@1delta/margin-fetcher 5.0.9 → 5.0.11

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
@@ -7,9 +7,9 @@ import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig
7
7
  import lodash from 'lodash';
8
8
  import { Chain } from '@1delta/chain-registry';
9
9
  import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
10
- import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, ResupplyUtilitiesAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, CurvanceMarketManagerAbi, CurvanceCTokenAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, CurvanceProtocolReaderAbi, CurvanceCentralRegistryAbi, TermPriceConsumerAbi, CurvanceOracleManagerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
10
+ import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, ResupplyUtilitiesAbi, ResupplyRewardHandlerAbi, ResupplyPairEmissionsAbi, ConvexPoolUtilAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, CurvanceMarketManagerAbi, CurvanceCTokenAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, CurvanceProtocolReaderAbi, CurvanceCentralRegistryAbi, TermPriceConsumerAbi, CurvanceOracleManagerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
11
11
  export { MorphoLensAbi } from '@1delta/abis';
12
- import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
12
+ import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, bandLtvCurve, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
13
13
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
14
14
  import { BALANCER_V2_FORKS, BALANCER_V3_FORKS, UNISWAP_V4_FORKS, isFlashLoanSourceExcluded, FLASH_LOAN_IDS } from '@1delta/dex-registry';
15
15
 
@@ -21401,6 +21401,19 @@ function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalY
21401
21401
  borrowLiquidity = Math.min(borrowLiquidity, Math.max(0, cap - entireDebt));
21402
21402
  }
21403
21403
  if (shutdown) borrowLiquidity = 0;
21404
+ const rateParameter = {
21405
+ kind: "interest-rate",
21406
+ dimension: "rate",
21407
+ domain: {
21408
+ min: Number(cfg.minAnnualInterestRate ?? 0) / 1e18,
21409
+ max: Number(cfg.maxAnnualInterestRate ?? 0) / 1e18
21410
+ },
21411
+ // No protocol default — the borrower must choose. The low end is the
21412
+ // cheapest but the first to be redeemed against.
21413
+ default: Number(cfg.minAnnualInterestRate ?? 0) / 1e18,
21414
+ immutableAfterOpen: false,
21415
+ adjustCooldownSeconds: cfg.interestRateAdjCooldownSeconds ? Number(cfg.interestRateAdjCooldownSeconds) : void 0
21416
+ };
21404
21417
  const entry = { data: {} };
21405
21418
  const collUid = createMarketUid(chainId, lenderKey, collAddr);
21406
21419
  entry.data[collUid] = {
@@ -21435,7 +21448,18 @@ function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalY
21435
21448
  liquidationPenalty: liqPenalty,
21436
21449
  closeFactor: 1,
21437
21450
  collateralDisabled: false,
21438
- debtDisabled: true
21451
+ debtDisabled: true,
21452
+ /**
21453
+ * Liquity's borrower picks their own interest rate at open, and it
21454
+ * sets redemption priority as well as cost — so it is a real
21455
+ * parameter, not a quoted rate.
21456
+ *
21457
+ * The MUTABLE case: adjustable in place, but rate-limited by
21458
+ * `interestRateAdjCooldownSeconds` and fee-charged if adjusted
21459
+ * early. The per-trove value lives in `modes[troveId]`, because one
21460
+ * address can hold several troves at different rates at once.
21461
+ */
21462
+ openParameter: rateParameter
21439
21463
  }
21440
21464
  },
21441
21465
  closeFactor: 1,
@@ -22991,16 +23015,22 @@ var maxBorrowableCall = (m, oneUnit, n) => m.version === 1 ? {
22991
23015
  name: "max_borrowable",
22992
23016
  params: [oneUnit, BigInt(n), ZERO]
22993
23017
  };
22994
- var buildBandLtv = (perBand, borrowedDecimals, collateralPrice) => {
22995
- if (!collateralPrice || collateralPrice <= 0) return null;
22996
- const out = {};
22997
- for (const { n, maxBorrowable } of perBand) {
22998
- const borrowable = human(maxBorrowable, borrowedDecimals);
22999
- if (borrowable === null || borrowable <= 0) continue;
23000
- const ltv = borrowable / collateralPrice;
23001
- if (ltv > 0 && ltv <= 1) out[String(n)] = ltv;
23018
+ var buildBandLtv = (market) => {
23019
+ if (!market.ammA || !market.loanDiscount) return null;
23020
+ try {
23021
+ const curve = bandLtvCurve({
23022
+ ammA: BigInt(market.ammA),
23023
+ loanDiscount: BigInt(market.loanDiscount),
23024
+ // Reference size only it feeds the DEAD_SHARES cushion, which is
23025
+ // negligible at any realistic position size and converges as it grows.
23026
+ collateral: 10n ** BigInt(market.collateralDecimals + 3),
23027
+ collateralDecimals: market.collateralDecimals,
23028
+ bandCounts: bandGrid(market)
23029
+ });
23030
+ return Object.keys(curve).length > 0 ? curve : null;
23031
+ } catch {
23032
+ return null;
23002
23033
  }
23003
- return Object.keys(out).length > 0 ? out : null;
23004
23034
  };
23005
23035
  async function fetchChainExtras(chainId, markets) {
23006
23036
  const perMarketCalls = markets.map((m) => {
@@ -23043,17 +23073,9 @@ async function fetchChainExtras(chainId, markets) {
23043
23073
  const nLoansRaw = toBig5(results[cursor + 2]);
23044
23074
  const maxDepositRaw = toBig5(results[cursor + 3]);
23045
23075
  const borrowCapRaw = toBig5(results[cursor + 4]);
23046
- const perBand = grid.map((n, i) => ({
23047
- n,
23048
- maxBorrowable: toBig5(results[cursor + 5 + i])
23049
- }));
23050
23076
  cursor += 5 + grid.length;
23051
23077
  const collateralPrice = priceRaw === null ? null : Number(priceRaw) / 1e18;
23052
- const bandLtv = buildBandLtv(
23053
- perBand,
23054
- market.borrowedDecimals,
23055
- collateralPrice
23056
- );
23078
+ const bandLtv = buildBandLtv(market);
23057
23079
  const defaultN = String(bandsFor(market));
23058
23080
  out[market.controller.toLowerCase()] = {
23059
23081
  collateralPrice,
@@ -23204,8 +23226,24 @@ var VAULT_PRICE_ABI = [
23204
23226
  outputs: [{ type: "uint256" }]
23205
23227
  }
23206
23228
  ];
23229
+ var WRAPPED_COLLATERAL_ABI = [
23230
+ {
23231
+ name: "collateral_token",
23232
+ type: "function",
23233
+ stateMutability: "view",
23234
+ inputs: [],
23235
+ outputs: [{ type: "address" }]
23236
+ },
23237
+ {
23238
+ name: "collateralContract",
23239
+ type: "function",
23240
+ stateMutability: "view",
23241
+ inputs: [],
23242
+ outputs: [{ type: "address" }]
23243
+ }
23244
+ ];
23207
23245
  var IDENTITY_READS = 3;
23208
- var STATE_READS = 12;
23246
+ var STATE_READS = 14;
23209
23247
  var ONE = 10n ** 18n;
23210
23248
  var identityCache = /* @__PURE__ */ new Map();
23211
23249
  var identityKey = (chainId, pair) => `${chainId}:${pair.toLowerCase()}`;
@@ -23288,30 +23326,54 @@ async function fetchResupplyMarkets(lender, chainId) {
23288
23326
  chain: chainId,
23289
23327
  calls: pending.flatMap((p) => [
23290
23328
  { address: p.collateral, name: "decimals", params: [] },
23291
- { address: p.underlying, name: "decimals", params: [] }
23329
+ { address: p.underlying, name: "decimals", params: [] },
23330
+ { address: p.collateral, name: "collateral_token", params: [] },
23331
+ { address: p.collateral, name: "collateralContract", params: [] }
23332
+ ]),
23333
+ abi: pending.flatMap(() => [
23334
+ erc20Abi,
23335
+ erc20Abi,
23336
+ WRAPPED_COLLATERAL_ABI,
23337
+ WRAPPED_COLLATERAL_ABI
23292
23338
  ]),
23293
- abi: pending.flatMap(() => [erc20Abi, erc20Abi]),
23294
23339
  allowFailure: true
23295
23340
  });
23296
23341
  } catch {
23297
23342
  dec = [];
23298
23343
  }
23344
+ const addr2 = (v) => typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v) && !/^0x0+$/.test(v) ? v : void 0;
23345
+ const wrapped = pending.map((_3, i) => {
23346
+ const curve = addr2(dec[i * 4 + 2]);
23347
+ const frax = addr2(dec[i * 4 + 3]);
23348
+ return {
23349
+ token: curve ?? frax,
23350
+ family: curve ? "curvelend" : frax ? "fraxlend" : void 0
23351
+ };
23352
+ });
23299
23353
  pending.forEach((p, i) => {
23300
- const cd = Number(dec[i * 2]);
23301
- const ud = Number(dec[i * 2 + 1]);
23354
+ const cd = Number(dec[i * 4]);
23355
+ const ud = Number(dec[i * 4 + 1]);
23356
+ const w = wrapped[i];
23302
23357
  identityCache.set(identityKey(chainId, p.pair), {
23303
23358
  pair: p.pair,
23304
23359
  name: p.name,
23305
23360
  collateral: p.collateral,
23306
23361
  underlying: p.underlying,
23307
23362
  collateralDecimals: Number.isFinite(cd) && cd > 0 ? cd : 18,
23308
- underlyingDecimals: Number.isFinite(ud) && ud > 0 ? ud : 18
23363
+ underlyingDecimals: Number.isFinite(ud) && ud > 0 ? ud : 18,
23364
+ wrappedCollateralToken: w?.token,
23365
+ wrappedFamily: w?.family
23309
23366
  });
23310
23367
  });
23311
23368
  }
23312
23369
  }
23313
23370
  const identities = discovered.map((p) => identityCache.get(identityKey(chainId, p))).filter((x) => !!x);
23314
23371
  if (identities.length === 0) return { lender, config, pairs: [] };
23372
+ const { rsup, pairEmissions, convexPoolUtil } = await readRewardContext(
23373
+ chainId,
23374
+ config.registry,
23375
+ config.utilities
23376
+ );
23315
23377
  const utilities = config.utilities;
23316
23378
  const calls = [];
23317
23379
  const abis = [];
@@ -23328,7 +23390,16 @@ async function fetchResupplyMarkets(lender, chainId) {
23328
23390
  // The collateral vault's own share price — the exact input Resupply's
23329
23391
  // `BasicVaultOracle` uses. Read LIVE rather than inverting the pair's
23330
23392
  // cached `exchangeRate`, which only moves when someone writes.
23331
- { address: id.collateral, name: "convertToAssets", params: [ONE] }
23393
+ { address: id.collateral, name: "convertToAssets", params: [ONE] },
23394
+ // Rewards. `convexPid == 0` means the collateral is not staked, so there
23395
+ // is nothing to report; the weight is this pair's slice of the RSUP
23396
+ // stream. Both are governance-mutable, so neither is cached.
23397
+ { address: id.pair, name: "convexPid", params: [] },
23398
+ {
23399
+ address: pairEmissions ?? id.pair,
23400
+ name: pairEmissions ? "balanceOf" : "convexPid",
23401
+ params: pairEmissions ? [id.pair] : []
23402
+ }
23332
23403
  );
23333
23404
  abis.push(
23334
23405
  ResupplyPairAbi,
@@ -23339,7 +23410,9 @@ async function fetchResupplyMarkets(lender, chainId) {
23339
23410
  ResupplyPairAbi,
23340
23411
  ResupplyPairAbi,
23341
23412
  ResupplyPairAbi,
23342
- VAULT_PRICE_ABI
23413
+ VAULT_PRICE_ABI,
23414
+ ResupplyPairAbi,
23415
+ pairEmissions ? ResupplyPairEmissionsAbi : ResupplyPairAbi
23343
23416
  );
23344
23417
  if (utilities) {
23345
23418
  calls.push(
@@ -23397,11 +23470,118 @@ async function fetchResupplyMarkets(lender, chainId) {
23397
23470
  ratePerSec: tuple(rateInfo, 1),
23398
23471
  exchangeRate: tuple(exchangeInfo, 2),
23399
23472
  collateralPrice: big(results[base + 8]),
23400
- liveRatePerSec: utilities ? big(results[base + 9]) : null,
23401
- underlyingSupplyRatePerSec: utilities ? big(results[base + 10]) : null
23473
+ // Indices follow the PUSH ORDER above exactly: the two reward reads sit
23474
+ // at +9/+10, BEFORE the lens block, so the lens reads are +11/+12.
23475
+ // (Getting this wrong is silent — it produced a 3-billion-percent APR
23476
+ // before the numbers were checked against a hand computation.)
23477
+ convexPid: big(results[base + 9]),
23478
+ rsupWeight: pairEmissions ? big(results[base + 10]) : null,
23479
+ liveRatePerSec: utilities ? big(results[base + 11]) : null,
23480
+ underlyingSupplyRatePerSec: utilities ? big(results[base + 12]) : null,
23481
+ collateralRewards: []
23482
+ };
23483
+ });
23484
+ await attachCollateralRewards(chainId, convexPoolUtil, pairs);
23485
+ return { lender, config, pairs, rsup };
23486
+ }
23487
+ async function readRewardContext(chainId, registry, utilities) {
23488
+ const addr2 = (v) => typeof v === "string" && v.startsWith("0x") && !/^0x0+$/.test(v) ? v : void 0;
23489
+ try {
23490
+ const first = await multicallRetryUniversal({
23491
+ chain: chainId,
23492
+ calls: [
23493
+ { address: registry, name: "rewardHandler", params: [] },
23494
+ { address: registry, name: "govToken", params: [] },
23495
+ ...utilities ? [{ address: utilities, name: "convexPoolUtil", params: [] }] : []
23496
+ ],
23497
+ abi: [
23498
+ ResupplyRegistryAbi,
23499
+ ResupplyRegistryAbi,
23500
+ ...utilities ? [ResupplyUtilitiesAbi] : []
23501
+ ],
23502
+ allowFailure: true
23503
+ });
23504
+ const rewardHandler = addr2(first[0]);
23505
+ const govToken = addr2(first[1]);
23506
+ const convexPoolUtil = utilities ? addr2(first[2]) : void 0;
23507
+ if (!rewardHandler || !govToken) return { convexPoolUtil };
23508
+ const [emissions] = await multicallRetryUniversal({
23509
+ chain: chainId,
23510
+ calls: [{ address: rewardHandler, name: "pairEmissions", params: [] }],
23511
+ abi: ResupplyRewardHandlerAbi,
23512
+ allowFailure: true
23513
+ });
23514
+ const pairEmissions = addr2(emissions);
23515
+ if (!pairEmissions) return { convexPoolUtil };
23516
+ const stream = await multicallRetryUniversal({
23517
+ chain: chainId,
23518
+ calls: [
23519
+ { address: pairEmissions, name: "periodFinish", params: [] },
23520
+ { address: pairEmissions, name: "rewardRate", params: [] },
23521
+ { address: pairEmissions, name: "totalSupply", params: [] }
23522
+ ],
23523
+ abi: [
23524
+ ResupplyPairEmissionsAbi,
23525
+ ResupplyPairEmissionsAbi,
23526
+ ResupplyPairEmissionsAbi
23527
+ ],
23528
+ allowFailure: true
23529
+ });
23530
+ const periodFinish = big(stream[0]);
23531
+ const rewardRate = big(stream[1]);
23532
+ const totalWeight = big(stream[2]);
23533
+ if (periodFinish === null || rewardRate === null || totalWeight === null || totalWeight === 0n) {
23534
+ return { pairEmissions, convexPoolUtil };
23535
+ }
23536
+ if (periodFinish <= BigInt(Math.floor(Date.now() / 1e3))) {
23537
+ return { pairEmissions, convexPoolUtil };
23538
+ }
23539
+ return {
23540
+ rsup: { govToken, rewardRate, totalWeight, periodFinish },
23541
+ pairEmissions,
23542
+ convexPoolUtil
23402
23543
  };
23544
+ } catch {
23545
+ return {};
23546
+ }
23547
+ }
23548
+ async function attachCollateralRewards(chainId, convexPoolUtil, pairs) {
23549
+ if (!convexPoolUtil) return;
23550
+ const staked = pairs.filter((p) => (p.convexPid ?? 0n) > 0n);
23551
+ if (staked.length === 0) return;
23552
+ let res = [];
23553
+ try {
23554
+ res = await multicallRetryUniversal({
23555
+ chain: chainId,
23556
+ calls: staked.map((p) => ({
23557
+ address: convexPoolUtil,
23558
+ name: "rewardRates",
23559
+ params: [p.convexPid]
23560
+ })),
23561
+ abi: staked.map(() => ConvexPoolUtilAbi),
23562
+ allowFailure: true
23563
+ });
23564
+ } catch {
23565
+ return;
23566
+ }
23567
+ staked.forEach((p, i) => {
23568
+ const entry = res[i];
23569
+ if (!Array.isArray(entry)) return;
23570
+ const [tokens, rates] = entry;
23571
+ if (!Array.isArray(tokens) || !Array.isArray(rates)) return;
23572
+ const byToken = /* @__PURE__ */ new Map();
23573
+ tokens.forEach((t, j) => {
23574
+ const rate = rates[j];
23575
+ if (typeof t !== "string" || typeof rate !== "bigint" || rate === 0n) {
23576
+ return;
23577
+ }
23578
+ const key2 = t.toLowerCase();
23579
+ byToken.set(key2, (byToken.get(key2) ?? 0n) + rate);
23580
+ });
23581
+ p.collateralRewards = [...byToken.entries()].map(
23582
+ ([token, ratePerSecPerShare]) => ({ token, ratePerSecPerShare })
23583
+ );
23403
23584
  });
23404
- return { lender, config, pairs };
23405
23585
  }
23406
23586
 
23407
23587
  // src/prices/oracle-prices/fetchers/curvanceRoster.ts
@@ -23991,6 +24171,8 @@ function currencyFor9(address, decimals, symbol, tokens) {
23991
24171
  const lower3 = address.toLowerCase();
23992
24172
  return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
23993
24173
  }
24174
+ var LLAMALEND_MIN_BANDS = 4;
24175
+ var LLAMALEND_MAX_BANDS = 50;
23994
24176
  function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additionalYields = {
23995
24177
  intrinsicYields: {},
23996
24178
  lenderRewards: {},
@@ -24027,6 +24209,13 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
24027
24209
  const liqPenalty = Number(market.liquidationDiscount) / 1e18 || 0;
24028
24210
  const closeFactor = 1;
24029
24211
  const depositsEnabled = (m.maxDeposit ?? 0) > 0;
24212
+ const bandParameter = {
24213
+ kind: "llamalend-bands",
24214
+ dimension: "collateralFactor",
24215
+ domain: { min: LLAMALEND_MIN_BANDS, max: LLAMALEND_MAX_BANDS },
24216
+ default: market.defaultBands ?? 10,
24217
+ immutableAfterOpen: true
24218
+ };
24030
24219
  const entry = { data: {} };
24031
24220
  const collUid = createMarketUid(chainId, lenderKey, collAddr);
24032
24221
  entry.data[collUid] = {
@@ -24064,7 +24253,8 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
24064
24253
  liquidationPenalty: liqPenalty,
24065
24254
  closeFactor,
24066
24255
  collateralDisabled: false,
24067
- debtDisabled: true
24256
+ debtDisabled: true,
24257
+ openParameter: bandParameter
24068
24258
  }
24069
24259
  },
24070
24260
  closeFactor,
@@ -24218,8 +24408,24 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
24218
24408
  }
24219
24409
  return out;
24220
24410
  }
24411
+ function resupplyMarketLabel(rawName) {
24412
+ const inner = rawName.match(/\(([^)]+)\)/)?.[1];
24413
+ if (!inner) return rawName;
24414
+ const suffix = rawName.match(/\)\s*-\s*(\d+)\s*$/)?.[1];
24415
+ return suffix && suffix !== "1" ? `${inner} - ${suffix}` : inner;
24416
+ }
24417
+ function wrappedCollateralSymbol(rawName) {
24418
+ const inner = rawName.match(/\(([^)]+)\)/)?.[1];
24419
+ const sym = inner?.split("/").pop()?.trim();
24420
+ return sym && sym.length > 0 ? sym : void 0;
24421
+ }
24221
24422
  var llamaLendKey = (controller) => `LLAMALEND_${controller.replace(/^0x/i, "").toUpperCase()}`;
24222
- function resolveWrappedMarket(chainId, collateralVault, pairName) {
24423
+ function resolveWrappedMarket(chainId, identity) {
24424
+ const collateralVault = identity.collateral;
24425
+ const onChain = {
24426
+ collateralToken: identity.wrappedCollateralToken,
24427
+ collateralSymbol: wrappedCollateralSymbol(identity.name)
24428
+ };
24223
24429
  const market = llamaLendMarketByVault("LLAMALEND", chainId, collateralVault);
24224
24430
  if (market) {
24225
24431
  return {
@@ -24229,13 +24435,19 @@ function resolveWrappedMarket(chainId, collateralVault, pairName) {
24229
24435
  controller: market.controller,
24230
24436
  amm: market.amm,
24231
24437
  version: market.version,
24232
- collateralSymbol: market.collateralSymbol
24438
+ // Roster first (curated symbols/decimals), on-chain as the backstop, so
24439
+ // an unpublished or lagging roster degrades a label rather than the
24440
+ // image address.
24441
+ collateralSymbol: market.collateralSymbol ?? onChain.collateralSymbol,
24442
+ collateralToken: market.collateralToken ?? onChain.collateralToken,
24443
+ collateralDecimals: market.collateralDecimals
24233
24444
  };
24234
24445
  }
24235
- const isFraxlend = /fraxlend/i.test(pairName);
24446
+ const family = identity.wrappedFamily ?? (/fraxlend/i.test(identity.name) ? "fraxlend" : void 0);
24236
24447
  return {
24237
- provider: isFraxlend ? "fraxlend" : "unknown",
24238
- vault: collateralVault
24448
+ provider: family === "fraxlend" ? "fraxlend" : family === "curvelend" ? "llamalend" : "unknown",
24449
+ vault: collateralVault,
24450
+ ...onChain
24239
24451
  };
24240
24452
  }
24241
24453
  function resupplyLenderKey(lender, chainId, pair) {
@@ -24263,6 +24475,52 @@ function ratePerSecToApr(rate) {
24263
24475
  if (rate === null) return 0;
24264
24476
  return Number(rate) / 1e18 * SECONDS_PER_YEAR9 * 100;
24265
24477
  }
24478
+ function buildRewardEntries(p, rsup, chainId, prices, tokens, collateralUsd, debtUsd) {
24479
+ const priceOf = (address) => {
24480
+ const lower3 = address.toLowerCase();
24481
+ const token = tokens[lower3];
24482
+ const key2 = toOracleKey(token?.assetGroup) || toGenericPriceKey(lower3, chainId);
24483
+ return prices[key2] ?? 0;
24484
+ };
24485
+ const collateral = [];
24486
+ if (collateralUsd > 0) {
24487
+ for (const r of p.collateralRewards ?? []) {
24488
+ const price2 = priceOf(r.token);
24489
+ if (price2 <= 0) continue;
24490
+ const decimals = tokens[r.token.toLowerCase()]?.decimals ?? 18;
24491
+ const perSecond = Number(r.ratePerSecPerShare) * Number(p.totalCollateral ?? 0n) / 1e18;
24492
+ const usdPerYear = perSecond / 10 ** decimals * SECONDS_PER_YEAR9 * price2;
24493
+ const apr = usdPerYear / collateralUsd * 100;
24494
+ if (!Number.isFinite(apr) || apr <= 0) continue;
24495
+ collateral.push({
24496
+ asset: r.token,
24497
+ depositRate: apr,
24498
+ variableBorrowRate: 0,
24499
+ stableBorrowRate: 0
24500
+ });
24501
+ }
24502
+ }
24503
+ const borrow = [];
24504
+ if (rsup && debtUsd > 0 && (p.rsupWeight ?? 0n) > 0n) {
24505
+ const price2 = priceOf(rsup.govToken);
24506
+ if (price2 > 0) {
24507
+ const decimals = tokens[rsup.govToken.toLowerCase()]?.decimals ?? 18;
24508
+ const perSecond = Number(rsup.rewardRate) * Number(p.rsupWeight) / Number(rsup.totalWeight);
24509
+ const usdPerYear = perSecond / 10 ** decimals * SECONDS_PER_YEAR9 * price2;
24510
+ const apr = usdPerYear / debtUsd * 100;
24511
+ if (Number.isFinite(apr) && apr > 0) {
24512
+ borrow.push({
24513
+ asset: rsup.govToken,
24514
+ depositRate: 0,
24515
+ // A REBATE on the borrow cost, not a charge.
24516
+ variableBorrowRate: apr,
24517
+ stableBorrowRate: 0
24518
+ });
24519
+ }
24520
+ }
24521
+ }
24522
+ return { collateral, borrow };
24523
+ }
24266
24524
  function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
24267
24525
  intrinsicYields: {},
24268
24526
  lenderRewards: {},
@@ -24297,7 +24555,17 @@ function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additional
24297
24555
  const borrowLimit = p.borrowLimit !== null ? Number(p.borrowLimit) / 10 ** debtDecimals : 0;
24298
24556
  const borrowLiquidity = Math.max(borrowLimit - totalDebt, 0);
24299
24557
  const halted = (p.borrowLimit ?? 0n) === 0n;
24300
- const wrappedMarket = resolveWrappedMarket(chainId, id.collateral, id.name);
24558
+ const wrappedMarket = resolveWrappedMarket(chainId, id);
24559
+ const marketLabel = resupplyMarketLabel(id.name);
24560
+ const rewardEntries = buildRewardEntries(
24561
+ p,
24562
+ raw.rsup,
24563
+ chainId,
24564
+ prices,
24565
+ tokens,
24566
+ totalColl * collPrice,
24567
+ totalDebt * debtPrice
24568
+ );
24301
24569
  const maxLtv = p.maxLTV !== null ? Number(p.maxLTV) / LTV_PRECISION : 0;
24302
24570
  const liquidationPenalty = p.liquidationFee !== null ? Number(p.liquidationFee) / LTV_PRECISION : 0;
24303
24571
  const mintFeePct = p.mintFee !== null ? Number(p.mintFee) / LTV_PRECISION * 100 : 0;
@@ -24328,11 +24596,14 @@ function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additional
24328
24596
  // The wrapped Curve Lend / Fraxlend supply rate — this collateral is a
24329
24597
  // lending position and earns while it sits here.
24330
24598
  intrinsicYield: collateralIntrinsicApr,
24331
- rewards: void 0,
24599
+ // CRV/CVX from the Convex position the pair stakes the collateral into.
24600
+ // Empty (not undefined) when the pair does not stake — `convexPid == 0`.
24601
+ rewards: rewardEntries.collateral,
24332
24602
  decimals: collDecimals,
24333
24603
  config: {
24334
24604
  0: {
24335
24605
  category: 0,
24606
+ label: marketLabel,
24336
24607
  borrowCollateralFactor: maxLtv,
24337
24608
  collateralFactor: maxLtv,
24338
24609
  borrowFactor: 1,
@@ -24385,11 +24656,14 @@ function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additional
24385
24656
  // but it is governance-settable.
24386
24657
  originationFee: mintFeePct,
24387
24658
  intrinsicYield: 0,
24388
- rewards: void 0,
24659
+ // RSUP emissions to BORROWERS — a rebate on `variableBorrowRate`, not a
24660
+ // deposit yield. Empty when the emission stream has expired.
24661
+ rewards: rewardEntries.borrow,
24389
24662
  decimals: debtDecimals,
24390
24663
  config: {
24391
24664
  0: {
24392
24665
  category: 0,
24666
+ label: marketLabel,
24393
24667
  borrowCollateralFactor: 0,
24394
24668
  collateralFactor: 0,
24395
24669
  borrowFactor: 1,
@@ -24411,7 +24685,7 @@ function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additional
24411
24685
  entry.params = {
24412
24686
  market: {
24413
24687
  lender: lenderKey,
24414
- name: id.name,
24688
+ name: marketLabel,
24415
24689
  loanDecimals: debtDecimals,
24416
24690
  collateralDecimals: collDecimals,
24417
24691
  id: id.pair.toLowerCase(),
@@ -24426,6 +24700,9 @@ function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additional
24426
24700
  // worker-api resolvers and the loop quoter) ---
24427
24701
  resupply: {
24428
24702
  pair: id.pair,
24703
+ /** The pair's raw on-chain `name()`, before the label is derived. */
24704
+ rawName: id.name,
24705
+ label: marketLabel,
24429
24706
  /** The ERC-4626 share the pair actually books as collateral. */
24430
24707
  collateralVault: id.collateral,
24431
24708
  collateralVaultDecimals: id.collateralDecimals,
@@ -31141,7 +31418,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
31141
31418
  troveInfo
31142
31419
  }
31143
31420
  };
31144
- modes[t.troveId] = 0;
31421
+ modes[t.troveId] = Number(troveInfo.annualInterestRate) / 1e18;
31145
31422
  hist[t.troveId] = {
31146
31423
  totalDeposits24h: collNum * collHist,
31147
31424
  totalDebt24h: debtNum * loanHist
@@ -31601,7 +31878,7 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31601
31878
  }
31602
31879
  }
31603
31880
  };
31604
- const modes = { "0": 0 };
31881
+ const modes = { "0": bandCount };
31605
31882
  const hist = {
31606
31883
  "0": {
31607
31884
  totalDeposits24h: collNum * collHist + bandBorrowedNum * loanHist,
@@ -64417,6 +64694,26 @@ var llamaLendAdapter = {
64417
64694
  ] : void 0,
64418
64695
  bandLtv,
64419
64696
  defaultBands: typeof ll.defaultBands === "number" ? ll.defaultBands : void 0,
64697
+ /**
64698
+ * The band count as an editable TERM, not just a curve to read.
64699
+ *
64700
+ * `bandLtv` alone cannot drive a control: it is four sampled points,
64701
+ * and it is missing on any market whose curve could not be computed.
64702
+ * The domain is always known — `MIN_TICKS`/`MAX_TICKS` are 4..50 on
64703
+ * both generations — so the control works even where the curve does
64704
+ * not.
64705
+ *
64706
+ * `immutableAfterOpen` is what tells the UI to render this read-only
64707
+ * on an existing loan: `_add_collateral_borrow` reuses the tick
64708
+ * width, so changing N means closing and reopening.
64709
+ */
64710
+ openParameter: {
64711
+ kind: "llamalend-bands",
64712
+ dimension: "collateralFactor",
64713
+ domain: { min: 4, max: 50 },
64714
+ default: typeof ll.defaultBands === "number" ? ll.defaultBands : 10,
64715
+ immutableAfterOpen: true
64716
+ },
64420
64717
  badDebt: "socialized"
64421
64718
  },
64422
64719
  counterparty: { kind: "pool", solvency: "overcollateralized" }
@@ -65145,6 +65442,6 @@ function validateTermSheets(sheets) {
65145
65442
  return sheets.flatMap((s) => validateTermSheet(s));
65146
65443
  }
65147
65444
 
65148
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, EXACTLY_LENDER_KEY, 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, 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_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, 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, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, duration, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, frankencoinKeyParts, frankencoinLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, 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, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isFailedCall, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, stampVaultClassification, supplyDescription, supplyFindings, supplyHeadline, 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, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData };
65445
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, EXACTLY_LENDER_KEY, 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, 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_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, 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, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, duration, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, frankencoinKeyParts, frankencoinLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, 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, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isFailedCall, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, stampVaultClassification, supplyDescription, supplyFindings, supplyHeadline, 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, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData };
65149
65446
  //# sourceMappingURL=index.js.map
65150
65447
  //# sourceMappingURL=index.js.map