@1delta/margin-fetcher 5.0.58 → 5.0.59

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.
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, stringToHex, isAddress, pad, encodeFunctionData, formatUnits, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-YILYOOYB.js';
1
+ import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, stringToHex, isAddress, pad, encodeFunctionData, formatUnits, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, hexToString, parseAbiParameters, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-JUYF2XLF.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
4
  import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isCooler, isDssType, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, isCurvance, isTwyne, isFraxlend, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isMorphoBlue, isAaveV2Type, isAaveV32Type, isAaveV3Type, isUsdd, isSky, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { hasCrossMarginRisk, isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
- import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, coolerLendersByChain, llamaLendLendersByChain, usddLendersByChain, skyLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, fraxlendLendersByChain, twyneLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, coolerConfigFor, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, fraxlendConfigFor, dssConfigFor, dssChainData, dssDebtToken, dssDebtJoin, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, listaCollateralProvider, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, twyneConfigFor, twyneChainData, parseAaveV4SpokeLenderKey, fraxlendPairsFor, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles, morphoTypeOracles } from '@1delta/data-sdk';
6
+ import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, coolerLendersByChain, llamaLendLendersByChain, usddLendersByChain, skyLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, fraxlendLendersByChain, twyneLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, resolveTermApiBase, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, coolerConfigFor, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, fraxlendConfigFor, dssConfigFor, dssChainData, dssDebtToken, dssDebtJoin, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, listaCollateralProvider, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, twyneConfigFor, twyneChainData, parseAaveV4SpokeLenderKey, fraxlendPairsFor, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles, morphoTypeOracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
8
  import { Chain } from '@1delta/chain-registry';
9
9
  import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
@@ -7224,15 +7224,15 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
7224
7224
  isActive: configData?.[8 /* isActive */],
7225
7225
  isFrozen: configData?.[9 /* isFrozen */]
7226
7226
  };
7227
- const aaveTokens2 = aaveTokenMap[asset];
7228
- if (!!aaveTokens2) {
7227
+ const aaveTokens3 = aaveTokenMap[asset];
7228
+ if (!!aaveTokens3) {
7229
7229
  resultReserves[marketUid] = {
7230
7230
  ...resultReserves[marketUid],
7231
7231
  params: {
7232
7232
  metadata: {
7233
- aToken: aaveTokens2.aToken,
7234
- vToken: aaveTokens2.vToken,
7235
- sToken: aaveTokens2.sToken
7233
+ aToken: aaveTokens3.aToken,
7234
+ vToken: aaveTokens3.vToken,
7235
+ sToken: aaveTokens3.sToken
7236
7236
  }
7237
7237
  }
7238
7238
  };
@@ -7457,15 +7457,15 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
7457
7457
  };
7458
7458
  })()
7459
7459
  };
7460
- const aaveTokens2 = aaveTokenMap[asset];
7461
- if (!!aaveTokens2) {
7460
+ const aaveTokens3 = aaveTokenMap[asset];
7461
+ if (!!aaveTokens3) {
7462
7462
  resultReserves[marketUid] = {
7463
7463
  ...resultReserves[marketUid],
7464
7464
  params: {
7465
7465
  metadata: {
7466
- aToken: aaveTokens2.aToken,
7467
- vToken: aaveTokens2.vToken,
7468
- sToken: aaveTokens2.sToken
7466
+ aToken: aaveTokens3.aToken,
7467
+ vToken: aaveTokens3.vToken,
7468
+ sToken: aaveTokens3.sToken
7469
7469
  }
7470
7470
  }
7471
7471
  };
@@ -7692,15 +7692,15 @@ function parseYLDRCall(chainId, lender, additionalYields, prices, tokenList) {
7692
7692
  isActive: configData?.[7 /* isActive */],
7693
7693
  isFrozen: configData?.[8 /* isFrozen */]
7694
7694
  };
7695
- const aaveTokens2 = aaveTokenMap[asset];
7696
- if (!!aaveTokens2) {
7695
+ const aaveTokens3 = aaveTokenMap[asset];
7696
+ if (!!aaveTokens3) {
7697
7697
  resultReserves[marketUid] = {
7698
7698
  ...resultReserves[marketUid],
7699
7699
  params: {
7700
7700
  metadata: {
7701
- aToken: aaveTokens2.aToken,
7702
- vToken: aaveTokens2.vToken,
7703
- sToken: aaveTokens2.sToken
7701
+ aToken: aaveTokens3.aToken,
7702
+ vToken: aaveTokens3.vToken,
7703
+ sToken: aaveTokens3.sToken
7704
7704
  }
7705
7705
  }
7706
7706
  };
@@ -7888,15 +7888,15 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
7888
7888
  };
7889
7889
  })()
7890
7890
  };
7891
- const aaveTokens2 = aaveTokenMap[asset];
7892
- if (!!aaveTokens2) {
7891
+ const aaveTokens3 = aaveTokenMap[asset];
7892
+ if (!!aaveTokens3) {
7893
7893
  resultReserves[marketUid] = {
7894
7894
  ...resultReserves[marketUid],
7895
7895
  params: {
7896
7896
  metadata: {
7897
- aToken: aaveTokens2.aToken,
7898
- vToken: aaveTokens2.vToken,
7899
- sToken: aaveTokens2.sToken
7897
+ aToken: aaveTokens3.aToken,
7898
+ vToken: aaveTokens3.vToken,
7899
+ sToken: aaveTokens3.sToken
7900
7900
  }
7901
7901
  }
7902
7902
  };
@@ -18816,7 +18816,7 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
18816
18816
  { self: market.silo0, other: market.silo1 },
18817
18817
  { self: market.silo1, other: market.silo0 }
18818
18818
  ];
18819
- const toBigInt18 = (v) => {
18819
+ const toBigInt17 = (v) => {
18820
18820
  if (v === void 0 || v === null || v === "0x") return 0n;
18821
18821
  if (typeof v === "bigint") return v;
18822
18822
  try {
@@ -18828,8 +18828,8 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
18828
18828
  for (let s = 0; s < 2; s++) {
18829
18829
  const { self, other } = sides[s];
18830
18830
  const slot = s * SILO_V2_CALLS_PER_SIDE;
18831
- const totalAssetsRaw = toBigInt18(data[slot]);
18832
- const debtAssetsRaw = toBigInt18(data[slot + 1]);
18831
+ const totalAssetsRaw = toBigInt17(data[slot]);
18832
+ const debtAssetsRaw = toBigInt17(data[slot + 1]);
18833
18833
  const irmConfigRaw = data[slot + 2];
18834
18834
  const decimals = self.decimals;
18835
18835
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -18984,7 +18984,7 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
18984
18984
  { self: market.silo0, other: market.silo1 },
18985
18985
  { self: market.silo1, other: market.silo0 }
18986
18986
  ];
18987
- const toBigInt18 = (v) => {
18987
+ const toBigInt17 = (v) => {
18988
18988
  if (v === void 0 || v === null || v === "0x") return 0n;
18989
18989
  if (typeof v === "bigint") return v;
18990
18990
  try {
@@ -18996,8 +18996,8 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
18996
18996
  for (let s = 0; s < 2; s++) {
18997
18997
  const { self, other } = sides[s];
18998
18998
  const slot = s * SILO_V3_CALLS_PER_SIDE;
18999
- const totalAssetsRaw = toBigInt18(data[slot]);
19000
- const debtAssetsRaw = toBigInt18(data[slot + 1]);
18999
+ const totalAssetsRaw = toBigInt17(data[slot]);
19000
+ const debtAssetsRaw = toBigInt17(data[slot + 1]);
19001
19001
  const irmConfigRaw = data[slot + 2];
19002
19002
  const decimals = self.decimals;
19003
19003
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -20904,12 +20904,12 @@ function convertMidnightMarketsToResponse(raw, chainId, prices = {}, _additional
20904
20904
  isFrozen: false
20905
20905
  };
20906
20906
  });
20907
- const toLevels = (levels) => (levels ?? []).map((l) => ({
20907
+ const toLevels2 = (levels) => (levels ?? []).map((l) => ({
20908
20908
  apr: tickToAprNumber(l.tick, ttmBig) * 100,
20909
20909
  units: l.units.toString(),
20910
20910
  assets: formatNr(l.assets, config.loanDecimals)
20911
20911
  }));
20912
- const marketBook = book && !matured ? { bids: toLevels(book.bids), asks: toLevels(book.asks) } : void 0;
20912
+ const marketBook = book && !matured ? { bids: toLevels2(book.bids), asks: toLevels2(book.asks) } : void 0;
20913
20913
  const primaryCollateral = config.collateralParams[0];
20914
20914
  entry.params = {
20915
20915
  market: {
@@ -21216,6 +21216,144 @@ function createTermBookSource(chainId, fetchImpl = fetch) {
21216
21216
  return new TermSubgraphSource(termApiBaseUrl(chainId), fetchImpl);
21217
21217
  }
21218
21218
 
21219
+ // src/lending/public-data/term/math.ts
21220
+ var WAD4 = 1e18;
21221
+ function termMaintenanceRatioToLtv(maintenanceRatio) {
21222
+ if (!maintenanceRatio) return 0;
21223
+ let r;
21224
+ try {
21225
+ r = BigInt(maintenanceRatio);
21226
+ } catch {
21227
+ return 0;
21228
+ }
21229
+ if (r <= 0n) return 0;
21230
+ const ratio = Number(r) / WAD4;
21231
+ return ratio > 0 ? 1 / ratio : 0;
21232
+ }
21233
+ function termLiquidatedDamagesToPenalty(liquidatedDamages) {
21234
+ if (!liquidatedDamages) return 0;
21235
+ try {
21236
+ return Number(BigInt(liquidatedDamages)) / WAD4;
21237
+ } catch {
21238
+ return 0;
21239
+ }
21240
+ }
21241
+ function termOfferRateToAprPct(offerRate) {
21242
+ if (!offerRate) return 0;
21243
+ let r;
21244
+ try {
21245
+ r = BigInt(offerRate);
21246
+ } catch {
21247
+ return 0;
21248
+ }
21249
+ if (r <= 0n) return 0;
21250
+ return Number(r) / WAD4 * 100;
21251
+ }
21252
+
21253
+ // src/lending/public-data/term/orderStore.ts
21254
+ var DEFAULT_TERM_ORDER_STORE = "https://api.global.termfinance.io/protocol";
21255
+ var TERM_ORDER_STORE_OVERRIDE_KEY = "__1delta_term_order_store_base__";
21256
+ function termOrderStoreBaseUrl(chainId) {
21257
+ const override = globalThis[TERM_ORDER_STORE_OVERRIDE_KEY];
21258
+ if (typeof override === "string" && override.length > 0) {
21259
+ return override.replace(/\/+$/, "");
21260
+ }
21261
+ const cfg = termConfig()?.[chainId]?.orderStoreUrl;
21262
+ if (typeof cfg === "string" && cfg.length > 0) {
21263
+ return cfg.replace(/\/+$/, "");
21264
+ }
21265
+ return DEFAULT_TERM_ORDER_STORE;
21266
+ }
21267
+ var ZERO_ADDRESS6 = "0x0000000000000000000000000000000000000000";
21268
+ var DEFAULT_TIMEOUT_MS = 5e3;
21269
+ function fillableRemaining(order, nowSec9) {
21270
+ if (order.taker && order.taker.toLowerCase() !== ZERO_ADDRESS6) return 0n;
21271
+ if (order.hasSufficientApproval === false) return 0n;
21272
+ let remaining;
21273
+ let expiry;
21274
+ try {
21275
+ remaining = BigInt(order.remainingAmount ?? order.purchaseTokenAmount);
21276
+ expiry = BigInt(order.expiry ?? "0");
21277
+ } catch {
21278
+ return 0n;
21279
+ }
21280
+ if (expiry <= BigInt(nowSec9)) return 0n;
21281
+ if (remaining <= 0n) return 0n;
21282
+ if (order.cachedAvailableBalance != null) {
21283
+ try {
21284
+ const avail = BigInt(order.cachedAvailableBalance);
21285
+ if (avail < remaining) remaining = avail;
21286
+ } catch {
21287
+ }
21288
+ }
21289
+ return remaining;
21290
+ }
21291
+ async function fetchTermStoreOrders(chainId, fetchImpl = fetch, filter = "fillable") {
21292
+ const base = termOrderStoreBaseUrl(chainId);
21293
+ const url = `${base}/orders?chainId=${chainId}`;
21294
+ try {
21295
+ const res = await fetchImpl.call(globalThis, url, {
21296
+ signal: AbortSignal.timeout(DEFAULT_TIMEOUT_MS)
21297
+ });
21298
+ if (!res.ok) return null;
21299
+ const json = await res.json();
21300
+ const orders = Array.isArray(json?.orders) ? json.orders : Array.isArray(json) ? json : [];
21301
+ const nowSec9 = Math.floor(Date.now() / 1e3);
21302
+ const byServicer = /* @__PURE__ */ new Map();
21303
+ for (const order of orders) {
21304
+ if (!order?.repoServicer) continue;
21305
+ if (order.orderKind !== "lend" && order.orderKind !== "borrow") continue;
21306
+ if (filter === "fillable" && fillableRemaining(order, nowSec9) <= 0n)
21307
+ continue;
21308
+ const key3 = order.repoServicer.toLowerCase();
21309
+ const list = byServicer.get(key3);
21310
+ if (list) list.push(order);
21311
+ else byServicer.set(key3, [order]);
21312
+ }
21313
+ return byServicer;
21314
+ } catch {
21315
+ return null;
21316
+ }
21317
+ }
21318
+ function toLevels(orders, loanDecimals, nowSec9) {
21319
+ const scale3 = 10 ** loanDecimals;
21320
+ return orders.map((o) => {
21321
+ const units = fillableRemaining(o, nowSec9);
21322
+ return {
21323
+ apr: termOfferRateToAprPct(o.offerRate),
21324
+ units: units.toString(),
21325
+ assets: Number(units) / scale3
21326
+ };
21327
+ });
21328
+ }
21329
+ function reduceSide(levels) {
21330
+ if (levels.length === 0) return void 0;
21331
+ let units = 0n;
21332
+ let assets = 0;
21333
+ for (const l of levels) {
21334
+ units += BigInt(l.units);
21335
+ assets += l.assets;
21336
+ }
21337
+ return { aprPct: levels[0].apr, units: units.toString(), assets, levels };
21338
+ }
21339
+ function toTermFillNow(orders, loanDecimals, nowSec9 = Math.floor(Date.now() / 1e3)) {
21340
+ if (!orders || orders.length === 0) return null;
21341
+ const borrowLevels = toLevels(
21342
+ orders.filter((o) => o.orderKind === "lend").sort((a, b) => Number(BigInt(a.offerRate) - BigInt(b.offerRate))),
21343
+ loanDecimals,
21344
+ nowSec9
21345
+ );
21346
+ const lendLevels = toLevels(
21347
+ orders.filter((o) => o.orderKind === "borrow").sort((a, b) => Number(BigInt(b.offerRate) - BigInt(a.offerRate))),
21348
+ loanDecimals,
21349
+ nowSec9
21350
+ );
21351
+ const borrow = reduceSide(borrowLevels);
21352
+ const lend = reduceSide(lendLevels);
21353
+ if (!borrow && !lend) return null;
21354
+ return { borrow, lend };
21355
+ }
21356
+
21219
21357
  // src/lending/public-data/term/fetchPublic.ts
21220
21358
  var TERM_BOOK_LEVELS = 20;
21221
21359
  var LKG_TTL_SEC2 = 30 * 60;
@@ -21245,14 +21383,15 @@ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
21245
21383
  }
21246
21384
  return { top: null, book: null, auction: null };
21247
21385
  }
21248
- async function fetchTermMarkets(chainId, source = createTermBookSource(chainId)) {
21386
+ async function fetchTermMarkets(chainId, source = createTermBookSource(chainId), fetchOrders = fetchTermStoreOrders) {
21249
21387
  const markets = termMarketsByChain(chainId);
21250
21388
  if (markets.length === 0) return [];
21251
21389
  const nowSec9 = Math.floor(Date.now() / 1e3);
21390
+ const storeOrders = await fetchOrders(chainId).catch(() => null);
21252
21391
  return Promise.all(
21253
21392
  markets.map(async (config) => {
21254
21393
  if (Number(config.maturity) <= nowSec9) {
21255
- return { config, top: null, book: null, auction: null };
21394
+ return { config, top: null, book: null, auction: null, fillNow: null };
21256
21395
  }
21257
21396
  const { top, book, auction } = await fetchTopAndBookWithFallback2(
21258
21397
  source,
@@ -21260,34 +21399,16 @@ async function fetchTermMarkets(chainId, source = createTermBookSource(chainId))
21260
21399
  config,
21261
21400
  nowSec9
21262
21401
  );
21263
- return { config, top, book, auction };
21402
+ const fillNow = storeOrders ? toTermFillNow(
21403
+ storeOrders.get(config.servicer.toLowerCase()),
21404
+ config.loanDecimals,
21405
+ nowSec9
21406
+ ) : null;
21407
+ return { config, top, book, auction, fillNow };
21264
21408
  })
21265
21409
  );
21266
21410
  }
21267
21411
 
21268
- // src/lending/public-data/term/math.ts
21269
- var WAD4 = 1e18;
21270
- function termMaintenanceRatioToLtv(maintenanceRatio) {
21271
- if (!maintenanceRatio) return 0;
21272
- let r;
21273
- try {
21274
- r = BigInt(maintenanceRatio);
21275
- } catch {
21276
- return 0;
21277
- }
21278
- if (r <= 0n) return 0;
21279
- const ratio = Number(r) / WAD4;
21280
- return ratio > 0 ? 1 / ratio : 0;
21281
- }
21282
- function termLiquidatedDamagesToPenalty(liquidatedDamages) {
21283
- if (!liquidatedDamages) return 0;
21284
- try {
21285
- return Number(BigInt(liquidatedDamages)) / WAD4;
21286
- } catch {
21287
- return 0;
21288
- }
21289
- }
21290
-
21291
21412
  // src/lending/public-data/term/convertPublic.ts
21292
21413
  var nowSec2 = () => Math.floor(Date.now() / 1e3);
21293
21414
  function termLenderKey(termRepoId) {
@@ -21299,7 +21420,7 @@ function fmtDuration(secs) {
21299
21420
  if (secs >= 2 * 3600) return `${Math.round(secs / 3600)} hours`;
21300
21421
  return `${Math.max(1, Math.round(secs / 60))} minutes`;
21301
21422
  }
21302
- function auctionImplications(status, matured, secondsUntilClose) {
21423
+ function auctionImplications(status, matured, secondsUntilClose, fillNowBorrow = false) {
21303
21424
  const out = [];
21304
21425
  if (matured) {
21305
21426
  out.push(
@@ -21307,44 +21428,56 @@ function auctionImplications(status, matured, secondsUntilClose) {
21307
21428
  );
21308
21429
  return out;
21309
21430
  }
21310
- if (status === "open") {
21431
+ if (fillNowBorrow) {
21311
21432
  out.push(
21312
- `\u26A0 Borrowing is a SEALED BID into an auction, not an instant loan. Submissions close in ${secondsUntilClose != null ? fmtDuration(secondsUntilClose) : "a limited window"}; after that nothing can be borrowed until the next round is listed.`
21433
+ "Borrowing can be filled INSTANTLY against standing limit orders \u2014 the shown borrow rate is the best standing order and is the rate you actually get."
21313
21434
  );
21435
+ }
21436
+ if (status === "open") {
21314
21437
  out.push(
21315
- "Your rate is NOT the rate shown \u2014 the shown figure is the last round\u2019s clearing rate. Your actual rate is set when this round clears, and a bid above the clearing rate may not be filled at all."
21438
+ `${fillNowBorrow ? "Alternatively, borrowing" : "\u26A0 Borrowing"} is a SEALED BID into an auction${fillNowBorrow ? "" : ", not an instant loan"}. Submissions close in ${secondsUntilClose != null ? fmtDuration(secondsUntilClose) : "a limited window"}${fillNowBorrow ? "." : "; after that nothing can be borrowed until the next round is listed."}`
21316
21439
  );
21440
+ if (!fillNowBorrow)
21441
+ out.push(
21442
+ "Your rate is NOT the rate shown \u2014 the shown figure is the last round\u2019s clearing rate. Your actual rate is set when this round clears, and a bid above the clearing rate may not be filled at all."
21443
+ );
21317
21444
  } else if (status === "revealing") {
21318
21445
  out.push(
21319
- "\u26A0 Bidding has CLOSED for this round \u2014 sealed prices are being revealed and the auction is clearing. No new borrows until the next round is listed."
21446
+ `\u26A0 Bidding has CLOSED for this round \u2014 sealed prices are being revealed and the auction is clearing.${fillNowBorrow ? "" : " No new borrows until the next round is listed."}`
21320
21447
  );
21321
21448
  } else if (status === "upcoming") {
21322
21449
  out.push(
21323
- "An auction round is scheduled but not yet accepting bids. Borrowing becomes possible when it opens."
21450
+ `An auction round is scheduled but not yet accepting bids.${fillNowBorrow ? "" : " Borrowing becomes possible when it opens."}`
21324
21451
  );
21325
- } else {
21452
+ } else if (!fillNowBorrow) {
21326
21453
  out.push(
21327
- "\u26A0 NO auction is open, so this market CANNOT be borrowed right now. Term originates loans only during scheduled sealed-bid auctions."
21454
+ "\u26A0 NO auction is open and no instant limit-order liquidity is standing, so this market CANNOT be borrowed right now."
21328
21455
  );
21329
21456
  out.push(
21330
21457
  "Any borrow rate shown is the last round\u2019s clearing rate \u2014 historical, not obtainable."
21331
21458
  );
21332
21459
  }
21333
21460
  out.push(
21334
- "Lending is still possible between rounds by buying repo tokens on the secondary market; only borrowing depends on the auction window."
21461
+ "Lending is still possible between rounds by buying repo tokens on the secondary market; only borrowing depends on the auction window or standing limit orders."
21335
21462
  );
21336
21463
  out.push(
21337
21464
  "Fixed maturity: the debt is a static face value with no interest accrual, repayable up to the end of the repurchase window."
21338
21465
  );
21339
21466
  return out;
21340
21467
  }
21341
- function toFixedTermAuction(auction, now, matured = false) {
21342
- const base = { canBorrow: false, canLend: !matured };
21468
+ function toFixedTermAuction(auction, now, matured = false, fillNow) {
21469
+ const fillNowBorrow = !matured && !!fillNow?.borrow;
21470
+ const base = { canBorrow: fillNowBorrow, canLend: !matured };
21343
21471
  if (!auction || auction.endTime <= now) {
21344
21472
  return {
21345
21473
  status: "closed",
21346
21474
  ...base,
21347
- implications: auctionImplications("closed", matured)
21475
+ implications: auctionImplications(
21476
+ "closed",
21477
+ matured,
21478
+ void 0,
21479
+ fillNowBorrow
21480
+ )
21348
21481
  };
21349
21482
  }
21350
21483
  const status = now < auction.startTime ? "upcoming" : now < auction.revealTime ? "open" : "revealing";
@@ -21353,9 +21486,14 @@ function toFixedTermAuction(auction, now, matured = false) {
21353
21486
  status,
21354
21487
  ...base,
21355
21488
  // A matured repo is never borrowable, whatever the round says.
21356
- canBorrow: status === "open" && !matured,
21489
+ canBorrow: (status === "open" || fillNowBorrow) && !matured,
21357
21490
  secondsUntilClose,
21358
- implications: auctionImplications(status, matured, secondsUntilClose),
21491
+ implications: auctionImplications(
21492
+ status,
21493
+ matured,
21494
+ secondsUntilClose,
21495
+ fillNowBorrow
21496
+ ),
21359
21497
  id: auction.id,
21360
21498
  startTime: auction.startTime,
21361
21499
  revealTime: auction.revealTime,
@@ -21368,6 +21506,28 @@ function currencyFor2(address, decimals, tokens) {
21368
21506
  const lower4 = address.toLowerCase();
21369
21507
  return tokens[lower4] ?? { address: lower4, symbol: "", name: "", decimals };
21370
21508
  }
21509
+ function toFixedTermFillNow(fillNow, canLendAtAll) {
21510
+ if (!fillNow || !fillNow.borrow && !fillNow.lend) return void 0;
21511
+ return {
21512
+ canBorrow: !!fillNow.borrow,
21513
+ canLend: canLendAtAll && !!fillNow.lend,
21514
+ borrowAprPct: fillNow.borrow?.aprPct,
21515
+ lendAprPct: fillNow.lend?.aprPct,
21516
+ borrowLiquidity: fillNow.borrow?.assets,
21517
+ lendLiquidity: fillNow.lend?.assets
21518
+ };
21519
+ }
21520
+ function mergeTermBook(book, fillNow) {
21521
+ if (!book && !fillNow) return void 0;
21522
+ const asks = [...book?.asks ?? [], ...fillNow?.lend?.levels ?? []].sort(
21523
+ (a, b) => b.apr - a.apr
21524
+ );
21525
+ const bids = [...book?.bids ?? [], ...fillNow?.borrow?.levels ?? []].sort(
21526
+ (a, b) => a.apr - b.apr
21527
+ );
21528
+ if (asks.length === 0 && bids.length === 0) return void 0;
21529
+ return { bids, asks };
21530
+ }
21371
21531
  function convertTermMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
21372
21532
  intrinsicYields: {},
21373
21533
  lenderRewards: {},
@@ -21375,30 +21535,33 @@ function convertTermMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
21375
21535
  }, tokens = {}) {
21376
21536
  const out = {};
21377
21537
  const now = nowSec2();
21378
- for (const { config, top, book, auction } of raw) {
21538
+ for (const { config, top, book, auction, fillNow: fillNowRaw } of raw) {
21379
21539
  if (!config?.termRepoId || !config.purchaseToken) continue;
21380
21540
  const m = termLenderKey(config.termRepoId);
21381
21541
  const maturity = Number(config.maturity);
21382
21542
  const ttm = maturity - now;
21383
21543
  const matured = ttm <= 0;
21384
- const supplyAprPct = !matured ? top?.supplyAprPct ?? 0 : 0;
21385
- const borrowAprPct = !matured ? top?.borrowAprPct ?? 0 : 0;
21386
- const auctionInfo = toFixedTermAuction(auction, now, matured);
21387
- const auctionOpen = auctionInfo.canBorrow;
21388
- const terms = borrowAprPct > 0 && auctionOpen ? [
21544
+ const fillNow = matured ? null : fillNowRaw ?? null;
21545
+ const supplyAprPct = !matured ? Math.max(top?.supplyAprPct ?? 0, fillNow?.lend?.aprPct ?? 0) : 0;
21546
+ const borrowAprPct = !matured ? fillNow?.borrow?.aprPct ?? top?.borrowAprPct ?? 0 : 0;
21547
+ const auctionInfo = toFixedTermAuction(auction, now, matured, fillNow);
21548
+ const roundOpen = auctionInfo.status === "open" && !matured;
21549
+ const canBorrowNow = auctionInfo.canBorrow;
21550
+ const cardApr = fillNow?.borrow ? fillNow.borrow.aprPct : borrowAprPct;
21551
+ const terms = canBorrowNow && cardApr > 0 && (fillNow?.borrow || roundOpen) ? [
21389
21552
  {
21390
21553
  termId: 0,
21391
21554
  durationSecs: Math.max(0, ttm),
21392
21555
  durationDays: ttm / 86400,
21393
- apr: borrowAprPct
21556
+ apr: cardApr
21394
21557
  }
21395
21558
  ] : void 0;
21396
21559
  const loanAddr = config.purchaseToken.toLowerCase();
21397
21560
  const loanAsset = tokens[loanAddr];
21398
21561
  const loanKey = toOracleKey(loanAsset?.assetGroup) || toGenericPriceKey(loanAddr, chainId);
21399
21562
  const loanPrice = prices[loanKey] ?? 0;
21400
- const supplyLiquidity = top?.supplyLiquidity ?? 0;
21401
- const borrowLiquidity = top?.borrowLiquidity ?? 0;
21563
+ const supplyLiquidity = (top?.supplyLiquidity ?? 0) + (fillNow?.lend?.assets ?? 0);
21564
+ const borrowLiquidity = (top?.borrowLiquidity ?? 0) + (fillNow?.borrow?.assets ?? 0);
21402
21565
  const entry = { data: {} };
21403
21566
  const loanUid = createMarketUid(chainId, m, loanAddr);
21404
21567
  entry.data[loanUid] = {
@@ -21440,10 +21603,10 @@ function convertTermMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
21440
21603
  },
21441
21604
  closeFactor: 1,
21442
21605
  collateralActive: false,
21443
- // Borrow needs a LIVE auction round, not just an unmatured repo.
21444
- // `depositsEnabled` stays on the maturity alone: lending is also possible
21445
- // between rounds by buying repo tokens on the secondary book.
21446
- borrowingEnabled: auctionOpen,
21606
+ // Borrow needs a live path: an OPEN auction round OR standing Terminal 1
21607
+ // lend orders to fill. `depositsEnabled` stays on the maturity alone:
21608
+ // lending also works between rounds via the secondary repo-token book.
21609
+ borrowingEnabled: canBorrowNow,
21447
21610
  depositsEnabled: auctionInfo.canLend,
21448
21611
  hasStable: false,
21449
21612
  // Term has no variable rate at all; between auctions there is no
@@ -21533,15 +21696,18 @@ function convertTermMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
21533
21696
  // per-repo servicer is the market-level venue reference.
21534
21697
  provider: { kind: "auction", address: config.servicer },
21535
21698
  // The origination window. `closed` (the common state between rounds)
21536
- // is what tells a consumer that this market is display-only right
21537
- // now, rather than an ordinary market with an empty rate card.
21538
- auction: auctionInfo
21699
+ // used to mean display-only; with Terminal 1, `canBorrow` can be true
21700
+ // while the round is closed `fillNow` carries the instant path.
21701
+ auction: auctionInfo,
21702
+ fillNow: toFixedTermFillNow(fillNow, auctionInfo.canLend)
21539
21703
  },
21540
21704
  collateralParams: config.collateralParams,
21541
- // Bounded book slice (top-N open orders/side) for later filtering. Term
21542
- // levels are already rate+size normalized; pass through (empty when
21543
- // matured or no book). `asks` = secondary lend orders, `bids` = borrow.
21544
- book: !matured && book ? { bids: book.bids, asks: book.asks } : void 0
21705
+ // Bounded book slice (top-N open orders/side) for later filtering.
21706
+ // `asks` = lend-side venues (secondary repo-token orders at the
21707
+ // clearing APR + Terminal 1 borrow orders at their own rates, best
21708
+ // rate first); `bids` = borrow-side (Terminal 1 lend orders, cheapest
21709
+ // first — the legacy auction book has no standing bids).
21710
+ book: !matured ? mergeTermBook(book ?? void 0, fillNow ?? void 0) : void 0
21545
21711
  }
21546
21712
  };
21547
21713
  entry.chainId = chainId;
@@ -22681,10 +22847,113 @@ var TermMaxApiSource = class {
22681
22847
  function createTermMaxDataSource(chainId, fetchImpl = fetch) {
22682
22848
  return new TermMaxApiSource(termMaxApiBase(chainId), fetchImpl);
22683
22849
  }
22850
+ var RESIDUE_TTL_MS = 60 * 6e4;
22851
+ var RESIDUE_FAILURE_TTL_MS = 5 * 6e4;
22852
+ var API_TIMEOUT_MS = 4e3;
22853
+ var residueCache = /* @__PURE__ */ new Map();
22854
+ var inFlight = /* @__PURE__ */ new Map();
22855
+ var isStale = (e) => !e || Date.now() - e.at > (e.failed ? RESIDUE_FAILURE_TTL_MS : RESIDUE_TTL_MS);
22856
+ function getTermMaxMaturedResidue(chainId) {
22857
+ const hit = residueCache.get(chainId);
22858
+ if (isStale(hit)) void refreshTermMaxMaturedResidue(chainId);
22859
+ return hit?.markets ?? [];
22860
+ }
22861
+ function refreshTermMaxMaturedResidue(chainId) {
22862
+ const running = inFlight.get(chainId);
22863
+ if (running) return running;
22864
+ const p = sweep(chainId).finally(() => inFlight.delete(chainId));
22865
+ inFlight.set(chainId, p);
22866
+ return p;
22867
+ }
22868
+ var API = "https://api.termmax.ts.finance";
22869
+ async function fetchFullHistory(chainId) {
22870
+ const ctl = new AbortController();
22871
+ const timer = setTimeout(() => ctl.abort(), API_TIMEOUT_MS);
22872
+ try {
22873
+ const res = await fetch(
22874
+ `${API}/market/config/market/list?chainId=${chainId}&includeInactive=true`,
22875
+ { signal: ctl.signal, headers: { Accept: "application/json" } }
22876
+ );
22877
+ if (!res.ok) return [];
22878
+ const body = await res.json();
22879
+ return Array.isArray(body?.data) ? body.data : [];
22880
+ } catch {
22881
+ return [];
22882
+ } finally {
22883
+ clearTimeout(timer);
22884
+ }
22885
+ }
22886
+ var TOTAL_SUPPLY_ABI = [
22887
+ {
22888
+ name: "totalSupply",
22889
+ type: "function",
22890
+ stateMutability: "view",
22891
+ inputs: [],
22892
+ outputs: [{ name: "", type: "uint256" }]
22893
+ }
22894
+ ];
22895
+ var toConfig = (m) => {
22896
+ const c = m?.contracts;
22897
+ if (!c?.marketAddr || !c?.ftAddr || !c?.gtAddr) return void 0;
22898
+ return {
22899
+ market: String(c.marketAddr).toLowerCase(),
22900
+ ft: String(c.ftAddr).toLowerCase(),
22901
+ xt: String(c.xtAddr ?? "").toLowerCase(),
22902
+ gt: String(c.gtAddr).toLowerCase(),
22903
+ collateral: String(c.collateralAddr ?? "").toLowerCase(),
22904
+ debtToken: String(c.underlyingAddr ?? "").toLowerCase(),
22905
+ maturity: Math.floor(Date.parse(m.maturity) / 1e3),
22906
+ symbol: m.symbol
22907
+ };
22908
+ };
22909
+ async function sweep(chainId) {
22910
+ if (!termMaxConfigByChain(chainId)) return;
22911
+ const hit = residueCache.get(chainId);
22912
+ const nowSec9 = Math.floor(Date.now() / 1e3);
22913
+ const all = await fetchFullHistory(chainId);
22914
+ const matured = all.map(toConfig).filter((m) => !!m && m.maturity <= nowSec9);
22915
+ if (matured.length === 0) {
22916
+ if (!hit || hit.failed) {
22917
+ residueCache.set(chainId, { markets: hit?.markets ?? [], at: Date.now(), failed: true });
22918
+ }
22919
+ return;
22920
+ }
22921
+ const calls = matured.flatMap((m) => [
22922
+ { address: m.ft, name: "totalSupply", params: [] },
22923
+ { address: m.gt, name: "totalSupply", params: [] }
22924
+ ]);
22925
+ let res;
22926
+ try {
22927
+ res = await multicallRetryUniversal({
22928
+ chain: chainId,
22929
+ calls,
22930
+ abi: TOTAL_SUPPLY_ABI,
22931
+ allowFailure: true
22932
+ });
22933
+ } catch {
22934
+ if (!hit || hit.failed) {
22935
+ residueCache.set(chainId, { markets: hit?.markets ?? [], at: Date.now(), failed: true });
22936
+ }
22937
+ return;
22938
+ }
22939
+ const markets = [];
22940
+ for (let i = 0; i < matured.length; i++) {
22941
+ const ft = res[2 * i];
22942
+ const gt = res[2 * i + 1];
22943
+ const ftUnknown = typeof ft !== "bigint";
22944
+ const gtUnknown = typeof gt !== "bigint";
22945
+ if (ftUnknown || gtUnknown || ft > 0n || gt > 0n) markets.push(matured[i]);
22946
+ }
22947
+ residueCache.set(chainId, { markets, at: Date.now() });
22948
+ }
22684
22949
 
22685
22950
  // src/lending/public-data/termmax/fetchPublic.ts
22686
22951
  var LKG_TTL_SEC3 = 30 * 60;
22687
22952
  var lastGood3 = /* @__PURE__ */ new Map();
22953
+ var SWR_FRESH_MS = 6e4;
22954
+ var REFRESH_RETRY_MS = 3e4;
22955
+ var lastRefreshAttempt = /* @__PURE__ */ new Map();
22956
+ var refreshInFlight = /* @__PURE__ */ new Map();
22688
22957
  var MARKET_CACHE_TTL_MS = 10 * 6e4;
22689
22958
  var marketCache = /* @__PURE__ */ new Map();
22690
22959
  var marketKey = (chainId, market) => `${chainId}:${market.toLowerCase()}`;
@@ -22710,23 +22979,48 @@ function getCachedTermMaxMarkets(chainId) {
22710
22979
  }
22711
22980
  return out;
22712
22981
  }
22713
- async function fetchTermMaxMarkets(chainId, source = createTermMaxDataSource(chainId)) {
22714
- if (!termMaxConfigByChain(chainId)) return [];
22715
- const nowSec9 = Math.floor(Date.now() / 1e3);
22716
- const fresh = await source.getChainMarkets(chainId).catch(() => null);
22717
- if (fresh) {
22982
+ function refreshLiveMarkets(chainId, source) {
22983
+ const running = refreshInFlight.get(chainId);
22984
+ if (running) return running;
22985
+ lastRefreshAttempt.set(chainId, Date.now());
22986
+ const p = source.getChainMarkets(chainId).then((fresh) => {
22987
+ if (!fresh) return;
22988
+ const nowSec9 = Math.floor(Date.now() / 1e3);
22718
22989
  const live = fresh.filter((m) => m.config.maturity > nowSec9);
22719
22990
  lastGood3.set(chainId, { markets: live, at: nowSec9 });
22720
22991
  rememberMarkets(chainId, live);
22721
- return live;
22722
- }
22992
+ }).catch(() => void 0).finally(() => refreshInFlight.delete(chainId));
22993
+ refreshInFlight.set(chainId, p);
22994
+ return p;
22995
+ }
22996
+ async function fetchTermMaxMarkets(chainId, source = createTermMaxDataSource(chainId), options) {
22997
+ if (!termMaxConfigByChain(chainId)) return [];
22998
+ const nowSec9 = Math.floor(Date.now() / 1e3);
22723
22999
  const cached = lastGood3.get(chainId);
22724
- if (cached && nowSec9 - cached.at <= LKG_TTL_SEC3) {
22725
- const live = cached.markets.filter((m) => m.config.maturity > nowSec9);
22726
- rememberMarkets(chainId, live);
22727
- return live;
23000
+ const ageSec = cached ? nowSec9 - cached.at : Infinity;
23001
+ let live;
23002
+ if (cached && ageSec <= LKG_TTL_SEC3) {
23003
+ live = cached.markets.filter((m) => m.config.maturity > nowSec9);
23004
+ const attemptedAt = lastRefreshAttempt.get(chainId) ?? 0;
23005
+ if (ageSec * 1e3 > SWR_FRESH_MS && Date.now() - attemptedAt > REFRESH_RETRY_MS) {
23006
+ void refreshLiveMarkets(chainId, source);
23007
+ }
23008
+ } else {
23009
+ await refreshLiveMarkets(chainId, source);
23010
+ const after = lastGood3.get(chainId);
23011
+ if (!after || nowSec9 - after.at > LKG_TTL_SEC3) return [];
23012
+ live = after.markets.filter((m) => m.config.maturity > nowSec9);
22728
23013
  }
22729
- return [];
23014
+ const markets = options?.includeMatured ? [...live, ...maturedRows(chainId, live)] : live;
23015
+ rememberMarkets(chainId, markets);
23016
+ return markets;
23017
+ }
23018
+ function maturedRows(chainId, live) {
23019
+ const seen = new Set(live.map((m) => m.config.market.toLowerCase()));
23020
+ const residue = getTermMaxMaturedResidue(chainId);
23021
+ return residue.filter(
23022
+ (config) => !seen.has(config.market.toLowerCase())
23023
+ ).map((config) => ({ config, top: null, orders: [] }));
22730
23024
  }
22731
23025
 
22732
23026
  // src/lending/public-data/teller/math.ts
@@ -23221,7 +23515,23 @@ function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalY
23221
23515
  // product", which does not change with book depth.
23222
23516
  variableBorrowDisabled: true,
23223
23517
  isActive: true,
23224
- isFrozen: false
23518
+ isFrozen: false,
23519
+ /**
23520
+ * ZERO CAPACITY once matured, stated explicitly rather than left implicit.
23521
+ *
23522
+ * `depositsEnabled: false` says it, but not every consumer reads it: the
23523
+ * pairs view deliberately does NOT gate on that flag (it would delete
23524
+ * ~3.2k Dolomite and ~480 Gearbox pairs, whose collateral-only tokens
23525
+ * carry `deposits_enabled = false` while staying valid collateral) and
23526
+ * gates on CAPACITY instead — "a provider that switches supply off must
23527
+ * express it as ZERO CAPACITY". Without a cap, `depositable` is computed
23528
+ * as NULL, which that view reads as UNLIMITED.
23529
+ *
23530
+ * Today a matured market is kept out of pairs by its disabled debt leg, so
23531
+ * this changes nothing there — it removes the dependence on that one flag
23532
+ * being the thing that saves us.
23533
+ */
23534
+ ...matured ? { supplyCap: 0, borrowCap: 0 } : {}
23225
23535
  };
23226
23536
  const collUid = createMarketUid(chainId, m, collAddr);
23227
23537
  const collCapacityUSD = maxLtv > 0 ? borrowLiquidityUSD / maxLtv : borrowLiquidityUSD;
@@ -23265,6 +23575,22 @@ function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalY
23265
23575
  collateralActive: true,
23266
23576
  borrowingEnabled: false,
23267
23577
  depositsEnabled: !matured,
23578
+ /**
23579
+ * ZERO CAPACITY once matured, stated explicitly rather than left implicit.
23580
+ *
23581
+ * `depositsEnabled: false` says it, but not every consumer reads it: the
23582
+ * pairs view deliberately does NOT gate on that flag (it would delete
23583
+ * ~3.2k Dolomite and ~480 Gearbox pairs, whose collateral-only tokens
23584
+ * carry `deposits_enabled = false` while staying valid collateral) and
23585
+ * gates on CAPACITY instead — "a provider that switches supply off must
23586
+ * express it as ZERO CAPACITY". Without a cap, `depositable` is computed
23587
+ * as NULL, which that view reads as UNLIMITED.
23588
+ *
23589
+ * Today a matured market is kept out of pairs by its disabled debt leg, so
23590
+ * this changes nothing there — it removes the dependence on that one flag
23591
+ * being the thing that saves us.
23592
+ */
23593
+ ...matured ? { supplyCap: 0, borrowCap: 0 } : {},
23268
23594
  hasStable: false,
23269
23595
  isActive: true,
23270
23596
  isFrozen: false
@@ -27740,7 +28066,7 @@ function bigintToLtv(v) {
27740
28066
  return Number.isFinite(n) ? n / 1e18 : 0;
27741
28067
  }
27742
28068
  }
27743
- var ZERO_ADDRESS6 = "0x0000000000000000000000000000000000000000";
28069
+ var ZERO_ADDRESS7 = "0x0000000000000000000000000000000000000000";
27744
28070
  function convertSiloV3MarketsToPublicResponse(apiItems, chainId, prices, additionalYields = {
27745
28071
  intrinsicYields: {},
27746
28072
  lenderRewards: {},
@@ -27843,8 +28169,8 @@ function convertSiloV3MarketsToPublicResponse(apiItems, chainId, prices, additio
27843
28169
  silo: self.silo.toLowerCase(),
27844
28170
  counterpartySilo: other.silo.toLowerCase(),
27845
28171
  siloConfig: registryEntry.siloConfig.toLowerCase(),
27846
- oracle: (api.solvencyOracleAddress || self.solvencyOracle || ZERO_ADDRESS6).toLowerCase(),
27847
- irm: (api.interestRateModelId || self.interestRateModel || ZERO_ADDRESS6).toLowerCase(),
28172
+ oracle: (api.solvencyOracleAddress || self.solvencyOracle || ZERO_ADDRESS7).toLowerCase(),
28173
+ irm: (api.interestRateModelId || self.interestRateModel || ZERO_ADDRESS7).toLowerCase(),
27848
28174
  shareTokens: {
27849
28175
  collateral: self.collateralShareToken,
27850
28176
  protected: self.protectedShareToken,
@@ -28024,7 +28350,10 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
28024
28350
  if (isCurvance(lender)) return await fetchCurvanceMarkets(lender, chainId);
28025
28351
  if (isTwyne(lender)) return await fetchTwyneMarkets(lender, chainId);
28026
28352
  if (isFraxlend(lender)) return await fetchFraxlendPairs(lender, chainId);
28027
- if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
28353
+ if (isTermMax(lender))
28354
+ return await fetchTermMaxMarkets(chainId, void 0, {
28355
+ includeMatured: true
28356
+ });
28028
28357
  if (isDssType(lender)) return await fetchDssMarkets(lender, chainId);
28029
28358
  if (isFrankencoin(lender))
28030
28359
  return await fetchFrankencoinMarkets(lender, chainId);
@@ -28557,121 +28886,6 @@ var buildAaveV2UserCall = (chainId, lender, account) => {
28557
28886
  }
28558
28887
  }
28559
28888
  };
28560
- var getBaseAaveV3Calls = (chainId, account, lender, assetsToQuery) => {
28561
- return assetsToQuery.flatMap((tk) => [
28562
- {
28563
- address: getAaveTypePoolDataProviderAddress(chainId, lender),
28564
- name: "getUserReserveData",
28565
- params: [tk, account]
28566
- }
28567
- ]);
28568
- };
28569
- var buildAaveV3UserCall = (chainId, lender, account) => {
28570
- const assetsToQuery = getAaveAssets(chainId, lender).sort(
28571
- (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())
28572
- );
28573
- const calls = [...getBaseAaveV3Calls(chainId, account, lender, assetsToQuery)];
28574
- if (!isYLDR(lender)) {
28575
- const callDataEmode = {
28576
- address: getAaveTypePoolAddress(chainId, lender),
28577
- name: "getUserEMode",
28578
- params: [account]
28579
- };
28580
- calls.push(callDataEmode);
28581
- }
28582
- return calls;
28583
- };
28584
- var buildInitUserCall = (chainId, lender, account) => {
28585
- const lensContract = getInitLensAddress(chainId);
28586
- const calls = [];
28587
- const legacyBroker = InitMarginAddresses.getLegacyFlashAggregator(chainId);
28588
- if (legacyBroker) {
28589
- calls.push({
28590
- address: lensContract,
28591
- name: "getUserPositionData",
28592
- params: [account, legacyBroker]
28593
- });
28594
- }
28595
- const currentBroker = InitMarginAddresses.getFlashAggregator(chainId);
28596
- if (currentBroker) {
28597
- calls.push({
28598
- address: lensContract,
28599
- name: "getUserPositionData",
28600
- params: [account, currentBroker]
28601
- });
28602
- }
28603
- return calls;
28604
- };
28605
-
28606
- // src/lending/user-data/compound-v3/userCallBuild.ts
28607
- var buildCompoundV3UserCall = (chainId, lender, account) => {
28608
- const baseAsset = getCompoundV3BaseAsset(lender, chainId)?.baseAsset;
28609
- const cometContractAddress = getCompoundV3CometAddress(chainId, lender);
28610
- const assets = getLenderAssets(chainId, lender).sort(
28611
- (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())
28612
- );
28613
- const assetsNoBase = assets.filter((a) => a !== baseAsset);
28614
- const baseCalls = [
28615
- {
28616
- address: cometContractAddress,
28617
- name: "balanceOf",
28618
- params: [account]
28619
- },
28620
- {
28621
- address: cometContractAddress,
28622
- name: "borrowBalanceOf",
28623
- params: [account]
28624
- }
28625
- ];
28626
- const callsNonBase = assetsNoBase.map((tk) => {
28627
- return {
28628
- address: cometContractAddress,
28629
- name: "userCollateral",
28630
- params: [account, tk]
28631
- };
28632
- });
28633
- const callEarnedBalances = {
28634
- address: getCompoundV3CometRewardsAddress(chainId),
28635
- name: "getRewardOwed",
28636
- params: [cometContractAddress, account]
28637
- };
28638
- const calls = [...callsNonBase, ...baseCalls, callEarnedBalances];
28639
- return calls;
28640
- };
28641
-
28642
- // src/lending/user-data/compound-v2/userCallBuild.ts
28643
- var buildCompoundV2UserCall = (chainId, lender, account) => {
28644
- const tokens = getCompoundV2Tokens(chainId, lender).sort(
28645
- (a, b) => a.cToken.toLowerCase().localeCompare(b.cToken.toLowerCase())
28646
- );
28647
- const comptroller = getCompoundV2Comptroller(chainId, lender);
28648
- let calls = tokens.flatMap((tk) => [
28649
- {
28650
- address: tk.cToken,
28651
- name: "balanceOfUnderlying",
28652
- params: [account]
28653
- },
28654
- {
28655
- address: tk.cToken,
28656
- name: "borrowBalanceCurrent",
28657
- params: [account]
28658
- },
28659
- {
28660
- address: tk.cToken,
28661
- name: "balanceOf",
28662
- params: [account]
28663
- }
28664
- ]);
28665
- calls = [
28666
- ...calls,
28667
- {
28668
- address: comptroller,
28669
- name: "getAssetsIn",
28670
- params: [account]
28671
- }
28672
- ];
28673
- return calls;
28674
- };
28675
28889
  var MULTICALL_DEFAULT_BATCH_SIZE = 4096;
28676
28890
  var CELO_MULTICALL_ADDRESS = "0x633987602DE5C4F337e3DbF265303A1080324204";
28677
28891
  var BNB_MULTICALL_ADDRESS = "0x963Df249eD09c358A4819E39d9Cd5736c3087184";
@@ -28828,7 +29042,6 @@ var toSlots = (returnData, allowFailure) => {
28828
29042
  }
28829
29043
  );
28830
29044
  };
28831
- var slotValues = (slots) => slots.map((s) => s.value);
28832
29045
  var recordPermanentFailures = (slots, offset, collector) => {
28833
29046
  if (!collector) return;
28834
29047
  for (let i = 0; i < slots.length; i++) {
@@ -28897,116 +29110,7 @@ var repairFailedSlots = async (chainId, contracts, slots, getEvmClient17, nextRp
28897
29110
  }
28898
29111
  return slots;
28899
29112
  };
28900
- var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient17, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false, permanentFailures, options) => {
28901
- const tried = options?.tried ?? /* @__PURE__ */ new Set();
28902
- const endpoint = resolveEndpoint(chainId, getEvmClient17, providerId, tried);
28903
- if (!endpoint) throw new Error("No usable RPC endpoint for " + chainId);
28904
- const endpointOptions = {
28905
- tried,
28906
- onEndpointFailure: options?.onEndpointFailure
28907
- };
28908
- try {
28909
- const abiIsArray = isArray(abi[0]);
28910
- const contracts = calls.map(({ address, name, params }, i) => ({
28911
- abi: abiIsArray ? abi?.[i] : abi,
28912
- address,
28913
- functionName: name,
28914
- args: params
28915
- }));
28916
- const returnData = await endpoint.client.multicall({
28917
- allowFailure,
28918
- batchSize,
28919
- contracts
28920
- });
28921
- if (!allowFailure) return returnData;
28922
- const slots = toSlots(returnData, true);
28923
- if (retries > 0 && slots.length > 0 && slots.every((s) => isFailedCall(s.value) && !s.permanent)) {
28924
- if (logs)
28925
- console.log(
28926
- `multicall fully failed on rpc ${endpoint.rpcId} for chain ${chainId}, failing over`
28927
- );
28928
- options?.onEndpointFailure?.({
28929
- chainId,
28930
- url: endpoint.url,
28931
- rpcId: endpoint.rpcId,
28932
- kind: "slots"
28933
- });
28934
- await sleep(backoffForRound(0));
28935
- return multicallViemAbiArray(
28936
- chainId,
28937
- abi,
28938
- calls,
28939
- getEvmClient17,
28940
- retry,
28941
- endpoint.rpcId + 1,
28942
- retries - 1,
28943
- allowFailure,
28944
- batchSize,
28945
- logs,
28946
- retryFailed,
28947
- permanentFailures,
28948
- endpointOptions
28949
- );
28950
- }
28951
- const finalSlots = retryFailed ? await repairFailedSlots(
28952
- chainId,
28953
- contracts,
28954
- slots,
28955
- getEvmClient17,
28956
- endpoint.rpcId + 1,
28957
- batchSize,
28958
- logs,
28959
- MULTICALL_REPAIR_ROUNDS,
28960
- endpointOptions
28961
- ) : slots;
28962
- recordPermanentFailures(finalSlots, 0, permanentFailures);
28963
- return slotValues(finalSlots);
28964
- } catch (error) {
28965
- if (logs) console.log("error in multicall", error);
28966
- options?.onEndpointFailure?.({
28967
- chainId,
28968
- url: endpoint.url,
28969
- rpcId: endpoint.rpcId,
28970
- kind: "transport"
28971
- });
28972
- retries--;
28973
- if (retries < 0) throw new Error("Failed too often");
28974
- await sleep(backoffForRound(0));
28975
- return multicallViemAbiArray(
28976
- chainId,
28977
- abi,
28978
- calls,
28979
- getEvmClient17,
28980
- retry,
28981
- endpoint.rpcId + 1,
28982
- retries,
28983
- allowFailure,
28984
- batchSize,
28985
- logs,
28986
- retryFailed,
28987
- permanentFailures,
28988
- endpointOptions
28989
- );
28990
- }
28991
- };
28992
29113
  var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient17, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false, permanentFailures, options) => {
28993
- if (poolSize <= 1) {
28994
- return multicallViemAbiArray(
28995
- chainId,
28996
- abi,
28997
- calls,
28998
- getEvmClient17,
28999
- true,
29000
- 0,
29001
- retries,
29002
- allowFailure,
29003
- batchSize,
29004
- logs,
29005
- retryFailed,
29006
- permanentFailures,
29007
- options
29008
- );
29009
- }
29010
29114
  const abiIsArray = isArray(abi[0]);
29011
29115
  const contracts = calls.map(({ address, name, params }, i) => ({
29012
29116
  abi: abiIsArray ? abi?.[i] : abi,
@@ -29215,13 +29319,484 @@ function prepareMulticallInputs(abi, calls) {
29215
29319
  abi: abiIsArray ? abi[i] : abi
29216
29320
  }));
29217
29321
  }
29322
+ var POSITION_LENS_V3 = "0xb05B8adB2675A43513A0198B962F5abAF3bc9edf";
29323
+ var LENS_FAMILY = {
29324
+ COMPOUND_V2: 1,
29325
+ SILO: 2,
29326
+ LLAMALEND: 3,
29327
+ /**
29328
+ * Liquity family (Liquity V2 + every fork). Implemented in `PositionLens.sol`
29329
+ * but **not in any deployed contract** — v1 carries families 1-3, and adding a
29330
+ * family changes the creation code and therefore the address.
29331
+ *
29332
+ * Declared here on purpose, and deliberately absent from `V1_FAMILIES`: a
29333
+ * caller that wires this family gets `undefined` from `getPositionLensFor` on
29334
+ * every chain and takes the per-market probe, which is exactly right until a v2
29335
+ * is deployed and the map below is updated per chain.
29336
+ */
29337
+ LIQUITY: 4,
29338
+ /** Aave V2 + V3 (shared `getUserReserveData` shape). Not in any deployed contract. */
29339
+ AAVE: 5,
29340
+ /** Compound V3 / Comet. Not in any deployed contract. */
29341
+ COMET: 6,
29342
+ /**
29343
+ * Morpho Blue + Lista/Moolah, ported from the standalone `MorphoLens` so both
29344
+ * can share ONE address. The packed layout is byte-identical to that contract's
29345
+ * `getUserDataCompact` — verified against the live deployment — so the existing
29346
+ * decoder keeps working unchanged. Not in any deployed PositionLens yet: until
29347
+ * one declares it, Morpho keeps using `MORPHO_LENS`.
29348
+ */
29349
+ MORPHO: 7,
29350
+ /** Aave V4, per spoke. Not in any deployed contract. */
29351
+ AAVE_V4: 8,
29352
+ /** Term Finance. Not in any deployed contract. */
29353
+ TERM: 9,
29354
+ /** Inverse FiRM. Not in any deployed contract. */
29355
+ INVERSE: 10,
29356
+ /** Fraxlend. Not in any deployed contract. */
29357
+ FRAXLEND: 11,
29358
+ /** River (Satoshi). Not in any deployed contract. */
29359
+ RIVER: 12,
29360
+ /** Morpho Midnight. Not in any deployed contract. */
29361
+ MIDNIGHT: 13,
29362
+ /**
29363
+ * Teller — DISCOVERY FOLDED IN. Its builder costs ~1.7 s across six chains and
29364
+ * issues zero batch calls: it is entirely pre-flight. Not deployed yet.
29365
+ */
29366
+ TELLER: 14,
29367
+ /**
29368
+ * Resupply — discovery folded in, and the roster is read from the chain: there
29369
+ * is no published pair list, `getAllPairAddresses` IS the discovery. Not
29370
+ * deployed yet.
29371
+ */
29372
+ RESUPPLY: 15
29373
+ };
29374
+ var V3_WITHHELD = /* @__PURE__ */ new Set([
29375
+ LENS_FAMILY.AAVE,
29376
+ LENS_FAMILY.AAVE_V4
29377
+ ]);
29378
+ var V3_FAMILIES = new Set(
29379
+ Object.values(LENS_FAMILY).filter(
29380
+ (f) => !V3_WITHHELD.has(f)
29381
+ )
29382
+ );
29383
+ var v3 = () => ({
29384
+ address: POSITION_LENS_V3,
29385
+ families: V3_FAMILIES
29386
+ });
29387
+ var POSITION_LENS = {
29388
+ [Chain.ETHEREUM_MAINNET]: v3(),
29389
+ [Chain.ARBITRUM_ONE]: v3(),
29390
+ [Chain.AVALANCHE_C_CHAIN]: v3(),
29391
+ [Chain.BNB_SMART_CHAIN_MAINNET]: v3(),
29392
+ [Chain.BASE]: v3(),
29393
+ [Chain.SONIC_MAINNET]: v3(),
29394
+ [Chain.SEI_NETWORK]: v3(),
29395
+ [Chain.KATANA]: v3(),
29396
+ [Chain.HYPEREVM]: v3(),
29397
+ [Chain.MANTLE]: v3(),
29398
+ [Chain.XDC_NETWORK]: v3(),
29399
+ [Chain.OP_MAINNET]: v3(),
29400
+ [Chain.POLYGON_MAINNET]: v3(),
29401
+ [Chain.LINEA]: v3(),
29402
+ [Chain.SONEIUM]: v3(),
29403
+ [Chain.PLASMA_MAINNET]: v3(),
29404
+ [Chain.HEMI_NETWORK]: v3(),
29405
+ [Chain.SCROLL]: v3(),
29406
+ [Chain.FLARE_MAINNET]: v3(),
29407
+ [Chain.KAIA_MAINNET]: v3()
29408
+ };
29409
+ var getPositionLensFor = (chainId, family) => {
29410
+ const dep = POSITION_LENS[chainId];
29411
+ if (!dep || !dep.families.has(family)) return void 0;
29412
+ return dep.address;
29413
+ };
29414
+ var PositionLensAbi = [
29415
+ {
29416
+ inputs: [
29417
+ {
29418
+ components: [
29419
+ { name: "family", type: "uint8" },
29420
+ { name: "payload", type: "bytes" }
29421
+ ],
29422
+ name: "queries",
29423
+ type: "tuple[]"
29424
+ },
29425
+ { name: "user", type: "address" }
29426
+ ],
29427
+ name: "getUserData",
29428
+ outputs: [{ name: "", type: "bytes[]" }],
29429
+ stateMutability: "nonpayable",
29430
+ type: "function"
29431
+ }
29432
+ ];
29433
+ var WORD = 32;
29434
+ function readBE(buf, off, len) {
29435
+ let v = 0n;
29436
+ for (let i = 0; i < len; i++) v = v << 8n | BigInt(buf[off + i]);
29437
+ return v;
29438
+ }
29439
+ function asInt256(v) {
29440
+ return v >= 1n << 255n ? v - (1n << 256n) : v;
29441
+ }
29442
+ function toBytes2(hex) {
29443
+ const h = hex.startsWith("0x") ? hex.slice(2) : hex;
29444
+ if (h.length === 0) return new Uint8Array(0);
29445
+ const out = new Uint8Array(h.length / 2);
29446
+ for (let i = 0; i < out.length; i++) out[i] = parseInt(h.slice(i * 2, i * 2 + 2), 16);
29447
+ return out;
29448
+ }
29449
+ function decodeLensRows(blob, wordCount, headerBytes = 0, flagBytes = 1) {
29450
+ const buf = toBytes2(blob);
29451
+ const minimum = headerBytes + 2;
29452
+ if (buf.length < minimum) {
29453
+ throw new Error(`position-lens: blob too short (${buf.length} < ${minimum})`);
29454
+ }
29455
+ const header = buf.slice(0, headerBytes);
29456
+ const count = Number(readBE(buf, headerBytes, 2));
29457
+ const entrySize = 2 + flagBytes + wordCount * WORD;
29458
+ const expected = minimum + count * entrySize;
29459
+ if (buf.length !== expected) {
29460
+ throw new Error(
29461
+ `position-lens: blob is ${buf.length} bytes, expected ${expected} for ${count} rows of ${wordCount} words`
29462
+ );
29463
+ }
29464
+ const rows = [];
29465
+ let off = minimum;
29466
+ for (let i = 0; i < count; i++) {
29467
+ const index = Number(readBE(buf, off, 2));
29468
+ const flags = flagBytes === 1 ? Number(readBE(buf, off + 2, 1)) : 0;
29469
+ off += 2 + flagBytes;
29470
+ const words = [];
29471
+ for (let k = 0; k < wordCount; k++) {
29472
+ words.push(readBE(buf, off, WORD));
29473
+ off += WORD;
29474
+ }
29475
+ rows.push({ index, flags, words });
29476
+ }
29477
+ return { header, rows };
29478
+ }
29479
+
29480
+ // src/lending/user-data/aave-v3-type/lens.ts
29481
+ var ZERO2 = "0x0000000000000000000000000000000000000000";
29482
+ var AAVE_LENS_HEADER_BYTES = 3;
29483
+ var HEADER_EMODE_OK = 1;
29484
+ var HEADER_CONFIG_OK = 2;
29485
+ var AAVE_LENS_WORDS = 7;
29486
+ var reserveTuple = (tokens, asset) => {
29487
+ const t = tokens?.[asset.toLowerCase()];
29488
+ if (!t?.aToken || !t?.vToken) return void 0;
29489
+ return [asset, t.aToken, t.vToken, t.sToken ?? ZERO2];
29490
+ };
29491
+ var usesAaveLens = (chainId, lender) => {
29492
+ if (getPositionLensFor(chainId, LENS_FAMILY.AAVE) === void 0) return false;
29493
+ if (!getAaveTypePoolDataProviderAddress(chainId, lender) || !getAaveTypePoolAddress(chainId, lender)) {
29494
+ return false;
29495
+ }
29496
+ const tokens = aaveTokens()?.[lender]?.[chainId];
29497
+ if (!tokens) return false;
29498
+ const assets = getAaveAssets(chainId, lender);
29499
+ if (assets.length === 0) return false;
29500
+ return assets.every((a) => reserveTuple(tokens, a) !== void 0);
29501
+ };
29502
+ var buildAaveLensCall = (chainId, lender, account, assetsToQuery, withEMode) => {
29503
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.AAVE);
29504
+ if (!lens) return [];
29505
+ const tokens = aaveTokens()?.[lender]?.[chainId] ?? {};
29506
+ const reserves = [];
29507
+ for (const asset of assetsToQuery) {
29508
+ const t = reserveTuple(tokens, asset);
29509
+ if (!t) return [];
29510
+ reserves.push(t);
29511
+ }
29512
+ const payload = encodeAbiParameters(
29513
+ parseAbiParameters("(address,address,address,address)[], address, address"),
29514
+ [
29515
+ reserves,
29516
+ getAaveTypePoolDataProviderAddress(chainId, lender),
29517
+ // A zero pool disables the e-mode read, which is exactly what YLDR wants:
29518
+ // it has no `getUserEMode` and the walk omits that call for it too.
29519
+ withEMode ? getAaveTypePoolAddress(chainId, lender) : ZERO2
29520
+ ]
29521
+ );
29522
+ return [
29523
+ {
29524
+ address: lens,
29525
+ name: "getUserData",
29526
+ params: [[{ family: LENS_FAMILY.AAVE, payload }], account],
29527
+ abi: PositionLensAbi
29528
+ }
29529
+ ];
29530
+ };
29531
+ var rebuildAaveReserveData = (blobs, assetCount, withEMode) => {
29532
+ if (isFailedCall(blobs) || !Array.isArray(blobs) || blobs.length !== 1) {
29533
+ return void 0;
29534
+ }
29535
+ let decoded;
29536
+ try {
29537
+ decoded = decodeLensRows(
29538
+ blobs[0],
29539
+ AAVE_LENS_WORDS,
29540
+ AAVE_LENS_HEADER_BYTES,
29541
+ 1
29542
+ );
29543
+ } catch {
29544
+ return void 0;
29545
+ }
29546
+ const { header, rows } = decoded;
29547
+ const eModeOk = (header[0] & HEADER_EMODE_OK) !== 0;
29548
+ if (withEMode && !eModeOk) return void 0;
29549
+ const eMode = header[1] << 8 | header[2];
29550
+ void ((header[0] & HEADER_CONFIG_OK) !== 0);
29551
+ const out = Array.from({ length: assetCount }, () => [
29552
+ 0n,
29553
+ 0n,
29554
+ 0n,
29555
+ 0n,
29556
+ 0n,
29557
+ 0n,
29558
+ 0n,
29559
+ 0n,
29560
+ false
29561
+ ]);
29562
+ for (const r of rows) {
29563
+ if (r.index >= assetCount) return void 0;
29564
+ const [
29565
+ aTokenBalance,
29566
+ stableDebt,
29567
+ variableDebt,
29568
+ principalStable,
29569
+ scaledVariable,
29570
+ stableRate
29571
+ ] = r.words;
29572
+ out[r.index] = [
29573
+ aTokenBalance,
29574
+ stableDebt,
29575
+ variableDebt,
29576
+ principalStable,
29577
+ scaledVariable,
29578
+ stableRate,
29579
+ 0n,
29580
+ // liquidityRate — see the note above
29581
+ 0n,
29582
+ // stableRateLastUpdated
29583
+ (r.flags & 1) === 1
29584
+ ];
29585
+ }
29586
+ if (withEMode) out.push(eMode);
29587
+ return out;
29588
+ };
29589
+
29590
+ // src/lending/user-data/aave-v3-type/userCallBuild.ts
29591
+ var getBaseAaveV3Calls = (chainId, account, lender, assetsToQuery) => {
29592
+ return assetsToQuery.flatMap((tk) => [
29593
+ {
29594
+ address: getAaveTypePoolDataProviderAddress(chainId, lender),
29595
+ name: "getUserReserveData",
29596
+ params: [tk, account]
29597
+ }
29598
+ ]);
29599
+ };
29600
+ var buildAaveV3UserCall = (chainId, lender, account) => {
29601
+ const assetsToQuery = getAaveAssets(chainId, lender).sort(
29602
+ (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())
29603
+ );
29604
+ const withEMode = !isYLDR(lender);
29605
+ if (withEMode && usesAaveLens(chainId, lender)) {
29606
+ return buildAaveLensCall(
29607
+ chainId,
29608
+ lender,
29609
+ account,
29610
+ assetsToQuery,
29611
+ withEMode
29612
+ );
29613
+ }
29614
+ const calls = [...getBaseAaveV3Calls(chainId, account, lender, assetsToQuery)];
29615
+ if (withEMode) {
29616
+ const callDataEmode = {
29617
+ address: getAaveTypePoolAddress(chainId, lender),
29618
+ name: "getUserEMode",
29619
+ params: [account]
29620
+ };
29621
+ calls.push(callDataEmode);
29622
+ }
29623
+ return calls;
29624
+ };
29625
+ var buildInitUserCall = (chainId, lender, account) => {
29626
+ const lensContract = getInitLensAddress(chainId);
29627
+ const calls = [];
29628
+ const legacyBroker = InitMarginAddresses.getLegacyFlashAggregator(chainId);
29629
+ if (legacyBroker) {
29630
+ calls.push({
29631
+ address: lensContract,
29632
+ name: "getUserPositionData",
29633
+ params: [account, legacyBroker]
29634
+ });
29635
+ }
29636
+ const currentBroker = InitMarginAddresses.getFlashAggregator(chainId);
29637
+ if (currentBroker) {
29638
+ calls.push({
29639
+ address: lensContract,
29640
+ name: "getUserPositionData",
29641
+ params: [account, currentBroker]
29642
+ });
29643
+ }
29644
+ return calls;
29645
+ };
29646
+
29647
+ // src/lending/user-data/compound-v3/lens.ts
29648
+ var HEADER_BYTES = 64;
29649
+ var ROW_BYTES = 18;
29650
+ var usesCometLens = (chainId, lender) => getPositionLensFor(chainId, LENS_FAMILY.COMET) !== void 0 && !!getCompoundV3CometAddress(chainId, lender);
29651
+ var buildCometLensCall = (chainId, comet, collaterals, account) => {
29652
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.COMET);
29653
+ if (!lens || !comet || collaterals.some((c) => !c)) return [];
29654
+ const payload = encodeAbiParameters(
29655
+ parseAbiParameters("address, address[]"),
29656
+ [comet, collaterals]
29657
+ );
29658
+ return [
29659
+ {
29660
+ address: lens,
29661
+ name: "getUserData",
29662
+ params: [[{ family: LENS_FAMILY.COMET, payload }], account],
29663
+ abi: PositionLensAbi
29664
+ }
29665
+ ];
29666
+ };
29667
+ var rebuildCometData = (blobs, collateralCount) => {
29668
+ if (isFailedCall(blobs) || !Array.isArray(blobs) || blobs.length !== 1) {
29669
+ return void 0;
29670
+ }
29671
+ const hex = blobs[0];
29672
+ if (typeof hex !== "string" || !hex.startsWith("0x")) return void 0;
29673
+ const buf = Buffer.from(hex.slice(2), "hex");
29674
+ if (buf.length < HEADER_BYTES + 2) return void 0;
29675
+ const word = (off2) => BigInt("0x" + buf.subarray(off2, off2 + 32).toString("hex"));
29676
+ const baseSupply = word(0);
29677
+ const baseBorrow = word(32);
29678
+ const count = buf.readUInt16BE(HEADER_BYTES);
29679
+ if (buf.length !== HEADER_BYTES + 2 + count * ROW_BYTES) return void 0;
29680
+ const out = Array.from({ length: collateralCount }, () => [0n, 0n]);
29681
+ let off = HEADER_BYTES + 2;
29682
+ for (let i = 0; i < count; i++) {
29683
+ const index = buf.readUInt16BE(off);
29684
+ if (index >= collateralCount) return void 0;
29685
+ const balance = BigInt("0x" + buf.subarray(off + 2, off + 18).toString("hex"));
29686
+ out[index] = [balance, 0n];
29687
+ off += ROW_BYTES;
29688
+ }
29689
+ out.push(baseSupply, baseBorrow);
29690
+ return out;
29691
+ };
29692
+
29693
+ // src/lending/user-data/compound-v3/userCallBuild.ts
29694
+ var buildCompoundV3UserCall = (chainId, lender, account) => {
29695
+ const baseAsset = getCompoundV3BaseAsset(lender, chainId)?.baseAsset;
29696
+ const cometContractAddress = getCompoundV3CometAddress(chainId, lender);
29697
+ const assets = getLenderAssets(chainId, lender).sort(
29698
+ (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())
29699
+ );
29700
+ const assetsNoBase = assets.filter((a) => a !== baseAsset);
29701
+ const baseCalls = [
29702
+ {
29703
+ address: cometContractAddress,
29704
+ name: "balanceOf",
29705
+ params: [account]
29706
+ },
29707
+ {
29708
+ address: cometContractAddress,
29709
+ name: "borrowBalanceOf",
29710
+ params: [account]
29711
+ }
29712
+ ];
29713
+ const callsNonBase = assetsNoBase.map((tk) => {
29714
+ return {
29715
+ address: cometContractAddress,
29716
+ name: "userCollateral",
29717
+ params: [account, tk]
29718
+ };
29719
+ });
29720
+ const callEarnedBalances = {
29721
+ address: getCompoundV3CometRewardsAddress(chainId),
29722
+ name: "getRewardOwed",
29723
+ params: [cometContractAddress, account]
29724
+ };
29725
+ if (usesCometLens(chainId, lender)) {
29726
+ const lensCall = buildCometLensCall(
29727
+ chainId,
29728
+ cometContractAddress,
29729
+ assetsNoBase,
29730
+ account
29731
+ );
29732
+ if (lensCall.length) return [...lensCall, callEarnedBalances];
29733
+ }
29734
+ const calls = [...callsNonBase, ...baseCalls, callEarnedBalances];
29735
+ return calls;
29736
+ };
29737
+
29738
+ // src/lending/user-data/compound-v2/userCallBuild.ts
29739
+ var COMPOUND_V2_LENS_WORDS = 3;
29740
+ var COMPOUND_V2_LENS_HEADER_BYTES = 1;
29741
+ var usesCompoundV2Lens = (chainId) => getPositionLensFor(chainId, LENS_FAMILY.COMPOUND_V2) !== void 0;
29742
+ var buildCompoundV2UserCall = (chainId, lender, account) => {
29743
+ const tokens = getCompoundV2Tokens(chainId, lender).sort(
29744
+ (a, b) => a.cToken.toLowerCase().localeCompare(b.cToken.toLowerCase())
29745
+ );
29746
+ const comptroller = getCompoundV2Comptroller(chainId, lender);
29747
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.COMPOUND_V2);
29748
+ if (lens && comptroller && tokens.length > 0) {
29749
+ const payload = encodeAbiParameters(
29750
+ parseAbiParameters("address[], address"),
29751
+ [
29752
+ tokens.map((t) => t.cToken),
29753
+ comptroller
29754
+ ]
29755
+ );
29756
+ return [
29757
+ {
29758
+ address: lens,
29759
+ name: "getUserData",
29760
+ params: [[{ family: LENS_FAMILY.COMPOUND_V2, payload }], account],
29761
+ abi: PositionLensAbi
29762
+ }
29763
+ ];
29764
+ }
29765
+ let calls = tokens.flatMap((tk) => [
29766
+ {
29767
+ address: tk.cToken,
29768
+ name: "balanceOfUnderlying",
29769
+ params: [account]
29770
+ },
29771
+ {
29772
+ address: tk.cToken,
29773
+ name: "borrowBalanceCurrent",
29774
+ params: [account]
29775
+ },
29776
+ {
29777
+ address: tk.cToken,
29778
+ name: "balanceOf",
29779
+ params: [account]
29780
+ }
29781
+ ]);
29782
+ calls = [
29783
+ ...calls,
29784
+ {
29785
+ address: comptroller,
29786
+ name: "getAssetsIn",
29787
+ params: [account]
29788
+ }
29789
+ ];
29790
+ return calls;
29791
+ };
29218
29792
  var getCompoundV2UserDataConverter = (lender, chainId, account, metaMap) => {
29219
29793
  switch (lender) {
29220
29794
  default: {
29221
29795
  const tokens = getCompoundV2Tokens(chainId, lender).sort(
29222
29796
  (a, b) => a.cToken.toLowerCase().localeCompare(b.cToken.toLowerCase())
29223
29797
  );
29224
- const expectedNumberOfCalls = tokens.length * 3 + 1;
29798
+ const viaLens = usesCompoundV2Lens(chainId);
29799
+ const expectedNumberOfCalls = viaLens ? 1 : tokens.length * 3 + 1;
29225
29800
  return [
29226
29801
  (data) => {
29227
29802
  if (data.length !== expectedNumberOfCalls) {
@@ -29230,19 +29805,48 @@ var getCompoundV2UserDataConverter = (lender, chainId, account, metaMap) => {
29230
29805
  const lendingPositions = {};
29231
29806
  let totalDebt24h = 0;
29232
29807
  let totalDeposits24h = 0;
29233
- const assetsInRaw = data[data.length - 1];
29234
- if (isFailedCall(assetsInRaw) || !Array.isArray(assetsInRaw)) {
29235
- return void 0;
29808
+ let states;
29809
+ if (viaLens) {
29810
+ const blobs = data[0];
29811
+ if (isFailedCall(blobs) || !Array.isArray(blobs) || blobs.length !== 1) {
29812
+ return void 0;
29813
+ }
29814
+ const { header, rows } = decodeLensRows(
29815
+ blobs[0],
29816
+ COMPOUND_V2_LENS_WORDS,
29817
+ COMPOUND_V2_LENS_HEADER_BYTES
29818
+ );
29819
+ if (header[0] !== 1) return void 0;
29820
+ states = new Map(
29821
+ rows.map((r) => [
29822
+ r.index,
29823
+ {
29824
+ deposits: r.words[0],
29825
+ borrows: r.words[1],
29826
+ shares: r.words[2],
29827
+ // bit0 — the market is in `getAssetsIn`. bit1 says the values
29828
+ // are one accrual behind because the market's own
29829
+ // `accrueInterest` reverts (a broken IRM, e.g. 4 of Gamma's 6
29830
+ // BNB markets). Reported rather than dropped: the per-token
29831
+ // walk drops those markets entirely.
29832
+ collateralEnabled: (r.flags & 1) !== 0
29833
+ }
29834
+ ])
29835
+ );
29836
+ } else {
29837
+ const assetsInRaw = data[data.length - 1];
29838
+ if (isFailedCall(assetsInRaw) || !Array.isArray(assetsInRaw)) {
29839
+ return void 0;
29840
+ }
29841
+ const asstsIn = assetsInRaw.map((a) => a.toLowerCase());
29842
+ states = statesFromSlice(data, tokens, asstsIn);
29236
29843
  }
29237
- const asstsIn = assetsInRaw.map((a) => a.toLowerCase());
29238
29844
  for (let i = 0; i < tokens.length; i++) {
29239
29845
  const { cToken } = tokens[i];
29240
29846
  const key3 = createMarketUid(chainId, lender, cToken);
29241
29847
  const { dataForAsset, addedDebt, addedDeposits } = createCompoundV2Entry(
29242
- i,
29243
- data,
29848
+ states.get(i),
29244
29849
  key3,
29245
- asstsIn,
29246
29850
  cToken,
29247
29851
  metaMap[key3],
29248
29852
  0
@@ -29272,18 +29876,33 @@ var getCompoundV2UserDataConverter = (lender, chainId, account, metaMap) => {
29272
29876
  }
29273
29877
  }
29274
29878
  };
29275
- function createCompoundV2Entry(i, data, key3, assetsIn, vToken, meta, claimableRewards) {
29276
- if (isFailedCall(data[3 * i]) || isFailedCall(data[3 * i + 1])) {
29879
+ function statesFromSlice(data, tokens, assetsIn) {
29880
+ const out = /* @__PURE__ */ new Map();
29881
+ for (let i = 0; i < tokens.length; i++) {
29882
+ if (isFailedCall(data[3 * i]) || isFailedCall(data[3 * i + 1])) continue;
29883
+ out.set(i, {
29884
+ deposits: BigInt(data[3 * i].toString()),
29885
+ borrows: BigInt(data[3 * i + 1].toString()),
29886
+ shares: BigInt(data[3 * i + 2]?.toString() ?? "0"),
29887
+ collateralEnabled: Boolean(
29888
+ assetsIn?.includes(tokens[i].cToken.toLowerCase())
29889
+ )
29890
+ });
29891
+ }
29892
+ return out;
29893
+ }
29894
+ function createCompoundV2Entry(st, key3, vToken, meta, claimableRewards) {
29895
+ if (!st) {
29277
29896
  return {
29278
29897
  dataForAsset: void 0,
29279
29898
  addedDeposits: 0,
29280
29899
  addedDebt: 0
29281
29900
  };
29282
29901
  }
29283
- const depositsRaw = data[3 * i].toString();
29284
- const borrowsRaw = data[3 * i + 1].toString();
29285
- const depositShares = data[3 * i + 2].toString();
29286
- const collateralEnabled = Boolean(assetsIn?.includes(vToken));
29902
+ const depositsRaw = st.deposits.toString();
29903
+ const borrowsRaw = st.borrows.toString();
29904
+ const depositShares = st.shares.toString();
29905
+ const collateralEnabled = st.collateralEnabled;
29287
29906
  if (!collateralEnabled && depositsRaw === "0" && borrowsRaw === "0") {
29288
29907
  return {
29289
29908
  dataForAsset: void 0,
@@ -29505,99 +30124,118 @@ var buildAaveV4UserCall = (chainId, lender, account) => {
29505
30124
  }
29506
30125
  return calls;
29507
30126
  };
30127
+ var resolveSiloRoster = (chainId, lender, params) => {
30128
+ const v32 = isSiloV3Type(lender);
30129
+ const entryFor = v32 ? getSiloV3MarketEntry : getSiloV2MarketEntry;
30130
+ const keyFor = v32 ? siloV3LenderKey : siloV2LenderKey;
30131
+ if (Array.isArray(params) && params.length > 0) {
30132
+ const out = [];
30133
+ for (const key3 of params) {
30134
+ const market = entryFor(chainId, key3);
30135
+ if (market) out.push({ key: key3, market });
30136
+ }
30137
+ return out;
30138
+ }
30139
+ const single = entryFor(chainId, lender);
30140
+ if (single) return [{ key: lender, market: single }];
30141
+ const all = (v32 ? siloMarketsV3() : siloMarkets())?.[chainId] ?? [];
30142
+ return all.map((market) => ({ key: keyFor(market.siloConfig), market }));
30143
+ };
30144
+
30145
+ // src/lending/user-data/silo-v2/userCallBuild.ts
29508
30146
  var ASSET_TYPE_PROTECTED = 0;
29509
30147
  var ASSET_TYPE_COLLATERAL = 1;
29510
30148
  var SILO_V2_USER_CALLS_PER_SIDE = 5;
29511
30149
  var SILO_V2_USER_CALLS_PER_PAIR = SILO_V2_USER_CALLS_PER_SIDE * 2;
29512
- var buildSiloV2UserCall = (chainId, lender, account) => {
29513
- const market = getSiloV2MarketEntry(chainId, lender);
29514
- if (!market) return [];
30150
+ var SILO_LENS_WORDS = 10;
30151
+ var usesSiloLens = (chainId) => getPositionLensFor(chainId, LENS_FAMILY.SILO) !== void 0;
30152
+ var buildSiloLensCall = (chainId, roster, account) => {
30153
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.SILO);
30154
+ if (!lens || roster.length === 0) return [];
30155
+ const side = (h) => [
30156
+ h.silo,
30157
+ h.protectedShareToken,
30158
+ h.debtShareToken,
30159
+ Number(h.decimals)
30160
+ ];
30161
+ const payload = encodeAbiParameters(
30162
+ parseAbiParameters(
30163
+ "((address,address,address,uint8),(address,address,address,uint8))[]"
30164
+ ),
30165
+ [roster.map((r) => [side(r.market.silo0), side(r.market.silo1)])]
30166
+ );
30167
+ return [
30168
+ {
30169
+ address: lens,
30170
+ name: "getUserData",
30171
+ params: [[{ family: LENS_FAMILY.SILO, payload }], account],
30172
+ abi: PositionLensAbi
30173
+ }
30174
+ ];
30175
+ };
30176
+ var buildSiloPairCalls = (market, account) => {
29515
30177
  const calls = [];
29516
30178
  for (const half of [market.silo0, market.silo1]) {
29517
30179
  const oneUnit = BigInt(10) ** BigInt(half.decimals);
29518
30180
  calls.push(
29519
- // [0] collateral shares (silo IS the collateral share token)
29520
- {
29521
- address: half.silo,
29522
- name: "balanceOf",
29523
- params: [account]
29524
- },
29525
- // [1] protected shares (separate ERC-20)
30181
+ { address: half.silo, name: "balanceOf", params: [account] },
29526
30182
  {
29527
30183
  address: half.protectedShareToken,
29528
30184
  name: "balanceOf",
29529
30185
  params: [account]
29530
30186
  },
29531
- // [2] collateral rate: assets per unit of collateral shares
29532
30187
  {
29533
30188
  address: half.silo,
29534
30189
  name: "convertToAssets",
29535
30190
  params: [oneUnit, ASSET_TYPE_COLLATERAL],
29536
30191
  abi: SiloConvertToAssetsTypedAbi
29537
30192
  },
29538
- // [3] protected rate: assets per unit of protected shares
29539
30193
  {
29540
30194
  address: half.silo,
29541
30195
  name: "convertToAssets",
29542
30196
  params: [oneUnit, ASSET_TYPE_PROTECTED],
29543
30197
  abi: SiloConvertToAssetsTypedAbi
29544
30198
  },
29545
- // [4] debt position (already in assets, includes accrued interest)
29546
- {
29547
- address: half.silo,
29548
- name: "maxRepay",
29549
- params: [account]
29550
- }
30199
+ { address: half.silo, name: "maxRepay", params: [account] }
29551
30200
  );
29552
30201
  }
29553
30202
  return calls;
29554
30203
  };
29555
- var ASSET_TYPE_PROTECTED2 = 0;
29556
- var ASSET_TYPE_COLLATERAL2 = 1;
29557
- var SILO_V3_USER_CALLS_PER_SIDE = 5;
29558
- var SILO_V3_USER_CALLS_PER_PAIR = SILO_V3_USER_CALLS_PER_SIDE * 2;
29559
- var buildSiloV3UserCall = (chainId, lender, account) => {
29560
- const market = getSiloV3MarketEntry(chainId, lender);
29561
- if (!market) return [];
29562
- const calls = [];
29563
- for (const half of [market.silo0, market.silo1]) {
29564
- const oneUnit = BigInt(10) ** BigInt(half.decimals);
29565
- calls.push(
29566
- // [0] collateral shares (silo IS the collateral share token)
29567
- {
29568
- address: half.silo,
29569
- name: "balanceOf",
29570
- params: [account]
29571
- },
29572
- // [1] protected shares (separate ERC-20)
29573
- {
29574
- address: half.protectedShareToken,
29575
- name: "balanceOf",
29576
- params: [account]
29577
- },
29578
- // [2] collateral rate: assets per unit of collateral shares
29579
- {
29580
- address: half.silo,
29581
- name: "convertToAssets",
29582
- params: [oneUnit, ASSET_TYPE_COLLATERAL2],
29583
- abi: SiloConvertToAssetsTypedAbi
29584
- },
29585
- // [3] protected rate: assets per unit of protected shares
29586
- {
29587
- address: half.silo,
29588
- name: "convertToAssets",
29589
- params: [oneUnit, ASSET_TYPE_PROTECTED2],
29590
- abi: SiloConvertToAssetsTypedAbi
29591
- },
29592
- // [4] debt position (already in assets, includes accrued interest)
30204
+ var buildSiloV2UserCall = (chainId, lender, account, params) => {
30205
+ const roster = resolveSiloRoster(chainId, lender, params);
30206
+ if (roster.length === 0) return [];
30207
+ if (usesSiloLens(chainId)) {
30208
+ return buildSiloLensCall(chainId, roster, account);
30209
+ }
30210
+ return roster.flatMap((r) => buildSiloPairCalls(r.market, account));
30211
+ };
30212
+ var buildSiloV3UserCall = (chainId, lender, account, params) => {
30213
+ const roster = resolveSiloRoster(chainId, lender, params);
30214
+ if (roster.length === 0) return [];
30215
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.SILO);
30216
+ if (lens) {
30217
+ const side = (h) => [
30218
+ h.silo,
30219
+ h.protectedShareToken,
30220
+ h.debtShareToken,
30221
+ Number(h.decimals)
30222
+ ];
30223
+ const payload = encodeAbiParameters(
30224
+ parseAbiParameters(
30225
+ "((address,address,address,uint8),(address,address,address,uint8))[]"
30226
+ ),
30227
+ [roster.map((r) => [side(r.market.silo0), side(r.market.silo1)])]
30228
+ );
30229
+ return [
29593
30230
  {
29594
- address: half.silo,
29595
- name: "maxRepay",
29596
- params: [account]
30231
+ address: lens,
30232
+ name: "getUserData",
30233
+ params: [[{ family: LENS_FAMILY.SILO, payload }], account],
30234
+ abi: PositionLensAbi
29597
30235
  }
29598
- );
30236
+ ];
29599
30237
  }
29600
- return calls;
30238
+ return roster.flatMap((r) => buildSiloPairCalls(r.market, account));
29601
30239
  };
29602
30240
  var FLUID_USER_CALL_COUNT = 1;
29603
30241
  var buildFluidUserCall = (chainId, _lender, account) => {
@@ -29796,6 +30434,65 @@ var buildExactlyUserCall = (chainId, _lender, account) => {
29796
30434
  var OWNER_INDEX_PROBE_COUNT = 8;
29797
30435
  var CACHE_TTL_MS = 5 * 6e4;
29798
30436
  var discoveryCache = /* @__PURE__ */ new Map();
30437
+ async function discoverViaLens(chainId, branches, zappers, account) {
30438
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.LIQUITY);
30439
+ if (!lens) return void 0;
30440
+ const payload = encodeAbiParameters(
30441
+ [
30442
+ {
30443
+ type: "tuple[]",
30444
+ components: [
30445
+ { name: "troveNFT", type: "address" },
30446
+ { name: "troveManager", type: "address" }
30447
+ ]
30448
+ },
30449
+ { type: "address[]" },
30450
+ { type: "uint8" }
30451
+ ],
30452
+ [
30453
+ branches.map((b) => ({
30454
+ troveNFT: b.troveNFT,
30455
+ troveManager: b.troveManager
30456
+ })),
30457
+ zappers,
30458
+ OWNER_INDEX_PROBE_COUNT
30459
+ ]
30460
+ );
30461
+ let blobs;
30462
+ try {
30463
+ const res = await multicallRetryUniversal({
30464
+ chain: chainId,
30465
+ calls: [
30466
+ {
30467
+ address: lens,
30468
+ name: "getUserData",
30469
+ params: [[{ family: LENS_FAMILY.LIQUITY, payload }], account]
30470
+ }
30471
+ ],
30472
+ abi: PositionLensAbi,
30473
+ allowFailure: true
30474
+ });
30475
+ blobs = res?.[0];
30476
+ } catch {
30477
+ return void 0;
30478
+ }
30479
+ if (!Array.isArray(blobs) || blobs.length !== 1) return void 0;
30480
+ let rows;
30481
+ try {
30482
+ rows = decodeLensRows(blobs[0], 1, 0, 1).rows;
30483
+ } catch {
30484
+ return void 0;
30485
+ }
30486
+ const perBranch = branches.map(() => []);
30487
+ for (const r of rows) {
30488
+ if (r.index >= branches.length) return void 0;
30489
+ perBranch[r.index].push({
30490
+ troveId: r.words[0].toString(),
30491
+ zombie: (r.flags & 1) !== 0
30492
+ });
30493
+ }
30494
+ return perBranch;
30495
+ }
29799
30496
  var cacheKey = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
29800
30497
  var getCachedLiquityTroves = (chainId, lender, account) => {
29801
30498
  const hit = discoveryCache.get(cacheKey(chainId, lender, account));
@@ -29847,7 +30544,20 @@ var buildLiquityUserCall = async (chainId, lender, account) => {
29847
30544
  const cfg = liquityConfigFor(lender, chainId);
29848
30545
  const branches = liquityBranchesByChain(lender, chainId);
29849
30546
  if (!cfg || branches.length === 0) return [];
29850
- const candidates = liquityCandidateTroveIds(account, cfg.zappers ?? []);
30547
+ const zappers = cfg.zappers ?? [];
30548
+ let perBranch = await discoverViaLens(chainId, branches, zappers, account);
30549
+ if (!perBranch) {
30550
+ perBranch = await discoverByProbing(chainId, branches, zappers, account);
30551
+ if (!perBranch) return [];
30552
+ }
30553
+ discoveryCache.set(cacheKey(chainId, lender, account), {
30554
+ perBranch,
30555
+ at: Date.now()
30556
+ });
30557
+ return buildDataPhaseCalls(branches, perBranch, account);
30558
+ };
30559
+ async function discoverByProbing(chainId, branches, zappers, account) {
30560
+ const candidates = liquityCandidateTroveIds(account, zappers);
29851
30561
  let statuses = [];
29852
30562
  try {
29853
30563
  statuses = await multicallRetryUniversal({
@@ -29863,9 +30573,9 @@ var buildLiquityUserCall = async (chainId, lender, account) => {
29863
30573
  allowFailure: true
29864
30574
  });
29865
30575
  } catch {
29866
- return [];
30576
+ return void 0;
29867
30577
  }
29868
- const perBranch = branches.map(
30578
+ return branches.map(
29869
30579
  (_3, bi) => candidates.map((id, ci) => {
29870
30580
  const r = statuses[bi * candidates.length + ci];
29871
30581
  const status = typeof r === "bigint" || typeof r === "number" ? Number(r) : 0;
@@ -29873,10 +30583,8 @@ var buildLiquityUserCall = async (chainId, lender, account) => {
29873
30583
  return { troveId: id, zombie: status === 4 };
29874
30584
  }).filter((t) => !!t)
29875
30585
  );
29876
- discoveryCache.set(cacheKey(chainId, lender, account), {
29877
- perBranch,
29878
- at: Date.now()
29879
- });
30586
+ }
30587
+ function buildDataPhaseCalls(branches, perBranch, account) {
29880
30588
  const calls = [];
29881
30589
  branches.forEach((b, bi) => {
29882
30590
  for (const t of perBranch[bi]) {
@@ -29916,7 +30624,7 @@ var buildLiquityUserCall = async (chainId, lender, account) => {
29916
30624
  }
29917
30625
  });
29918
30626
  return calls;
29919
- };
30627
+ }
29920
30628
  var RIVER_CALLS_PER_MARKET = 3;
29921
30629
  var buildRiverUserCall = (chainId, lender, account) => {
29922
30630
  const cfg = riverConfigFor(lender, chainId);
@@ -29938,12 +30646,42 @@ var buildRiverUserCall = (chainId, lender, account) => {
29938
30646
  });
29939
30647
  return calls;
29940
30648
  };
30649
+ var ZERO3 = "0x0000000000000000000000000000000000000000";
30650
+ var LLAMALEND_LENS_WORDS = 12;
29941
30651
  var LLAMALEND_CALLS_PER_MARKET = 8;
30652
+ var usesLlamaLendLens = (chainId) => getPositionLensFor(chainId, LENS_FAMILY.LLAMALEND) !== void 0;
30653
+ var buildLlamaLendLensCall = (chainId, markets, account, delegate) => {
30654
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.LLAMALEND);
30655
+ if (!lens) return [];
30656
+ const payload = encodeAbiParameters(
30657
+ parseAbiParameters("(address,address,address,address)[], address"),
30658
+ [
30659
+ markets.map((m) => [
30660
+ m.controller,
30661
+ m.amm,
30662
+ m.vault,
30663
+ m.gauge ?? ZERO3
30664
+ ]),
30665
+ delegate
30666
+ ]
30667
+ );
30668
+ return [
30669
+ {
30670
+ address: lens,
30671
+ name: "getUserData",
30672
+ params: [[{ family: LENS_FAMILY.LLAMALEND, payload }], account],
30673
+ abi: PositionLensAbi
30674
+ }
30675
+ ];
30676
+ };
29942
30677
  var buildLlamaLendUserCall = (chainId, lender, account, spender) => {
29943
30678
  const cfg = llamaLendConfigFor(lender, chainId);
29944
30679
  const markets = llamaLendChainData(lender, chainId)?.markets ?? [];
29945
30680
  if (!cfg || markets.length === 0) return [];
29946
30681
  const delegate = account;
30682
+ if (usesLlamaLendLens(chainId)) {
30683
+ return buildLlamaLendLensCall(chainId, markets, account, delegate);
30684
+ }
29947
30685
  return markets.flatMap((m) => [
29948
30686
  { address: m.controller, name: "user_state", params: [account] },
29949
30687
  { address: m.controller, name: "health", params: [account, true] },
@@ -29961,6 +30699,70 @@ var buildLlamaLendUserCall = (chainId, lender, account, spender) => {
29961
30699
  { address: m.vault, name: "convertToAssets", params: [10n ** 18n] }
29962
30700
  ]);
29963
30701
  };
30702
+
30703
+ // src/lending/user-data/inverse/lens.ts
30704
+ var HEADER_BYTES2 = 128;
30705
+ var WORDS = 4;
30706
+ var usesInverseLens = (chainId) => getPositionLensFor(chainId, LENS_FAMILY.INVERSE) !== void 0;
30707
+ var buildInverseLensCall = (chainId, markets, dbr, account) => {
30708
+ const lens = getPositionLensFor(chainId, LENS_FAMILY.INVERSE);
30709
+ if (!lens || !dbr || markets.some((m) => !m.address || !m.escrowImplementation)) {
30710
+ return [];
30711
+ }
30712
+ const payload = encodeAbiParameters(
30713
+ [
30714
+ {
30715
+ type: "tuple[]",
30716
+ components: [
30717
+ { name: "market", type: "address" },
30718
+ { name: "escrow", type: "address" }
30719
+ ]
30720
+ },
30721
+ { type: "address" }
30722
+ ],
30723
+ [
30724
+ markets.map((m) => ({
30725
+ market: m.address,
30726
+ escrow: predictInverseEscrow(
30727
+ m.address,
30728
+ m.escrowImplementation,
30729
+ account
30730
+ )
30731
+ })),
30732
+ dbr
30733
+ ]
30734
+ );
30735
+ return [
30736
+ {
30737
+ address: lens,
30738
+ name: "getUserData",
30739
+ params: [[{ family: LENS_FAMILY.INVERSE, payload }], account],
30740
+ abi: PositionLensAbi
30741
+ }
30742
+ ];
30743
+ };
30744
+ var rebuildInverseData = (blobs, marketCount) => {
30745
+ if (isFailedCall(blobs) || !Array.isArray(blobs) || blobs.length !== 1) {
30746
+ return void 0;
30747
+ }
30748
+ let decoded;
30749
+ try {
30750
+ decoded = decodeLensRows(blobs[0], WORDS, HEADER_BYTES2, 0);
30751
+ } catch {
30752
+ return void 0;
30753
+ }
30754
+ const { header, rows } = decoded;
30755
+ const out = new Array(marketCount * 4).fill(0n);
30756
+ for (const r of rows) {
30757
+ if (r.index >= marketCount) return void 0;
30758
+ for (let k = 0; k < 4; k++) out[r.index * 4 + k] = r.words[k];
30759
+ }
30760
+ const word = (i) => BigInt("0x" + Buffer.from(header.slice(i * 32, i * 32 + 32)).toString("hex"));
30761
+ out.push(word(0), word(1), word(2), word(3));
30762
+ return out;
30763
+ };
30764
+
30765
+ // src/lending/user-data/inverse/userCallBuild.ts
29964
30766
  var INVERSE_CALLS_PER_MARKET = 4;
29965
30767
  var INVERSE_TAIL_CALLS = 4;
29966
30768
  var proxyInitCode = (impl) => concat([
@@ -29980,6 +30782,15 @@ var buildInverseUserCall = (chainId, lender, account) => {
29980
30782
  const cfg = inverseConfigFor(lender, chainId);
29981
30783
  const markets = inverseChainData(lender, chainId)?.markets ?? [];
29982
30784
  if (!cfg || markets.length === 0) return [];
30785
+ if (usesInverseLens(chainId)) {
30786
+ const lensCall = buildInverseLensCall(
30787
+ chainId,
30788
+ markets,
30789
+ cfg.dbr,
30790
+ account
30791
+ );
30792
+ if (lensCall.length) return lensCall;
30793
+ }
29983
30794
  const calls = markets.flatMap((m) => [
29984
30795
  {
29985
30796
  address: predictInverseEscrow(
@@ -30699,7 +31510,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
30699
31510
  }
30700
31511
  return calls;
30701
31512
  };
30702
- var TERMMAX_CALLS_PER_ACCOUNT = 1;
31513
+ var TERMMAX_MARKETS_PER_CALL = 180;
30703
31514
  var CACHE_TTL_MS4 = 5 * 6e4;
30704
31515
  var discoveryCache8 = /* @__PURE__ */ new Map();
30705
31516
  var cacheKey5 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
@@ -30711,27 +31522,48 @@ var getCachedTermMaxDiscovery = (chainId, account) => {
30711
31522
  var buildTermMaxUserCall = async (chainId, _lender, account) => {
30712
31523
  const proto = termMaxConfigByChain(chainId);
30713
31524
  if (!proto?.viewer) return [];
30714
- let markets = getCachedTermMaxMarkets(chainId);
30715
- if (markets.length === 0) {
31525
+ let live = getCachedTermMaxMarkets(chainId);
31526
+ if (live.length === 0) {
30716
31527
  try {
30717
- markets = (await fetchTermMaxMarkets(chainId)).map((m) => m.config);
31528
+ live = (await fetchTermMaxMarkets(chainId)).map((m) => m.config);
30718
31529
  } catch {
30719
- return [];
31530
+ live = [];
30720
31531
  }
30721
31532
  }
31533
+ const matured = getTermMaxMaturedResidue(chainId);
31534
+ const seen = /* @__PURE__ */ new Set();
31535
+ const markets = [...live, ...matured].filter((m) => {
31536
+ const k = m.market.toLowerCase();
31537
+ if (seen.has(k)) return false;
31538
+ seen.add(k);
31539
+ return true;
31540
+ });
30722
31541
  if (markets.length === 0) {
30723
- discoveryCache8.set(cacheKey5(chainId, account), { markets: [], at: Date.now() });
31542
+ discoveryCache8.set(cacheKey5(chainId, account), {
31543
+ markets: [],
31544
+ chunks: 0,
31545
+ at: Date.now()
31546
+ });
30724
31547
  return [];
30725
31548
  }
30726
- markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
30727
- discoveryCache8.set(cacheKey5(chainId, account), { markets, at: Date.now() });
30728
- return [
30729
- {
31549
+ markets.sort((a, b) => a.market.localeCompare(b.market));
31550
+ const calls = [];
31551
+ for (let i = 0; i < markets.length; i += TERMMAX_MARKETS_PER_CALL) {
31552
+ calls.push({
30730
31553
  address: proto.viewer,
30731
31554
  name: "getPositionDetails",
30732
- params: [markets.map((m) => m.market), account]
30733
- }
30734
- ];
31555
+ params: [
31556
+ markets.slice(i, i + TERMMAX_MARKETS_PER_CALL).map((m) => m.market),
31557
+ account
31558
+ ]
31559
+ });
31560
+ }
31561
+ discoveryCache8.set(cacheKey5(chainId, account), {
31562
+ markets,
31563
+ chunks: calls.length,
31564
+ at: Date.now()
31565
+ });
31566
+ return calls;
30735
31567
  };
30736
31568
 
30737
31569
  // src/lending/user-data/fetch-balances/prepare.ts
@@ -30776,8 +31608,10 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
30776
31608
  account,
30777
31609
  params?.subAccountIndexes
30778
31610
  );
30779
- if (isSiloV2Type(lender)) return buildSiloV2UserCall(chainId, lender, account);
30780
- if (isSiloV3Type(lender)) return buildSiloV3UserCall(chainId, lender, account);
31611
+ if (isSiloV2Type(lender))
31612
+ return buildSiloV2UserCall(chainId, lender, account, params);
31613
+ if (isSiloV3Type(lender))
31614
+ return buildSiloV3UserCall(chainId, lender, account, params);
30781
31615
  if (isCompoundV2Type(lender))
30782
31616
  return buildCompoundV2UserCall(chainId, lender, account);
30783
31617
  if (isFluid(lender)) return buildFluidUserCall(chainId, lender, account);
@@ -30805,11 +31639,13 @@ function organizeUserQueries(queries) {
30805
31639
  const usdd = queries.filter((q) => isUsdd(q.lender));
30806
31640
  const sky = queries.filter((q) => isSky(q.lender));
30807
31641
  const llamaLend = queries.filter((q) => isLlamaLend(q.lender));
31642
+ const siloV2 = queries.filter((q) => isSiloV2Type(q.lender));
31643
+ const siloV3 = queries.filter((q) => isSiloV3Type(q.lender));
30808
31644
  const frankencoin = queries.filter((q) => isFrankencoin(q.lender));
30809
- if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0 && sky.length === 0 && frankencoin.length === 0 && llamaLend.length === 0)
31645
+ if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0 && sky.length === 0 && frankencoin.length === 0 && llamaLend.length === 0 && siloV2.length === 0 && siloV3.length === 0)
30810
31646
  return queries;
30811
31647
  const others = queries.filter(
30812
- (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isDssType(q.lender) && !isFrankencoin(q.lender) && !isLlamaLend(q.lender)
31648
+ (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isDssType(q.lender) && !isFrankencoin(q.lender) && !isLlamaLend(q.lender) && !isSiloV2Type(q.lender) && !isSiloV3Type(q.lender)
30813
31649
  );
30814
31650
  const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
30815
31651
  const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
@@ -30894,6 +31730,22 @@ function organizeUserQueries(queries) {
30894
31730
  assets: void 0
30895
31731
  });
30896
31732
  }
31733
+ if (siloV2.length > 0) {
31734
+ result.push({
31735
+ lender: "SILO_V2",
31736
+ account: siloV2[0].account,
31737
+ params: siloV2.map((p) => p.lender),
31738
+ assets: void 0
31739
+ });
31740
+ }
31741
+ if (siloV3.length > 0) {
31742
+ result.push({
31743
+ lender: "SILO_V3",
31744
+ account: siloV3[0].account,
31745
+ params: siloV3.map((p) => p.lender),
31746
+ assets: void 0
31747
+ });
31748
+ }
30897
31749
  if (llamaLend.length > 0) {
30898
31750
  result.push({
30899
31751
  lender: Lender.LLAMALEND,
@@ -31025,20 +31877,24 @@ function createAaveV2Entry(i, data, key3, meta, claimableRewards) {
31025
31877
  addedDebt: (Number(currentVariableDebt) + Number(currentStableDebt)) * priceHist
31026
31878
  };
31027
31879
  }
31028
-
31029
- // src/lending/user-data/aave-v3-type/userCallParse.ts
31030
31880
  var getAaveV3UserDataConverter = (lender, chainId, account, metaMap) => {
31031
31881
  const assetsToQuery = getAaveAssets(chainId, lender).sort(
31032
31882
  (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())
31033
31883
  );
31034
- const expectedNumberOfCalls = assetsToQuery.length + 1;
31884
+ const withEMode = !isYLDR(lender);
31885
+ const viaLens = usesAaveLens(chainId, lender);
31886
+ const walkCalls = assetsToQuery.length + (withEMode ? 1 : 0);
31887
+ const expectedNumberOfCalls = viaLens ? 1 : walkCalls;
31035
31888
  return [
31036
- (data) => {
31037
- if (data.length !== expectedNumberOfCalls) {
31889
+ (raw) => {
31890
+ if (raw.length !== expectedNumberOfCalls) {
31038
31891
  return void 0;
31039
31892
  }
31040
- const rawEMode = Number(data[expectedNumberOfCalls - 1]);
31041
- if (isFailedCall(data[expectedNumberOfCalls - 1]) || !Number.isFinite(rawEMode)) {
31893
+ const data = viaLens ? rebuildAaveReserveData(raw[0], assetsToQuery.length, withEMode) : raw;
31894
+ if (!data) return void 0;
31895
+ const eModeSlot = data[walkCalls - 1];
31896
+ const rawEMode = withEMode ? Number(eModeSlot) : 0;
31897
+ if (withEMode && (isFailedCall(eModeSlot) || !Number.isFinite(rawEMode))) {
31042
31898
  return void 0;
31043
31899
  }
31044
31900
  const userEMode = rawEMode;
@@ -31270,10 +32126,23 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
31270
32126
  (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())
31271
32127
  );
31272
32128
  const assetsNoBase = assets.filter((a) => a !== baseAsset);
31273
- const expectedNumberOfCalls = assetsNoBase.length + 2 + 1;
32129
+ const walkCalls = assetsNoBase.length + 2 + 1;
32130
+ const viaLens = usesCometLens(chainId, lender);
32131
+ const expectedNumberOfCalls = viaLens ? 2 : walkCalls;
31274
32132
  return [
31275
- (data) => {
31276
- if (data.length !== expectedNumberOfCalls) {
32133
+ (raw) => {
32134
+ if (raw.length !== expectedNumberOfCalls) {
32135
+ return void 0;
32136
+ }
32137
+ let data;
32138
+ if (viaLens) {
32139
+ const rebuilt = rebuildCometData(raw[0], assetsNoBase.length);
32140
+ if (!rebuilt) return void 0;
32141
+ data = [...rebuilt, raw[1]];
32142
+ } else {
32143
+ data = raw;
32144
+ }
32145
+ if (data.length !== walkCalls) {
31277
32146
  return void 0;
31278
32147
  }
31279
32148
  let totalDebt24h = 0;
@@ -31339,7 +32208,7 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
31339
32208
  collateralEnabled: false
31340
32209
  }
31341
32210
  };
31342
- const earnedBalances = data[expectedNumberOfCalls - 1];
32211
+ const earnedBalances = data[walkCalls - 1];
31343
32212
  const compRewards = Number(
31344
32213
  parseRawAmount(earnedBalances?.owed?.toString(), 18)
31345
32214
  );
@@ -31461,7 +32330,7 @@ function createAaveV3Entry2(i, data, key3, meta) {
31461
32330
  }
31462
32331
 
31463
32332
  // src/lending/user-data/morpho/decoder.ts
31464
- var WORD = 32;
32333
+ var WORD2 = 32;
31465
32334
  var HALF = 16;
31466
32335
  function readBigIntBE(buf, off, len) {
31467
32336
  let v = 0n;
@@ -31479,14 +32348,14 @@ function decodePackedMorphoUserDataset(hex) {
31479
32348
  for (let i = 0; i < count; i++) {
31480
32349
  const index = Number(readBigIntBE(buf, off, 2));
31481
32350
  off += 2;
31482
- const supplyShares = readBigIntBE(buf, off, WORD);
31483
- off += WORD;
32351
+ const supplyShares = readBigIntBE(buf, off, WORD2);
32352
+ off += WORD2;
31484
32353
  const borrowShares = readBigIntBE(buf, off, HALF);
31485
32354
  off += HALF;
31486
- const supplyAssets = readBigIntBE(buf, off, WORD);
31487
- off += WORD;
31488
- const borrowAssets = readBigIntBE(buf, off, WORD);
31489
- off += WORD;
32355
+ const supplyAssets = readBigIntBE(buf, off, WORD2);
32356
+ off += WORD2;
32357
+ const borrowAssets = readBigIntBE(buf, off, WORD2);
32358
+ off += WORD2;
31490
32359
  const collateral = readBigIntBE(buf, off, HALF);
31491
32360
  off += HALF;
31492
32361
  out.push({
@@ -31514,14 +32383,14 @@ function decodePackedListaUserDataset(hex, marketsCount) {
31514
32383
  for (let i = 0; i < totalCount; i++) {
31515
32384
  const index = Number(readBigIntBE(buf, off, 2));
31516
32385
  off += 2;
31517
- const supplyShares = readBigIntBE(buf, off, WORD);
31518
- off += WORD;
32386
+ const supplyShares = readBigIntBE(buf, off, WORD2);
32387
+ off += WORD2;
31519
32388
  const borrowShares = readBigIntBE(buf, off, HALF);
31520
32389
  off += HALF;
31521
- const supplyAssets = readBigIntBE(buf, off, WORD);
31522
- off += WORD;
31523
- const borrowAssets = readBigIntBE(buf, off, WORD);
31524
- off += WORD;
32390
+ const supplyAssets = readBigIntBE(buf, off, WORD2);
32391
+ off += WORD2;
32392
+ const borrowAssets = readBigIntBE(buf, off, WORD2);
32393
+ off += WORD2;
31525
32394
  const collateral = readBigIntBE(buf, off, HALF);
31526
32395
  off += HALF;
31527
32396
  balances.push({
@@ -32498,125 +33367,63 @@ function createAaveV4Entry(base, data, key3, meta, spokeAddr) {
32498
33367
  addedDebt: Number(currentDebt) * priceHist
32499
33368
  };
32500
33369
  }
32501
- var getSiloV2UserDataConverter = (lender, chainId, account, metaMap) => {
32502
- const market = getSiloV2MarketEntry(chainId, lender);
32503
- if (!market) return [() => void 0, 0];
33370
+
33371
+ // src/lending/user-data/silo-v2/userCallParse.ts
33372
+ var getSiloV2UserDataConverter = (lender, chainId, account, meta, params) => {
33373
+ const roster = resolveSiloRoster(chainId, lender, params);
33374
+ const viaLens = usesSiloLens(chainId);
33375
+ const expected = roster.length === 0 ? 0 : viaLens ? 1 : roster.length * SILO_V2_USER_CALLS_PER_PAIR;
32504
33376
  return [
32505
33377
  (data) => {
32506
- if (!data || data.length !== SILO_V2_USER_CALLS_PER_PAIR)
32507
- return void 0;
32508
- const sides = [
32509
- { self: market.silo0, other: market.silo1 },
32510
- { self: market.silo1, other: market.silo0 }
32511
- ];
32512
- const lendingPositions = {};
32513
- let addedDeposits = 0;
32514
- let addedDebt = 0;
32515
- let hasAnyPosition = false;
32516
- for (let s = 0; s < 2; s++) {
32517
- const { self } = sides[s];
32518
- const slot = s * SILO_V2_USER_CALLS_PER_SIDE;
32519
- const collateralShares = toBigInt7(data[slot]);
32520
- const protectedShares = toBigInt7(data[slot + 1]);
32521
- const collateralRate = toBigInt7(data[slot + 2]);
32522
- const protectedRate = toBigInt7(data[slot + 3]);
32523
- const repayRaw = toBigInt7(data[slot + 4]);
32524
- const decimals = self.decimals;
32525
- const oneUnit = BigInt(10) ** BigInt(decimals);
32526
- const collateralAssets = oneUnit > 0n ? collateralShares * collateralRate / oneUnit : 0n;
32527
- const protectedAssets = oneUnit > 0n ? protectedShares * protectedRate / oneUnit : 0n;
32528
- const depositAssetsRaw = collateralAssets + protectedAssets;
32529
- if (depositAssetsRaw === 0n && repayRaw === 0n) continue;
32530
- hasAnyPosition = true;
32531
- const marketUid = createMarketUid(chainId, lender, self.silo);
32532
- const meta = metaMap?.[marketUid];
32533
- const metaDecimals = meta?.asset?.decimals ?? decimals;
32534
- const depositsStr = parseRawAmount(
32535
- depositAssetsRaw.toString(),
32536
- metaDecimals
32537
- );
32538
- const depositsStandardStr = parseRawAmount(
32539
- collateralAssets.toString(),
32540
- metaDecimals
32541
- );
32542
- const depositsProtectedStr = parseRawAmount(
32543
- protectedAssets.toString(),
32544
- metaDecimals
33378
+ if (expected === 0) return void 0;
33379
+ if (!data || data.length !== expected) return void 0;
33380
+ let states;
33381
+ if (viaLens) {
33382
+ const blobs = data[0];
33383
+ if (isFailedCall(blobs) || !Array.isArray(blobs) || blobs.length !== 1) {
33384
+ return void 0;
33385
+ }
33386
+ const { rows } = decodeLensRows(blobs[0], SILO_LENS_WORDS, 0, 0);
33387
+ states = new Map(
33388
+ rows.map((r) => [
33389
+ r.index,
33390
+ { side0: r.words.slice(0, 5), side1: r.words.slice(5, 10) }
33391
+ ])
32545
33392
  );
32546
- const debtStr = parseRawAmount(repayRaw.toString(), metaDecimals);
32547
- const depositsNum = Number(depositsStr);
32548
- const debtNum = Number(debtStr);
32549
- const displayPrice = meta ? getDisplayPrice(meta) : 0;
32550
- const oraclePrice = meta ? getOraclePrice(meta) : 0;
32551
- const priceHist = meta?.price?.priceUsd24h ?? displayPrice;
32552
- const depositsUSD = depositsNum * displayPrice;
32553
- const debtUSD = debtNum * displayPrice;
32554
- const depositsUSDOracle = depositsNum * oraclePrice;
32555
- const debtUSDOracle = debtNum * oraclePrice;
32556
- addedDeposits += depositsNum * priceHist;
32557
- addedDebt += debtNum * priceHist;
32558
- const selfLt = Number(self.lt) / 1e18;
32559
- const collateralEnabled = selfLt > 0 && depositAssetsRaw > 0n;
32560
- lendingPositions[marketUid] = {
32561
- marketUid,
32562
- underlying: self.token.toLowerCase(),
32563
- deposits: depositsStr,
32564
- depositsStandard: depositsStandardStr,
32565
- depositsProtected: depositsProtectedStr,
32566
- debt: debtStr,
32567
- debtStable: "0",
32568
- // Raw share balances (stringified bigints, not decimal-formatted).
32569
- // Used by the leverage close flow to approve the exact share count
32570
- // and avoid rounding errors on "withdraw all".
32571
- depositShares: collateralShares.toString(),
32572
- protectedDepositShares: protectedShares.toString(),
32573
- depositsUSD,
32574
- debtUSD,
32575
- debtStableUSD: 0,
32576
- depositsUSDOracle,
32577
- debtUSDOracle,
32578
- debtStableUSDOracle: 0,
32579
- stableBorrowRate: "0",
32580
- collateralEnabled,
32581
- collateralRate: collateralRate.toString(),
32582
- claimableRewards: 0
32583
- };
33393
+ } else {
33394
+ states = /* @__PURE__ */ new Map();
33395
+ for (let i = 0; i < roster.length; i++) {
33396
+ const base = i * SILO_V2_USER_CALLS_PER_PAIR;
33397
+ const slice2 = data.slice(base, base + SILO_V2_USER_CALLS_PER_PAIR);
33398
+ if (slice2.some((v) => isFailedCall(v))) continue;
33399
+ states.set(i, {
33400
+ side0: slice2.slice(0, 5).map(toBigInt7),
33401
+ side1: slice2.slice(5, 10).map(toBigInt7)
33402
+ });
33403
+ }
32584
33404
  }
32585
- if (!hasAnyPosition) return void 0;
32586
- const payload = {
32587
- chainId,
32588
- account,
32589
- lendingPositions,
32590
- rewards: [],
32591
- userEMode: 0
32592
- };
32593
- return createBaseTypeUserState(
32594
- payload,
32595
- metaMap,
32596
- addedDeposits,
32597
- addedDebt,
32598
- lender
32599
- );
33405
+ const out = {};
33406
+ roster.forEach(({ key: key3, market }, i) => {
33407
+ const st = states.get(i);
33408
+ if (!st) return;
33409
+ const entry = convertSiloPair(
33410
+ chainId,
33411
+ key3,
33412
+ account,
33413
+ market,
33414
+ st,
33415
+ meta?.[key3]
33416
+ );
33417
+ if (entry) out[key3] = entry;
33418
+ });
33419
+ return Object.keys(out).length > 0 ? out : void 0;
32600
33420
  },
32601
- SILO_V2_USER_CALLS_PER_PAIR
33421
+ expected
32602
33422
  ];
32603
33423
  };
32604
- function toBigInt7(v) {
32605
- if (v === void 0 || v === null || v === "0x") return 0n;
32606
- if (typeof v === "bigint") return v;
32607
- try {
32608
- return BigInt(v);
32609
- } catch {
32610
- return 0n;
32611
- }
32612
- }
32613
- var getSiloV3UserDataConverter = (lender, chainId, account, metaMap) => {
32614
- const market = getSiloV3MarketEntry(chainId, lender);
32615
- if (!market) return [() => void 0, 0];
32616
- return [
32617
- (data) => {
32618
- if (!data || data.length !== SILO_V3_USER_CALLS_PER_PAIR)
32619
- return void 0;
33424
+ function convertSiloPair(chainId, lender, account, market, state, metaMap) {
33425
+ {
33426
+ {
32620
33427
  const sides = [
32621
33428
  { self: market.silo0, other: market.silo1 },
32622
33429
  { self: market.silo1, other: market.silo0 }
@@ -32627,12 +33434,14 @@ var getSiloV3UserDataConverter = (lender, chainId, account, metaMap) => {
32627
33434
  let hasAnyPosition = false;
32628
33435
  for (let s = 0; s < 2; s++) {
32629
33436
  const { self } = sides[s];
32630
- const slot = s * SILO_V3_USER_CALLS_PER_SIDE;
32631
- const collateralShares = toBigInt8(data[slot]);
32632
- const protectedShares = toBigInt8(data[slot + 1]);
32633
- const collateralRate = toBigInt8(data[slot + 2]);
32634
- const protectedRate = toBigInt8(data[slot + 3]);
32635
- const repayRaw = toBigInt8(data[slot + 4]);
33437
+ const vals = s === 0 ? state.side0 : state.side1;
33438
+ const [
33439
+ collateralShares,
33440
+ protectedShares,
33441
+ collateralRate,
33442
+ protectedRate,
33443
+ repayRaw
33444
+ ] = vals;
32636
33445
  const decimals = self.decimals;
32637
33446
  const oneUnit = BigInt(10) ** BigInt(decimals);
32638
33447
  const collateralAssets = oneUnit > 0n ? collateralShares * collateralRate / oneUnit : 0n;
@@ -32678,6 +33487,8 @@ var getSiloV3UserDataConverter = (lender, chainId, account, metaMap) => {
32678
33487
  debt: debtStr,
32679
33488
  debtStable: "0",
32680
33489
  // Raw share balances (stringified bigints, not decimal-formatted).
33490
+ // Used by the leverage close flow to approve the exact share count
33491
+ // and avoid rounding errors on "withdraw all".
32681
33492
  depositShares: collateralShares.toString(),
32682
33493
  protectedDepositShares: protectedShares.toString(),
32683
33494
  depositsUSD,
@@ -32707,11 +33518,10 @@ var getSiloV3UserDataConverter = (lender, chainId, account, metaMap) => {
32707
33518
  addedDebt,
32708
33519
  lender
32709
33520
  );
32710
- },
32711
- SILO_V3_USER_CALLS_PER_PAIR
32712
- ];
32713
- };
32714
- function toBigInt8(v) {
33521
+ }
33522
+ }
33523
+ }
33524
+ function toBigInt7(v) {
32715
33525
  if (v === void 0 || v === null || v === "0x") return 0n;
32716
33526
  if (typeof v === "bigint") return v;
32717
33527
  try {
@@ -32720,9 +33530,12 @@ function toBigInt8(v) {
32720
33530
  return 0n;
32721
33531
  }
32722
33532
  }
33533
+
33534
+ // src/lending/user-data/silo-v3/userCallParse.ts
33535
+ var getSiloV3UserDataConverter = (lender, chainId, account, meta, params) => getSiloV2UserDataConverter(lender, chainId, account, meta, params);
32723
33536
  var FLUID_EEE_LOWER2 = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
32724
33537
  var normalizeUnderlying2 = (addr4) => addr4 === FLUID_EEE_LOWER2 ? zeroAddress : addr4;
32725
- function toBigInt9(v) {
33538
+ function toBigInt8(v) {
32726
33539
  if (v === void 0 || v === null || v === "0x") return 0n;
32727
33540
  if (typeof v === "bigint") return v;
32728
33541
  try {
@@ -32817,8 +33630,8 @@ var getFluidUserDataConverter = (lender, chainId, account, meta) => {
32817
33630
  const histData = {};
32818
33631
  for (const { pos } of nfts) {
32819
33632
  const nftId = pos.nftId.toString();
32820
- const supplyRaw = toBigInt9(pos.supply);
32821
- const borrowRaw = toBigInt9(pos.borrow) + toBigInt9(pos.dustBorrow);
33633
+ const supplyRaw = toBigInt8(pos.supply);
33634
+ const borrowRaw = toBigInt8(pos.borrow) + toBigInt8(pos.dustBorrow);
32822
33635
  if (supplyRaw === 0n && borrowRaw === 0n) continue;
32823
33636
  modes[nftId] = 0;
32824
33637
  const posData = {};
@@ -32898,7 +33711,7 @@ var getFluidUserDataConverter = (lender, chainId, account, meta) => {
32898
33711
  FLUID_USER_CALL_COUNT
32899
33712
  ];
32900
33713
  };
32901
- function toBigInt10(v) {
33714
+ function toBigInt9(v) {
32902
33715
  if (v === void 0 || v === null || v === "0x") return 0n;
32903
33716
  if (typeof v === "bigint") return v;
32904
33717
  try {
@@ -32982,7 +33795,7 @@ var getGearboxV3UserDataConverter = (_lender, chainId, account, meta) => {
32982
33795
  for (const ca of accounts) {
32983
33796
  const caAddress = (ca.creditAccount ?? ca.addr ?? "").toString().toLowerCase();
32984
33797
  if (!caAddress) continue;
32985
- const debtRaw = toBigInt10(ca.debt);
33798
+ const debtRaw = toBigInt9(ca.debt);
32986
33799
  const tokens = Array.isArray(ca.tokens) ? ca.tokens : Array.isArray(ca.balances) ? ca.balances : [];
32987
33800
  modes[caAddress] = 0;
32988
33801
  const posData = {};
@@ -32991,9 +33804,9 @@ var getGearboxV3UserDataConverter = (_lender, chainId, account, meta) => {
32991
33804
  const rawToken = (bal?.token ?? "").toString().toLowerCase();
32992
33805
  if (!rawToken) continue;
32993
33806
  const token = rawToken;
32994
- const balRaw = toBigInt10(bal.balance);
33807
+ const balRaw = toBigInt9(bal.balance);
32995
33808
  if (balRaw === 0n) continue;
32996
- const quotaRaw = toBigInt10(bal.quota);
33809
+ const quotaRaw = toBigInt9(bal.quota);
32997
33810
  const isQuoted = quotaRaw > 0n || !!bal?.isQuoted;
32998
33811
  const colMarketUid = createMarketUid(chainId, lenderKey, token);
32999
33812
  ensureMetaStub(metaMap, colMarketUid, token);
@@ -33168,7 +33981,7 @@ function normalizeUnderlying3(token) {
33168
33981
  const lower4 = token.toLowerCase();
33169
33982
  return Object.values(WETH_BY_CHAIN).includes(lower4) ? zeroAddress : lower4;
33170
33983
  }
33171
- function toBigInt11(v) {
33984
+ function toBigInt10(v) {
33172
33985
  if (v === void 0 || v === null || v === "0x") return 0n;
33173
33986
  if (typeof v === "bigint") return v;
33174
33987
  try {
@@ -33178,22 +33991,22 @@ function toBigInt11(v) {
33178
33991
  }
33179
33992
  }
33180
33993
  function readDebtUnits(positionResult) {
33181
- if (Array.isArray(positionResult)) return toBigInt11(positionResult[4]);
33994
+ if (Array.isArray(positionResult)) return toBigInt10(positionResult[4]);
33182
33995
  if (positionResult && typeof positionResult === "object")
33183
- return toBigInt11(positionResult.debt);
33996
+ return toBigInt10(positionResult.debt);
33184
33997
  return 0n;
33185
33998
  }
33186
33999
  function readUpdatedLender(updateResult) {
33187
34000
  if (Array.isArray(updateResult)) {
33188
34001
  return {
33189
- credit: toBigInt11(updateResult[0]),
33190
- pendingFee: toBigInt11(updateResult[1])
34002
+ credit: toBigInt10(updateResult[0]),
34003
+ pendingFee: toBigInt10(updateResult[1])
33191
34004
  };
33192
34005
  }
33193
34006
  if (updateResult && typeof updateResult === "object") {
33194
34007
  return {
33195
- credit: toBigInt11(updateResult.newCredit),
33196
- pendingFee: toBigInt11(updateResult.newPendingFee)
34008
+ credit: toBigInt10(updateResult.newCredit),
34009
+ pendingFee: toBigInt10(updateResult.newPendingFee)
33197
34010
  };
33198
34011
  }
33199
34012
  return { credit: 0n, pendingFee: 0n };
@@ -33264,7 +34077,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
33264
34077
  pendingFee: pendingFeeStr
33265
34078
  };
33266
34079
  market.collateralParams.forEach((c, i) => {
33267
- const collAmt = toBigInt11(collateralResults[i]);
34080
+ const collAmt = toBigInt10(collateralResults[i]);
33268
34081
  if (collAmt === 0n) return;
33269
34082
  anyBalance = true;
33270
34083
  const collAddr = c.token.toLowerCase();
@@ -33313,7 +34126,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
33313
34126
  ];
33314
34127
  };
33315
34128
  var WAD12 = 1000000000000000000n;
33316
- function toBigInt12(v) {
34129
+ function toBigInt11(v) {
33317
34130
  if (v === void 0 || v === null || v === "0x") return 0n;
33318
34131
  if (typeof v === "bigint") return v;
33319
34132
  try {
@@ -33350,11 +34163,11 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
33350
34163
  const loanDisplayPrice = loanMeta ? getDisplayPrice(loanMeta) : 0;
33351
34164
  const loanOraclePrice = loanMeta ? getOraclePrice(loanMeta) : 0;
33352
34165
  const loanPriceHist = loanMeta?.price?.priceUsd24h ?? loanDisplayPrice;
33353
- const debtUnits = toBigInt12(obligationResult);
34166
+ const debtUnits = toBigInt11(obligationResult);
33354
34167
  const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
33355
34168
  const debtNum = Number(debtStr);
33356
- const repoBalance = toBigInt12(balanceResult);
33357
- const redemptionValue = toBigInt12(redemptionResult) || toBigInt12(market.redemptionValue) || WAD12;
34169
+ const repoBalance = toBigInt11(balanceResult);
34170
+ const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD12;
33358
34171
  const lentUnits = repoBalance * redemptionValue / WAD12;
33359
34172
  const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
33360
34173
  const depositsNum = Number(depositsStr);
@@ -33378,7 +34191,7 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
33378
34191
  claimableRewards: 0
33379
34192
  };
33380
34193
  market.collateralParams.forEach((c, i) => {
33381
- const collAmt = toBigInt12(collateralResults[i]);
34194
+ const collAmt = toBigInt11(collateralResults[i]);
33382
34195
  if (collAmt === 0n) return;
33383
34196
  anyBalance = true;
33384
34197
  const collAddr = c.token.toLowerCase();
@@ -33974,11 +34787,15 @@ var big9 = (v) => {
33974
34787
  var getInverseUserDataConverter = (lender, chainId, account, meta) => {
33975
34788
  const cfg = inverseConfigFor(lender, chainId);
33976
34789
  const markets = inverseChainData(lender, chainId)?.markets ?? [];
33977
- const expected = cfg && markets.length > 0 ? markets.length * INVERSE_CALLS_PER_MARKET + INVERSE_TAIL_CALLS : 0;
34790
+ const viaLens = usesInverseLens(chainId);
34791
+ const walkSlots = cfg && markets.length > 0 ? markets.length * INVERSE_CALLS_PER_MARKET + INVERSE_TAIL_CALLS : 0;
34792
+ const expected = walkSlots === 0 ? 0 : viaLens ? 1 : walkSlots;
33978
34793
  return [
33979
- (data) => {
34794
+ (raw) => {
33980
34795
  if (!cfg || expected === 0) return void 0;
33981
- if (!data || data.length < expected) return void 0;
34796
+ if (!raw || raw.length < expected) return void 0;
34797
+ const data = viaLens ? rebuildInverseData(raw[0], markets.length) : raw;
34798
+ if (!data || data.length < walkSlots) return void 0;
33982
34799
  const dolaAddr = cfg.dola.toLowerCase();
33983
34800
  const debtDecimals = cfg.debtDecimals ?? 18;
33984
34801
  const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
@@ -34196,6 +35013,60 @@ var getCoolerUserDataConverter = (lender, chainId, account, meta) => {
34196
35013
  expected
34197
35014
  ];
34198
35015
  };
35016
+ var statesFromSlice2 = (data, marketCount) => {
35017
+ const out = /* @__PURE__ */ new Map();
35018
+ for (let i = 0; i < marketCount; i++) {
35019
+ const base = i * LLAMALEND_CALLS_PER_MARKET;
35020
+ const stateRaw = data[base];
35021
+ if (isFailedCall(stateRaw) || !Array.isArray(stateRaw)) continue;
35022
+ const ticksRaw = data[base + 3];
35023
+ const approvalRaw = data[base + 4];
35024
+ const vaultSharesRaw = data[base + 5];
35025
+ const gaugeSharesRaw = data[base + 6];
35026
+ const shareToAssetRaw = data[base + 7];
35027
+ const healthRaw = data[base + 1];
35028
+ const pricesRaw = data[base + 2];
35029
+ out.set(i, {
35030
+ collateral: big11(stateRaw[0]),
35031
+ bandBorrowed: big11(stateRaw[1]),
35032
+ debt: big11(stateRaw[2]),
35033
+ bandCount: Number(big11(stateRaw[3])),
35034
+ health: isFailedCall(healthRaw) ? 0n : big11(healthRaw),
35035
+ priceUpper: arrAt(pricesRaw, 0),
35036
+ priceLower: arrAt(pricesRaw, 1),
35037
+ bands: isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(big11(ticksRaw[0])), Number(big11(ticksRaw[1]))],
35038
+ delegated: isFailedCall(approvalRaw) ? false : approvalRaw === true,
35039
+ vaultShares: isFailedCall(vaultSharesRaw) ? 0n : big11(vaultSharesRaw),
35040
+ gaugeShares: isFailedCall(gaugeSharesRaw) ? 0n : big11(gaugeSharesRaw),
35041
+ shareToAsset: isFailedCall(shareToAssetRaw) ? 0n : big11(shareToAssetRaw)
35042
+ });
35043
+ }
35044
+ return out;
35045
+ };
35046
+ var statesFromLens = (rows) => {
35047
+ const out = /* @__PURE__ */ new Map();
35048
+ for (const r of rows) {
35049
+ const w = r.words;
35050
+ out.set(r.index, {
35051
+ collateral: w[0],
35052
+ bandBorrowed: w[1],
35053
+ debt: w[2],
35054
+ bandCount: Number(w[3]),
35055
+ health: asInt256(w[4]),
35056
+ priceUpper: w[5],
35057
+ priceLower: w[6],
35058
+ bands: [Number(asInt256(w[7])), Number(asInt256(w[8]))],
35059
+ // bit0 — the spender holds this Controller's boolean grant. Absent on
35060
+ // older-blueprint controllers, where the lens's read fails and this reads
35061
+ // false: fail closed, same as the roster walk.
35062
+ delegated: (r.flags & 1) !== 0,
35063
+ vaultShares: w[9],
35064
+ gaugeShares: w[10],
35065
+ shareToAsset: w[11]
35066
+ });
35067
+ }
35068
+ return out;
35069
+ };
34199
35070
  var big11 = (v) => {
34200
35071
  try {
34201
35072
  if (typeof v === "bigint") return v;
@@ -34211,36 +35082,34 @@ var arrAt = (v, i) => {
34211
35082
  var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
34212
35083
  const cfg = llamaLendConfigFor(lender, chainId);
34213
35084
  const markets = llamaLendChainData(lender, chainId)?.markets ?? [];
34214
- const expected = cfg && markets.length > 0 ? markets.length * LLAMALEND_CALLS_PER_MARKET : 0;
35085
+ const viaLens = usesLlamaLendLens(chainId);
35086
+ const expected = cfg && markets.length > 0 ? viaLens ? 1 : markets.length * LLAMALEND_CALLS_PER_MARKET : 0;
34215
35087
  return [
34216
35088
  (data) => {
34217
35089
  if (!cfg || expected === 0) return void 0;
34218
35090
  if (!data || data.length < expected) return void 0;
34219
35091
  const out = {};
35092
+ let states;
35093
+ if (viaLens) {
35094
+ const blobs = data[0];
35095
+ if (isFailedCall(blobs) || !Array.isArray(blobs) || blobs.length !== 1) {
35096
+ return void 0;
35097
+ }
35098
+ states = statesFromLens(
35099
+ decodeLensRows(blobs[0], LLAMALEND_LENS_WORDS).rows
35100
+ );
35101
+ } else {
35102
+ states = statesFromSlice2(data, markets.length);
35103
+ }
34220
35104
  markets.forEach((market, i) => {
34221
- const base = i * LLAMALEND_CALLS_PER_MARKET;
34222
- const stateRaw = data[base];
34223
- if (isFailedCall(stateRaw) || !Array.isArray(stateRaw)) return;
34224
- const collateral = big11(stateRaw[0]);
34225
- const bandBorrowed = big11(stateRaw[1]);
34226
- const debt = big11(stateRaw[2]);
34227
- const bandCount = Number(big11(stateRaw[3]));
34228
- const vaultSharesRaw = data[base + 5];
34229
- const gaugeSharesRaw = data[base + 6];
34230
- const vaultShares = isFailedCall(vaultSharesRaw) ? 0n : big11(vaultSharesRaw);
34231
- const gaugeShares = isFailedCall(gaugeSharesRaw) ? 0n : big11(gaugeSharesRaw);
35105
+ const st = states.get(i);
35106
+ if (!st) return;
35107
+ const { collateral, bandBorrowed, debt, bandCount } = st;
35108
+ const { vaultShares, gaugeShares } = st;
34232
35109
  const lendShares = vaultShares + gaugeShares;
34233
35110
  if (collateral === 0n && debt === 0n && bandBorrowed === 0n && lendShares === 0n)
34234
35111
  return;
34235
- const healthRaw = data[base + 1];
34236
- const health = isFailedCall(healthRaw) ? 0n : big11(healthRaw);
34237
- const pricesRaw = data[base + 2];
34238
- const priceUpper = arrAt(pricesRaw, 0);
34239
- const priceLower = arrAt(pricesRaw, 1);
34240
- const ticksRaw = data[base + 3];
34241
- const bands = isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(big11(ticksRaw[0])), Number(big11(ticksRaw[1]))];
34242
- const approvalRaw = data[base + 4];
34243
- const delegated = isFailedCall(approvalRaw) ? false : approvalRaw === true;
35112
+ const { health, priceUpper, priceLower, bands, delegated } = st;
34244
35113
  const lenderKey = llamaLendLenderKey(lender, market.controller);
34245
35114
  const metaMap = meta?.[lenderKey];
34246
35115
  if (!metaMap) return;
@@ -34258,8 +35127,7 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
34258
35127
  const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
34259
35128
  const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
34260
35129
  const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
34261
- const shareToAssetRaw = data[base + 7];
34262
- const shareToAsset = isFailedCall(shareToAssetRaw) ? 0n : big11(shareToAssetRaw);
35130
+ const { shareToAsset } = st;
34263
35131
  const lendAssets = shareToAsset === 0n ? 0n : lendShares * shareToAsset / 10n ** 18n;
34264
35132
  const lendStr = parseRawAmount(lendAssets.toString(), loanDecimals);
34265
35133
  const depositStr = parseRawAmount(
@@ -35294,7 +36162,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
35294
36162
  ];
35295
36163
  };
35296
36164
  var nowSec8 = () => Math.floor(Date.now() / 1e3);
35297
- function toBigInt13(v) {
36165
+ function toBigInt12(v) {
35298
36166
  if (v === void 0 || v === null || v === "0x") return 0n;
35299
36167
  if (typeof v === "bigint") return v;
35300
36168
  try {
@@ -35311,18 +36179,18 @@ function field11(res, name, index) {
35311
36179
  return void 0;
35312
36180
  }
35313
36181
  function parsePosition(res) {
35314
- const ftBalance = toBigInt13(field11(res, "ftBalance", 2));
35315
- const xtBalance = toBigInt13(field11(res, "xtBalance", 3));
36182
+ const ftBalance = toBigInt12(field11(res, "ftBalance", 2));
36183
+ const xtBalance = toBigInt12(field11(res, "xtBalance", 3));
35316
36184
  const rawGts = field11(res, "gtInfo", 4);
35317
36185
  const gts = [];
35318
36186
  if (Array.isArray(rawGts)) {
35319
36187
  for (const g of rawGts) {
35320
- const loanId = toBigInt13(field11(g, "loanId", 0));
36188
+ const loanId = toBigInt12(field11(g, "loanId", 0));
35321
36189
  if (loanId === 0n) continue;
35322
36190
  gts.push({
35323
36191
  loanId: loanId.toString(),
35324
- collateralAmt: toBigInt13(field11(g, "collateralAmt", 1)),
35325
- debtAmt: toBigInt13(field11(g, "debtAmt", 2))
36192
+ collateralAmt: toBigInt12(field11(g, "collateralAmt", 1)),
36193
+ debtAmt: toBigInt12(field11(g, "debtAmt", 2))
35326
36194
  });
35327
36195
  }
35328
36196
  }
@@ -35331,22 +36199,35 @@ function parsePosition(res) {
35331
36199
  var getTermMaxUserDataConverter = (_lender, chainId, account, meta) => {
35332
36200
  const discovery = getCachedTermMaxDiscovery(chainId, account);
35333
36201
  const markets = discovery?.markets ?? [];
35334
- const expected = markets.length > 0 ? TERMMAX_CALLS_PER_ACCOUNT : 0;
36202
+ const expected = discovery?.chunks ?? 0;
35335
36203
  return [
35336
36204
  (data) => {
35337
36205
  if (expected === 0) return void 0;
35338
36206
  if (!data || data.length < expected) return void 0;
35339
- const positions = data[0];
35340
- if (!Array.isArray(positions)) return void 0;
36207
+ const positions = [];
36208
+ for (let i = 0; i < expected; i++) {
36209
+ const chunk7 = data[i];
36210
+ const size = Math.min(
36211
+ TERMMAX_MARKETS_PER_CALL,
36212
+ markets.length - i * TERMMAX_MARKETS_PER_CALL
36213
+ );
36214
+ if (Array.isArray(chunk7)) positions.push(...chunk7);
36215
+ else positions.push(...new Array(Math.max(size, 0)).fill(void 0));
36216
+ }
36217
+ if (positions.length === 0) return void 0;
35341
36218
  const now = nowSec8();
35342
36219
  const out = {};
36220
+ let droppedMatured = 0;
35343
36221
  markets.forEach((market, i) => {
35344
36222
  const parsed = parsePosition(positions[i]);
35345
36223
  if (!parsed) return;
35346
36224
  if (parsed.ftBalance === 0n && parsed.gts.length === 0) return;
35347
36225
  const lenderKey = termMaxLenderKey(market.market);
35348
36226
  const metaMap = meta?.[lenderKey];
35349
- if (!metaMap) return;
36227
+ if (!metaMap) {
36228
+ if (market.maturity <= now) droppedMatured++;
36229
+ return;
36230
+ }
35350
36231
  const loanAddr = market.debtToken.toLowerCase();
35351
36232
  const collAddr = market.collateral.toLowerCase();
35352
36233
  const loanUid = createMarketUid(chainId, lenderKey, loanAddr);
@@ -35461,6 +36342,11 @@ var getTermMaxUserDataConverter = (_lender, chainId, account, meta) => {
35461
36342
  );
35462
36343
  if (userData && userData.data.length > 0) out[lenderKey] = userData;
35463
36344
  });
36345
+ if (droppedMatured > 0) {
36346
+ console.warn(
36347
+ `[termmax] ${droppedMatured} matured position(s) found for ${account} on chain ${chainId} but dropped: no meta row`
36348
+ );
36349
+ }
35464
36350
  return Object.keys(out).length > 0 ? out : void 0;
35465
36351
  },
35466
36352
  expected
@@ -35614,9 +36500,9 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
35614
36500
  params?.subAccountIndexes
35615
36501
  );
35616
36502
  if (isSiloV2Type(lender))
35617
- return getSiloV2UserDataConverter(lender, chainId, account, meta?.[lender]);
36503
+ return getSiloV2UserDataConverter(lender, chainId, account, meta, params);
35618
36504
  if (isSiloV3Type(lender))
35619
- return getSiloV3UserDataConverter(lender, chainId, account, meta?.[lender]);
36505
+ return getSiloV3UserDataConverter(lender, chainId, account, meta, params);
35620
36506
  if (isFluid(lender))
35621
36507
  return getFluidUserDataConverter(lender, chainId, account, meta);
35622
36508
  if (isGearboxV3(lender))
@@ -50469,7 +51355,7 @@ var DLEND_POOLS = [
50469
51355
  pool: "0x6598DaD18Bda89A0E58A1F427c8CeBc0dE90F153"
50470
51356
  }
50471
51357
  ];
50472
- var ZERO_ADDRESS7 = "0x0000000000000000000000000000000000000000";
51358
+ var ZERO_ADDRESS8 = "0x0000000000000000000000000000000000000000";
50473
51359
  var SECONDS_PER_YEAR13 = 31536e3;
50474
51360
  var ABI = [
50475
51361
  {
@@ -50586,7 +51472,7 @@ var DTRINITY_SOURCE = {
50586
51472
  link: "https://docs.dtrinity.org/protocol-components/dlend",
50587
51473
  platform: "protocol"
50588
51474
  };
50589
- var isZero = (a) => !a || a.toLowerCase() === ZERO_ADDRESS7;
51475
+ var isZero = (a) => !a || a.toLowerCase() === ZERO_ADDRESS8;
50590
51476
  var scale = (raw, decimals) => Number(raw) / 10 ** decimals;
50591
51477
  function emptyReward2() {
50592
51478
  return {
@@ -50801,7 +51687,7 @@ var dtrinityRebateRewardFetcher = {
50801
51687
  };
50802
51688
  var SECONDS_PER_YEAR14 = 31536e3;
50803
51689
  var WAD16 = 10n ** 18n;
50804
- var ZERO2 = "0x0000000000000000000000000000000000000000";
51690
+ var ZERO4 = "0x0000000000000000000000000000000000000000";
50805
51691
  var UNBOOSTED_FACTOR = 0.4;
50806
51692
  var MAX_BOOST = 2.5;
50807
51693
  var GAUGE_CONTROLLER = "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB";
@@ -50997,7 +51883,7 @@ async function fetchPrices(keys) {
50997
51883
  var priceOf = (prices, chainId, address) => prices[`${LLAMA_CHAIN_SLUG[chainId]}:${address.toLowerCase()}`] ?? 0;
50998
51884
  function rosterFor(chainId) {
50999
51885
  const markets = llamaLendChainData(Lender.LLAMALEND, chainId)?.markets ?? [];
51000
- return markets.filter((m) => m.gauge && m.gauge !== ZERO2).map((m) => ({
51886
+ return markets.filter((m) => m.gauge && m.gauge !== ZERO4).map((m) => ({
51001
51887
  controller: m.controller,
51002
51888
  vault: m.vault,
51003
51889
  gauge: m.gauge,
@@ -51074,7 +51960,7 @@ async function fetchForChain(chainId, nowSeconds) {
51074
51960
  }) : [];
51075
51961
  let cursor = 0;
51076
51962
  const withTokens = state.map((s) => {
51077
- const tokens = r2.slice(cursor, cursor + s.rewardCount).filter((t) => typeof t === "string" && t !== ZERO2);
51963
+ const tokens = r2.slice(cursor, cursor + s.rewardCount).filter((t) => typeof t === "string" && t !== ZERO4);
51078
51964
  cursor += s.rewardCount;
51079
51965
  return { ...s, tokens };
51080
51966
  });
@@ -53347,7 +54233,7 @@ var SiloOracleAbi = [
53347
54233
  type: "function"
53348
54234
  }
53349
54235
  ];
53350
- var ZERO_ADDRESS8 = "0x0000000000000000000000000000000000000000";
54236
+ var ZERO_ADDRESS9 = "0x0000000000000000000000000000000000000000";
53351
54237
  function lookupUSD(context, asset) {
53352
54238
  const lc = asset.toLowerCase();
53353
54239
  const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
@@ -53359,7 +54245,7 @@ function getSiloV2Calls(chainId) {
53359
54245
  const tokensWithRealOracle = /* @__PURE__ */ new Set();
53360
54246
  for (const market of allMarkets) {
53361
54247
  for (const half of [market.silo0, market.silo1]) {
53362
- if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS8) {
54248
+ if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS9) {
53363
54249
  tokensWithRealOracle.add(half.token.toLowerCase());
53364
54250
  }
53365
54251
  }
@@ -53372,7 +54258,7 @@ function getSiloV2Calls(chainId) {
53372
54258
  const lenderKey = siloV2LenderKey(market.siloConfig);
53373
54259
  const halves = [market.silo0, market.silo1];
53374
54260
  const isStatic = halves.map(
53375
- (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS8
54261
+ (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS9
53376
54262
  );
53377
54263
  if (isStatic[0] && isStatic[1]) {
53378
54264
  const t0 = halves[0].token.toLowerCase();
@@ -53392,7 +54278,7 @@ function getSiloV2Calls(chainId) {
53392
54278
  decimals: half.decimals,
53393
54279
  silo: half.silo.toLowerCase(),
53394
54280
  lenderKey,
53395
- oracle: ZERO_ADDRESS8,
54281
+ oracle: ZERO_ADDRESS9,
53396
54282
  partnerToken: partnerLc,
53397
54283
  isStatic: true
53398
54284
  });
@@ -53516,7 +54402,7 @@ var SiloOracleAbi2 = [
53516
54402
  type: "function"
53517
54403
  }
53518
54404
  ];
53519
- var ZERO_ADDRESS9 = "0x0000000000000000000000000000000000000000";
54405
+ var ZERO_ADDRESS10 = "0x0000000000000000000000000000000000000000";
53520
54406
  function lookupUSD2(context, asset) {
53521
54407
  const lc = asset.toLowerCase();
53522
54408
  const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
@@ -53528,7 +54414,7 @@ function getSiloV3Calls(chainId) {
53528
54414
  const tokensWithRealOracle = /* @__PURE__ */ new Set();
53529
54415
  for (const market of allMarkets) {
53530
54416
  for (const half of [market.silo0, market.silo1]) {
53531
- if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS9) {
54417
+ if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS10) {
53532
54418
  tokensWithRealOracle.add(half.token.toLowerCase());
53533
54419
  }
53534
54420
  }
@@ -53541,7 +54427,7 @@ function getSiloV3Calls(chainId) {
53541
54427
  const lenderKey = siloV3LenderKey(market.siloConfig);
53542
54428
  const halves = [market.silo0, market.silo1];
53543
54429
  const isStatic = halves.map(
53544
- (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS9
54430
+ (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS10
53545
54431
  );
53546
54432
  if (isStatic[0] && isStatic[1]) {
53547
54433
  const t0 = halves[0].token.toLowerCase();
@@ -53561,7 +54447,7 @@ function getSiloV3Calls(chainId) {
53561
54447
  decimals: half.decimals,
53562
54448
  silo: half.silo.toLowerCase(),
53563
54449
  lenderKey,
53564
- oracle: ZERO_ADDRESS9,
54450
+ oracle: ZERO_ADDRESS10,
53565
54451
  partnerToken: partnerLc,
53566
54452
  isStatic: true
53567
54453
  });
@@ -53940,7 +54826,7 @@ function lookupUSD3(context, asset) {
53940
54826
  return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
53941
54827
  }
53942
54828
  function parseSiloV2GraphQLResults(items, context) {
53943
- const ZERO_ADDRESS11 = "0x0000000000000000000000000000000000000000";
54829
+ const ZERO_ADDRESS12 = "0x0000000000000000000000000000000000000000";
53944
54830
  const out = [];
53945
54831
  const seen = /* @__PURE__ */ new Set();
53946
54832
  for (const item of items) {
@@ -53963,8 +54849,8 @@ function parseSiloV2GraphQLResults(items, context) {
53963
54849
  const partnerTokenLc = other.token.toLowerCase();
53964
54850
  const dedupKey = `${lenderKey}:${tokenLc}`;
53965
54851
  if (seen.has(dedupKey)) continue;
53966
- const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS11).toLowerCase();
53967
- const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS11;
54852
+ const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS12).toLowerCase();
54853
+ const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS12;
53968
54854
  const siloAddrLc = self.silo.toLowerCase();
53969
54855
  try {
53970
54856
  let priceUSD = 0;
@@ -54082,7 +54968,7 @@ function lookupUSD4(context, asset) {
54082
54968
  return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
54083
54969
  }
54084
54970
  function parseSiloV3GraphQLResults(items, context) {
54085
- const ZERO_ADDRESS11 = "0x0000000000000000000000000000000000000000";
54971
+ const ZERO_ADDRESS12 = "0x0000000000000000000000000000000000000000";
54086
54972
  const out = [];
54087
54973
  const seen = /* @__PURE__ */ new Set();
54088
54974
  for (const item of items) {
@@ -54105,8 +54991,8 @@ function parseSiloV3GraphQLResults(items, context) {
54105
54991
  const partnerTokenLc = other.token.toLowerCase();
54106
54992
  const dedupKey = `${lenderKey}:${tokenLc}`;
54107
54993
  if (seen.has(dedupKey)) continue;
54108
- const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS11).toLowerCase();
54109
- const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS11;
54994
+ const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS12).toLowerCase();
54995
+ const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS12;
54110
54996
  const siloAddrLc = self.silo.toLowerCase();
54111
54997
  try {
54112
54998
  let priceUSD = 0;
@@ -54228,7 +55114,7 @@ var AGGREGATOR_ABI = [...ChainlinkAggregatorAbi, ...DESCRIPTION_ABI];
54228
55114
  function isFailed(r) {
54229
55115
  return r === "0x" || r === void 0 || r === null;
54230
55116
  }
54231
- var ZERO_ADDRESS10 = "0x0000000000000000000000000000000000000000";
55117
+ var ZERO_ADDRESS11 = "0x0000000000000000000000000000000000000000";
54232
55118
  async function probeAaveFeedTimestamps(chainId, options = {}) {
54233
55119
  const { rpcOverrides, batchSize, retries = 2 } = options;
54234
55120
  const result = {};
@@ -54265,7 +55151,7 @@ async function probeAaveFeedTimestamps(chainId, options = {}) {
54265
55151
  const raw = sourceResults[i];
54266
55152
  if (isFailed(raw)) return;
54267
55153
  const source = String(raw).toLowerCase();
54268
- if (source === ZERO_ADDRESS10) return;
55154
+ if (source === ZERO_ADDRESS11) return;
54269
55155
  sourceOf.set(i, source);
54270
55156
  if (!sourceIndex.has(source)) {
54271
55157
  sourceIndex.set(source, uniqueSources.length);
@@ -57718,6 +58604,7 @@ query GetSiloVaults {
57718
58604
  ownerId
57719
58605
  curatorId
57720
58606
  guardianId
58607
+ allocators
57721
58608
  feeRecipient
57722
58609
  totalAssets
57723
58610
  totalAssetsUsd
@@ -57742,9 +58629,21 @@ query GetSiloVaults {
57742
58629
  collateralSharesSupply
57743
58630
  collateralAssetsSupply
57744
58631
  liquidity
58632
+ utilization
57745
58633
  otherMarket { inputToken { id } }
57746
58634
  }
57747
58635
  }
58636
+ incentivesPrograms(where: {chainId_in: [${chainId}]}, limit: ${limit}) {
58637
+ items {
58638
+ id
58639
+ name
58640
+ shareTokenId
58641
+ emissionPerSecond
58642
+ distributionEnd
58643
+ apr
58644
+ rewardToken { id symbol decimals }
58645
+ }
58646
+ }
57748
58647
  }
57749
58648
  `;
57750
58649
  function buildExposures(vaultId, totalAssetsFormatted, pricePerUnit, positionsByVault, marketMeta, tokenList) {
@@ -57779,10 +58678,11 @@ function buildExposures(vaultId, totalAssetsFormatted, pricePerUnit, positionsBy
57779
58678
  return withIdle.length > 0 ? withIdle : void 0;
57780
58679
  }
57781
58680
  function computeSiloLiquidityFormatted(vaultId, totalAssetsFormatted, positionsByVault, marketMeta) {
57782
- if (totalAssetsFormatted <= 0) return 0;
58681
+ if (totalAssetsFormatted <= 0) return { formatted: 0, proven: true };
57783
58682
  const rows = positionsByVault.get(vaultId) ?? [];
57784
58683
  let allocated = 0;
57785
58684
  let withdrawable = 0;
58685
+ let resolved2 = 0;
57786
58686
  for (const row of rows) {
57787
58687
  const marketId = (row.marketId ?? "").toLowerCase();
57788
58688
  if (!marketId) continue;
@@ -57792,13 +58692,81 @@ function computeSiloLiquidityFormatted(vaultId, totalAssetsFormatted, positionsB
57792
58692
  if (!Number.isFinite(shares) || shares <= 0) continue;
57793
58693
  const assets = shares * meta.collateralAssets / meta.collateralShares;
57794
58694
  if (!(assets > 0) || assets > totalAssetsFormatted * 1.01) continue;
58695
+ resolved2 += 1;
57795
58696
  allocated += assets;
57796
58697
  withdrawable += Math.min(assets, meta.liquidity);
57797
58698
  }
57798
58699
  const idle = Math.max(0, totalAssetsFormatted - allocated);
57799
- return Math.min(totalAssetsFormatted, idle + withdrawable);
58700
+ return {
58701
+ formatted: Math.min(totalAssetsFormatted, idle + withdrawable),
58702
+ proven: resolved2 > 0
58703
+ };
58704
+ }
58705
+ function computeSiloUtilization(vaultId, totalAssetsFormatted, positionsByVault, marketMeta) {
58706
+ if (totalAssetsFormatted <= 0) return void 0;
58707
+ const rows = positionsByVault.get(vaultId) ?? [];
58708
+ let borrowed = 0;
58709
+ let resolved2 = 0;
58710
+ for (const row of rows) {
58711
+ const marketId = (row.marketId ?? "").toLowerCase();
58712
+ if (!marketId) continue;
58713
+ const meta = marketMeta.get(marketId);
58714
+ if (!meta || meta.collateralShares <= 0) continue;
58715
+ const shares = Number(row.sTokenBalance ?? 0);
58716
+ if (!Number.isFinite(shares) || shares <= 0) continue;
58717
+ const assets = shares * meta.collateralAssets / meta.collateralShares;
58718
+ if (!(assets > 0) || assets > totalAssetsFormatted * 1.01) continue;
58719
+ resolved2 += 1;
58720
+ borrowed += assets * clamp012(meta.utilization);
58721
+ }
58722
+ if (resolved2 === 0) return void 0;
58723
+ return {
58724
+ borrowed: Math.min(borrowed, totalAssetsFormatted),
58725
+ total: totalAssetsFormatted
58726
+ };
57800
58727
  }
58728
+ var clamp012 = (n) => !Number.isFinite(n) ? 0 : n < 0 ? 0 : n > 1 ? 1 : n;
57801
58729
  var PERFORMANCE_FEE_SCALE = 1e16;
58730
+ var SECONDS_PER_YEAR15 = 31536e3;
58731
+ function buildVaultRewards(vaultId, totalAssetsUsd, programsByShareToken, priceOf2, nowSeconds) {
58732
+ const programs = programsByShareToken.get(vaultId) ?? [];
58733
+ const rewards = [];
58734
+ let rewardsRate = 0;
58735
+ let priced = true;
58736
+ for (const p of programs) {
58737
+ const emission = Number(p.emissionPerSecond ?? 0);
58738
+ const endsAt = Number(p.distributionEnd ?? 0);
58739
+ if (!Number.isFinite(emission) || emission <= 0) continue;
58740
+ if (!Number.isFinite(endsAt) || endsAt <= nowSeconds) continue;
58741
+ const tokenAddress = (p.rewardToken?.id ?? "").toLowerCase();
58742
+ const tokenDecimals = Number(p.rewardToken?.decimals ?? 18);
58743
+ const tokenPrice = tokenAddress ? priceOf2(tokenAddress) : 0;
58744
+ let apr;
58745
+ if (tokenPrice > 0 && totalAssetsUsd > 0) {
58746
+ const annualTokens = emission / 10 ** tokenDecimals * SECONDS_PER_YEAR15;
58747
+ apr = annualTokens * tokenPrice / totalAssetsUsd * 100;
58748
+ rewardsRate += apr;
58749
+ } else {
58750
+ priced = false;
58751
+ }
58752
+ rewards.push({
58753
+ programId: p.id ?? "",
58754
+ name: p.name ?? void 0,
58755
+ tokenAddress,
58756
+ tokenSymbol: p.rewardToken?.symbol ?? void 0,
58757
+ tokenDecimals,
58758
+ emissionPerSecond: String(p.emissionPerSecond ?? "0"),
58759
+ endsAt,
58760
+ apr,
58761
+ indexerApr: p.apr == null ? void 0 : Number(p.apr)
58762
+ });
58763
+ }
58764
+ return {
58765
+ rewards: rewards.length > 0 ? rewards : void 0,
58766
+ rewardsRate,
58767
+ priced
58768
+ };
58769
+ }
57802
58770
  var toRawAmount3 = (decimalString, decimals) => {
57803
58771
  if (!decimalString) return "0";
57804
58772
  try {
@@ -57807,7 +58775,16 @@ var toRawAmount3 = (decimalString, decimals) => {
57807
58775
  return "0";
57808
58776
  }
57809
58777
  };
57810
- function parseVault5(v, chainId, prices, tokenList, exposures, liquidityFormatted) {
58778
+ function parseVault5(v, chainId, prices, tokenList, derived) {
58779
+ const {
58780
+ exposures,
58781
+ liquidityFormatted,
58782
+ liquidityProven,
58783
+ utilization,
58784
+ rewards,
58785
+ rewardsRate,
58786
+ rewardsPriced
58787
+ } = derived;
57811
58788
  const address = (v?.id ?? "").toLowerCase();
57812
58789
  const assetAddr = (v?.asset?.id ?? "").toLowerCase();
57813
58790
  if (!address || !assetAddr) return null;
@@ -57852,13 +58829,20 @@ function parseVault5(v, chainId, prices, tokenList, exposures, liquidityFormatte
57852
58829
  convertToAssets,
57853
58830
  supplyRate,
57854
58831
  grossRate,
57855
- rewardsRate: 0,
57856
- depositRate: supplyRate,
58832
+ rewardsRate,
58833
+ depositRate: supplyRate + rewardsRate,
58834
+ rewards,
58835
+ rewardsIncomplete: rewardsPriced ? void 0 : true,
57857
58836
  fee,
57858
58837
  timelock: Number(v.timelock ?? 0),
57859
58838
  owner: v.ownerId?.toLowerCase() || void 0,
57860
58839
  curator: v.curatorId?.toLowerCase() || void 0,
57861
58840
  guardian: v.guardianId?.toLowerCase() || void 0,
58841
+ // An allocator can move the vault's money between silos with NO timelock
58842
+ // — the one curation power that changes a depositor's exposure between
58843
+ // blocks. Carried so governance can state it; `timelock` alone overstates
58844
+ // how much notice a holder actually gets.
58845
+ allocators: v.allocators && v.allocators.length > 0 ? v.allocators.map((a) => a.toLowerCase()) : void 0,
57862
58846
  feeRecipient: v.feeRecipient?.toLowerCase() || void 0,
57863
58847
  asset: assetMeta,
57864
58848
  priceUsd: priceUsd || void 0,
@@ -57872,6 +58856,12 @@ function parseVault5(v, chainId, prices, tokenList, exposures, liquidityFormatte
57872
58856
  liquidity: liquidityFormatted >= totalAssetsFormatted ? totalAssetsRaw : toRawAmount3(liquidityFormatted.toFixed(decimals), decimals),
57873
58857
  liquidityFormatted,
57874
58858
  liquidityUsd: totalAssetsFormatted > 0 ? liquidityFormatted * (totalAssetsUsd / totalAssetsFormatted) : 0,
58859
+ // Only claim a same-block exit when the allocation walk actually proved
58860
+ // one. Left undefined on a proven figure so the term-sheet builder makes
58861
+ // the `instant` / `instant-capped` call from the liquidity it can see.
58862
+ withdrawalMode: liquidityProven ? void 0 : "instant-capped",
58863
+ totalBorrowed: utilization && toRawAmount3(utilization.borrowed.toFixed(decimals), decimals),
58864
+ expectedLiquidity: utilization && toRawAmount3(utilization.total.toFixed(decimals), decimals),
57875
58865
  exposures
57876
58866
  };
57877
58867
  }
@@ -57915,9 +58905,26 @@ var fetchSiloVaults = async (chainId, prices = {}, tokenList = {}, options) => {
57915
58905
  supplyApr: Number.isFinite(apr) ? apr : 0,
57916
58906
  collateralShares: Number(m.collateralSharesSupply ?? 0) || 0,
57917
58907
  collateralAssets: Number(m.collateralAssetsSupply ?? 0) || 0,
57918
- liquidity: Number(m.liquidity ?? 0) || 0
58908
+ liquidity: Number(m.liquidity ?? 0) || 0,
58909
+ utilization: Number(m.utilization ?? 0) || 0
57919
58910
  });
57920
58911
  }
58912
+ const programs = payload?.data?.incentivesPrograms?.items ?? [];
58913
+ const programsByShareToken = /* @__PURE__ */ new Map();
58914
+ for (const p of programs) {
58915
+ const shareTokenId = (p.shareTokenId ?? "").toLowerCase();
58916
+ if (!shareTokenId) continue;
58917
+ const list = programsByShareToken.get(shareTokenId);
58918
+ if (list) list.push(p);
58919
+ else programsByShareToken.set(shareTokenId, [p]);
58920
+ }
58921
+ const priceOf2 = (address) => {
58922
+ if (!address) return 0;
58923
+ const meta = tokenList[address];
58924
+ const oracleKey = toOracleKey(meta?.assetGroup) ?? toGenericPriceKey(address, chainId);
58925
+ return prices[oracleKey] ?? prices[address] ?? 0;
58926
+ };
58927
+ const nowSeconds = Math.floor(Date.now() / 1e3);
57921
58928
  const out = {};
57922
58929
  for (const v of items) {
57923
58930
  if (options?.protocolVersion && v.protocol?.protocolVersion !== options.protocolVersion) {
@@ -57935,20 +58942,38 @@ var fetchSiloVaults = async (chainId, prices = {}, tokenList = {}, options) => {
57935
58942
  marketMeta,
57936
58943
  tokenList
57937
58944
  );
57938
- const liquidityFormatted = computeSiloLiquidityFormatted(
58945
+ const liquidity = computeSiloLiquidityFormatted(
57939
58946
  vaultId,
57940
58947
  totalAssetsFormatted,
57941
58948
  positionsByVault,
57942
58949
  marketMeta
57943
58950
  );
57944
- const parsed = parseVault5(
57945
- v,
57946
- chainId,
57947
- prices,
57948
- tokenList,
57949
- exposures,
57950
- liquidityFormatted
58951
+ const utilization = computeSiloUtilization(
58952
+ vaultId,
58953
+ totalAssetsFormatted,
58954
+ positionsByVault,
58955
+ marketMeta
58956
+ );
58957
+ const {
58958
+ rewards,
58959
+ rewardsRate,
58960
+ priced: rewardsPriced
58961
+ } = buildVaultRewards(
58962
+ vaultId,
58963
+ apiTotalAssetsUsd || totalAssetsFormatted * pricePerUnit,
58964
+ programsByShareToken,
58965
+ priceOf2,
58966
+ nowSeconds
57951
58967
  );
58968
+ const parsed = parseVault5(v, chainId, prices, tokenList, {
58969
+ exposures,
58970
+ liquidityFormatted: liquidity.formatted,
58971
+ liquidityProven: liquidity.proven,
58972
+ utilization,
58973
+ rewards,
58974
+ rewardsRate,
58975
+ rewardsPriced
58976
+ });
57952
58977
  if (parsed) out[parsed.address] = parsed;
57953
58978
  }
57954
58979
  return out;
@@ -58083,7 +59108,7 @@ query EvkByAssets($assets: [Bytes!]!) {
58083
59108
  }
58084
59109
  }
58085
59110
  `;
58086
- var ZERO3 = 0n;
59111
+ var ZERO5 = 0n;
58087
59112
  var RAY_TO_PERCENT3 = 1e25;
58088
59113
  function readAddress2(field13) {
58089
59114
  if (!field13) return void 0;
@@ -58098,28 +59123,28 @@ function parseVaultFee(v) {
58098
59123
  return n;
58099
59124
  }
58100
59125
  function safeBigInt(v) {
58101
- if (v == null || v === "") return ZERO3;
59126
+ if (v == null || v === "") return ZERO5;
58102
59127
  try {
58103
59128
  return BigInt(v);
58104
59129
  } catch {
58105
- return ZERO3;
59130
+ return ZERO5;
58106
59131
  }
58107
59132
  }
58108
59133
  function computeWeightedSupplyApy(strategies, totalAssetsRaw, feePercent2, evkIndex) {
58109
59134
  if (!strategies?.length) return 0;
58110
59135
  const totalAssets = safeBigInt(totalAssetsRaw);
58111
- if (totalAssets === ZERO3) return 0;
58112
- let weightedRay = ZERO3;
59136
+ if (totalAssets === ZERO5) return 0;
59137
+ let weightedRay = ZERO5;
58113
59138
  for (const s of strategies) {
58114
59139
  const evk = s.strategy?.toLowerCase();
58115
59140
  if (!evk) continue;
58116
59141
  const apyRay = evkIndex.bySupplyApyRay.get(evk);
58117
59142
  if (apyRay == null) continue;
58118
59143
  const allocated = safeBigInt(s.allocatedAssets);
58119
- if (allocated === ZERO3) continue;
59144
+ if (allocated === ZERO5) continue;
58120
59145
  weightedRay += allocated * apyRay;
58121
59146
  }
58122
- if (weightedRay === ZERO3) return 0;
59147
+ if (weightedRay === ZERO5) return 0;
58123
59148
  const apyRayPerAsset = weightedRay / totalAssets;
58124
59149
  const grossPercent = apyToAprPercent(Number(apyRayPerAsset) / RAY_TO_PERCENT3);
58125
59150
  const netPercent = grossPercent * (1 - feePercent2 / 100);
@@ -58127,24 +59152,24 @@ function computeWeightedSupplyApy(strategies, totalAssetsRaw, feePercent2, evkIn
58127
59152
  }
58128
59153
  function computeRealLiquidity(strategies, totalAssetsRaw, evkIndex) {
58129
59154
  const totalAssets = safeBigInt(totalAssetsRaw);
58130
- if (totalAssets === ZERO3) return ZERO3;
59155
+ if (totalAssets === ZERO5) return ZERO5;
58131
59156
  if (evkIndex.byCash.size === 0 && evkIndex.bySupplyApyRay.size === 0) {
58132
59157
  return totalAssets;
58133
59158
  }
58134
59159
  if (!strategies?.length) {
58135
59160
  return totalAssets;
58136
59161
  }
58137
- let allocSum = ZERO3;
58138
- let withdrawable = ZERO3;
59162
+ let allocSum = ZERO5;
59163
+ let withdrawable = ZERO5;
58139
59164
  for (const s of strategies) {
58140
59165
  const alloc = safeBigInt(s.allocatedAssets);
58141
- if (alloc === ZERO3) continue;
59166
+ if (alloc === ZERO5) continue;
58142
59167
  allocSum += alloc;
58143
59168
  const evk = s.strategy?.toLowerCase();
58144
59169
  const cash = evk ? evkIndex.byCash.get(evk) : void 0;
58145
59170
  withdrawable += cash == null ? alloc : alloc < cash ? alloc : cash;
58146
59171
  }
58147
- const idle = totalAssets > allocSum ? totalAssets - allocSum : ZERO3;
59172
+ const idle = totalAssets > allocSum ? totalAssets - allocSum : ZERO5;
58148
59173
  const result = idle + withdrawable;
58149
59174
  return result > totalAssets ? totalAssets : result;
58150
59175
  }
@@ -58301,7 +59326,7 @@ async function fetchEulerEarnVaultsFromSubgraph(chainId, prices = {}, tokenList
58301
59326
  return out;
58302
59327
  }
58303
59328
  var EULER_DATA_API_BASE2 = "https://v3.euler.finance/v3";
58304
- var API_TIMEOUT_MS = 1e4;
59329
+ var API_TIMEOUT_MS2 = 1e4;
58305
59330
  var DETAIL_CONCURRENCY = 8;
58306
59331
  function safeBigInt2(v) {
58307
59332
  if (v == null || v === "") return 0n;
@@ -58319,7 +59344,7 @@ function rescaleExchangeRate(exchangeRate, shareDecimals) {
58319
59344
  }
58320
59345
  async function getJson3(url) {
58321
59346
  const controller = new AbortController();
58322
- const timer = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
59347
+ const timer = setTimeout(() => controller.abort(), API_TIMEOUT_MS2);
58323
59348
  try {
58324
59349
  const res = await fetch(url, { signal: controller.signal });
58325
59350
  if (!res.ok) return void 0;
@@ -58834,7 +59859,7 @@ var Multicall3BalanceAbi = [
58834
59859
  outputs: [{ type: "uint256" }]
58835
59860
  }
58836
59861
  ];
58837
- var toBigInt14 = (v) => {
59862
+ var toBigInt13 = (v) => {
58838
59863
  if (v === void 0 || v === null) return void 0;
58839
59864
  if (typeof v === "bigint") return v;
58840
59865
  if (typeof v === "number") return BigInt(v);
@@ -58858,12 +59883,12 @@ var readerBeetsStS = (entry) => ({
58858
59883
  ],
58859
59884
  abis: [TotalSupplyAbi, BeetsStSAbi, BeetsStSAbi],
58860
59885
  parse: ([supply, rate, pool]) => {
58861
- const totalSupply = toBigInt14(supply);
58862
- const exchangeRate = toBigInt14(rate);
59886
+ const totalSupply = toBigInt13(supply);
59887
+ const exchangeRate = toBigInt13(rate);
58863
59888
  if (totalSupply === void 0 || exchangeRate === void 0) {
58864
59889
  return void 0;
58865
59890
  }
58866
- const liquidity = toBigInt14(pool);
59891
+ const liquidity = toBigInt13(pool);
58867
59892
  return {
58868
59893
  totalAssets: totalSupply * exchangeRate / ONE_E1811,
58869
59894
  totalSupply,
@@ -58904,12 +59929,12 @@ var readerBenqiSavax = (entry) => ({
58904
59929
  ],
58905
59930
  abis: [TotalSupplyAbi, BenqiSavaxAbi, BenqiSavaxAbi],
58906
59931
  parse: ([supply, rate, totalPooled]) => {
58907
- const totalSupply = toBigInt14(supply);
58908
- const exchangeRate = toBigInt14(rate);
59932
+ const totalSupply = toBigInt13(supply);
59933
+ const exchangeRate = toBigInt13(rate);
58909
59934
  if (totalSupply === void 0 || exchangeRate === void 0) {
58910
59935
  return void 0;
58911
59936
  }
58912
- const totalAssets = toBigInt14(totalPooled) ?? totalSupply * exchangeRate / ONE_E1811;
59937
+ const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E1811;
58913
59938
  return {
58914
59939
  totalAssets,
58915
59940
  totalSupply,
@@ -58923,7 +59948,7 @@ var readerBgtWrapper1to1 = (entry) => ({
58923
59948
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
58924
59949
  abis: [TotalSupplyAbi],
58925
59950
  parse: ([supply]) => {
58926
- const totalSupply = toBigInt14(supply);
59951
+ const totalSupply = toBigInt13(supply);
58927
59952
  if (totalSupply === void 0) return void 0;
58928
59953
  return {
58929
59954
  totalAssets: totalSupply,
@@ -58952,8 +59977,8 @@ var readerDineroBeraEth = (entry) => ({
58952
59977
  ],
58953
59978
  abis: [TotalSupplyAbi, DineroBeraEthAbi],
58954
59979
  parse: ([supply, rate]) => {
58955
- const totalSupply = toBigInt14(supply);
58956
- const exchangeRate = toBigInt14(rate);
59980
+ const totalSupply = toBigInt13(supply);
59981
+ const exchangeRate = toBigInt13(rate);
58957
59982
  if (totalSupply === void 0 || exchangeRate === void 0) {
58958
59983
  return void 0;
58959
59984
  }
@@ -58974,9 +59999,9 @@ var readerErc4626 = (entry) => ({
58974
59999
  ],
58975
60000
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
58976
60001
  parse: ([assets, supply, rate]) => {
58977
- const totalAssets = toBigInt14(assets);
58978
- const totalSupply = toBigInt14(supply);
58979
- const exchangeRate = toBigInt14(rate);
60002
+ const totalAssets = toBigInt13(assets);
60003
+ const totalSupply = toBigInt13(supply);
60004
+ const exchangeRate = toBigInt13(rate);
58980
60005
  if (totalAssets === void 0 || totalSupply === void 0 || exchangeRate === void 0) {
58981
60006
  return void 0;
58982
60007
  }
@@ -58991,9 +60016,9 @@ var readerErc4626PreviewRedeem = (entry) => ({
58991
60016
  ],
58992
60017
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
58993
60018
  parse: ([assets, supply, rate]) => {
58994
- const totalAssets = toBigInt14(assets);
58995
- const totalSupply = toBigInt14(supply);
58996
- const exchangeRate = toBigInt14(rate);
60019
+ const totalAssets = toBigInt13(assets);
60020
+ const totalSupply = toBigInt13(supply);
60021
+ const exchangeRate = toBigInt13(rate);
58997
60022
  if (totalAssets === void 0 || totalSupply === void 0 || exchangeRate === void 0) {
58998
60023
  return void 0;
58999
60024
  }
@@ -59053,15 +60078,15 @@ var readerEtherFiWeEth = (entry) => {
59053
60078
  calls,
59054
60079
  abis,
59055
60080
  parse: (slice2) => {
59056
- const totalSupply = toBigInt14(slice2[0]);
59057
- const exchangeRate = toBigInt14(slice2[1]);
60081
+ const totalSupply = toBigInt13(slice2[0]);
60082
+ const exchangeRate = toBigInt13(slice2[1]);
59058
60083
  if (totalSupply === void 0 || exchangeRate === void 0) {
59059
60084
  return void 0;
59060
60085
  }
59061
60086
  let liquidity;
59062
60087
  if (lp) {
59063
- const lpBalance = toBigInt14(slice2[2]);
59064
- const locked = toBigInt14(slice2[3]);
60088
+ const lpBalance = toBigInt13(slice2[2]);
60089
+ const locked = toBigInt13(slice2[3]);
59065
60090
  if (lpBalance !== void 0 && locked !== void 0) {
59066
60091
  liquidity = lpBalance > locked ? lpBalance - locked : 0n;
59067
60092
  }
@@ -59095,7 +60120,7 @@ var readerHyperbeatBeHype = (entry) => {
59095
60120
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59096
60121
  abis: [TotalSupplyAbi],
59097
60122
  parse: ([supply]) => {
59098
- const totalSupply = toBigInt14(supply);
60123
+ const totalSupply = toBigInt13(supply);
59099
60124
  if (totalSupply === void 0) return void 0;
59100
60125
  return {
59101
60126
  totalAssets: totalSupply,
@@ -59112,8 +60137,8 @@ var readerHyperbeatBeHype = (entry) => {
59112
60137
  ],
59113
60138
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
59114
60139
  parse: ([supply, rate]) => {
59115
- const totalSupply = toBigInt14(supply);
59116
- const exchangeRate = toBigInt14(rate);
60140
+ const totalSupply = toBigInt13(supply);
60141
+ const exchangeRate = toBigInt13(rate);
59117
60142
  if (totalSupply === void 0 || exchangeRate === void 0) {
59118
60143
  return void 0;
59119
60144
  }
@@ -59145,7 +60170,7 @@ var readerKelpRsEth = (entry) => {
59145
60170
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59146
60171
  abis: [TotalSupplyAbi],
59147
60172
  parse: ([supply]) => {
59148
- const totalSupply = toBigInt14(supply);
60173
+ const totalSupply = toBigInt13(supply);
59149
60174
  if (totalSupply === void 0) return void 0;
59150
60175
  return {
59151
60176
  totalAssets: totalSupply,
@@ -59162,8 +60187,8 @@ var readerKelpRsEth = (entry) => {
59162
60187
  ],
59163
60188
  abis: [TotalSupplyAbi, KelpLrtOracleAbi],
59164
60189
  parse: ([supply, rate]) => {
59165
- const totalSupply = toBigInt14(supply);
59166
- const exchangeRate = toBigInt14(rate);
60190
+ const totalSupply = toBigInt13(supply);
60191
+ const exchangeRate = toBigInt13(rate);
59167
60192
  if (totalSupply === void 0 || exchangeRate === void 0) {
59168
60193
  return void 0;
59169
60194
  }
@@ -59195,7 +60220,7 @@ var readerKinetiqKHype = (entry) => {
59195
60220
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59196
60221
  abis: [TotalSupplyAbi],
59197
60222
  parse: ([supply]) => {
59198
- const totalSupply = toBigInt14(supply);
60223
+ const totalSupply = toBigInt13(supply);
59199
60224
  if (totalSupply === void 0) return void 0;
59200
60225
  return {
59201
60226
  totalAssets: totalSupply,
@@ -59212,8 +60237,8 @@ var readerKinetiqKHype = (entry) => {
59212
60237
  ],
59213
60238
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
59214
60239
  parse: ([supply, rate]) => {
59215
- const totalSupply = toBigInt14(supply);
59216
- const exchangeRate = toBigInt14(rate);
60240
+ const totalSupply = toBigInt13(supply);
60241
+ const exchangeRate = toBigInt13(rate);
59217
60242
  if (totalSupply === void 0 || exchangeRate === void 0) {
59218
60243
  return void 0;
59219
60244
  }
@@ -59253,12 +60278,12 @@ var readerLairStKaia = (entry) => ({
59253
60278
  ],
59254
60279
  abis: [TotalSupplyAbi, LairStKaiaAbi, LairStKaiaAbi],
59255
60280
  parse: ([supply, rate, totalStaking]) => {
59256
- const totalSupply = toBigInt14(supply);
59257
- const exchangeRate = toBigInt14(rate);
60281
+ const totalSupply = toBigInt13(supply);
60282
+ const exchangeRate = toBigInt13(rate);
59258
60283
  if (totalSupply === void 0 || exchangeRate === void 0) {
59259
60284
  return void 0;
59260
60285
  }
59261
- const totalAssets = toBigInt14(totalStaking) ?? totalSupply * exchangeRate / ONE_E1811;
60286
+ const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E1811;
59262
60287
  return {
59263
60288
  totalAssets,
59264
60289
  totalSupply,
@@ -59286,8 +60311,8 @@ var readerLidoWstEth = (entry) => ({
59286
60311
  ],
59287
60312
  abis: [TotalSupplyAbi, LidoWstEthAbi],
59288
60313
  parse: ([supply, rate]) => {
59289
- const totalSupply = toBigInt14(supply);
59290
- const exchangeRate = toBigInt14(rate);
60314
+ const totalSupply = toBigInt13(supply);
60315
+ const exchangeRate = toBigInt13(rate);
59291
60316
  if (totalSupply === void 0 || exchangeRate === void 0) {
59292
60317
  return void 0;
59293
60318
  }
@@ -59325,7 +60350,7 @@ var readerListaSlisBnb = (entry) => {
59325
60350
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59326
60351
  abis: [TotalSupplyAbi],
59327
60352
  parse: ([supply]) => {
59328
- const totalSupply = toBigInt14(supply);
60353
+ const totalSupply = toBigInt13(supply);
59329
60354
  if (totalSupply === void 0) return void 0;
59330
60355
  return {
59331
60356
  totalAssets: totalSupply,
@@ -59343,12 +60368,12 @@ var readerListaSlisBnb = (entry) => {
59343
60368
  ],
59344
60369
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
59345
60370
  parse: ([supply, rate, pooled]) => {
59346
- const totalSupply = toBigInt14(supply);
59347
- const exchangeRate = toBigInt14(rate);
60371
+ const totalSupply = toBigInt13(supply);
60372
+ const exchangeRate = toBigInt13(rate);
59348
60373
  if (totalSupply === void 0 || exchangeRate === void 0) {
59349
60374
  return void 0;
59350
60375
  }
59351
- const pooledBnb = toBigInt14(pooled);
60376
+ const pooledBnb = toBigInt13(pooled);
59352
60377
  const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E1811;
59353
60378
  return { totalAssets, totalSupply, exchangeRate };
59354
60379
  }
@@ -59374,7 +60399,7 @@ var readerMantleMEth = (entry) => {
59374
60399
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59375
60400
  abis: [TotalSupplyAbi],
59376
60401
  parse: ([supply]) => {
59377
- const totalSupply = toBigInt14(supply);
60402
+ const totalSupply = toBigInt13(supply);
59378
60403
  if (totalSupply === void 0) return void 0;
59379
60404
  return {
59380
60405
  totalAssets: totalSupply,
@@ -59391,8 +60416,8 @@ var readerMantleMEth = (entry) => {
59391
60416
  ],
59392
60417
  abis: [TotalSupplyAbi, MantleStakingAbi],
59393
60418
  parse: ([supply, rate]) => {
59394
- const totalSupply = toBigInt14(supply);
59395
- const exchangeRate = toBigInt14(rate);
60419
+ const totalSupply = toBigInt13(supply);
60420
+ const exchangeRate = toBigInt13(rate);
59396
60421
  if (totalSupply === void 0 || exchangeRate === void 0) {
59397
60422
  return void 0;
59398
60423
  }
@@ -59413,7 +60438,7 @@ var readerOffChain = (entry) => {
59413
60438
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59414
60439
  abis: [TotalSupplyAbi],
59415
60440
  parse: ([supply]) => {
59416
- const totalSupply = toBigInt14(supply);
60441
+ const totalSupply = toBigInt13(supply);
59417
60442
  if (totalSupply === void 0) return void 0;
59418
60443
  return {
59419
60444
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
@@ -59447,7 +60472,7 @@ var readerRenzoEzEth = (entry) => {
59447
60472
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59448
60473
  abis: [TotalSupplyAbi],
59449
60474
  parse: ([supply]) => {
59450
- const totalSupply = toBigInt14(supply);
60475
+ const totalSupply = toBigInt13(supply);
59451
60476
  if (totalSupply === void 0) return void 0;
59452
60477
  return {
59453
60478
  totalAssets: totalSupply,
@@ -59464,9 +60489,9 @@ var readerRenzoEzEth = (entry) => {
59464
60489
  ],
59465
60490
  abis: [TotalSupplyAbi, RenzoRestakeManagerAbi],
59466
60491
  parse: ([supply, tvls]) => {
59467
- const totalSupply = toBigInt14(supply);
60492
+ const totalSupply = toBigInt13(supply);
59468
60493
  if (totalSupply === void 0 || totalSupply === 0n) return void 0;
59469
- const totalTvl = Array.isArray(tvls) && tvls.length >= 3 ? toBigInt14(tvls[2]) : void 0;
60494
+ const totalTvl = Array.isArray(tvls) && tvls.length >= 3 ? toBigInt13(tvls[2]) : void 0;
59470
60495
  if (totalTvl === void 0) return void 0;
59471
60496
  return {
59472
60497
  totalAssets: totalTvl,
@@ -59520,12 +60545,12 @@ var readerRocketReth = (entry) => {
59520
60545
  calls,
59521
60546
  abis,
59522
60547
  parse: (slice2) => {
59523
- const totalSupply = toBigInt14(slice2[0]);
59524
- const exchangeRate = toBigInt14(slice2[1]);
60548
+ const totalSupply = toBigInt13(slice2[0]);
60549
+ const exchangeRate = toBigInt13(slice2[1]);
59525
60550
  if (totalSupply === void 0 || exchangeRate === void 0) {
59526
60551
  return void 0;
59527
60552
  }
59528
- const liquidity = depositPool ? toBigInt14(slice2[2]) : void 0;
60553
+ const liquidity = depositPool ? toBigInt13(slice2[2]) : void 0;
59529
60554
  return {
59530
60555
  totalAssets: totalSupply * exchangeRate / ONE_E1811,
59531
60556
  totalSupply,
@@ -59564,7 +60589,7 @@ var readerStaderEthx = (entry) => {
59564
60589
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59565
60590
  abis: [TotalSupplyAbi],
59566
60591
  parse: ([supply]) => {
59567
- const totalSupply = toBigInt14(supply);
60592
+ const totalSupply = toBigInt13(supply);
59568
60593
  if (totalSupply === void 0) return void 0;
59569
60594
  return {
59570
60595
  totalAssets: totalSupply,
@@ -59581,8 +60606,8 @@ var readerStaderEthx = (entry) => {
59581
60606
  ],
59582
60607
  abis: [TotalSupplyAbi, StaderEthxAbi],
59583
60608
  parse: ([supply, rate]) => {
59584
- const totalSupply = toBigInt14(supply);
59585
- const exchangeRate = toBigInt14(rate);
60609
+ const totalSupply = toBigInt13(supply);
60610
+ const exchangeRate = toBigInt13(rate);
59586
60611
  if (totalSupply === void 0 || exchangeRate === void 0) {
59587
60612
  return void 0;
59588
60613
  }
@@ -59610,10 +60635,10 @@ var readerStaderMaticX = (entry) => {
59610
60635
  ],
59611
60636
  abis: [TotalSupplyAbi, StaderMaticXAbi],
59612
60637
  parse: ([supply, tup]) => {
59613
- const totalSupply = toBigInt14(supply);
60638
+ const totalSupply = toBigInt13(supply);
59614
60639
  if (!Array.isArray(tup) || tup.length < 3) return void 0;
59615
- const amountInMatic = toBigInt14(tup[0]);
59616
- const totalPooledMatic = toBigInt14(tup[2]);
60640
+ const amountInMatic = toBigInt13(tup[0]);
60641
+ const totalPooledMatic = toBigInt13(tup[2]);
59617
60642
  if (totalSupply === void 0 || amountInMatic === void 0) {
59618
60643
  return void 0;
59619
60644
  }
@@ -59646,7 +60671,7 @@ var readerStakeWiseOsEth = (entry) => {
59646
60671
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59647
60672
  abis: [TotalSupplyAbi],
59648
60673
  parse: ([supply]) => {
59649
- const totalSupply = toBigInt14(supply);
60674
+ const totalSupply = toBigInt13(supply);
59650
60675
  if (totalSupply === void 0) return void 0;
59651
60676
  return {
59652
60677
  totalAssets: totalSupply,
@@ -59663,8 +60688,8 @@ var readerStakeWiseOsEth = (entry) => {
59663
60688
  ],
59664
60689
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
59665
60690
  parse: ([supply, rate]) => {
59666
- const totalSupply = toBigInt14(supply);
59667
- const exchangeRate = toBigInt14(rate);
60691
+ const totalSupply = toBigInt13(supply);
60692
+ const exchangeRate = toBigInt13(rate);
59668
60693
  if (totalSupply === void 0 || exchangeRate === void 0) {
59669
60694
  return void 0;
59670
60695
  }
@@ -59696,7 +60721,7 @@ var readerStCelo = (entry) => {
59696
60721
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59697
60722
  abis: [TotalSupplyAbi],
59698
60723
  parse: ([supply]) => {
59699
- const totalSupply = toBigInt14(supply);
60724
+ const totalSupply = toBigInt13(supply);
59700
60725
  if (totalSupply === void 0) return void 0;
59701
60726
  return {
59702
60727
  totalAssets: totalSupply,
@@ -59713,8 +60738,8 @@ var readerStCelo = (entry) => {
59713
60738
  ],
59714
60739
  abis: [TotalSupplyAbi, StCeloManagerAbi],
59715
60740
  parse: ([supply, rate]) => {
59716
- const totalSupply = toBigInt14(supply);
59717
- const exchangeRate = toBigInt14(rate);
60741
+ const totalSupply = toBigInt13(supply);
60742
+ const exchangeRate = toBigInt13(rate);
59718
60743
  if (totalSupply === void 0 || exchangeRate === void 0) {
59719
60744
  return void 0;
59720
60745
  }
@@ -59746,8 +60771,8 @@ var readerSwellGetRate = (entry) => ({
59746
60771
  ],
59747
60772
  abis: [TotalSupplyAbi, SwellGetRateAbi],
59748
60773
  parse: ([supply, rate]) => {
59749
- const totalSupply = toBigInt14(supply);
59750
- const exchangeRate = toBigInt14(rate);
60774
+ const totalSupply = toBigInt13(supply);
60775
+ const exchangeRate = toBigInt13(rate);
59751
60776
  if (totalSupply === void 0 || exchangeRate === void 0) {
59752
60777
  return void 0;
59753
60778
  }
@@ -59778,7 +60803,7 @@ var readerValantisWstHype = (entry) => {
59778
60803
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59779
60804
  abis: [TotalSupplyAbi],
59780
60805
  parse: ([supply]) => {
59781
- const totalSupply = toBigInt14(supply);
60806
+ const totalSupply = toBigInt13(supply);
59782
60807
  if (totalSupply === void 0) return void 0;
59783
60808
  return {
59784
60809
  totalAssets: totalSupply,
@@ -59795,8 +60820,8 @@ var readerValantisWstHype = (entry) => {
59795
60820
  ],
59796
60821
  abis: [TotalSupplyAbi, ValantisStHypeAbi],
59797
60822
  parse: ([supply, rate]) => {
59798
- const totalSupply = toBigInt14(supply);
59799
- const exchangeRate = toBigInt14(rate);
60823
+ const totalSupply = toBigInt13(supply);
60824
+ const exchangeRate = toBigInt13(rate);
59800
60825
  if (totalSupply === void 0 || exchangeRate === void 0) {
59801
60826
  return void 0;
59802
60827
  }
@@ -59830,7 +60855,7 @@ var readerVedaAccountant = (entry) => {
59830
60855
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
59831
60856
  abis: [TotalSupplyAbi],
59832
60857
  parse: ([supply]) => {
59833
- const totalSupply = toBigInt14(supply);
60858
+ const totalSupply = toBigInt13(supply);
59834
60859
  if (totalSupply === void 0) return void 0;
59835
60860
  return {
59836
60861
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
@@ -59848,8 +60873,8 @@ var readerVedaAccountant = (entry) => {
59848
60873
  ],
59849
60874
  abis: [TotalSupplyAbi, VedaAccountantGetRateAbi],
59850
60875
  parse: ([supply, rate]) => {
59851
- const totalSupply = toBigInt14(supply);
59852
- const rawRate = toBigInt14(rate);
60876
+ const totalSupply = toBigInt13(supply);
60877
+ const rawRate = toBigInt13(rate);
59853
60878
  if (totalSupply === void 0 || rawRate === void 0) return void 0;
59854
60879
  const exchangeRate = rawRate * scale3;
59855
60880
  return {
@@ -59884,8 +60909,8 @@ var readerAnkrRatio = (entry) => ({
59884
60909
  ],
59885
60910
  abis: [TotalSupplyAbi, AnkrRatioAbi],
59886
60911
  parse: ([supply, ratio]) => {
59887
- const totalSupply = toBigInt14(supply);
59888
- const r = toBigInt14(ratio);
60912
+ const totalSupply = toBigInt13(supply);
60913
+ const r = toBigInt13(ratio);
59889
60914
  if (totalSupply === void 0 || r === void 0 || r === 0n) {
59890
60915
  return void 0;
59891
60916
  }
@@ -59916,8 +60941,8 @@ var readerBinanceWbeth = (entry) => ({
59916
60941
  ],
59917
60942
  abis: [TotalSupplyAbi, WbethExchangeRateAbi],
59918
60943
  parse: ([supply, rate]) => {
59919
- const totalSupply = toBigInt14(supply);
59920
- const exchangeRate = toBigInt14(rate);
60944
+ const totalSupply = toBigInt13(supply);
60945
+ const exchangeRate = toBigInt13(rate);
59921
60946
  if (totalSupply === void 0 || exchangeRate === void 0) {
59922
60947
  return void 0;
59923
60948
  }
@@ -59960,8 +60985,8 @@ var readerCoreEarnRate = (entry) => {
59960
60985
  ],
59961
60986
  abis: [CoreEarnRateAbi, TotalSupplyAbi],
59962
60987
  parse: ([rate, supply]) => {
59963
- const r = toBigInt14(rate);
59964
- const totalSupply = toBigInt14(supply);
60988
+ const r = toBigInt13(rate);
60989
+ const totalSupply = toBigInt13(supply);
59965
60990
  if (r === void 0 || r === 0n || totalSupply === void 0) {
59966
60991
  return void 0;
59967
60992
  }
@@ -59982,8 +61007,8 @@ var readerCoreStakedRatio = (entry) => {
59982
61007
  ],
59983
61008
  abis: [CoreTotalStakedAbi, TotalSupplyAbi],
59984
61009
  parse: ([staked, supply]) => {
59985
- const totalStaked = toBigInt14(staked);
59986
- const totalSupply = toBigInt14(supply);
61010
+ const totalStaked = toBigInt13(staked);
61011
+ const totalSupply = toBigInt13(supply);
59987
61012
  if (totalStaked === void 0 || totalSupply === void 0 || totalSupply === 0n) {
59988
61013
  return void 0;
59989
61014
  }
@@ -60022,8 +61047,8 @@ var readerKintsuSMon = (entry) => ({
60022
61047
  ],
60023
61048
  abis: [KintsuSMonAbi, KintsuSMonAbi],
60024
61049
  parse: ([pooled, shares]) => {
60025
- const totalAssets = toBigInt14(pooled);
60026
- const totalSupply = toBigInt14(shares);
61050
+ const totalAssets = toBigInt13(pooled);
61051
+ const totalSupply = toBigInt13(shares);
60027
61052
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
60028
61053
  const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E1811 / totalSupply : ONE_E1811;
60029
61054
  return { totalAssets, totalSupply, exchangeRate };
@@ -60544,7 +61569,7 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
60544
61569
  const validatorsByAddress = new Map(validatorEntries);
60545
61570
  const idleByAddress = /* @__PURE__ */ new Map();
60546
61571
  idleEntries.forEach((e, i) => {
60547
- const bal = toBigInt14(idleResults[i]);
61572
+ const bal = toBigInt13(idleResults[i]);
60548
61573
  if (bal !== void 0) idleByAddress.set(e.address.toLowerCase(), bal);
60549
61574
  });
60550
61575
  const rawResults = new Array(allCalls.length);
@@ -60674,7 +61699,7 @@ var BeetsStSWithdrawalAbi = [
60674
61699
  ];
60675
61700
 
60676
61701
  // src/vaults/lst/withdrawals/readers/shared.ts
60677
- var toBigInt15 = (v) => {
61702
+ var toBigInt14 = (v) => {
60678
61703
  if (v === void 0 || v === null) return void 0;
60679
61704
  if (typeof v === "bigint") return v;
60680
61705
  if (typeof v === "number") return BigInt(v);
@@ -60689,7 +61714,7 @@ var toBigInt15 = (v) => {
60689
61714
  return void 0;
60690
61715
  };
60691
61716
  var toNumber = (v) => {
60692
- const b = toBigInt15(v);
61717
+ const b = toBigInt14(v);
60693
61718
  if (b === void 0) return void 0;
60694
61719
  if (b > BigInt(Number.MAX_SAFE_INTEGER)) return void 0;
60695
61720
  return Number(b);
@@ -60726,7 +61751,7 @@ var readerBeets = {
60726
61751
  const out = [];
60727
61752
  for (let i = 0; i < reqs.length; i++) {
60728
61753
  const r = reqs[i];
60729
- const amount3 = toBigInt15(r.assetAmount);
61754
+ const amount3 = toBigInt14(r.assetAmount);
60730
61755
  const ts = toNumber(r.requestTimestamp);
60731
61756
  const isWithdrawn = Boolean(r.isWithdrawn);
60732
61757
  if (amount3 === void 0 || ts === void 0) continue;
@@ -60818,13 +61843,13 @@ var readerBeHype = {
60818
61843
  const q = stage2[i * 2];
60819
61844
  const canClaim = Boolean(stage2[i * 2 + 1]);
60820
61845
  if (!q) continue;
60821
- const hypeAmount = Array.isArray(q) ? toBigInt15(q[2]) : toBigInt15(q.hypeAmount);
61846
+ const hypeAmount = Array.isArray(q) ? toBigInt14(q[2]) : toBigInt14(q.hypeAmount);
60822
61847
  if (hypeAmount === void 0) continue;
60823
61848
  out.push({
60824
61849
  lst: entry.lst,
60825
61850
  brand: entry.brand,
60826
61851
  symbol: entry.symbol,
60827
- requestId: String(toBigInt15(ids[i]) ?? i),
61852
+ requestId: String(toBigInt14(ids[i]) ?? i),
60828
61853
  amountUnderlying: hypeAmount.toString(),
60829
61854
  status: canClaim ? "claimable" : "pending"
60830
61855
  });
@@ -60927,7 +61952,7 @@ var readerBenqi = {
60927
61952
  for (let i = 0; i < reqs.length; i++) {
60928
61953
  const r = reqs[i];
60929
61954
  const startedAt = toNumber(r.startedAt);
60930
- const shareAmount = toBigInt15(r.shareAmount);
61955
+ const shareAmount = toBigInt14(r.shareAmount);
60931
61956
  if (startedAt === void 0 || shareAmount === void 0) continue;
60932
61957
  const readyAt = startedAt + cooldown;
60933
61958
  const expiresAt = readyAt + claimWindow;
@@ -61016,8 +62041,8 @@ var readerBinanceWbeth2 = {
61016
62041
  for (let i = 0; i < reqs.length; i++) {
61017
62042
  const r = reqs[i];
61018
62043
  const triggerTime = toNumber(r.triggerTime);
61019
- const ethAmount = toBigInt15(r.ethAmount);
61020
- const wbethAmount = toBigInt15(r.wbethAmount);
62044
+ const ethAmount = toBigInt14(r.ethAmount);
62045
+ const wbethAmount = toBigInt14(r.wbethAmount);
61021
62046
  if (triggerTime === void 0 || ethAmount === void 0) continue;
61022
62047
  const readyAt = triggerTime + lockTime;
61023
62048
  const claimed = (toNumber(r.claimTime) ?? 0) > 0;
@@ -61080,8 +62105,8 @@ var readerBeraPaw = {
61080
62105
  }
61081
62106
  const pos = res[0];
61082
62107
  if (!pos) return [];
61083
- const queued = Array.isArray(pos) ? toBigInt15(pos[0]) : toBigInt15(pos.queued);
61084
- const available = Array.isArray(pos) ? toBigInt15(pos[1]) : toBigInt15(pos.available);
62108
+ const queued = Array.isArray(pos) ? toBigInt14(pos[0]) : toBigInt14(pos.queued);
62109
+ const available = Array.isArray(pos) ? toBigInt14(pos[1]) : toBigInt14(pos.available);
61085
62110
  const out = [];
61086
62111
  if (available !== void 0 && available > 0n) {
61087
62112
  out.push({
@@ -61163,7 +62188,7 @@ var readerIbera = {
61163
62188
  return [];
61164
62189
  }
61165
62190
  const length = toNumber(stage1[0]) ?? 0;
61166
- const frontier = toBigInt15(stage1[1]) ?? 0n;
62191
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
61167
62192
  if (length === 0) return [];
61168
62193
  const start = length > MAX_SCAN ? length - MAX_SCAN : 0;
61169
62194
  const ids = Array.from({ length: length - start }, (_3, k) => start + k);
@@ -61187,7 +62212,7 @@ var readerIbera = {
61187
62212
  const r = stage2[k];
61188
62213
  if (!r) continue;
61189
62214
  const receiver = Array.isArray(r) ? r[2] : r.receiver;
61190
- const amount3 = Array.isArray(r) ? toBigInt15(r[3]) : toBigInt15(r.amount);
62215
+ const amount3 = Array.isArray(r) ? toBigInt14(r[3]) : toBigInt14(r.amount);
61191
62216
  if (typeof receiver !== "string" || receiver.toLowerCase() !== target || amount3 === void 0 || amount3 === 0n) {
61192
62217
  continue;
61193
62218
  }
@@ -61260,7 +62285,7 @@ var readerPrimeStaking = {
61260
62285
  return [];
61261
62286
  }
61262
62287
  const length = toNumber(stage1[0]) ?? 0;
61263
- const frontier = toBigInt15(stage1[1]) ?? 0n;
62288
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
61264
62289
  if (length === 0) return [];
61265
62290
  const start = length > MAX_SCAN2 ? length - MAX_SCAN2 : 0;
61266
62291
  const ids = Array.from({ length: length - start }, (_3, k) => start + k);
@@ -61284,7 +62309,7 @@ var readerPrimeStaking = {
61284
62309
  const r = stage2[k];
61285
62310
  if (!r) continue;
61286
62311
  const receiver = Array.isArray(r) ? r[1] : r.receiver;
61287
- const assets = Array.isArray(r) ? toBigInt15(r[3]) : toBigInt15(r.assets);
62312
+ const assets = Array.isArray(r) ? toBigInt14(r[3]) : toBigInt14(r.assets);
61288
62313
  const processed = Array.isArray(r) ? r[4] : r.processed;
61289
62314
  if (typeof receiver !== "string" || receiver.toLowerCase() !== target || assets === void 0 || assets === 0n) {
61290
62315
  continue;
@@ -61355,8 +62380,8 @@ var readerErc7540 = {
61355
62380
  ],
61356
62381
  abi: [Erc7540Abi, Erc7540Abi]
61357
62382
  });
61358
- const pending = toBigInt15(stage1[0]) ?? 0n;
61359
- const claimable = toBigInt15(stage1[1]) ?? 0n;
62383
+ const pending = toBigInt14(stage1[0]) ?? 0n;
62384
+ const claimable = toBigInt14(stage1[1]) ?? 0n;
61360
62385
  const out = [];
61361
62386
  if (claimable > 0n) {
61362
62387
  const stage2 = await multicallRetry({
@@ -61370,7 +62395,7 @@ var readerErc7540 = {
61370
62395
  ],
61371
62396
  abi: [Erc7540Abi]
61372
62397
  });
61373
- const amount3 = toBigInt15(stage2[0]) ?? claimable;
62398
+ const amount3 = toBigInt14(stage2[0]) ?? claimable;
61374
62399
  out.push({
61375
62400
  lst: entry.lst,
61376
62401
  brand: entry.brand,
@@ -61427,11 +62452,11 @@ var readerEthenaCooldown = {
61427
62452
  let cooldownEnd;
61428
62453
  let amount3;
61429
62454
  if (Array.isArray(cell)) {
61430
- cooldownEnd = toBigInt15(cell[0]);
61431
- amount3 = toBigInt15(cell[1]);
62455
+ cooldownEnd = toBigInt14(cell[0]);
62456
+ amount3 = toBigInt14(cell[1]);
61432
62457
  } else if (cell && typeof cell === "object") {
61433
- cooldownEnd = toBigInt15(cell.cooldownEnd);
61434
- amount3 = toBigInt15(cell.underlyingAmount);
62458
+ cooldownEnd = toBigInt14(cell.cooldownEnd);
62459
+ amount3 = toBigInt14(cell.underlyingAmount);
61435
62460
  }
61436
62461
  if (!amount3 || amount3 === 0n) return [];
61437
62462
  const readyAt = Number(cooldownEnd ?? 0n);
@@ -61487,13 +62512,13 @@ var readerSusd3Cooldown = {
61487
62512
  let windowEnd;
61488
62513
  let shares;
61489
62514
  if (Array.isArray(cell)) {
61490
- cooldownEnd = toBigInt15(cell[0]);
61491
- windowEnd = toBigInt15(cell[1]);
61492
- shares = toBigInt15(cell[2]);
62515
+ cooldownEnd = toBigInt14(cell[0]);
62516
+ windowEnd = toBigInt14(cell[1]);
62517
+ shares = toBigInt14(cell[2]);
61493
62518
  } else if (cell && typeof cell === "object") {
61494
- cooldownEnd = toBigInt15(cell.cooldownEnd);
61495
- windowEnd = toBigInt15(cell.windowEnd);
61496
- shares = toBigInt15(cell.shares);
62519
+ cooldownEnd = toBigInt14(cell.cooldownEnd);
62520
+ windowEnd = toBigInt14(cell.windowEnd);
62521
+ shares = toBigInt14(cell.shares);
61497
62522
  }
61498
62523
  if (!shares || shares === 0n) return [];
61499
62524
  let amount3 = shares;
@@ -61505,7 +62530,7 @@ var readerSusd3Cooldown = {
61505
62530
  ],
61506
62531
  abi: [Susd3CooldownStatusAbi]
61507
62532
  });
61508
- amount3 = toBigInt15(stage2[0]) ?? shares;
62533
+ amount3 = toBigInt14(stage2[0]) ?? shares;
61509
62534
  } catch {
61510
62535
  }
61511
62536
  const readyAt = Number(cooldownEnd ?? 0n);
@@ -61579,12 +62604,12 @@ var readerStrataCooldown = {
61579
62604
  let claimable;
61580
62605
  let nextUnlockAt;
61581
62606
  if (Array.isArray(cell)) {
61582
- pending = toBigInt15(cell[0]);
61583
- claimable = toBigInt15(cell[1]);
62607
+ pending = toBigInt14(cell[0]);
62608
+ claimable = toBigInt14(cell[1]);
61584
62609
  nextUnlockAt = toNumber(cell[2]);
61585
62610
  } else if (cell && typeof cell === "object") {
61586
- pending = toBigInt15(cell.pending);
61587
- claimable = toBigInt15(cell.claimable);
62611
+ pending = toBigInt14(cell.pending);
62612
+ claimable = toBigInt14(cell.claimable);
61588
62613
  nextUnlockAt = toNumber(cell.nextUnlockAt);
61589
62614
  }
61590
62615
  const escrow = { withdrawQueue: contracts[i], claimToken: escrowToken };
@@ -61692,7 +62717,7 @@ var readerEtherFi = {
61692
62717
  calls: enumCalls,
61693
62718
  abi: enumCalls.map(() => EtherFiWithdrawRequestAbi)
61694
62719
  });
61695
- const ids = stage2.map(toBigInt15).filter((v) => v !== void 0);
62720
+ const ids = stage2.map(toBigInt14).filter((v) => v !== void 0);
61696
62721
  if (ids.length === 0) return [];
61697
62722
  const detailCalls = ids.flatMap((id) => [
61698
62723
  { address: entry.withdrawalContract, name: "getRequest", params: [id] },
@@ -61712,7 +62737,7 @@ var readerEtherFi = {
61712
62737
  const isValid = Boolean(stage3[i * 3 + 2]);
61713
62738
  if (!req) continue;
61714
62739
  if (!isValid) continue;
61715
- const amount3 = toBigInt15(req.amountOfEEth);
62740
+ const amount3 = toBigInt14(req.amountOfEEth);
61716
62741
  if (amount3 === void 0) continue;
61717
62742
  out.push({
61718
62743
  lst: entry.lst,
@@ -61807,7 +62832,7 @@ var readerKelp = {
61807
62832
  }
61808
62833
  ],
61809
62834
  abi: [KelpWithdrawalManagerAbi]
61810
- }).then((res) => toBigInt15(res[0]) ?? 0n)
62835
+ }).then((res) => toBigInt14(res[0]) ?? 0n)
61811
62836
  ]);
61812
62837
  lengths = storageReads;
61813
62838
  currentBlock = block;
@@ -61839,9 +62864,9 @@ var readerKelp = {
61839
62864
  for (let i = 0; i < detailCalls.length; i++) {
61840
62865
  const r = stage2[i];
61841
62866
  if (!r) continue;
61842
- const expected = Array.isArray(r) ? toBigInt15(r[1]) : toBigInt15(r.expectedAssetAmount);
61843
- const startBlock = Array.isArray(r) ? toBigInt15(r[2]) : toBigInt15(r.withdrawalStartBlock);
61844
- const nonce = Array.isArray(r) ? toBigInt15(r[3]) : toBigInt15(r.userNonce);
62867
+ const expected = Array.isArray(r) ? toBigInt14(r[1]) : toBigInt14(r.expectedAssetAmount);
62868
+ const startBlock = Array.isArray(r) ? toBigInt14(r[2]) : toBigInt14(r.withdrawalStartBlock);
62869
+ const nonce = Array.isArray(r) ? toBigInt14(r[3]) : toBigInt14(r.userNonce);
61845
62870
  if (expected === void 0 || startBlock === void 0) continue;
61846
62871
  const claimable = currentBlock >= startBlock + delayBlocks;
61847
62872
  out.push({
@@ -61918,7 +62943,7 @@ var readerLido = {
61918
62943
  abi: [LidoWithdrawalQueueAbi, LidoWithdrawalQueueAbi]
61919
62944
  });
61920
62945
  const ids = stage1[0];
61921
- const frontier = toBigInt15(stage1[1]) ?? 0n;
62946
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
61922
62947
  if (!Array.isArray(ids) || ids.length === 0) return [];
61923
62948
  const stage2 = await multicallRetry({
61924
62949
  chain: chainId,
@@ -61935,10 +62960,10 @@ var readerLido = {
61935
62960
  if (!Array.isArray(statuses)) return [];
61936
62961
  const out = [];
61937
62962
  for (let i = 0; i < ids.length; i++) {
61938
- const id = toBigInt15(ids[i]);
62963
+ const id = toBigInt14(ids[i]);
61939
62964
  const s = statuses[i];
61940
62965
  if (id === void 0 || !s) continue;
61941
- const amountOfStETH = toBigInt15(s.amountOfStETH);
62966
+ const amountOfStETH = toBigInt14(s.amountOfStETH);
61942
62967
  const isFinalized = Boolean(s.isFinalized);
61943
62968
  const isClaimed = Boolean(s.isClaimed);
61944
62969
  if (amountOfStETH === void 0) continue;
@@ -62047,11 +63072,11 @@ var readerLista = {
62047
63072
  const status = stage2[i];
62048
63073
  if (!status) continue;
62049
63074
  const isClaimable = Array.isArray(status) ? Boolean(status[0]) : Boolean(status._isClaimable);
62050
- const bnbAmount = Array.isArray(status) ? toBigInt15(status[1]) : toBigInt15(status._amount);
62051
- const snbnbAmount = Array.isArray(req) ? toBigInt15(req[1]) : toBigInt15(req?.amountInSnBnb);
63075
+ const bnbAmount = Array.isArray(status) ? toBigInt14(status[1]) : toBigInt14(status._amount);
63076
+ const snbnbAmount = Array.isArray(req) ? toBigInt14(req[1]) : toBigInt14(req?.amountInSnBnb);
62052
63077
  const amount3 = bnbAmount ?? snbnbAmount;
62053
63078
  if (amount3 === void 0) continue;
62054
- const uuid = Array.isArray(req) ? toBigInt15(req[0]) : toBigInt15(req?.uuid);
63079
+ const uuid = Array.isArray(req) ? toBigInt14(req[0]) : toBigInt14(req?.uuid);
62055
63080
  out.push({
62056
63081
  lst: entry.lst,
62057
63082
  brand: entry.brand,
@@ -62136,7 +63161,7 @@ var readerRenzo = {
62136
63161
  for (let i = 0; i < count; i++) {
62137
63162
  const tup = stage2[i];
62138
63163
  if (!Array.isArray(tup) || tup.length < 5) continue;
62139
- const amountToRedeem = toBigInt15(tup[2]);
63164
+ const amountToRedeem = toBigInt14(tup[2]);
62140
63165
  const createdAt = toNumber(tup[4]);
62141
63166
  if (amountToRedeem === void 0 || createdAt === void 0) continue;
62142
63167
  const readyAt = createdAt + cooldown;
@@ -62209,9 +63234,9 @@ var readerStaderEthx2 = {
62209
63234
  ]
62210
63235
  });
62211
63236
  const ids = stage1[0];
62212
- const frontier = toBigInt15(stage1[1]) ?? 0n;
63237
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
62213
63238
  if (!Array.isArray(ids) || ids.length === 0) return [];
62214
- const idBigInts = ids.map(toBigInt15).filter((v) => v !== void 0);
63239
+ const idBigInts = ids.map(toBigInt14).filter((v) => v !== void 0);
62215
63240
  const detailCalls = idBigInts.map((id) => ({
62216
63241
  address: entry.withdrawalContract,
62217
63242
  name: "userWithdrawRequests",
@@ -62227,8 +63252,8 @@ var readerStaderEthx2 = {
62227
63252
  const id = idBigInts[i];
62228
63253
  const tup = stage2[i];
62229
63254
  if (!Array.isArray(tup) || tup.length < 5) continue;
62230
- const ethExpected = toBigInt15(tup[2]) ?? 0n;
62231
- const ethFinalized = toBigInt15(tup[3]) ?? 0n;
63255
+ const ethExpected = toBigInt14(tup[2]) ?? 0n;
63256
+ const ethFinalized = toBigInt14(tup[3]) ?? 0n;
62232
63257
  const isFinalized = id < frontier && ethFinalized > 0n;
62233
63258
  const queuePosition = isFinalized ? 0 : Number(id - frontier);
62234
63259
  out.push({
@@ -62307,13 +63332,13 @@ var readerStaderMaticX2 = {
62307
63332
  });
62308
63333
  const arr = stage1[0];
62309
63334
  if (!Array.isArray(arr)) return [];
62310
- const currentEpoch = stakeManager ? toBigInt15(stage1[1]) ?? 0n : 0n;
62311
- const delay = stakeManager ? toBigInt15(stage1[2]) ?? 0n : 0n;
63335
+ const currentEpoch = stakeManager ? toBigInt14(stage1[1]) ?? 0n : 0n;
63336
+ const delay = stakeManager ? toBigInt14(stage1[2]) ?? 0n : 0n;
62312
63337
  const out = [];
62313
63338
  for (let i = 0; i < arr.length; i++) {
62314
63339
  const r = arr[i];
62315
- const amount3 = toBigInt15(r.amount) ?? 0n;
62316
- const requestEpoch = toBigInt15(r.requestEpoch);
63340
+ const amount3 = toBigInt14(r.amount) ?? 0n;
63341
+ const requestEpoch = toBigInt14(r.requestEpoch);
62317
63342
  if (requestEpoch === void 0) continue;
62318
63343
  const ready = stakeManager ? currentEpoch >= requestEpoch + delay : false;
62319
63344
  out.push({
@@ -62398,9 +63423,9 @@ var readerMantle = {
62398
63423
  if (typeof requester === "string" && requester.toLowerCase() !== lcUser) {
62399
63424
  continue;
62400
63425
  }
62401
- const ethRequested = Array.isArray(detail) ? toBigInt15(detail[3]) : toBigInt15(detail.ethRequested);
63426
+ const ethRequested = Array.isArray(detail) ? toBigInt14(detail[3]) : toBigInt14(detail.ethRequested);
62402
63427
  const isFinalized = Array.isArray(info) ? Boolean(info[0]) : Boolean(info.isFinalized);
62403
- const claimable = Array.isArray(info) ? toBigInt15(info[1]) : toBigInt15(info.claimableAmount);
63428
+ const claimable = Array.isArray(info) ? toBigInt14(info[1]) : toBigInt14(info.claimableAmount);
62404
63429
  if (ethRequested === void 0) continue;
62405
63430
  out.push({
62406
63431
  lst: entry.lst,
@@ -62479,8 +63504,8 @@ var readerPuffer = {
62479
63504
  calls,
62480
63505
  abi: calls.map(() => PufferWithdrawalManagerAbi)
62481
63506
  });
62482
- const finalizedBatch = toBigInt15(results[detailCalls.length]) ?? 0n;
62483
- const batchSize = toBigInt15(results[detailCalls.length + 1]) ?? 0n;
63507
+ const finalizedBatch = toBigInt14(results[detailCalls.length]) ?? 0n;
63508
+ const batchSize = toBigInt14(results[detailCalls.length + 1]) ?? 0n;
62484
63509
  const out = [];
62485
63510
  const lcUser = user.toLowerCase();
62486
63511
  for (let i = 0; i < ids.length; i++) {
@@ -62490,7 +63515,7 @@ var readerPuffer = {
62490
63515
  if (typeof recipient === "string" && recipient.toLowerCase() !== lcUser) {
62491
63516
  continue;
62492
63517
  }
62493
- const pufETHAmount = Array.isArray(d) ? toBigInt15(d[0]) : toBigInt15(d.pufETHAmount);
63518
+ const pufETHAmount = Array.isArray(d) ? toBigInt14(d[0]) : toBigInt14(d.pufETHAmount);
62494
63519
  if (pufETHAmount === void 0) continue;
62495
63520
  const batchIdx = batchSize > 0n ? ids[i] / batchSize : 0n;
62496
63521
  const claimable = batchIdx <= finalizedBatch;
@@ -62588,7 +63613,7 @@ var readerKinetiq = {
62588
63613
  for (let i = 0; i < count; i++) {
62589
63614
  const r = stage2[i];
62590
63615
  if (!r) continue;
62591
- const hypeAmount = Array.isArray(r) ? toBigInt15(r[0]) : toBigInt15(r.hypeAmount);
63616
+ const hypeAmount = Array.isArray(r) ? toBigInt14(r[0]) : toBigInt14(r.hypeAmount);
62592
63617
  const timestamp = Array.isArray(r) ? toNumber(r[4]) : toNumber(r.timestamp);
62593
63618
  if (hypeAmount === void 0 || hypeAmount === 0n || timestamp === void 0) {
62594
63619
  continue;
@@ -62716,7 +63741,7 @@ var readerStakeWise = {
62716
63741
  const claimedByIdx = /* @__PURE__ */ new Map();
62717
63742
  for (let i = 0; i < onChainChecks.length; i++) {
62718
63743
  const cell = checkResults[i];
62719
- const claimed = Array.isArray(cell) ? toBigInt15(cell[2]) : toBigInt15(cell?.claimedAssets);
63744
+ const claimed = Array.isArray(cell) ? toBigInt14(cell[2]) : toBigInt14(cell?.claimedAssets);
62720
63745
  if (claimed !== void 0 && claimed > 0n) {
62721
63746
  claimedByIdx.set(onChainChecks[i].idx, claimed);
62722
63747
  }
@@ -62724,7 +63749,7 @@ var readerStakeWise = {
62724
63749
  const out = [];
62725
63750
  for (let i = 0; i < requests.length; i++) {
62726
63751
  const r = requests[i];
62727
- const amount3 = toBigInt15(r.totalAssets) ?? 0n;
63752
+ const amount3 = toBigInt14(r.totalAssets) ?? 0n;
62728
63753
  const onChainClaimed = claimedByIdx.get(i);
62729
63754
  const claimable = onChainClaimed !== void 0 || r.isClaimable;
62730
63755
  out.push({
@@ -62781,7 +63806,7 @@ var readerStCelo2 = {
62781
63806
  const timestamps = cell[1] ?? [];
62782
63807
  const out = [];
62783
63808
  for (let i = 0; i < values.length; i++) {
62784
- const amount3 = toBigInt15(values[i]);
63809
+ const amount3 = toBigInt14(values[i]);
62785
63810
  const readyAt = toNumber(timestamps[i]);
62786
63811
  if (amount3 === void 0 || readyAt === void 0) continue;
62787
63812
  out.push({
@@ -62861,7 +63886,7 @@ var readerSwell = {
62861
63886
  abi: [SwellRswExitAbi, SwellRswExitAbi]
62862
63887
  });
62863
63888
  const count = toNumber(stage1[0]) ?? 0;
62864
- const lastProcessed = toBigInt15(stage1[1]) ?? 0n;
63889
+ const lastProcessed = toBigInt14(stage1[1]) ?? 0n;
62865
63890
  if (count === 0) return [];
62866
63891
  const enumCalls = Array.from({ length: count }, (_3, i) => ({
62867
63892
  address: entry.withdrawalContract,
@@ -62873,7 +63898,7 @@ var readerSwell = {
62873
63898
  calls: enumCalls,
62874
63899
  abi: enumCalls.map(() => SwellRswExitAbi)
62875
63900
  });
62876
- const ids = stage2.map(toBigInt15).filter((v) => v !== void 0);
63901
+ const ids = stage2.map(toBigInt14).filter((v) => v !== void 0);
62877
63902
  if (ids.length === 0) return [];
62878
63903
  const detailCalls = ids.map((id) => ({
62879
63904
  address: entry.withdrawalContract,
@@ -62890,7 +63915,7 @@ var readerSwell = {
62890
63915
  const id = ids[i];
62891
63916
  const r = stage3[i];
62892
63917
  if (!r) continue;
62893
- const amount3 = toBigInt15(r.amount);
63918
+ const amount3 = toBigInt14(r.amount);
62894
63919
  if (amount3 === void 0) continue;
62895
63920
  const claimable = id <= lastProcessed;
62896
63921
  out.push({
@@ -62964,14 +63989,14 @@ var readerValantis = {
62964
63989
  for (let i = 0; i < burns.length; i++) {
62965
63990
  const b = burns[i];
62966
63991
  if (!b) continue;
62967
- const amount3 = Array.isArray(b) ? toBigInt15(b[0]) : toBigInt15(b.amount);
63992
+ const amount3 = Array.isArray(b) ? toBigInt14(b[0]) : toBigInt14(b.amount);
62968
63993
  const completed = Array.isArray(b) ? Boolean(b[2]) : Boolean(b.completed);
62969
63994
  if (amount3 === void 0 || completed) continue;
62970
63995
  out.push({
62971
63996
  lst: entry.lst,
62972
63997
  brand: entry.brand,
62973
63998
  symbol: entry.symbol,
62974
- requestId: String(toBigInt15(ids[i]) ?? i),
63999
+ requestId: String(toBigInt14(ids[i]) ?? i),
62975
64000
  amountUnderlying: amount3.toString(),
62976
64001
  status: redeemable[i] ? "claimable" : "pending"
62977
64002
  });
@@ -63044,7 +64069,7 @@ var readerTruFin = {
63044
64069
  if (typeof recipient === "string" && recipient.toLowerCase() !== lcUser) {
63045
64070
  continue;
63046
64071
  }
63047
- const amount3 = Array.isArray(w) ? toBigInt15(w[1]) : toBigInt15(w.amount);
64072
+ const amount3 = Array.isArray(w) ? toBigInt14(w[1]) : toBigInt14(w.amount);
63048
64073
  if (amount3 === void 0 || amount3 === 0n) continue;
63049
64074
  out.push({
63050
64075
  lst: entry.lst,
@@ -63140,7 +64165,7 @@ var readerYieldNest = {
63140
64165
  calls: enumCalls,
63141
64166
  abi: enumCalls.map(() => YieldNestWithdrawalQueueAbi)
63142
64167
  });
63143
- const ids = stage2.map(toBigInt15).filter((v) => v !== void 0);
64168
+ const ids = stage2.map(toBigInt14).filter((v) => v !== void 0);
63144
64169
  if (ids.length === 0) return [];
63145
64170
  const detailCalls = ids.map((id) => ({
63146
64171
  address: entry.withdrawalContract,
@@ -63159,7 +64184,7 @@ var readerYieldNest = {
63159
64184
  const id = ids[i];
63160
64185
  const r = stage3[i];
63161
64186
  if (!r) continue;
63162
- const amount3 = toBigInt15(r.amount);
64187
+ const amount3 = toBigInt14(r.amount);
63163
64188
  const created = toNumber(r.creationTimestamp);
63164
64189
  const processed = Boolean(r.processed);
63165
64190
  if (amount3 === void 0 || created === void 0) continue;
@@ -64070,7 +65095,7 @@ var NavOracleReadAbi = [
64070
65095
 
64071
65096
  // src/vaults/savings/readers/shared.ts
64072
65097
  var ONE_E1813 = 10n ** 18n;
64073
- var toBigInt16 = (v) => {
65098
+ var toBigInt15 = (v) => {
64074
65099
  if (v === void 0 || v === null) return void 0;
64075
65100
  if (typeof v === "bigint") return v;
64076
65101
  if (typeof v === "number") return BigInt(v);
@@ -64101,9 +65126,9 @@ var readerErc46262 = (entry) => {
64101
65126
  ],
64102
65127
  abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2],
64103
65128
  parse: ([assets, supply, rate]) => {
64104
- const totalAssets = toBigInt16(assets);
64105
- const totalSupply = toBigInt16(supply);
64106
- const convertToAssetsRaw = toBigInt16(rate);
65129
+ const totalAssets = toBigInt15(assets);
65130
+ const totalSupply = toBigInt15(supply);
65131
+ const convertToAssetsRaw = toBigInt15(rate);
64107
65132
  if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
64108
65133
  return void 0;
64109
65134
  }
@@ -64129,13 +65154,13 @@ var readerErc4626Cooldown = (entry) => {
64129
65154
  ],
64130
65155
  abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2, CooldownDurationAbi],
64131
65156
  parse: ([assets, supply, rate, cooldown]) => {
64132
- const totalAssets = toBigInt16(assets);
64133
- const totalSupply = toBigInt16(supply);
64134
- const convertToAssetsRaw = toBigInt16(rate);
65157
+ const totalAssets = toBigInt15(assets);
65158
+ const totalSupply = toBigInt15(supply);
65159
+ const convertToAssetsRaw = toBigInt15(rate);
64135
65160
  if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
64136
65161
  return void 0;
64137
65162
  }
64138
- const cooldownSecs = toBigInt16(cooldown);
65163
+ const cooldownSecs = toBigInt15(cooldown);
64139
65164
  return {
64140
65165
  totalAssets,
64141
65166
  totalSupply,
@@ -64392,13 +65417,13 @@ var readerErc4626Idle = (entry) => {
64392
65417
  ],
64393
65418
  abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2, BalanceOfAbi],
64394
65419
  parse: ([assets, supply, rate, inventoryBalance]) => {
64395
- const totalAssets = toBigInt16(assets);
64396
- const totalSupply = toBigInt16(supply);
64397
- const convertToAssetsRaw = toBigInt16(rate);
65420
+ const totalAssets = toBigInt15(assets);
65421
+ const totalSupply = toBigInt15(supply);
65422
+ const convertToAssetsRaw = toBigInt15(rate);
64398
65423
  if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
64399
65424
  return void 0;
64400
65425
  }
64401
- const capacity = toBigInt16(inventoryBalance);
65426
+ const capacity = toBigInt15(inventoryBalance);
64402
65427
  return {
64403
65428
  totalAssets,
64404
65429
  totalSupply,
@@ -64441,13 +65466,13 @@ var readerErc4626WithdrawLimit = (entry) => {
64441
65466
  AvailableWithdrawLimitAbi
64442
65467
  ],
64443
65468
  parse: ([assets, supply, rate, withdrawLimit]) => {
64444
- const totalAssets = toBigInt16(assets);
64445
- const totalSupply = toBigInt16(supply);
64446
- const convertToAssetsRaw = toBigInt16(rate);
65469
+ const totalAssets = toBigInt15(assets);
65470
+ const totalSupply = toBigInt15(supply);
65471
+ const convertToAssetsRaw = toBigInt15(rate);
64447
65472
  if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
64448
65473
  return void 0;
64449
65474
  }
64450
- const capacity = toBigInt16(withdrawLimit);
65475
+ const capacity = toBigInt15(withdrawLimit);
64451
65476
  return {
64452
65477
  totalAssets,
64453
65478
  totalSupply,
@@ -64493,13 +65518,13 @@ var readerBitwayVault = (entry) => {
64493
65518
  BitwayVaultReadAbi
64494
65519
  ],
64495
65520
  parse: ([supply, rate, buffer, waitingTime]) => {
64496
- const totalSupply = toBigInt16(supply);
64497
- const exchangeRate = toBigInt16(rate);
65521
+ const totalSupply = toBigInt15(supply);
65522
+ const exchangeRate = toBigInt15(rate);
64498
65523
  if (totalSupply === void 0 || exchangeRate === void 0 || exchangeRate === 0n) {
64499
65524
  return void 0;
64500
65525
  }
64501
- const capacity = toBigInt16(buffer);
64502
- const wait = toBigInt16(waitingTime);
65526
+ const capacity = toBigInt15(buffer);
65527
+ const wait = toBigInt15(waitingTime);
64503
65528
  return {
64504
65529
  // totalSupply is in raw share units; convert to raw underlying.
64505
65530
  // (Every live leg is 18/18-dec — BSC stables are 18-dec — but the
@@ -64529,9 +65554,9 @@ var readerFrankencoinSavings = (entry) => ({
64529
65554
  ],
64530
65555
  abis: [BalanceOfAbi, FrankencoinSavingsReadAbi],
64531
65556
  parse: ([balance, ratePPM]) => {
64532
- const deposits = toBigInt16(balance);
65557
+ const deposits = toBigInt15(balance);
64533
65558
  if (deposits === void 0) return void 0;
64534
- if (toBigInt16(ratePPM) === void 0) return void 0;
65559
+ if (toBigInt15(ratePPM) === void 0) return void 0;
64535
65560
  return {
64536
65561
  totalAssets: deposits,
64537
65562
  // No shares exist; the "supply" IS the deposited principal, and
@@ -64575,15 +65600,15 @@ var readerHyperbeatVault = (entry) => {
64575
65600
  HyperbeatQueueReadAbi
64576
65601
  ],
64577
65602
  parse: ([supply, rate, rateDecimals, inventory, fee, instantPaused]) => {
64578
- const totalSupply = toBigInt16(supply);
64579
- const rawRate = toBigInt16(rate);
64580
- const rateDec = toBigInt16(rateDecimals);
65603
+ const totalSupply = toBigInt15(supply);
65604
+ const rawRate = toBigInt15(rate);
65605
+ const rateDec = toBigInt15(rateDecimals);
64581
65606
  if (totalSupply === void 0 || rawRate === void 0 || rateDec === void 0 || rawRate === 0n) {
64582
65607
  return void 0;
64583
65608
  }
64584
65609
  const exchangeRate = rateDec <= 18n ? rawRate * 10n ** (18n - rateDec) : rawRate / 10n ** (rateDec - 18n);
64585
- const capacity = toBigInt16(inventory);
64586
- const feeRaw = toBigInt16(fee);
65610
+ const capacity = toBigInt15(inventory);
65611
+ const feeRaw = toBigInt15(fee);
64587
65612
  return {
64588
65613
  // totalSupply is in raw share units; convert to raw underlying.
64589
65614
  totalAssets: totalSupply * exchangeRate * underlyingUnit / (shareUnit * ONE_E1813),
@@ -64616,10 +65641,10 @@ var readerNavOracle = (entry) => {
64616
65641
  ],
64617
65642
  abis: [TotalSupplyAbi2, NavOracleReadAbi],
64618
65643
  parse: ([supply, round]) => {
64619
- const totalSupply = toBigInt16(supply);
65644
+ const totalSupply = toBigInt15(supply);
64620
65645
  if (totalSupply === void 0) return void 0;
64621
65646
  const raw = Array.isArray(round) ? round[1] : round?.answer;
64622
- const exchangeRate = toBigInt16(raw);
65647
+ const exchangeRate = toBigInt15(raw);
64623
65648
  if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
64624
65649
  return {
64625
65650
  totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1813 * shareUnit),
@@ -64661,14 +65686,14 @@ var readerNativeWnlp = (entry) => {
64661
65686
  NativeWithdrawQueueReadAbi
64662
65687
  ],
64663
65688
  parse: ([supply, rate, feeBips, instantEnabled, inventory, window]) => {
64664
- const totalSupply = toBigInt16(supply);
64665
- const exchangeRate = toBigInt16(rate);
65689
+ const totalSupply = toBigInt15(supply);
65690
+ const exchangeRate = toBigInt15(rate);
64666
65691
  if (totalSupply === void 0 || exchangeRate === void 0) {
64667
65692
  return void 0;
64668
65693
  }
64669
- const capacity = toBigInt16(inventory);
64670
- const windowSeconds = toBigInt16(window);
64671
- const bips = toBigInt16(feeBips);
65694
+ const capacity = toBigInt15(inventory);
65695
+ const windowSeconds = toBigInt15(window);
65696
+ const bips = toBigInt15(feeBips);
64672
65697
  return {
64673
65698
  totalAssets: totalSupply * exchangeRate / ONE_E1813,
64674
65699
  totalSupply,
@@ -64700,15 +65725,15 @@ var readerWrenNav = (entry) => {
64700
65725
  ],
64701
65726
  abis: [TotalSupplyAbi2, WrenNavReadAbi, WrenNavReadAbi, WrenNavReadAbi],
64702
65727
  parse: ([supply, burn, nav, burnable]) => {
64703
- const totalSupply = toBigInt16(supply);
64704
- const navPrice = toBigInt16(nav);
65728
+ const totalSupply = toBigInt15(supply);
65729
+ const navPrice = toBigInt15(nav);
64705
65730
  if (totalSupply === void 0) return void 0;
64706
65731
  if (navPrice === void 0 || navPrice <= 0n) return void 0;
64707
- const burncost = toBigInt16(burn);
65732
+ const burncost = toBigInt15(burn);
64708
65733
  const hasBurncost = burncost !== void 0 && burncost > 0n;
64709
65734
  const exchangeRate = hasBurncost ? burncost : navPrice;
64710
65735
  const totalAssets = totalSupply * exchangeRate * underlyingUnit / (ONE_E1813 * shareUnit);
64711
- const burnFlag = toBigInt16(burnable);
65736
+ const burnFlag = toBigInt15(burnable);
64712
65737
  const instantRedeemEnabled = burnFlag === void 0 ? true : burnFlag > 0n;
64713
65738
  return {
64714
65739
  totalAssets,
@@ -64742,17 +65767,17 @@ var readerYieldBasisLt = (entry) => {
64742
65767
  YieldBasisAmmReadAbi
64743
65768
  ],
64744
65769
  parse: ([supply, pps, redeemPerShare, maxDebt, valueOracle]) => {
64745
- const totalSupply = toBigInt16(supply);
64746
- const fundamental = toBigInt16(pps);
64747
- const redeemRaw = toBigInt16(redeemPerShare);
65770
+ const totalSupply = toBigInt15(supply);
65771
+ const fundamental = toBigInt15(pps);
65772
+ const redeemRaw = toBigInt15(redeemPerShare);
64748
65773
  if (totalSupply === void 0 || fundamental === void 0 || redeemRaw === void 0) {
64749
65774
  return void 0;
64750
65775
  }
64751
65776
  if (totalSupply === 0n || redeemRaw === 0n) return void 0;
64752
65777
  const totalAssets = totalSupply * redeemRaw / ONE_SHARE;
64753
65778
  const exchangeRate = redeemRaw * ONE_E1813 / underlyingUnit;
64754
- const equity = Array.isArray(valueOracle) ? toBigInt16(valueOracle[1]) : toBigInt16(valueOracle?.value);
64755
- const cap = toBigInt16(maxDebt);
65779
+ const equity = Array.isArray(valueOracle) ? toBigInt15(valueOracle[1]) : toBigInt15(valueOracle?.value);
65780
+ const cap = toBigInt15(maxDebt);
64756
65781
  let depositCapacity;
64757
65782
  if (cap !== void 0 && equity !== void 0 && equity > 0n) {
64758
65783
  const headroom = cap / 2n - equity;
@@ -65285,7 +66310,7 @@ var resolveAaveEarnCuratorName = (chainId, owner) => {
65285
66310
 
65286
66311
  // src/vaults/aave-earn/fetchPublic.ts
65287
66312
  var BRAND2 = "Aave";
65288
- var toBigInt17 = (v) => {
66313
+ var toBigInt16 = (v) => {
65289
66314
  if (v === void 0 || v === null) return void 0;
65290
66315
  if (typeof v === "bigint") return v;
65291
66316
  if (typeof v === "number") return BigInt(v);
@@ -65345,15 +66370,15 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
65345
66370
  const token = v.usedReserve.underlyingToken;
65346
66371
  const underlyingLc = token.address.toLowerCase();
65347
66372
  const assetDecimals = token.decimals;
65348
- const shareDecOnChain = toBigInt17(slice2[1]);
66373
+ const shareDecOnChain = toBigInt16(slice2[1]);
65349
66374
  const decimals = shareDecOnChain !== void 0 ? Number(shareDecOnChain) : assetDecimals;
65350
- const totalSupply = toBigInt17(slice2[2]);
66375
+ const totalSupply = toBigInt16(slice2[2]);
65351
66376
  if (totalSupply === void 0) continue;
65352
66377
  const shareUnit = 10n ** BigInt(decimals);
65353
66378
  const underlyingUnit = 10n ** BigInt(assetDecimals);
65354
- const convertToAssets = toBigInt17(slice2[3]) ?? 0n;
66379
+ const convertToAssets = toBigInt16(slice2[3]) ?? 0n;
65355
66380
  const convertToShares = convertToAssets > 0n ? shareUnit * underlyingUnit / convertToAssets : 0n;
65356
- const totalAssets = toBigInt17(slice2[0]) ?? totalSupply * convertToAssets / shareUnit;
66381
+ const totalAssets = toBigInt16(slice2[0]) ?? totalSupply * convertToAssets / shareUnit;
65357
66382
  const totalAssetsFormatted = Number(totalAssets) / 10 ** assetDecimals;
65358
66383
  const asset = tokenList[underlyingLc];
65359
66384
  const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num7(v.balance.usdPerToken) : void 0);
@@ -68836,7 +69861,7 @@ var TERM_SHEET_SCHEMA_VERSION = 1;
68836
69861
 
68837
69862
  // src/terms/buildTermSheet.ts
68838
69863
  var isNum = (v) => typeof v === "number" && Number.isFinite(v);
68839
- var clamp012 = (v) => Math.max(0, Math.min(1, v));
69864
+ var clamp013 = (v) => Math.max(0, Math.min(1, v));
68840
69865
  function assetRef(input) {
68841
69866
  const a = input.asset ?? {};
68842
69867
  return {
@@ -69052,7 +70077,7 @@ function resolveMinCollateral(input) {
69052
70077
  }
69053
70078
  function capUtil(total, cap) {
69054
70079
  if (!isNum(cap) || cap <= 0 || !isNum(total)) return void 0;
69055
- return clamp012(total / cap);
70080
+ return clamp013(total / cap);
69056
70081
  }
69057
70082
  function buildAvailability(input, side) {
69058
70083
  const frozen = input.isFrozen === true;
@@ -69091,7 +70116,7 @@ function buildUtilization(input) {
69091
70116
  if (!isNum(input.utilization)) return void 0;
69092
70117
  const shared = isNum(input.irmTotalDeposits) && isNum(input.irmTotalDebt);
69093
70118
  return {
69094
- utilization: clamp012(input.utilization),
70119
+ utilization: clamp013(input.utilization),
69095
70120
  basis: shared ? "pool" : "market",
69096
70121
  irmTotalDeposits: input.irmTotalDeposits,
69097
70122
  irmTotalDebt: input.irmTotalDebt,
@@ -69231,7 +70256,7 @@ function buildSupply(input, now, siblings) {
69231
70256
  const liquidity = isNum(input.totalLiquidity) ? {
69232
70257
  assets: input.totalLiquidity,
69233
70258
  assetsUsd: input.totalLiquidityUsd,
69234
- ratio: isNum(input.totalDeposits) && input.totalDeposits > 0 ? clamp012(input.totalLiquidity / input.totalDeposits) : void 0
70259
+ ratio: isNum(input.totalDeposits) && input.totalDeposits > 0 ? clamp013(input.totalLiquidity / input.totalDeposits) : void 0
69235
70260
  } : void 0;
69236
70261
  const supply = {
69237
70262
  role: canBeCollateral ? earns ? "both" : "collateral" : "yield",
@@ -69414,6 +70439,21 @@ var VAULT_PROVIDER_TRAITS = {
69414
70439
  reportsGovernance: true,
69415
70440
  reportsExposures: true
69416
70441
  },
70442
+ // Silo's curated vaults ("soTokens") are the MetaMorpho shape on Silo v2/v3
70443
+ // markets, and the indexer is unusually complete: `exposures`, the full role
70444
+ // set INCLUDING allocators, a real per-market utilization, and incentive
70445
+ // programs as their own query root. Two consequences worth stating.
70446
+ //
70447
+ // `hasUtilization: true` is genuinely satisfiable here — the vault's
70448
+ // allocation-weighted `Σ allocation × marketUtilization` fills the block —
70449
+ // unlike the sibling curated providers, where it stays permanently pending
70450
+ // because no underlying totals are joined.
70451
+ //
70452
+ // And the rate is a real two-leg split: `userApr` is BASE only
70453
+ // (`apr × (1 − performanceFee)`, verified on the whole book), with
70454
+ // incentives summed separately into `rewardsRate`. Do not restore the old
70455
+ // assumption that Silo folds rewards into its user yield — it does not, and
70456
+ // believing it pinned every incentivised vault's rewards leg at zero.
69417
70457
  silo: { ...LENDING_VAULT, reportsGovernance: true, reportsExposures: true },
69418
70458
  // Euler Earn publishes `timelock` + the full role set but NOT `exposures`,
69419
70459
  // contrary to TERM_SHEET_PLAN §7. Its backing is decomposable in principle,
@@ -69642,7 +70682,7 @@ function windowFromAprWindow(aprWindow) {
69642
70682
 
69643
70683
  // src/terms/vault/build.ts
69644
70684
  var isNum2 = (v) => typeof v === "number" && Number.isFinite(v);
69645
- var clamp013 = (v) => Math.max(0, Math.min(1, v));
70685
+ var clamp014 = (v) => Math.max(0, Math.min(1, v));
69646
70686
  function buildRate2(input, t, maturity) {
69647
70687
  const hasLegs = input.supplyRate != null || input.rewardsRate != null;
69648
70688
  const base = hasLegs ? input.supplyRate ?? 0 : input.totalRate ?? 0;
@@ -69819,7 +70859,7 @@ function settlementFor(mode, priceRisk) {
69819
70859
  function buildExit(input, t, fees) {
69820
70860
  const mode = resolveExitMode(input, t);
69821
70861
  const priceRisk = resolvePriceRisk(input, t);
69822
- const ratio = input.instantLiquidityRatio ?? (isNum2(input.liquidity) && isNum2(input.totalAssets) && input.totalAssets > 0 ? clamp013(input.liquidity / input.totalAssets) : void 0);
70862
+ const ratio = input.instantLiquidityRatio ?? (isNum2(input.liquidity) && isNum2(input.totalAssets) && input.totalAssets > 0 ? clamp014(input.liquidity / input.totalAssets) : void 0);
69823
70863
  return {
69824
70864
  mode,
69825
70865
  settlement: settlementFor(mode, priceRisk),
@@ -69936,11 +70976,13 @@ function buildPrincipal(input, t) {
69936
70976
  }
69937
70977
  function buildGovernance(input, t) {
69938
70978
  if (!t.reportsGovernance) return void 0;
70979
+ const allocators = input.allocators && input.allocators.length > 0 ? input.allocators : void 0;
69939
70980
  const roles = {
69940
70981
  owner: input.owner,
69941
70982
  curator: input.curator,
69942
70983
  guardian: input.guardian,
69943
- feeRecipient: input.feeRecipient
70984
+ feeRecipient: input.feeRecipient,
70985
+ allocators
69944
70986
  };
69945
70987
  const hasRole = Object.values(roles).some((r) => r != null);
69946
70988
  if (!isNum2(input.timelock) && !hasRole) return void 0;
@@ -69958,7 +71000,12 @@ function buildGovernance(input, t) {
69958
71000
  // enforces the queue itself, which is why this delay stands even though the
69959
71001
  // controller above is an unscreened curator address.
69960
71002
  timelockSource: "on-chain",
69961
- powers: ["set-caps", "change-fees", "pause-withdrawals"],
71003
+ // `reallocate` is listed only where an allocator actually exists, and it
71004
+ // is the power the timelock above does NOT cover: reshuffling between
71005
+ // already-approved markets lands in the next block. Stating it is what
71006
+ // stops `timelockSecs: 86400` from reading as "nothing about this vault
71007
+ // can change today".
71008
+ powers: allocators ? ["set-caps", "change-fees", "pause-withdrawals", "reallocate"] : ["set-caps", "change-fees", "pause-withdrawals"],
69962
71009
  roles: hasRole ? roles : void 0
69963
71010
  };
69964
71011
  }
@@ -69977,7 +71024,7 @@ function buildUtilization2(input, t) {
69977
71024
  const total = input.expectedLiquidity;
69978
71025
  if (!isNum2(borrowed) || !isNum2(total) || total <= 0) return void 0;
69979
71026
  return {
69980
- utilization: clamp013(borrowed / total),
71027
+ utilization: clamp014(borrowed / total),
69981
71028
  // The ratio is the underlying pool's, not this share token's.
69982
71029
  basis: "pool",
69983
71030
  irmTotalDeposits: total,
@@ -70475,6 +71522,21 @@ function isIlliquid(input) {
70475
71522
  if (input.liquidityUsd === void 0) return false;
70476
71523
  return input.liquidityUsd <= 0;
70477
71524
  }
71525
+ var UNCAPPED_EXIT_MODES = /* @__PURE__ */ new Set([
71526
+ "queued",
71527
+ "fixed-cooldown",
71528
+ "fee-or-queued",
71529
+ "instant-or-queued",
71530
+ "request-based",
71531
+ "off-chain",
71532
+ "at-maturity"
71533
+ ]);
71534
+ function meetsLiquidityFloor(input, minUsd) {
71535
+ if (input.canWithdraw === false) return false;
71536
+ if (input.exitMode && UNCAPPED_EXIT_MODES.has(input.exitMode)) return true;
71537
+ if (input.liquidityUsd === void 0) return true;
71538
+ return input.liquidityUsd >= minUsd;
71539
+ }
70478
71540
  var PROTOCOL_ALIASES = {
70479
71541
  MORPHO_BLUE: "Morpho",
70480
71542
  EULER_V2: "Euler",
@@ -70881,6 +71943,11 @@ var num14 = (v) => {
70881
71943
  };
70882
71944
  var str7 = (v) => typeof v === "string" && v.trim() !== "" ? v : void 0;
70883
71945
  var bool2 = (v) => typeof v === "boolean" ? v : void 0;
71946
+ var strArray = (v) => {
71947
+ if (!Array.isArray(v)) return void 0;
71948
+ const out = v.filter((x) => typeof x === "string" && x !== "");
71949
+ return out.length > 0 ? out : void 0;
71950
+ };
70884
71951
  var fromRaw = (raw, decimals) => {
70885
71952
  const s = raw == null ? void 0 : String(raw);
70886
71953
  if (!s || !/^\d+$/.test(s) || decimals == null) return void 0;
@@ -70964,6 +72031,7 @@ function toVaultTermInput(vault, provider, chainId) {
70964
72031
  whitelisted: bool2(row.whitelisted),
70965
72032
  expiry: num14(row.expiry),
70966
72033
  timelock: num14(row.timelock),
72034
+ allocators: strArray(row.allocators),
70967
72035
  owner: str7(row.owner),
70968
72036
  curator: str7(row.curator),
70969
72037
  guardian: str7(row.guardian),
@@ -71031,6 +72099,7 @@ function vaultTermInputFromEarnMarket(m) {
71031
72099
  whitelisted: bool2(meta.whitelisted),
71032
72100
  expiry: m.maturity?.maturity,
71033
72101
  timelock: num14(meta.timelock),
72102
+ allocators: strArray(meta.allocators),
71034
72103
  owner: str7(meta.owner),
71035
72104
  curator: str7(meta.curator),
71036
72105
  guardian: str7(meta.guardian),
@@ -71110,6 +72179,7 @@ function vaultTermInputFromSourceRow(row, chainId) {
71110
72179
  whitelisted: bool2(meta.whitelisted),
71111
72180
  expiry: num14(meta.expiry) ?? num14(meta.maturity),
71112
72181
  timelock: num14(meta.timelock),
72182
+ allocators: strArray(meta.allocators),
71113
72183
  owner: str7(meta.owner),
71114
72184
  curator: str7(meta.curator),
71115
72185
  guardian: str7(meta.guardian),
@@ -74827,6 +75897,6 @@ function earnPositionTotals(items) {
74827
75897
  };
74828
75898
  }
74829
75899
 
74830
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EARN_DESCRIPTIONS, EARN_LABELS, EMPTY_BALANCE, EXACTLY_LENDER_KEY, FRACTION_RATE_PROVIDERS, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MULTICALL_FAILURE, MaxParamThresholds, PASSTHROUGH_RATE_EPSILON, PENDLE_ASSETS_URL, PENDLE_CHAIN_IDS, PENDLE_MARKETS_URL, SDK_FRACTION_RATE_PROVIDERS, SPECTRA_NETWORKS, SPECTRA_RATE_MAX_PERCENT, SPECTRA_RATE_MIN_PERCENT, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_PROVIDERS, VAULT_PROVIDER_PROFILE, VAULT_PROVIDER_TRAITS, VAULT_SHARE_PRICE_PROBE, VAULT_VENUE_PREFIX, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLendingPositionUid, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultEarnUid, buildVaultLookup, buildVaultTermSheet, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, clearPendleMarketsCache, clearSpectraMarketsCache, collateralSymbolsByVenue, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertCoolerMarketsToResponse, convertDssMarketsToResponse, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertFraxlendPairsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, dexResolverFor, disambiguateEarnNames, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnMarketLabel, earnPositionFromLenderEntry, earnPositionFromVaultBalance, earnPositionTotals, earnRowSubtitle, earnUidFromMarketUid, earnVaultTerms, earnVenueKind, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchCoolerMarkets, fetchDolomiteAccountNumbers, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidDexState, fetchFluidFTokens, fetchFrankencoinMarkets, fetchFraxlendPairs, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendleApiAssets, fetchPendleApiMarkets, fetchPendlePrices, fetchPendlePtMarkets, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchSpectraApiMarkets, fetchSpectraPtMarkets, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, formatRaw, frankencoinKeyParts, frankencoinLenderKey, fraxlendAssetPerCollateral, fraxlendKeyParts, fraxlendLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedFluidDexState, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getReadFailurePolicy, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasPendleMarkets, hasSpectraMarkets, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, inverseKeyParts, inverseLenderKey, isBoundNeed, isFailedCall, isIlliquid, isLendingPosition, isLiveMarket as isLivePendleMarket, isLiveSpectraMarket, isSecondaryMarketOnly, isStablecoinSymbol, isVaultPosition, isVaultVenue, isYearnV3, keySegmentToIlk, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseEarnUid, parseMergedResult, parseMulticallRpcResponses, parseExpirySeconds as parsePendleExpirySeconds, parseRawRpcBatchResponses, parseRawRpcResponses, parseCurveFee as parseSpectraCurveFee, parsePtRate as parseSpectraPtRate, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, pickPool as pickSpectraPool, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveEarnIdentity, resolveModeConfig, resolveStCeloDepositGroup, resolveVaultProfileId, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, sanePercent as saneSpectraPercent, savingsAddresses, savingsBalanceKind, secondaryMarketVault, selectAssetGroupPrices, shortDate, spectraAddress, spectraNetwork, spectraPoolsUrl, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, stampEarnSubtitles, stampVaultClassification, stampVaultTermSheets, stripLeadingBrand, supplyDescription, supplyFindings, supplyHeadline, swapRoutedProvidersArePriceConsistent, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, toDigest, toTermSheetInput, toVaultTermInput, trancheFromCounterparty, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultSharesToAssets, vaultTermInputFromEarnMarket, vaultTermInputFromSourceRow, vaultTraits, vaultVenue, venueBrand, venueBrandKey, withMaturityLabel, withTrancheLabel };
75900
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, DEFAULT_TERM_ORDER_STORE, EARN_DESCRIPTIONS, EARN_LABELS, EMPTY_BALANCE, EXACTLY_LENDER_KEY, FRACTION_RATE_PROVIDERS, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MULTICALL_FAILURE, MaxParamThresholds, PASSTHROUGH_RATE_EPSILON, PENDLE_ASSETS_URL, PENDLE_CHAIN_IDS, PENDLE_MARKETS_URL, SDK_FRACTION_RATE_PROVIDERS, SPECTRA_NETWORKS, SPECTRA_RATE_MAX_PERCENT, SPECTRA_RATE_MIN_PERCENT, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_MARKETS_PER_CALL, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_PROVIDERS, VAULT_PROVIDER_PROFILE, VAULT_PROVIDER_TRAITS, VAULT_SHARE_PRICE_PROBE, VAULT_VENUE_PREFIX, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLendingPositionUid, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultEarnUid, buildVaultLookup, buildVaultTermSheet, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, clearPendleMarketsCache, clearSpectraMarketsCache, collateralSymbolsByVenue, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertCoolerMarketsToResponse, convertDssMarketsToResponse, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertFraxlendPairsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, dexResolverFor, disambiguateEarnNames, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnMarketLabel, earnPositionFromLenderEntry, earnPositionFromVaultBalance, earnPositionTotals, earnRowSubtitle, earnUidFromMarketUid, earnVaultTerms, earnVenueKind, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchCoolerMarkets, fetchDolomiteAccountNumbers, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidDexState, fetchFluidFTokens, fetchFrankencoinMarkets, fetchFraxlendPairs, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendleApiAssets, fetchPendleApiMarkets, fetchPendlePrices, fetchPendlePtMarkets, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchSpectraApiMarkets, fetchSpectraPtMarkets, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTermStoreOrders, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, fillableRemaining, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, formatRaw, frankencoinKeyParts, frankencoinLenderKey, fraxlendAssetPerCollateral, fraxlendKeyParts, fraxlendLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedFluidDexState, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getReadFailurePolicy, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasPendleMarkets, hasSpectraMarkets, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, inverseKeyParts, inverseLenderKey, isBoundNeed, isFailedCall, isIlliquid, isLendingPosition, isLiveMarket as isLivePendleMarket, isLiveSpectraMarket, isSecondaryMarketOnly, isStablecoinSymbol, isVaultPosition, isVaultVenue, isYearnV3, keySegmentToIlk, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, meetsLiquidityFloor, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseEarnUid, parseMergedResult, parseMulticallRpcResponses, parseExpirySeconds as parsePendleExpirySeconds, parseRawRpcBatchResponses, parseRawRpcResponses, parseCurveFee as parseSpectraCurveFee, parsePtRate as parseSpectraPtRate, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, pickPool as pickSpectraPool, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveEarnIdentity, resolveModeConfig, resolveStCeloDepositGroup, resolveVaultProfileId, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, sanePercent as saneSpectraPercent, savingsAddresses, savingsBalanceKind, secondaryMarketVault, selectAssetGroupPrices, shortDate, spectraAddress, spectraNetwork, spectraPoolsUrl, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, stampEarnSubtitles, stampVaultClassification, stampVaultTermSheets, stripLeadingBrand, supplyDescription, supplyFindings, supplyHeadline, swapRoutedProvidersArePriceConsistent, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termApiBaseUrl, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, termOfferRateToAprPct, termOrderStoreBaseUrl, tickToAprNumber, tickToPrice, toDigest, toTermFillNow, toTermSheetInput, toVaultTermInput, trancheFromCounterparty, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultSharesToAssets, vaultTermInputFromEarnMarket, vaultTermInputFromSourceRow, vaultTraits, vaultVenue, venueBrand, venueBrandKey, withMaturityLabel, withTrancheLabel };
74831
75901
  //# sourceMappingURL=index.js.map
74832
75902
  //# sourceMappingURL=index.js.map