@1delta/margin-fetcher 5.0.23 → 5.0.25

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,13 +1,13 @@
1
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';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isDssType, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, isCurvance, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isUsdd, isSky, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isDssType, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, isCurvance, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isFraxlend, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, 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, llamaLendLendersByChain, usddLendersByChain, skyLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, dssConfigFor, dssChainData, dssDebtToken, dssDebtJoin, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } 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, llamaLendLendersByChain, usddLendersByChain, skyLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, fraxlendConfigFor, dssConfigFor, dssChainData, dssDebtToken, dssDebtJoin, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, fraxlendPairsFor, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } 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';
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, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, 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, FraxlendPairAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, 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
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';
@@ -11542,10 +11542,10 @@ var safeParseNumber = (value, decimals = 18) => safeParseUnits(toFixed(value, de
11542
11542
  var safeParseUnits = (strValue, decimals = 18) => {
11543
11543
  if (!/[-+]?[0-9]*\.?[0-9]+/.test(strValue))
11544
11544
  throw Error(`invalid number: ${strValue}`);
11545
- let [whole, dec = ""] = strValue.split(".");
11546
- dec = dec.slice(0, decimals);
11545
+ let [whole, dec2 = ""] = strValue.split(".");
11546
+ dec2 = dec2.slice(0, decimals);
11547
11547
  return parseUnits(
11548
- [whole || "0", dec].filter((v) => v.length > 0).join("."),
11548
+ [whole || "0", dec2].filter((v) => v.length > 0).join("."),
11549
11549
  decimals
11550
11550
  );
11551
11551
  };
@@ -11555,12 +11555,12 @@ function rateToApy(rate) {
11555
11555
  );
11556
11556
  }
11557
11557
  function parseLtv(ltv) {
11558
- let str5 = 0;
11558
+ let str6 = 0;
11559
11559
  try {
11560
- str5 = Number(formatUnits(BigInt(ltv), 18));
11560
+ str6 = Number(formatUnits(BigInt(ltv), 18));
11561
11561
  } catch (e) {
11562
11562
  }
11563
- return str5;
11563
+ return str6;
11564
11564
  }
11565
11565
  function liquidationPenaltyFromLltv(lltv) {
11566
11566
  if (!lltv || lltv <= 0) return 0;
@@ -21918,7 +21918,7 @@ async function fetchTellerMarkets(chainId) {
21918
21918
  } catch {
21919
21919
  return { chainId, pools: [] };
21920
21920
  }
21921
- const big16 = (i) => {
21921
+ const big18 = (i) => {
21922
21922
  const r = results[i];
21923
21923
  if (typeof r === "bigint") return r;
21924
21924
  if (typeof r === "number") return BigInt(r);
@@ -21932,20 +21932,20 @@ async function fetchTellerMarkets(chainId) {
21932
21932
  return null;
21933
21933
  };
21934
21934
  const num14 = (i) => {
21935
- const b = big16(i);
21935
+ const b = big18(i);
21936
21936
  return b === null ? null : Number(b);
21937
21937
  };
21938
21938
  const pool0 = pools.map((config, i) => {
21939
21939
  const base = i * READS_PER_POOL;
21940
21940
  return {
21941
21941
  config,
21942
- available: big16(base),
21943
- committed: big16(base + 1),
21942
+ available: big18(base),
21943
+ committed: big18(base + 1),
21944
21944
  minRateBps: num14(base + 2),
21945
- collateralPerPrincipal: big16(base + 3),
21945
+ collateralPerPrincipal: big18(base + 3),
21946
21946
  maxLoanDuration: num14(base + 4),
21947
- marketId: big16(base + 5),
21948
- totalAssets: big16(base + 6)
21947
+ marketId: big18(base + 5),
21948
+ totalAssets: big18(base + 6)
21949
21949
  };
21950
21950
  });
21951
21951
  const attByMarket = /* @__PURE__ */ new Map();
@@ -22181,8 +22181,8 @@ var TermMaxApiSource = class {
22181
22181
  const assetDecimals = /* @__PURE__ */ new Map();
22182
22182
  for (const a of Array.isArray(data.assetConfigs) ? data.assetConfigs : []) {
22183
22183
  const addr3 = lower(a?.contractAddress ?? a?.assetAddress);
22184
- const dec = Number(a?.decimals ?? a?.assetDecimals);
22185
- if (addr3 && Number.isFinite(dec)) assetDecimals.set(addr3, dec);
22184
+ const dec2 = Number(a?.decimals ?? a?.assetDecimals);
22185
+ if (addr3 && Number.isFinite(dec2)) assetDecimals.set(addr3, dec2);
22186
22186
  }
22187
22187
  const markets = [];
22188
22188
  for (const m of Array.isArray(data.markets) ? data.markets : []) {
@@ -22919,8 +22919,8 @@ async function fetchInverseMarkets(lender, chainId) {
22919
22919
  // unlike the on-chain bps — normalize here, and fall back to the
22920
22920
  // curated metadata value when the field is missing.
22921
22921
  replenishmentIncentiveBps: (() => {
22922
- const dec = num14(m?.replenishmentIncentive);
22923
- if (dec !== null) return Math.round(dec * 1e4);
22922
+ const dec2 = num14(m?.replenishmentIncentive);
22923
+ if (dec2 !== null) return Math.round(dec2 * 1e4);
22924
22924
  const meta = Number(market.replenishmentIncentiveBps);
22925
22925
  return Number.isFinite(meta) ? meta : null;
22926
22926
  })()
@@ -23374,9 +23374,9 @@ async function fetchResupplyMarkets(lender, chainId) {
23374
23374
  });
23375
23375
  });
23376
23376
  if (pending.length > 0) {
23377
- let dec = [];
23377
+ let dec2 = [];
23378
23378
  try {
23379
- dec = await multicallRetryUniversal({
23379
+ dec2 = await multicallRetryUniversal({
23380
23380
  chain: chainId,
23381
23381
  calls: pending.flatMap((p) => [
23382
23382
  { address: p.collateral, name: "decimals", params: [] },
@@ -23393,20 +23393,20 @@ async function fetchResupplyMarkets(lender, chainId) {
23393
23393
  allowFailure: true
23394
23394
  });
23395
23395
  } catch {
23396
- dec = [];
23396
+ dec2 = [];
23397
23397
  }
23398
23398
  const addr3 = (v) => typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v) && !/^0x0+$/.test(v) ? v : void 0;
23399
23399
  const wrapped = pending.map((_3, i) => {
23400
- const curve = addr3(dec[i * 4 + 2]);
23401
- const frax = addr3(dec[i * 4 + 3]);
23400
+ const curve = addr3(dec2[i * 4 + 2]);
23401
+ const frax = addr3(dec2[i * 4 + 3]);
23402
23402
  return {
23403
23403
  token: curve ?? frax,
23404
23404
  family: curve ? "curvelend" : frax ? "fraxlend" : void 0
23405
23405
  };
23406
23406
  });
23407
23407
  pending.forEach((p, i) => {
23408
- const cd = Number(dec[i * 4]);
23409
- const ud = Number(dec[i * 4 + 1]);
23408
+ const cd = Number(dec2[i * 4]);
23409
+ const ud = Number(dec2[i * 4 + 1]);
23410
23410
  const w = wrapped[i];
23411
23411
  identityCache.set(identityKey(chainId, p.pair), {
23412
23412
  pair: p.pair,
@@ -24028,6 +24028,191 @@ function allowlist(config) {
24028
24028
  }
24029
24029
  return new Set(config.marketAllowlist.map((m) => m.toLowerCase()));
24030
24030
  }
24031
+ var PAIR_READS = 15;
24032
+ var big3 = (v) => {
24033
+ if (typeof v === "bigint") return v;
24034
+ if (typeof v === "number") return BigInt(v);
24035
+ if (typeof v === "string" && v !== "0x") {
24036
+ try {
24037
+ return BigInt(v);
24038
+ } catch {
24039
+ }
24040
+ }
24041
+ return 0n;
24042
+ };
24043
+ var bool = (v) => v === true;
24044
+ var str2 = (v, fallback) => typeof v === "string" && v.length > 0 ? v : fallback;
24045
+ var dec = (v, fallback = 18) => {
24046
+ const n = Number(v);
24047
+ return Number.isFinite(n) && n >= 0 && n <= 36 ? n : fallback;
24048
+ };
24049
+ async function fetchFraxlendPairs(lender, chainId) {
24050
+ const config = fraxlendConfigFor(lender, chainId);
24051
+ const roster = (config?.pairs ?? []).filter((p) => !!p?.address);
24052
+ if (roster.length === 0) return { lender, config, pairs: [] };
24053
+ const swapper = config?.leverageSwapper ?? void 0;
24054
+ const addresses = roster.map((p) => p.address);
24055
+ const calls = addresses.flatMap((pair) => [
24056
+ { address: pair, name: "symbol", params: [] },
24057
+ { address: pair, name: "decimals", params: [] },
24058
+ { address: pair, name: "asset", params: [] },
24059
+ { address: pair, name: "collateralContract", params: [] },
24060
+ { address: pair, name: "maxLTV", params: [] },
24061
+ { address: pair, name: "LTV_PRECISION", params: [] },
24062
+ { address: pair, name: "EXCHANGE_PRECISION", params: [] },
24063
+ { address: pair, name: "LIQ_PRECISION", params: [] },
24064
+ { address: pair, name: "depositLimit", params: [] },
24065
+ { address: pair, name: "borrowLimit", params: [] },
24066
+ // Post-accrual accounting AND post-accrual rate state in one call. This is
24067
+ // the read the whole converter is built on — `getPairAccounting` and
24068
+ // `currentRateInfo` are their stale counterparts.
24069
+ { address: pair, name: "previewAddInterest", params: [] },
24070
+ { address: pair, name: "totalCollateral", params: [] },
24071
+ { address: pair, name: "exchangeRateInfo", params: [] },
24072
+ { address: pair, name: "rateContract", params: [] },
24073
+ // THE leverage gate. Probed live, per pair, every refresh — the mapping is
24074
+ // owner-mutable both ways, so a cached answer eventually lies in whichever
24075
+ // direction hurts (advertising a loop that reverts `BadSwapper()`, or
24076
+ // hiding one that works).
24077
+ {
24078
+ address: pair,
24079
+ name: "swappers",
24080
+ params: [swapper ?? "0x0000000000000000000000000000000000000000"]
24081
+ }
24082
+ ]);
24083
+ const res = await multicallRetryUniversal({
24084
+ chain: chainId,
24085
+ calls,
24086
+ abi: calls.map(() => FraxlendPairAbi),
24087
+ allowFailure: true
24088
+ });
24089
+ const pauseCalls = addresses.flatMap((pair) => [
24090
+ { address: pair, name: "isRepayPaused", params: [] },
24091
+ { address: pair, name: "isWithdrawPaused", params: [] },
24092
+ { address: pair, name: "isLiquidatePaused", params: [] },
24093
+ { address: pair, name: "isInterestPaused", params: [] }
24094
+ ]);
24095
+ const pauseRes = await multicallRetryUniversal({
24096
+ chain: chainId,
24097
+ calls: pauseCalls,
24098
+ abi: pauseCalls.map(() => FraxlendPairAbi),
24099
+ allowFailure: true
24100
+ }).catch(() => []);
24101
+ const partials = [];
24102
+ addresses.forEach((pair, i) => {
24103
+ const s = res.slice(i * PAIR_READS, i * PAIR_READS + PAIR_READS);
24104
+ const [
24105
+ symbol,
24106
+ decimals,
24107
+ asset,
24108
+ collateral,
24109
+ maxLtv,
24110
+ ltvPrec,
24111
+ exPrec,
24112
+ liqPrec,
24113
+ depositLimit,
24114
+ borrowLimit,
24115
+ preview,
24116
+ totalCollateral,
24117
+ xrInfo,
24118
+ rateContract,
24119
+ swapperOk
24120
+ ] = s;
24121
+ if (typeof asset !== "string" || typeof collateral !== "string") return;
24122
+ if (!preview || !xrInfo) return;
24123
+ const rateInfo = preview[3] ?? {};
24124
+ const totalAsset = preview[4] ?? {};
24125
+ const totalBorrow = preview[5] ?? {};
24126
+ const p = pauseRes.slice(i * 4, i * 4 + 4);
24127
+ partials.push({
24128
+ pair,
24129
+ symbol: str2(symbol, "FraxlendPair"),
24130
+ decimals: dec(decimals),
24131
+ asset: asset.toLowerCase(),
24132
+ collateral: collateral.toLowerCase(),
24133
+ maxLtv: big3(maxLtv),
24134
+ ltvPrecision: big3(ltvPrec) || 100000n,
24135
+ exchangePrecision: big3(exPrec) || 10n ** 18n,
24136
+ liqPrecision: big3(liqPrec) || 100000n,
24137
+ cleanLiquidationFee: 0n,
24138
+ dirtyLiquidationFee: 0n,
24139
+ protocolLiquidationFee: 0n,
24140
+ depositLimit: big3(depositLimit),
24141
+ borrowLimit: big3(borrowLimit),
24142
+ totalAssetAmount: big3(totalAsset.amount ?? totalAsset[0]),
24143
+ totalAssetShares: big3(totalAsset.shares ?? totalAsset[1]),
24144
+ totalBorrowAmount: big3(
24145
+ totalBorrow.amount ?? totalBorrow[0]
24146
+ ),
24147
+ totalBorrowShares: big3(
24148
+ totalBorrow.shares ?? totalBorrow[1]
24149
+ ),
24150
+ totalCollateral: big3(totalCollateral),
24151
+ oracle: str2(xrInfo[0], "").toLowerCase(),
24152
+ maxOracleDeviation: Number(xrInfo[1] ?? 0),
24153
+ exchangeRateLastTimestamp: big3(xrInfo[2]),
24154
+ lowExchangeRate: big3(xrInfo[3]),
24155
+ highExchangeRate: big3(xrInfo[4]),
24156
+ ratePerSec: big3(rateInfo.ratePerSec ?? rateInfo[3]),
24157
+ fullUtilizationRate: big3(
24158
+ rateInfo.fullUtilizationRate ?? rateInfo[4]
24159
+ ),
24160
+ feeToProtocolRate: Number(
24161
+ rateInfo.feeToProtocolRate ?? rateInfo[1] ?? 0
24162
+ ),
24163
+ rateLastTimestamp: big3(
24164
+ rateInfo.lastTimestamp ?? rateInfo[2]
24165
+ ),
24166
+ rateContract: str2(rateContract, "").toLowerCase(),
24167
+ isRepayPaused: bool(p[0]),
24168
+ isWithdrawPaused: bool(p[1]),
24169
+ isLiquidatePaused: bool(p[2]),
24170
+ isInterestPaused: bool(p[3]),
24171
+ // Only meaningful when a swapper is configured; with none, the probe was
24172
+ // against the zero address and must never read as "leverage available".
24173
+ leverageSwapperApproved: !!swapper && bool(swapperOk),
24174
+ leverageSwapper: swapper
24175
+ });
24176
+ });
24177
+ if (partials.length === 0) return { lender, config, pairs: [] };
24178
+ const tokenSet = [
24179
+ ...new Set(partials.flatMap((p) => [p.asset, p.collateral]))
24180
+ ];
24181
+ const metaCalls = tokenSet.flatMap((t) => [
24182
+ { address: t, name: "symbol", params: [] },
24183
+ { address: t, name: "name", params: [] },
24184
+ { address: t, name: "decimals", params: [] }
24185
+ ]);
24186
+ const metaRes = await multicallRetryUniversal({
24187
+ chain: chainId,
24188
+ calls: metaCalls,
24189
+ abi: metaCalls.map(() => erc20Abi),
24190
+ allowFailure: true
24191
+ }).catch(() => []);
24192
+ const meta = /* @__PURE__ */ new Map();
24193
+ tokenSet.forEach((t, i) => {
24194
+ const [symbol, name, decimals] = metaRes.slice(i * 3, i * 3 + 3);
24195
+ meta.set(t, {
24196
+ symbol: str2(symbol, "?"),
24197
+ name: str2(name, "?"),
24198
+ decimals: dec(decimals)
24199
+ });
24200
+ });
24201
+ const pairs = partials.map((p) => {
24202
+ const a = meta.get(p.asset);
24203
+ const c = meta.get(p.collateral);
24204
+ return {
24205
+ ...p,
24206
+ assetSymbol: a?.symbol ?? "?",
24207
+ assetName: a?.name ?? "?",
24208
+ assetDecimals: a?.decimals ?? 18,
24209
+ collateralSymbol: c?.symbol ?? "?",
24210
+ collateralName: c?.name ?? "?",
24211
+ collateralDecimals: c?.decimals ?? 18
24212
+ };
24213
+ });
24214
+ return { lender, config, pairs };
24215
+ }
24031
24216
 
24032
24217
  // src/lending/public-data/inverse/convertPublic.ts
24033
24218
  function inverseLenderKey(lender, market) {
@@ -24887,12 +25072,12 @@ function convertCurvanceMarketsToResponse(raw, chainId, prices = {}, _additional
24887
25072
  const priceKey = toOracleKey(token?.assetGroup) || toGenericPriceKey(assetAddr, chainId);
24888
25073
  const collPrice = t.assetPriceLower > 0n ? Number(t.assetPriceLower) / 1e18 : prices[priceKey] || 0;
24889
25074
  const debtPrice = t.assetPrice > 0n ? Number(t.assetPrice) / 1e18 : prices[priceKey] || 0;
24890
- const dec = t.assetDecimals;
24891
- const totalDeposits = toFloat(t.totalAssets, dec);
24892
- const totalDebt = toFloat(t.debt, dec);
24893
- const liquidity = toFloat(t.liquidity, dec);
25075
+ const dec2 = t.assetDecimals;
25076
+ const totalDeposits = toFloat(t.totalAssets, dec2);
25077
+ const totalDebt = toFloat(t.debt, dec2);
25078
+ const liquidity = toFloat(t.liquidity, dec2);
24894
25079
  const borrowable = t.debtCap > 0n;
24895
- const debtHeadroom = borrowable ? Math.max(toFloat(t.debtCap, dec) - totalDebt, 0) : 0;
25080
+ const debtHeadroom = borrowable ? Math.max(toFloat(t.debtCap, dec2) - totalDebt, 0) : 0;
24896
25081
  const borrowLiquidity = borrowable ? Math.min(liquidity, debtHeadroom) : 0;
24897
25082
  const collateralActive = t.collRatio > 0n && t.collateralCap > 0n;
24898
25083
  const ltv = Number(t.collRatio) / BPS2;
@@ -24912,7 +25097,7 @@ function convertCurvanceMarketsToResponse(raw, chainId, prices = {}, _additional
24912
25097
  name: t.assetSymbol,
24913
25098
  poolId: market.marketManager.toLowerCase(),
24914
25099
  underlying: assetAddr,
24915
- asset: currencyFor11(assetAddr, dec, t.assetSymbol, t.assetName, tokens),
25100
+ asset: currencyFor11(assetAddr, dec2, t.assetSymbol, t.assetName, tokens),
24916
25101
  totalDeposits,
24917
25102
  totalDebtStable: 0,
24918
25103
  totalDebt,
@@ -24932,7 +25117,7 @@ function convertCurvanceMarketsToResponse(raw, chainId, prices = {}, _additional
24932
25117
  rateModel: "curvance-dynamic",
24933
25118
  intrinsicYield: 0,
24934
25119
  rewards: void 0,
24935
- decimals: dec,
25120
+ decimals: dec2,
24936
25121
  config: {
24937
25122
  0: {
24938
25123
  category: 0,
@@ -24965,7 +25150,7 @@ function convertCurvanceMarketsToResponse(raw, chainId, prices = {}, _additional
24965
25150
  symbol: t.symbol,
24966
25151
  assetSymbol: t.assetSymbol,
24967
25152
  decimals: t.decimals,
24968
- assetDecimals: dec,
25153
+ assetDecimals: dec2,
24969
25154
  /** THE borrowability gate — never `isBorrowable()`. */
24970
25155
  borrowable,
24971
25156
  debtCap: t.debtCap.toString(),
@@ -25081,6 +25266,230 @@ function resolvePositionManagers(cfg, marketManager) {
25081
25266
  }
25082
25267
  return void 0;
25083
25268
  }
25269
+
25270
+ // src/lending/public-data/fraxlend/convertPublic.ts
25271
+ function fraxlendLenderKey(lender, chainId, pair) {
25272
+ return `${lender}_${chainId}_${pair.replace(/^0x/i, "").toUpperCase()}`;
25273
+ }
25274
+ function fraxlendKeyParts(key3) {
25275
+ if (!key3.startsWith("FRAXLEND_")) return void 0;
25276
+ const m = key3.slice("FRAXLEND_".length).match(/^(\d+)_([0-9A-Fa-f]{40})$/);
25277
+ if (!m) return void 0;
25278
+ return { lender: "FRAXLEND", chainId: m[1], pair: `0x${m[2].toLowerCase()}` };
25279
+ }
25280
+ var SECONDS_PER_YEAR11 = 31536e3;
25281
+ var ratePerSecToApr3 = (rate) => Number(rate) / 1e18 * SECONDS_PER_YEAR11 * 100;
25282
+ var toFloat2 = (raw, decimals) => Number(raw) / 10 ** decimals;
25283
+ var MAX_UINT = (1n << 256n) - 1n;
25284
+ function currencyFor12(address, decimals, symbol, name, tokens) {
25285
+ const lower3 = address.toLowerCase();
25286
+ return tokens[lower3] ?? { address: lower3, symbol, name, decimals };
25287
+ }
25288
+ function fraxlendAssetPerCollateral(p, which = "high") {
25289
+ const rate = which === "high" ? p.highExchangeRate : p.lowExchangeRate;
25290
+ if (rate === 0n) return 0;
25291
+ const base = Number(p.exchangePrecision) / Number(rate);
25292
+ return base * 10 ** (p.collateralDecimals - p.assetDecimals);
25293
+ }
25294
+ function convertFraxlendPairsToResponse(raw, chainId, prices = {}, _additionalYields = {
25295
+ intrinsicYields: {},
25296
+ lenderRewards: {},
25297
+ loaded: true
25298
+ }, tokens = {}) {
25299
+ const out = {};
25300
+ for (const p of raw?.pairs ?? []) {
25301
+ const lenderKey = fraxlendLenderKey(raw.lender, chainId, p.pair);
25302
+ const entry = { data: {} };
25303
+ const assetToken = tokens[p.asset];
25304
+ const collToken = tokens[p.collateral];
25305
+ const assetPriceKey = toOracleKey(assetToken?.assetGroup) || toGenericPriceKey(p.asset, chainId);
25306
+ const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(p.collateral, chainId);
25307
+ const assetPrice = prices[assetPriceKey] || 0;
25308
+ const assetPerColl = fraxlendAssetPerCollateral(p, "high");
25309
+ const collPrice = assetPerColl > 0 && assetPrice > 0 ? assetPerColl * assetPrice : prices[collPriceKey] || 0;
25310
+ const totalDeposits = toFloat2(p.totalAssetAmount, p.assetDecimals);
25311
+ const totalDebt = toFloat2(p.totalBorrowAmount, p.assetDecimals);
25312
+ const liquidity = Math.max(totalDeposits - totalDebt, 0);
25313
+ const totalCollateral = toFloat2(p.totalCollateral, p.collateralDecimals);
25314
+ const utilization = totalDeposits > 0 ? totalDebt / totalDeposits : 0;
25315
+ const borrowApr = ratePerSecToApr3(p.ratePerSec);
25316
+ const protocolCut = Math.min(Math.max(p.feeToProtocolRate / 1e5, 0), 1);
25317
+ const supplyApr = borrowApr * utilization * (1 - protocolCut);
25318
+ const ltv = p.ltvPrecision > 0n ? Number(p.maxLtv) / Number(p.ltvPrecision) : 0;
25319
+ const liquidationPenalty = p.liqPrecision > 0n && p.cleanLiquidationFee > 0n ? Number(p.cleanLiquidationFee) / Number(p.liqPrecision) : 0;
25320
+ const uncappedDeposit = p.depositLimit >= MAX_UINT / 2n;
25321
+ const uncappedBorrow = p.borrowLimit >= MAX_UINT / 2n;
25322
+ const depositHeadroom = uncappedDeposit ? Number.POSITIVE_INFINITY : Math.max(toFloat2(p.depositLimit, p.assetDecimals) - totalDeposits, 0);
25323
+ const borrowHeadroom = uncappedBorrow ? Number.POSITIVE_INFINITY : Math.max(toFloat2(p.borrowLimit, p.assetDecimals) - totalDebt, 0);
25324
+ const depositsHalted = depositHeadroom <= 0;
25325
+ const borrowHalted = borrowHeadroom <= 0;
25326
+ const borrowLiquidity = borrowHalted ? 0 : Math.min(liquidity, borrowHeadroom);
25327
+ const assetUid = createMarketUid(chainId, lenderKey, p.asset);
25328
+ entry.data[assetUid] = {
25329
+ marketUid: assetUid,
25330
+ name: p.assetSymbol,
25331
+ poolId: p.pair.toLowerCase(),
25332
+ underlying: p.asset,
25333
+ asset: currencyFor12(
25334
+ p.asset,
25335
+ p.assetDecimals,
25336
+ p.assetSymbol,
25337
+ p.assetName,
25338
+ tokens
25339
+ ),
25340
+ totalDeposits,
25341
+ totalDebtStable: 0,
25342
+ totalDebt,
25343
+ totalLiquidity: liquidity,
25344
+ borrowLiquidity,
25345
+ totalLiquidityUSD: liquidity * assetPrice,
25346
+ borrowLiquidityUSD: borrowLiquidity * assetPrice,
25347
+ totalDepositsUSD: totalDeposits * assetPrice,
25348
+ totalDebtStableUSD: 0,
25349
+ totalDebtUSD: totalDebt * assetPrice,
25350
+ utilization,
25351
+ depositRate: supplyApr,
25352
+ variableBorrowRate: borrowApr,
25353
+ stableBorrowRate: 0,
25354
+ rateModel: "fraxlend-variable-v3",
25355
+ intrinsicYield: 0,
25356
+ rewards: void 0,
25357
+ decimals: p.assetDecimals,
25358
+ config: {
25359
+ 0: {
25360
+ category: 0,
25361
+ // The asset can never be posted as collateral in its own pair.
25362
+ borrowCollateralFactor: 0,
25363
+ collateralFactor: 0,
25364
+ borrowFactor: 1,
25365
+ liquidationPenalty,
25366
+ closeFactor: 1,
25367
+ collateralDisabled: true,
25368
+ debtDisabled: borrowHalted
25369
+ }
25370
+ },
25371
+ closeFactor: 1,
25372
+ collateralActive: false,
25373
+ borrowingEnabled: !borrowHalted,
25374
+ depositsEnabled: !depositsHalted,
25375
+ hasStable: false,
25376
+ variableBorrowDisabled: borrowHalted,
25377
+ isActive: !(depositsHalted && borrowHalted),
25378
+ isFrozen: depositsHalted && borrowHalted
25379
+ };
25380
+ const collUid = createMarketUid(chainId, lenderKey, p.collateral);
25381
+ entry.data[collUid] = {
25382
+ marketUid: collUid,
25383
+ name: p.collateralSymbol,
25384
+ poolId: p.pair.toLowerCase(),
25385
+ underlying: p.collateral,
25386
+ asset: currencyFor12(
25387
+ p.collateral,
25388
+ p.collateralDecimals,
25389
+ p.collateralSymbol,
25390
+ p.collateralName,
25391
+ tokens
25392
+ ),
25393
+ totalDeposits: totalCollateral,
25394
+ totalDebtStable: 0,
25395
+ totalDebt: 0,
25396
+ // Posted collateral is not lendable liquidity — it just sits there.
25397
+ totalLiquidity: 0,
25398
+ borrowLiquidity: 0,
25399
+ totalLiquidityUSD: 0,
25400
+ borrowLiquidityUSD: 0,
25401
+ totalDepositsUSD: totalCollateral * collPrice,
25402
+ totalDebtStableUSD: 0,
25403
+ totalDebtUSD: 0,
25404
+ utilization: 0,
25405
+ // Genuinely 0 %: there is no lender side on the collateral leg.
25406
+ depositRate: 0,
25407
+ variableBorrowRate: 0,
25408
+ stableBorrowRate: 0,
25409
+ rateModel: "fraxlend-variable-v3",
25410
+ intrinsicYield: 0,
25411
+ rewards: void 0,
25412
+ decimals: p.collateralDecimals,
25413
+ config: {
25414
+ 0: {
25415
+ category: 0,
25416
+ borrowCollateralFactor: ltv,
25417
+ // Fraxlend has ONE ratio: `maxLTV` gates both opening and solvency,
25418
+ // so the liquidation threshold IS the LTV. Publishing anything
25419
+ // higher would invent a buffer the contract does not give.
25420
+ collateralFactor: ltv,
25421
+ borrowFactor: 1,
25422
+ liquidationPenalty,
25423
+ closeFactor: 1,
25424
+ collateralDisabled: false,
25425
+ debtDisabled: true
25426
+ }
25427
+ },
25428
+ closeFactor: 1,
25429
+ collateralActive: true,
25430
+ borrowingEnabled: false,
25431
+ depositsEnabled: !depositsHalted,
25432
+ hasStable: false,
25433
+ variableBorrowDisabled: true,
25434
+ isActive: true,
25435
+ isFrozen: depositsHalted && borrowHalted
25436
+ };
25437
+ entry.descriptor = {
25438
+ pair: p.pair.toLowerCase(),
25439
+ symbol: p.symbol,
25440
+ fTokenDecimals: p.decimals,
25441
+ asset: p.asset,
25442
+ collateral: p.collateral,
25443
+ assetDecimals: p.assetDecimals,
25444
+ collateralDecimals: p.collateralDecimals,
25445
+ /** RAW, with its scale, so a caller can reproduce the protocol's math. */
25446
+ maxLtvRaw: p.maxLtv.toString(),
25447
+ ltvPrecision: p.ltvPrecision.toString(),
25448
+ maxLtv: ltv,
25449
+ /** INVERTED (collateral-per-asset) and NOT decimal-normalised — see
25450
+ * `fraxlendAssetPerCollateral` before using these directly. */
25451
+ lowExchangeRate: p.lowExchangeRate.toString(),
25452
+ highExchangeRate: p.highExchangeRate.toString(),
25453
+ exchangePrecision: p.exchangePrecision.toString(),
25454
+ /** The inverted, decimal-corrected, ready-to-use forms. */
25455
+ assetPerCollateralHigh: fraxlendAssetPerCollateral(p, "high"),
25456
+ assetPerCollateralLow: fraxlendAssetPerCollateral(p, "low"),
25457
+ oracle: p.oracle,
25458
+ maxOracleDeviation: p.maxOracleDeviation,
25459
+ /** Can be DAYS stale on this protocol — surface it, do not hide it. */
25460
+ exchangeRateLastTimestamp: p.exchangeRateLastTimestamp.toString(),
25461
+ /** Borrow SHARES outstanding; convert with `toBorrowAmount`. */
25462
+ totalBorrowShares: p.totalBorrowShares.toString(),
25463
+ totalAssetShares: p.totalAssetShares.toString(),
25464
+ ratePerSecond: p.ratePerSec.toString(),
25465
+ /** The STATEFUL IRM term — needed to reproduce the rate offline. */
25466
+ fullUtilizationRate: p.fullUtilizationRate.toString(),
25467
+ feeToProtocolRate: p.feeToProtocolRate,
25468
+ /** `VariableInterestRateV3`; `getNewRate` is a view ⇒ exact
25469
+ * rate-at-depth with no modelling. */
25470
+ rateContract: p.rateContract,
25471
+ depositLimit: p.depositLimit.toString(),
25472
+ borrowLimit: p.borrowLimit.toString(),
25473
+ isRepayPaused: p.isRepayPaused,
25474
+ isWithdrawPaused: p.isWithdrawPaused,
25475
+ isLiquidatePaused: p.isLiquidatePaused,
25476
+ isInterestPaused: p.isInterestPaused,
25477
+ /**
25478
+ * Native looping availability, PROBED LIVE this refresh. `false` means
25479
+ * `leveragedPosition` reverts `BadSwapper()` on this pair — it does NOT
25480
+ * mean the protocol lacks the feature. Never cache across refreshes.
25481
+ */
25482
+ leverageEnabled: p.leverageSwapperApproved,
25483
+ leverageSwapper: p.leverageSwapper,
25484
+ /** `path` for `leveragedPosition` / `repayAssetWithCollateral`. The
25485
+ * loop direction is asset->collateral; deleverage is the reverse. */
25486
+ leveragePath: [p.asset, p.collateral],
25487
+ deleveragePath: [p.collateral, p.asset]
25488
+ };
25489
+ out[lenderKey] = entry;
25490
+ }
25491
+ return out;
25492
+ }
25084
25493
  var CORE_READS_PER_ILK = 3;
25085
25494
  var DSS_CORE_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi];
25086
25495
  var dssIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
@@ -25125,12 +25534,12 @@ async function fetchDssMarkets(lender, chainId) {
25125
25534
  } catch {
25126
25535
  return { lender, config, chainData, markets: [] };
25127
25536
  }
25128
- const big16 = (v) => {
25537
+ const big18 = (v) => {
25129
25538
  if (typeof v === "bigint") return v;
25130
25539
  if (typeof v === "number") return BigInt(v);
25131
25540
  return null;
25132
25541
  };
25133
- const field13 = (res, name, idx) => big16(res?.[name] ?? res?.[idx]);
25542
+ const field13 = (res, name, idx) => big18(res?.[name] ?? res?.[idx]);
25134
25543
  let cursor = 0;
25135
25544
  const out = markets.map((market, i) => {
25136
25545
  const base = cursor;
@@ -25147,7 +25556,7 @@ async function fetchDssMarkets(lender, chainId) {
25147
25556
  dust: field13(vatIlk, "dust", 4),
25148
25557
  duty: field13(jugIlk, "duty", 0),
25149
25558
  mat: field13(spotIlk, "mat", 1),
25150
- joinBalance: joinReadIndex[i] >= 0 ? big16(results[joinReadIndex[i]]) : null
25559
+ joinBalance: joinReadIndex[i] >= 0 ? big18(results[joinReadIndex[i]]) : null
25151
25560
  };
25152
25561
  });
25153
25562
  return { lender, config, chainData, markets: out };
@@ -25175,7 +25584,7 @@ var YEAR_SECONDS2 = 31536e3;
25175
25584
  function toHuman4(raw, decimals) {
25176
25585
  return Number(raw) / 10 ** decimals;
25177
25586
  }
25178
- function currencyFor12(address, decimals, symbol, tokens) {
25587
+ function currencyFor13(address, decimals, symbol, tokens) {
25179
25588
  const lower3 = address.toLowerCase();
25180
25589
  return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
25181
25590
  }
@@ -25227,7 +25636,7 @@ function convertDssMarketsToResponse(raw, chainId, prices = {}, _additionalYield
25227
25636
  name: "Collateral " + collSymbol,
25228
25637
  poolId: market.gemJoin?.toLowerCase(),
25229
25638
  underlying: collAddr,
25230
- asset: currencyFor12(collAddr, collDecimals, collSymbol, tokens),
25639
+ asset: currencyFor13(collAddr, collDecimals, collSymbol, tokens),
25231
25640
  totalDeposits: totalColl,
25232
25641
  totalDebtStable: 0,
25233
25642
  totalDebt: 0,
@@ -25271,7 +25680,7 @@ function convertDssMarketsToResponse(raw, chainId, prices = {}, _additionalYield
25271
25680
  name: debtSymbol,
25272
25681
  poolId: cfg.vat.toLowerCase(),
25273
25682
  underlying: debtAddr,
25274
- asset: currencyFor12(debtAddr, debtDecimals, debtSymbol, tokens),
25683
+ asset: currencyFor13(debtAddr, debtDecimals, debtSymbol, tokens),
25275
25684
  totalDeposits: 0,
25276
25685
  totalDebtStable: 0,
25277
25686
  totalDebt,
@@ -25421,26 +25830,26 @@ async function fetchFrankencoinMarkets(lender, chainId) {
25421
25830
  } catch {
25422
25831
  return { lender, config, chainData, markets: [] };
25423
25832
  }
25424
- const big16 = (v) => {
25833
+ const big18 = (v) => {
25425
25834
  if (typeof v === "bigint") return v;
25426
25835
  if (typeof v === "number") return BigInt(v);
25427
25836
  return null;
25428
25837
  };
25429
25838
  const out = markets.map((market, i) => {
25430
25839
  const base = i * READS_PER_MARKET3;
25431
- const expiration = big16(results[base + 7]);
25840
+ const expiration = big18(results[base + 7]);
25432
25841
  return {
25433
25842
  market,
25434
- price: big16(results[base]),
25435
- minted: big16(results[base + 1]),
25436
- availableForClones: big16(results[base + 2]),
25437
- annualInterestPPM: big16(results[base + 3]),
25438
- currentFeePPM: big16(results[base + 4]),
25439
- reserveContribution: big16(results[base + 5]),
25440
- challengedAmount: big16(results[base + 6]),
25843
+ price: big18(results[base]),
25844
+ minted: big18(results[base + 1]),
25845
+ availableForClones: big18(results[base + 2]),
25846
+ annualInterestPPM: big18(results[base + 3]),
25847
+ currentFeePPM: big18(results[base + 4]),
25848
+ reserveContribution: big18(results[base + 5]),
25849
+ challengedAmount: big18(results[base + 6]),
25441
25850
  expiration,
25442
25851
  isClosed: typeof results[base + 8] === "boolean" ? results[base + 8] : null,
25443
- collateralBalance: big16(results[base + 9])
25852
+ collateralBalance: big18(results[base + 9])
25444
25853
  };
25445
25854
  });
25446
25855
  return { lender, config, chainData, markets: out };
@@ -25462,7 +25871,7 @@ function frankencoinKeyParts(key3) {
25462
25871
  };
25463
25872
  }
25464
25873
  var PPM = 1e6;
25465
- function currencyFor13(address, decimals, symbol, tokens) {
25874
+ function currencyFor14(address, decimals, symbol, tokens) {
25466
25875
  const lower3 = address.toLowerCase();
25467
25876
  return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
25468
25877
  }
@@ -25513,7 +25922,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
25513
25922
  name: "Collateral " + collSymbol,
25514
25923
  poolId: market.position.toLowerCase(),
25515
25924
  underlying: collAddr,
25516
- asset: currencyFor13(collAddr, collDecimals, collSymbol, tokens),
25925
+ asset: currencyFor14(collAddr, collDecimals, collSymbol, tokens),
25517
25926
  totalDeposits: totalColl,
25518
25927
  totalDebtStable: 0,
25519
25928
  totalDebt: 0,
@@ -25560,7 +25969,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
25560
25969
  name: debtSymbol,
25561
25970
  poolId: cfg.mintingHub.toLowerCase(),
25562
25971
  underlying: debtAddr,
25563
- asset: currencyFor13(debtAddr, debtDecimals, debtSymbol, tokens),
25972
+ asset: currencyFor14(debtAddr, debtDecimals, debtSymbol, tokens),
25564
25973
  totalDeposits: 0,
25565
25974
  totalDebtStable: 0,
25566
25975
  totalDebt,
@@ -26284,6 +26693,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
26284
26693
  if (isLlamaLend(lender)) return await fetchLlamaLendMarkets(lender, chainId);
26285
26694
  if (isResupply(lender)) return await fetchResupplyMarkets(lender, chainId);
26286
26695
  if (isCurvance(lender)) return await fetchCurvanceMarkets(lender, chainId);
26696
+ if (isFraxlend(lender)) return await fetchFraxlendPairs(lender, chainId);
26287
26697
  if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
26288
26698
  if (isDssType(lender)) return await fetchDssMarkets(lender, chainId);
26289
26699
  if (isFrankencoin(lender))
@@ -26373,6 +26783,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
26373
26783
  additionalYields,
26374
26784
  list
26375
26785
  );
26786
+ if (isFraxlend(lender))
26787
+ return convertFraxlendPairsToResponse(
26788
+ data,
26789
+ chainId,
26790
+ prices,
26791
+ additionalYields,
26792
+ list
26793
+ );
26376
26794
  if (isFrankencoin(lender))
26377
26795
  return convertFrankencoinMarketsToResponse(
26378
26796
  data,
@@ -26600,6 +27018,7 @@ function lenderApiOnly(lender, chainId) {
26600
27018
  if (isTermMax(lender)) return true;
26601
27019
  if (isResupply(lender)) return true;
26602
27020
  if (isCurvance(lender)) return true;
27021
+ if (isFraxlend(lender)) return true;
26603
27022
  if (isDssType(lender)) return true;
26604
27023
  if (isFrankencoin(lender)) return true;
26605
27024
  if (isLlamaLend(lender)) return true;
@@ -28122,6 +28541,17 @@ function __resetResupplyUserCaches() {
28122
28541
  rosterCache3.clear();
28123
28542
  discoveryCache2.clear();
28124
28543
  }
28544
+ var FRAXLEND_CALLS_PER_PAIR = 4;
28545
+ var buildFraxlendUserCall = (chainId, lender, account) => {
28546
+ const pairs = fraxlendPairsFor(lender, chainId);
28547
+ if (pairs.length === 0) return [];
28548
+ return pairs.flatMap((p) => [
28549
+ { address: p.address, name: "userCollateralBalance", params: [account] },
28550
+ { address: p.address, name: "userBorrowShares", params: [account] },
28551
+ { address: p.address, name: "balanceOf", params: [account] },
28552
+ { address: p.address, name: "previewAddInterest", params: [] }
28553
+ ]);
28554
+ };
28125
28555
  var ROSTER_TTL_MS2 = 5 * 6e4;
28126
28556
  var DISCOVERY_TTL_MS2 = 6e4;
28127
28557
  var CURVANCE_MARKET_READS = 2;
@@ -28299,7 +28729,7 @@ var getCachedDssCdps = (lender, chainId, account) => {
28299
28729
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
28300
28730
  return hit;
28301
28731
  };
28302
- var big3 = (v) => {
28732
+ var big4 = (v) => {
28303
28733
  try {
28304
28734
  if (typeof v === "bigint") return v;
28305
28735
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -28330,7 +28760,7 @@ var buildDssUserCall = async (chainId, lender, account) => {
28330
28760
  ],
28331
28761
  allowFailure: false
28332
28762
  });
28333
- owners.push({ owner: account, count: big3(rawCount), cursor: big3(rawFirst) });
28763
+ owners.push({ owner: account, count: big4(rawCount), cursor: big4(rawFirst) });
28334
28764
  const proxy = String(rawProxy ?? zero2);
28335
28765
  if (proxy.toLowerCase() !== zero2) {
28336
28766
  const [pCount, pFirst] = await multicallRetryUniversal({
@@ -28342,7 +28772,7 @@ var buildDssUserCall = async (chainId, lender, account) => {
28342
28772
  ],
28343
28773
  allowFailure: false
28344
28774
  });
28345
- owners.push({ owner: proxy, count: big3(pCount), cursor: big3(pFirst) });
28775
+ owners.push({ owner: proxy, count: big4(pCount), cursor: big4(pFirst) });
28346
28776
  }
28347
28777
  } catch {
28348
28778
  return [];
@@ -28383,7 +28813,7 @@ var buildDssUserCall = async (chainId, lender, account) => {
28383
28813
  if (curated.has(ilk)) {
28384
28814
  cdps.push({ cdpId: cursor.toString(), urn: String(urn), ilk });
28385
28815
  }
28386
- cursor = big3(field6(link, "next", 1));
28816
+ cursor = big4(field6(link, "next", 1));
28387
28817
  }
28388
28818
  }
28389
28819
  } catch {
@@ -28635,6 +29065,7 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
28635
29065
  if (isLlamaLend(lender))
28636
29066
  return buildLlamaLendUserCall(chainId, lender, account);
28637
29067
  if (isResupply(lender)) return buildResupplyUserCall(chainId, lender, account);
29068
+ if (isFraxlend(lender)) return buildFraxlendUserCall(chainId, lender, account);
28638
29069
  if (isCurvance(lender)) return buildCurvanceUserCall(chainId, lender, account);
28639
29070
  if (isDssType(lender)) return buildDssUserCall(chainId, lender, account);
28640
29071
  if (isFrankencoin(lender))
@@ -31446,7 +31877,7 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
31446
31877
  expected
31447
31878
  ];
31448
31879
  };
31449
- var big4 = (v) => {
31880
+ var big5 = (v) => {
31450
31881
  try {
31451
31882
  if (typeof v === "bigint") return v;
31452
31883
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -31454,7 +31885,7 @@ var big4 = (v) => {
31454
31885
  }
31455
31886
  return 0n;
31456
31887
  };
31457
- var field7 = (res, name, idx) => big4(res?.[name] ?? res?.[idx]);
31888
+ var field7 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
31458
31889
  var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
31459
31890
  const cfg = liquityConfigFor(lender, chainId);
31460
31891
  const branches = liquityBranchesByChain(lender, chainId);
@@ -31575,11 +32006,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
31575
32006
  };
31576
32007
  });
31577
32008
  const spBase = troves.length * 2;
31578
- const spDeposit = big4(slice2[spBase]);
31579
- const spYield = big4(slice2[spBase + 1]);
31580
- const spCollGain = big4(slice2[spBase + 2]);
31581
- const spStashed = big4(slice2[spBase + 3]);
31582
- const collSurplus = branch.collSurplusPool ? big4(slice2[spBase + 4]) : 0n;
32009
+ const spDeposit = big5(slice2[spBase]);
32010
+ const spYield = big5(slice2[spBase + 1]);
32011
+ const spCollGain = big5(slice2[spBase + 2]);
32012
+ const spStashed = big5(slice2[spBase + 3]);
32013
+ const collSurplus = branch.collSurplusPool ? big5(slice2[spBase + 4]) : 0n;
31583
32014
  const spStable = spDeposit + spYield;
31584
32015
  const spColl = spCollGain + spStashed + collSurplus;
31585
32016
  if (spStable > 0n || spColl > 0n) {
@@ -31658,7 +32089,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
31658
32089
  expected
31659
32090
  ];
31660
32091
  };
31661
- var big5 = (v) => {
32092
+ var big6 = (v) => {
31662
32093
  try {
31663
32094
  if (typeof v === "bigint") return v;
31664
32095
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -31666,7 +32097,7 @@ var big5 = (v) => {
31666
32097
  }
31667
32098
  return 0n;
31668
32099
  };
31669
- var field8 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
32100
+ var field8 = (res, name, idx) => big6(res?.[name] ?? res?.[idx]);
31670
32101
  var getRiverUserDataConverter = (lender, chainId, account, meta) => {
31671
32102
  const cfg = riverConfigFor(lender, chainId);
31672
32103
  const markets = riverChainData(lender, chainId)?.markets ?? [];
@@ -31678,13 +32109,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
31678
32109
  const debtAddr = cfg.debtToken.toLowerCase();
31679
32110
  const debtDecimals = cfg.debtDecimals ?? 18;
31680
32111
  const out = {};
31681
- const spDeposit = big5(data[markets.length * RIVER_CALLS_PER_MARKET]);
32112
+ const spDeposit = big6(data[markets.length * RIVER_CALLS_PER_MARKET]);
31682
32113
  markets.forEach((market, i) => {
31683
32114
  const base = i * RIVER_CALLS_PER_MARKET;
31684
32115
  const entire = data[base];
31685
32116
  if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
31686
- const status = Number(big5(data[base + 1]));
31687
- const surplus = big5(data[base + 2]);
32117
+ const status = Number(big6(data[base + 1]));
32118
+ const surplus = big6(data[base + 2]);
31688
32119
  const lenderKey = riverLenderKey(lender, chainId, market.index);
31689
32120
  const metaMap = meta?.[lenderKey];
31690
32121
  if (!metaMap) return;
@@ -31792,7 +32223,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
31792
32223
  expected
31793
32224
  ];
31794
32225
  };
31795
- var big6 = (v) => {
32226
+ var big7 = (v) => {
31796
32227
  try {
31797
32228
  if (typeof v === "bigint") return v;
31798
32229
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -31811,24 +32242,24 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
31811
32242
  const dolaAddr = cfg.dola.toLowerCase();
31812
32243
  const debtDecimals = cfg.debtDecimals ?? 18;
31813
32244
  const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
31814
- const dbrBalance = big6(data[tailBase]);
31815
- const dbrDeficit = big6(data[tailBase + 1]);
32245
+ const dbrBalance = big7(data[tailBase]);
32246
+ const dbrDeficit = big7(data[tailBase + 1]);
31816
32247
  const dbrSignedRaw = data[tailBase + 2];
31817
- const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big6(dbrSignedRaw);
32248
+ const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big7(dbrSignedRaw);
31818
32249
  const dbrTotalDebtRaw = data[tailBase + 3];
31819
- const dbrTotalDebt = isFailedCall(dbrTotalDebtRaw) ? 0n : big6(dbrTotalDebtRaw);
32250
+ const dbrTotalDebt = isFailedCall(dbrTotalDebtRaw) ? 0n : big7(dbrTotalDebtRaw);
31820
32251
  const dbrRunway = dbrTotalDebt > 0n ? dbrBalance * 31536000n / dbrTotalDebt : 0n;
31821
32252
  const nowSec9 = BigInt(Math.floor(Date.now() / 1e3));
31822
32253
  const out = {};
31823
32254
  markets.forEach((market, i) => {
31824
32255
  const base = i * INVERSE_CALLS_PER_MARKET;
31825
- const escrowBal = isFailedCall(data[base]) ? 0n : big6(data[base]);
32256
+ const escrowBal = isFailedCall(data[base]) ? 0n : big7(data[base]);
31826
32257
  const debtRaw = data[base + 1];
31827
32258
  if (isFailedCall(debtRaw)) return;
31828
- const debt = big6(debtRaw);
32259
+ const debt = big7(debtRaw);
31829
32260
  if (escrowBal === 0n && debt === 0n) return;
31830
- const creditLimit = isFailedCall(data[base + 2]) ? 0n : big6(data[base + 2]);
31831
- const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big6(data[base + 3]);
32261
+ const creditLimit = isFailedCall(data[base + 2]) ? 0n : big7(data[base + 2]);
32262
+ const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big7(data[base + 3]);
31832
32263
  const lenderKey = inverseLenderKey(lender, market.address);
31833
32264
  const metaMap = meta?.[lenderKey];
31834
32265
  if (!metaMap) return;
@@ -31914,7 +32345,7 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
31914
32345
  expected
31915
32346
  ];
31916
32347
  };
31917
- var big7 = (v) => {
32348
+ var big8 = (v) => {
31918
32349
  try {
31919
32350
  if (typeof v === "bigint") return v;
31920
32351
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -31924,7 +32355,7 @@ var big7 = (v) => {
31924
32355
  };
31925
32356
  var arrAt = (v, i) => {
31926
32357
  if (isFailedCall(v) || !Array.isArray(v)) return 0n;
31927
- return big7(v[i]);
32358
+ return big8(v[i]);
31928
32359
  };
31929
32360
  var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31930
32361
  const cfg = llamaLendConfigFor(lender, chainId);
@@ -31939,24 +32370,24 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31939
32370
  const base = i * LLAMALEND_CALLS_PER_MARKET;
31940
32371
  const stateRaw = data[base];
31941
32372
  if (isFailedCall(stateRaw) || !Array.isArray(stateRaw)) return;
31942
- const collateral = big7(stateRaw[0]);
31943
- const bandBorrowed = big7(stateRaw[1]);
31944
- const debt = big7(stateRaw[2]);
31945
- const bandCount = Number(big7(stateRaw[3]));
32373
+ const collateral = big8(stateRaw[0]);
32374
+ const bandBorrowed = big8(stateRaw[1]);
32375
+ const debt = big8(stateRaw[2]);
32376
+ const bandCount = Number(big8(stateRaw[3]));
31946
32377
  const vaultSharesRaw = data[base + 5];
31947
32378
  const gaugeSharesRaw = data[base + 6];
31948
- const vaultShares = isFailedCall(vaultSharesRaw) ? 0n : big7(vaultSharesRaw);
31949
- const gaugeShares = isFailedCall(gaugeSharesRaw) ? 0n : big7(gaugeSharesRaw);
32379
+ const vaultShares = isFailedCall(vaultSharesRaw) ? 0n : big8(vaultSharesRaw);
32380
+ const gaugeShares = isFailedCall(gaugeSharesRaw) ? 0n : big8(gaugeSharesRaw);
31950
32381
  const lendShares = vaultShares + gaugeShares;
31951
32382
  if (collateral === 0n && debt === 0n && bandBorrowed === 0n && lendShares === 0n)
31952
32383
  return;
31953
32384
  const healthRaw = data[base + 1];
31954
- const health = isFailedCall(healthRaw) ? 0n : big7(healthRaw);
32385
+ const health = isFailedCall(healthRaw) ? 0n : big8(healthRaw);
31955
32386
  const pricesRaw = data[base + 2];
31956
32387
  const priceUpper = arrAt(pricesRaw, 0);
31957
32388
  const priceLower = arrAt(pricesRaw, 1);
31958
32389
  const ticksRaw = data[base + 3];
31959
- const bands = isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(big7(ticksRaw[0])), Number(big7(ticksRaw[1]))];
32390
+ const bands = isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(big8(ticksRaw[0])), Number(big8(ticksRaw[1]))];
31960
32391
  const approvalRaw = data[base + 4];
31961
32392
  const delegated = isFailedCall(approvalRaw) ? false : approvalRaw === true;
31962
32393
  const lenderKey = llamaLendLenderKey(lender, market.controller);
@@ -31977,7 +32408,7 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31977
32408
  const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
31978
32409
  const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
31979
32410
  const shareToAssetRaw = data[base + 7];
31980
- const shareToAsset = isFailedCall(shareToAssetRaw) ? 0n : big7(shareToAssetRaw);
32411
+ const shareToAsset = isFailedCall(shareToAssetRaw) ? 0n : big8(shareToAssetRaw);
31981
32412
  const lendAssets = shareToAsset === 0n ? 0n : lendShares * shareToAsset / 10n ** 18n;
31982
32413
  const lendStr = parseRawAmount(lendAssets.toString(), loanDecimals);
31983
32414
  const depositStr = parseRawAmount(
@@ -32066,7 +32497,7 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
32066
32497
  expected
32067
32498
  ];
32068
32499
  };
32069
- var big8 = (v) => {
32500
+ var big9 = (v) => {
32070
32501
  try {
32071
32502
  if (typeof v === "bigint") return v;
32072
32503
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -32074,7 +32505,7 @@ var big8 = (v) => {
32074
32505
  }
32075
32506
  return 0n;
32076
32507
  };
32077
- var tupleAt = (v, i) => Array.isArray(v) ? big8(v[i]) : 0n;
32508
+ var tupleAt = (v, i) => Array.isArray(v) ? big9(v[i]) : 0n;
32078
32509
  var ONE4 = 10n ** 18n;
32079
32510
  function sharesToAmount(shares, totalAmount, totalShares) {
32080
32511
  if (totalShares === 0n || shares === 0n) return 0n;
@@ -32100,7 +32531,7 @@ var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
32100
32531
  if (isFailedCall(accounting) || !Array.isArray(accounting)) return;
32101
32532
  const totalBorrowAmount = tupleAt(accounting, 1);
32102
32533
  const totalBorrowShares = tupleAt(accounting, 2);
32103
- const sharePrice = isFailedCall(data[base + 1]) ? 0n : big8(data[base + 1]);
32534
+ const sharePrice = isFailedCall(data[base + 1]) ? 0n : big9(data[base + 1]);
32104
32535
  const lenderKey = resupplyLenderKey(lender, chainId, pair);
32105
32536
  const metaMap = meta?.[lenderKey];
32106
32537
  if (!metaMap) return;
@@ -32198,8 +32629,159 @@ var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
32198
32629
  expected
32199
32630
  ];
32200
32631
  };
32632
+ var big10 = (v) => {
32633
+ try {
32634
+ if (typeof v === "bigint") return v;
32635
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
32636
+ } catch {
32637
+ }
32638
+ return 0n;
32639
+ };
32640
+ function fraxlendToAmount(shares, totalAmount, totalShares, roundUp) {
32641
+ if (totalShares === 0n) return shares;
32642
+ let amount3 = shares * totalAmount / totalShares;
32643
+ if (roundUp && totalAmount > 0n && amount3 * totalShares / totalAmount < shares) {
32644
+ amount3 = amount3 + 1n;
32645
+ }
32646
+ return amount3;
32647
+ }
32648
+ var getFraxlendUserDataConverter = (lender, chainId, account, meta) => {
32649
+ const pairs = fraxlendPairsFor(lender, chainId);
32650
+ const expected = pairs.length * FRAXLEND_CALLS_PER_PAIR;
32651
+ return [
32652
+ (data) => {
32653
+ if (expected === 0) return void 0;
32654
+ if (!data || data.length < expected) return void 0;
32655
+ const out = {};
32656
+ pairs.forEach((pair, i) => {
32657
+ const base = i * FRAXLEND_CALLS_PER_PAIR;
32658
+ const collRaw = data[base];
32659
+ const sharesRaw = data[base + 1];
32660
+ const fTokenRaw = data[base + 2];
32661
+ const previewRaw = data[base + 3];
32662
+ if (isFailedCall(collRaw) || isFailedCall(sharesRaw)) return;
32663
+ const collateral = big10(collRaw);
32664
+ const borrowShares = big10(sharesRaw);
32665
+ const fTokenShares = isFailedCall(fTokenRaw) ? 0n : big10(fTokenRaw);
32666
+ if (collateral === 0n && borrowShares === 0n && fTokenShares === 0n)
32667
+ return;
32668
+ let totalBorrowAmount = 0n;
32669
+ let totalBorrowShares = 0n;
32670
+ let totalAssetAmount = 0n;
32671
+ let totalAssetShares = 0n;
32672
+ if (!isFailedCall(previewRaw) && previewRaw) {
32673
+ const ta = previewRaw[4];
32674
+ const tb = previewRaw[5];
32675
+ totalAssetAmount = big10(ta?.amount ?? ta?.[0]);
32676
+ totalAssetShares = big10(ta?.shares ?? ta?.[1]);
32677
+ totalBorrowAmount = big10(tb?.amount ?? tb?.[0]);
32678
+ totalBorrowShares = big10(tb?.shares ?? tb?.[1]);
32679
+ }
32680
+ const debt = fraxlendToAmount(
32681
+ borrowShares,
32682
+ totalBorrowAmount,
32683
+ totalBorrowShares,
32684
+ true
32685
+ );
32686
+ const fTokenAssets = fraxlendToAmount(
32687
+ fTokenShares,
32688
+ totalAssetAmount,
32689
+ totalAssetShares,
32690
+ false
32691
+ );
32692
+ const lenderKey = fraxlendLenderKey(lender, chainId, pair.address);
32693
+ const metaMap = meta?.[lenderKey];
32694
+ if (!metaMap) return;
32695
+ const uids = Object.keys(metaMap);
32696
+ const collUid = uids.find(
32697
+ (u) => metaMap[u]?.collateralActive === true
32698
+ );
32699
+ const loanUid = uids.find((u) => metaMap[u]?.borrowingEnabled === true);
32700
+ if (!collUid || !loanUid) return;
32701
+ const collMeta = metaMap[collUid];
32702
+ const loanMeta = metaMap[loanUid];
32703
+ const collAddr = collMeta?.underlying?.toLowerCase?.() ?? "";
32704
+ const loanAddr = loanMeta?.underlying?.toLowerCase?.() ?? "";
32705
+ const collDecimals = collMeta?.asset?.decimals ?? 18;
32706
+ const loanDecimals = loanMeta?.asset?.decimals ?? 18;
32707
+ const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
32708
+ const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
32709
+ const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
32710
+ const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
32711
+ const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
32712
+ const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
32713
+ const fraxlendInfo = {
32714
+ borrowShares: borrowShares.toString(),
32715
+ totalBorrowAmount: totalBorrowAmount.toString(),
32716
+ totalBorrowShares: totalBorrowShares.toString(),
32717
+ fTokenShares: fTokenShares.toString(),
32718
+ fTokenAssets: fTokenAssets.toString()
32719
+ };
32720
+ const collStr = parseRawAmount(collateral.toString(), collDecimals);
32721
+ const collNum = Number(collStr);
32722
+ const debtStr = parseRawAmount(debt.toString(), loanDecimals);
32723
+ const debtNum = Number(debtStr);
32724
+ const supplyStr = parseRawAmount(fTokenAssets.toString(), loanDecimals);
32725
+ const supplyNum = Number(supplyStr);
32726
+ const lendingPositions = {
32727
+ "0": {
32728
+ [collUid]: {
32729
+ marketUid: collUid,
32730
+ underlying: collAddr,
32731
+ deposits: collStr,
32732
+ debt: "0",
32733
+ debtStable: "0",
32734
+ depositsUSD: collNum * collDisplay,
32735
+ debtUSD: 0,
32736
+ debtStableUSD: 0,
32737
+ depositsUSDOracle: collNum * collOracle,
32738
+ debtUSDOracle: 0,
32739
+ debtStableUSDOracle: 0,
32740
+ stableBorrowRate: "0",
32741
+ collateralEnabled: true,
32742
+ claimableRewards: 0
32743
+ },
32744
+ [loanUid]: {
32745
+ marketUid: loanUid,
32746
+ underlying: loanAddr,
32747
+ deposits: supplyStr,
32748
+ debt: debtStr,
32749
+ debtStable: "0",
32750
+ depositsUSD: supplyNum * loanDisplay,
32751
+ debtUSD: debtNum * loanDisplay,
32752
+ debtStableUSD: 0,
32753
+ depositsUSDOracle: supplyNum * loanOracle,
32754
+ debtUSDOracle: debtNum * loanOracle,
32755
+ debtStableUSDOracle: 0,
32756
+ stableBorrowRate: "0",
32757
+ // The asset leg is never collateral in its own pair.
32758
+ collateralEnabled: false,
32759
+ claimableRewards: 0,
32760
+ fraxlendInfo
32761
+ }
32762
+ }
32763
+ };
32764
+ const modes = { "0": 0 };
32765
+ const hist = {
32766
+ "0": {
32767
+ totalDeposits24h: collNum * collHist + supplyNum * loanHist,
32768
+ totalDebt24h: debtNum * loanHist
32769
+ }
32770
+ };
32771
+ const userData = createMultiAccountTypeUserState(
32772
+ { chainId, account, lendingPositions, modes },
32773
+ metaMap,
32774
+ hist
32775
+ );
32776
+ if (userData && userData.data.length > 0) out[lenderKey] = userData;
32777
+ });
32778
+ return Object.keys(out).length > 0 ? out : void 0;
32779
+ },
32780
+ expected
32781
+ ];
32782
+ };
32201
32783
  var WAD13 = 10n ** 18n;
32202
- var big9 = (v) => {
32784
+ var big11 = (v) => {
32203
32785
  try {
32204
32786
  if (typeof v === "bigint") return v;
32205
32787
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -32207,7 +32789,7 @@ var big9 = (v) => {
32207
32789
  }
32208
32790
  return 0n;
32209
32791
  };
32210
- var tupleAt2 = (v, i) => Array.isArray(v) ? big9(v[i]) : 0n;
32792
+ var tupleAt2 = (v, i) => Array.isArray(v) ? big11(v[i]) : 0n;
32211
32793
  var HOLD_PERIOD_SECONDS = 1200n;
32212
32794
  var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
32213
32795
  const cfg = curvanceConfigFor(lender, chainId);
@@ -32230,7 +32812,7 @@ var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
32230
32812
  const cooldownRaw = data[base];
32231
32813
  const status = data[base + 1];
32232
32814
  if (isFailedCall(status) || !Array.isArray(status)) continue;
32233
- const cooldownTimestamp = isFailedCall(cooldownRaw) ? 0n : big9(cooldownRaw);
32815
+ const cooldownTimestamp = isFailedCall(cooldownRaw) ? 0n : big11(cooldownRaw);
32234
32816
  const holdPeriodEndsAt = cooldownTimestamp > 0n ? cooldownTimestamp + HOLD_PERIOD_SECONDS : 0n;
32235
32817
  const holdPeriodActive = holdPeriodEndsAt > nowSeconds;
32236
32818
  const lenderKey = curvanceLenderKey(lender, chainId, p.marketManager);
@@ -32252,10 +32834,10 @@ var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
32252
32834
  let rows = 0;
32253
32835
  p.activeTokens.forEach(({ cToken, asset }, i) => {
32254
32836
  const tokenBase = base + CURVANCE_MARKET_READS + i * CURVANCE_READS_PER_TOKEN;
32255
- const shares = isFailedCall(data[tokenBase]) ? 0n : big9(data[tokenBase]);
32256
- const collateralShares = isFailedCall(data[tokenBase + 1]) ? 0n : big9(data[tokenBase + 1]);
32257
- const debtRaw = isFailedCall(data[tokenBase + 2]) ? 0n : big9(data[tokenBase + 2]);
32258
- const exchangeRate = isFailedCall(data[tokenBase + 3]) ? 0n : big9(data[tokenBase + 3]);
32837
+ const shares = isFailedCall(data[tokenBase]) ? 0n : big11(data[tokenBase]);
32838
+ const collateralShares = isFailedCall(data[tokenBase + 1]) ? 0n : big11(data[tokenBase + 1]);
32839
+ const debtRaw = isFailedCall(data[tokenBase + 2]) ? 0n : big11(data[tokenBase + 2]);
32840
+ const exchangeRate = isFailedCall(data[tokenBase + 3]) ? 0n : big11(data[tokenBase + 3]);
32259
32841
  info.tokens[cToken.toLowerCase()] = {
32260
32842
  shares: shares.toString(),
32261
32843
  collateralShares: collateralShares.toString(),
@@ -32315,7 +32897,7 @@ var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
32315
32897
  ];
32316
32898
  };
32317
32899
  var RAY5 = 10n ** 27n;
32318
- var big10 = (v) => {
32900
+ var big12 = (v) => {
32319
32901
  try {
32320
32902
  if (typeof v === "bigint") return v;
32321
32903
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -32323,7 +32905,7 @@ var big10 = (v) => {
32323
32905
  }
32324
32906
  return 0n;
32325
32907
  };
32326
- var field9 = (res, name, idx) => big10(res?.[name] ?? res?.[idx]);
32908
+ var field9 = (res, name, idx) => big12(res?.[name] ?? res?.[idx]);
32327
32909
  var getDssUserDataConverter = (lender, chainId, account, meta) => {
32328
32910
  const cfg = dssConfigFor(lender, chainId);
32329
32911
  const markets = dssChainData(lender, chainId)?.markets ?? [];
@@ -32438,7 +33020,7 @@ var getDssUserDataConverter = (lender, chainId, account, meta) => {
32438
33020
  expected
32439
33021
  ];
32440
33022
  };
32441
- var big11 = (v) => {
33023
+ var big13 = (v) => {
32442
33024
  try {
32443
33025
  if (typeof v === "bigint") return v;
32444
33026
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -32468,11 +33050,11 @@ var getFrankencoinUserDataConverter = (lender, chainId, account, meta) => {
32468
33050
  const ownerRes = data[base];
32469
33051
  if (isFailedCall(ownerRes)) return;
32470
33052
  if (String(ownerRes).toLowerCase() !== lowerAccount) return;
32471
- const minted = big11(data[base + 1]);
32472
- const price2 = big11(data[base + 2]);
32473
- const expiration = big11(data[base + 3]);
32474
- const challenged = big11(data[base + 4]);
32475
- const coll = big11(data[base + 5]);
33053
+ const minted = big13(data[base + 1]);
33054
+ const price2 = big13(data[base + 2]);
33055
+ const expiration = big13(data[base + 3]);
33056
+ const challenged = big13(data[base + 4]);
33057
+ const coll = big13(data[base + 5]);
32476
33058
  if (minted === 0n && coll === 0n) return;
32477
33059
  const market = marketByOriginal.get(p.original);
32478
33060
  if (!market) return;
@@ -32573,7 +33155,7 @@ var getFrankencoinUserDataConverter = (lender, chainId, account, meta) => {
32573
33155
 
32574
33156
  // src/lending/user-data/teller/userCallParse.ts
32575
33157
  var nowSec7 = () => Math.floor(Date.now() / 1e3);
32576
- var big12 = (v) => {
33158
+ var big14 = (v) => {
32577
33159
  try {
32578
33160
  if (typeof v === "bigint") return v;
32579
33161
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -32595,7 +33177,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
32595
33177
  const base = i * TELLER_CALLS_PER_BID;
32596
33178
  const bidRes = data[base];
32597
33179
  const owed = data[base + 1];
32598
- const collAmount = big12(data[base + 2]);
33180
+ const collAmount = big14(data[base + 2]);
32599
33181
  const defaulted = !!data[base + 3];
32600
33182
  if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
32601
33183
  const pool = b.pool;
@@ -32616,17 +33198,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
32616
33198
  const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
32617
33199
  const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
32618
33200
  const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
32619
- const owedPrincipal = big12(field10(owed, "principal", 0));
32620
- const owedInterest = big12(field10(owed, "interest", 1));
33201
+ const owedPrincipal = big14(field10(owed, "principal", 0));
33202
+ const owedInterest = big14(field10(owed, "interest", 1));
32621
33203
  const owedTotal = owedPrincipal + owedInterest;
32622
33204
  if (owedTotal === 0n && collAmount === 0n) return;
32623
33205
  const loanDetails = field10(bidRes, "loanDetails", 5);
32624
33206
  const terms = field10(bidRes, "terms", 6);
32625
33207
  const acceptedTs = Number(
32626
- big12(field10(loanDetails, "acceptedTimestamp", 4))
33208
+ big14(field10(loanDetails, "acceptedTimestamp", 4))
32627
33209
  );
32628
- const loanDuration = Number(big12(field10(loanDetails, "loanDuration", 6)));
32629
- const aprBps = Number(big12(field10(terms, "APR", 2)));
33210
+ const loanDuration = Number(big14(field10(loanDetails, "loanDuration", 6)));
33211
+ const aprBps = Number(big14(field10(terms, "APR", 2)));
32630
33212
  const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
32631
33213
  const isMatured2 = defaulted || maturity !== void 0 && maturity < now;
32632
33214
  const collStr = parseRawAmount(collAmount.toString(), collDecimals);
@@ -33007,6 +33589,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
33007
33589
  return getLlamaLendUserDataConverter(lender, chainId, account, meta);
33008
33590
  if (isResupply(lender))
33009
33591
  return getResupplyUserDataConverter(lender, chainId, account, meta);
33592
+ if (isFraxlend(lender))
33593
+ return getFraxlendUserDataConverter(lender, chainId, account, meta);
33010
33594
  if (isCurvance(lender))
33011
33595
  return getCurvanceUserDataConverter(lender, chainId, account, meta);
33012
33596
  if (isDssType(lender))
@@ -37671,6 +38255,7 @@ var getAbi2 = (lender) => {
37671
38255
  if (isDssType(lender)) return [...UsddVatAbi];
37672
38256
  if (isFrankencoin(lender))
37673
38257
  return [...FrankencoinPositionAbi, ...erc20Abi];
38258
+ if (isFraxlend(lender)) return [...FraxlendPairAbi];
37674
38259
  if (isResupply(lender))
37675
38260
  return [...ResupplyPairAbi, ...VAULT_CONVERT_ABI];
37676
38261
  if (isCurvance(lender))
@@ -47021,7 +47606,7 @@ var DLEND_POOLS = [
47021
47606
  }
47022
47607
  ];
47023
47608
  var ZERO_ADDRESS5 = "0x0000000000000000000000000000000000000000";
47024
- var SECONDS_PER_YEAR11 = 31536e3;
47609
+ var SECONDS_PER_YEAR12 = 31536e3;
47025
47610
  var ABI = [
47026
47611
  {
47027
47612
  name: "getReservesList",
@@ -47162,7 +47747,7 @@ function rebateApr(params) {
47162
47747
  if (nowSeconds >= Number(distributionEnd)) return 0;
47163
47748
  if (emissionPerSecond <= 0n || balanceTotalSupply <= 0n) return 0;
47164
47749
  if (!(rewardPrice > 0) || !(assetPrice > 0)) return 0;
47165
- const rewardsPerYearUsd = scale(emissionPerSecond, rewardDecimals) * SECONDS_PER_YEAR11 * rewardPrice;
47750
+ const rewardsPerYearUsd = scale(emissionPerSecond, rewardDecimals) * SECONDS_PER_YEAR12 * rewardPrice;
47166
47751
  const baseUsd = scale(balanceTotalSupply, balanceDecimals) * assetPrice;
47167
47752
  if (!(baseUsd > 0)) return 0;
47168
47753
  return rewardsPerYearUsd / baseUsd * 100;
@@ -47350,7 +47935,7 @@ var dtrinityRebateRewardFetcher = {
47350
47935
  return { byLender: merged };
47351
47936
  }
47352
47937
  };
47353
- var SECONDS_PER_YEAR12 = 31536e3;
47938
+ var SECONDS_PER_YEAR13 = 31536e3;
47354
47939
  var WAD14 = 10n ** 18n;
47355
47940
  var ZERO2 = "0x0000000000000000000000000000000000000000";
47356
47941
  var UNBOOSTED_FACTOR = 0.4;
@@ -47458,7 +48043,7 @@ function crvGaugeApr(params) {
47458
48043
  return 0;
47459
48044
  }
47460
48045
  if (!(crvPriceUsd > 0) || !(assetPriceUsd > 0)) return 0;
47461
- const crvPerYear = scale2(inflationRate, 18) * scale2(relativeWeight, 18) * SECONDS_PER_YEAR12;
48046
+ const crvPerYear = scale2(inflationRate, 18) * scale2(relativeWeight, 18) * SECONDS_PER_YEAR13;
47462
48047
  const stakedUsd = scale2(workingSupply, 18) * scale2(pricePerShare, 18) * assetPriceUsd;
47463
48048
  if (!(stakedUsd > 0)) return 0;
47464
48049
  return crvPerYear * crvPriceUsd / stakedUsd * 100 * UNBOOSTED_FACTOR;
@@ -47477,7 +48062,7 @@ function extraRewardApr(params) {
47477
48062
  if (nowSeconds >= Number(periodFinish)) return 0;
47478
48063
  if (rate <= 0n || totalSupply <= 0n) return 0;
47479
48064
  if (!(rewardPriceUsd > 0) || !(assetPriceUsd > 0)) return 0;
47480
- const rewardPerYearUsd = scale2(rate, rewardDecimals) * SECONDS_PER_YEAR12 * rewardPriceUsd;
48065
+ const rewardPerYearUsd = scale2(rate, rewardDecimals) * SECONDS_PER_YEAR13 * rewardPriceUsd;
47481
48066
  const stakedUsd = scale2(totalSupply, 18) * scale2(pricePerShare, 18) * assetPriceUsd;
47482
48067
  if (!(stakedUsd > 0)) return 0;
47483
48068
  return rewardPerYearUsd / stakedUsd * 100;
@@ -47585,7 +48170,7 @@ async function fetchForChain(chainId, nowSeconds) {
47585
48170
  abi: GAUGE_ABI,
47586
48171
  allowFailure: true
47587
48172
  });
47588
- const big16 = (v) => {
48173
+ const big18 = (v) => {
47589
48174
  try {
47590
48175
  if (typeof v === "bigint") return v;
47591
48176
  if (typeof v === "string" && v !== "0x") return BigInt(v);
@@ -47599,15 +48184,15 @@ async function fetchForChain(chainId, nowSeconds) {
47599
48184
  const b = i * STRIDE;
47600
48185
  return {
47601
48186
  market: m,
47602
- inflationRate: big16(r1[b]),
47603
- workingSupply: big16(r1[b + 1]),
47604
- totalSupply: big16(r1[b + 2]),
48187
+ inflationRate: big18(r1[b]),
48188
+ workingSupply: big18(r1[b + 1]),
48189
+ totalSupply: big18(r1[b + 2]),
47605
48190
  isKilled: r1[b + 3] === true,
47606
- rewardCount: Number(big16(r1[b + 4])),
47607
- pricePerShare: big16(r1[b + 5]),
48191
+ rewardCount: Number(big18(r1[b + 4])),
48192
+ pricePerShare: big18(r1[b + 5]),
47608
48193
  // Off L1 the child gauge's own rate is already market-scoped, so the
47609
48194
  // weight is the identity.
47610
- relativeWeight: isL1 ? big16(r1[b + 6]) : WAD14
48195
+ relativeWeight: isL1 ? big18(r1[b + 6]) : WAD14
47611
48196
  };
47612
48197
  });
47613
48198
  const tokenCalls = state.flatMap(
@@ -47700,7 +48285,7 @@ async function fetchForChain(chainId, nowSeconds) {
47700
48285
  const decoded = decodeRewardData(data);
47701
48286
  if (!decoded) continue;
47702
48287
  const { periodFinish, rate } = decoded;
47703
- const decimals = typeof decRaw === "number" ? decRaw : Number(big16(decRaw) || 18n);
48288
+ const decimals = typeof decRaw === "number" ? decRaw : Number(big18(decRaw) || 18n);
47704
48289
  const rewardPrice = priceOf(prices, chainId, token);
47705
48290
  const apr = extraRewardApr({
47706
48291
  rate,
@@ -48715,7 +49300,7 @@ function getDssCalls(chainId) {
48715
49300
  return results;
48716
49301
  }
48717
49302
  var RAY8 = 1e27;
48718
- var big13 = (v) => {
49303
+ var big15 = (v) => {
48719
49304
  try {
48720
49305
  if (typeof v === "bigint") return v;
48721
49306
  if (v == null || v === "0x") return 0n;
@@ -48727,16 +49312,16 @@ var big13 = (v) => {
48727
49312
  var field12 = (res, name, idx) => {
48728
49313
  const v = res?.[name];
48729
49314
  if (typeof v === "bigint" || typeof v === "number" || typeof v === "string") {
48730
- return big13(v);
49315
+ return big15(v);
48731
49316
  }
48732
- return big13(res?.[idx]);
49317
+ return big15(res?.[idx]);
48733
49318
  };
48734
49319
  function parseDssResults(data, meta, context) {
48735
49320
  const { chainId } = context;
48736
49321
  const key3 = dssLenderKey(meta.lender, chainId, meta.ilk);
48737
49322
  const entries = [];
48738
49323
  const spot = field12(data?.[0], "spot", 2);
48739
- const mat = big13(meta.mat);
49324
+ const mat = big15(meta.mat);
48740
49325
  if (spot > 0n && mat > 0n) {
48741
49326
  const collUSD = Number(spot) / RAY8 * (Number(mat) / RAY8);
48742
49327
  if (collUSD > 0 && collUSD < 1e9) {
@@ -49105,13 +49690,13 @@ function getTermMaxCalls(chainId) {
49105
49690
  function readUsdPrice(res) {
49106
49691
  if (res == null || res === "0x") return void 0;
49107
49692
  let raw;
49108
- let dec;
49693
+ let dec2;
49109
49694
  if (Array.isArray(res)) {
49110
49695
  raw = res[0];
49111
- dec = res[1];
49696
+ dec2 = res[1];
49112
49697
  } else if (typeof res === "object") {
49113
49698
  raw = res.price;
49114
- dec = res.decimals;
49699
+ dec2 = res.decimals;
49115
49700
  } else {
49116
49701
  return void 0;
49117
49702
  }
@@ -49122,7 +49707,7 @@ function readUsdPrice(res) {
49122
49707
  return void 0;
49123
49708
  }
49124
49709
  if (price2 <= 0n) return void 0;
49125
- const decimals = Number(dec);
49710
+ const decimals = Number(dec2);
49126
49711
  if (!Number.isFinite(decimals) || decimals < 0 || decimals > 36) return void 0;
49127
49712
  const usd = Number(price2) / 10 ** decimals;
49128
49713
  return Number.isFinite(usd) && usd > 0 ? usd : void 0;
@@ -52656,13 +53241,13 @@ var fetchFluidFTokens = async (chainId, multicallRetry, prices = {}, tokenList =
52656
53241
  multicallRetry
52657
53242
  );
52658
53243
  for (const f of Object.values(fTokens)) {
52659
- const dec = assetDec.get(f.underlying);
52660
- if (dec == null || dec === f.decimals) continue;
53244
+ const dec2 = assetDec.get(f.underlying);
53245
+ if (dec2 == null || dec2 === f.decimals) continue;
52661
53246
  const price2 = f.priceUsd ?? 0;
52662
- f.decimals = dec;
52663
- f.totalAssetsFormatted = Number(parseRawAmount(f.totalAssets, dec));
53247
+ f.decimals = dec2;
53248
+ f.totalAssetsFormatted = Number(parseRawAmount(f.totalAssets, dec2));
52664
53249
  f.totalAssetsUsd = f.totalAssetsFormatted * price2;
52665
- f.liquidityFormatted = Number(parseRawAmount(f.liquidity, dec));
53250
+ f.liquidityFormatted = Number(parseRawAmount(f.liquidity, dec2));
52666
53251
  f.liquidityUsd = f.liquidityFormatted * price2;
52667
53252
  }
52668
53253
  } catch {
@@ -52772,8 +53357,8 @@ function deriveConvertToAssets(totalAssetsRaw, totalSupplyRaw, shareDecimals) {
52772
53357
  const ta = BigInt(totalAssetsRaw ?? 0);
52773
53358
  const ts = BigInt(totalSupplyRaw ?? 0);
52774
53359
  if (ts <= 0n) return "0";
52775
- const dec = Math.max(0, Math.round(Number(shareDecimals) || 0));
52776
- const probe = 10n ** BigInt(dec);
53360
+ const dec2 = Math.max(0, Math.round(Number(shareDecimals) || 0));
53361
+ const probe = 10n ** BigInt(dec2);
52777
53362
  return (ta * probe / ts).toString();
52778
53363
  } catch {
52779
53364
  return "0";
@@ -54613,8 +55198,8 @@ function safeBigInt2(v) {
54613
55198
  function rescaleExchangeRate(exchangeRate, shareDecimals) {
54614
55199
  const r = safeBigInt2(exchangeRate);
54615
55200
  if (r === 0n) return "0";
54616
- const dec = Math.max(0, Math.round(Number(shareDecimals) || 0));
54617
- return (r * 10n ** BigInt(dec) / 10n ** 18n).toString();
55201
+ const dec2 = Math.max(0, Math.round(Number(shareDecimals) || 0));
55202
+ return (r * 10n ** BigInt(dec2) / 10n ** 18n).toString();
54618
55203
  }
54619
55204
  async function getJson3(url) {
54620
55205
  const controller = new AbortController();
@@ -54759,7 +55344,7 @@ var num4 = (v) => {
54759
55344
  const n = Number(v);
54760
55345
  return Number.isFinite(n) ? n : 0;
54761
55346
  };
54762
- var big14 = (v) => {
55347
+ var big16 = (v) => {
54763
55348
  try {
54764
55349
  if (v === void 0 || v === null || v === "") return "0";
54765
55350
  const s = String(v);
@@ -54795,12 +55380,12 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
54795
55380
  const assetEntry = tokenList[underlying];
54796
55381
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
54797
55382
  const priceUsd = prices[priceKey];
54798
- const totalAssets = big14(r.totalAssets);
54799
- const totalSupply = big14(r.totalSupplyAmt);
55383
+ const totalAssets = big16(r.totalAssets);
55384
+ const totalSupply = big16(r.totalSupplyAmt);
54800
55385
  const totalAssetsFormatted = Number(totalAssets) / scale3;
54801
55386
  const supplyRate = num4(r.apr) * 100;
54802
55387
  const rewardsRate = num4(r?.incentiveData?.TMX_APR) * 100;
54803
- const rawLiquidity = BigInt(big14(r.redeemableAmt ?? r.idleFunds ?? "0"));
55388
+ const rawLiquidity = BigInt(big16(r.redeemableAmt ?? r.idleFunds ?? "0"));
54804
55389
  const totalAssetsBig = BigInt(totalAssets);
54805
55390
  const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
54806
55391
  const liquidityFormatted = Number(liquidity) / scale3;
@@ -54836,7 +55421,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
54836
55421
  liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
54837
55422
  version: r.version,
54838
55423
  isPaused: r.isPaused === true || void 0,
54839
- supplyCap: r.capacity ? big14(r.capacity) : void 0,
55424
+ supplyCap: r.capacity ? big16(r.capacity) : void 0,
54840
55425
  basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
54841
55426
  };
54842
55427
  }
@@ -54892,7 +55477,7 @@ var Erc20DecimalsBalanceAbi = [
54892
55477
 
54893
55478
  // src/vaults/termmax/fetchFromChain.ts
54894
55479
  var DECIMAL_BASE2 = 100000000n;
54895
- var big15 = (v) => {
55480
+ var big17 = (v) => {
54896
55481
  if (v === void 0 || v === null || v === "0x") return 0n;
54897
55482
  try {
54898
55483
  return typeof v === "bigint" ? v : BigInt(v);
@@ -54904,7 +55489,7 @@ var num5 = (v) => {
54904
55489
  const n = Number(v);
54905
55490
  return Number.isFinite(n) ? n : void 0;
54906
55491
  };
54907
- var str2 = (v) => typeof v === "string" && v.length > 0 ? v : void 0;
55492
+ var str3 = (v) => typeof v === "string" && v.length > 0 ? v : void 0;
54908
55493
  var addr = (v) => typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v) && !/^0x0{40}$/.test(v) ? v.toLowerCase() : void 0;
54909
55494
  async function discoverVaultAddresses(chainId) {
54910
55495
  const markets = await fetchTermMaxMarkets(chainId).catch(() => []);
@@ -54956,24 +55541,24 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
54956
55541
  vaults.forEach((address, i) => {
54957
55542
  const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
54958
55543
  const asset = addr(at("asset"));
54959
- const totalAssets = big15(at("totalAssets"));
55544
+ const totalAssets = big17(at("totalAssets"));
54960
55545
  if (!asset || totalAssets === 0n) return;
54961
55546
  rows.push({
54962
55547
  address,
54963
- name: str2(at("name")),
54964
- symbol: str2(at("symbol")),
55548
+ name: str3(at("name")),
55549
+ symbol: str3(at("symbol")),
54965
55550
  decimals: num5(at("decimals")) ?? 18,
54966
55551
  asset,
54967
55552
  totalAssets,
54968
- totalSupply: big15(at("totalSupply")),
54969
- annualizedInterest: big15(at("annualizedInterest")),
54970
- accretingPrincipal: big15(at("accretingPrincipal")),
54971
- performanceFeeRate: big15(at("performanceFeeRate")),
54972
- aprRaw: at("apr") != null ? big15(at("apr")) : void 0,
55553
+ totalSupply: big17(at("totalSupply")),
55554
+ annualizedInterest: big17(at("annualizedInterest")),
55555
+ accretingPrincipal: big17(at("accretingPrincipal")),
55556
+ performanceFeeRate: big17(at("performanceFeeRate")),
55557
+ aprRaw: at("apr") != null ? big17(at("apr")) : void 0,
54973
55558
  curator: addr(at("curator")),
54974
55559
  guardian: addr(at("guardian")),
54975
55560
  timelock: num5(at("timelock")),
54976
- version: str2(at("getVersion"))
55561
+ version: str3(at("getVersion"))
54977
55562
  });
54978
55563
  });
54979
55564
  if (rows.length === 0) return {};
@@ -54990,7 +55575,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
54990
55575
  const out = {};
54991
55576
  rows.forEach((r, i) => {
54992
55577
  const assetDecimals = num5(res2[i * 2]) ?? r.decimals;
54993
- const idle = big15(res2[i * 2 + 1]);
55578
+ const idle = big17(res2[i * 2 + 1]);
54994
55579
  const assetEntry = tokenList[r.asset];
54995
55580
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
54996
55581
  const priceUsd = prices[priceKey];
@@ -62541,23 +63126,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
62541
63126
  const indexMax = price(prices, m.indexToken)?.max;
62542
63127
  if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
62543
63128
  const base = i * SLOTS;
62544
- const big16 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
63129
+ const big18 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
62545
63130
  const cap = computeDepositCapacityUsd(
62546
- [info?.longTokenAmount, longMax, big16(0), big16(2)],
62547
- [info?.shortTokenAmount, shortMax, big16(1), big16(3)]
63131
+ [info?.longTokenAmount, longMax, big18(0), big18(2)],
63132
+ [info?.shortTokenAmount, shortMax, big18(1), big18(3)]
62548
63133
  );
62549
63134
  if (cap != null) value.depositCapacityUsd = cap;
62550
63135
  if (indexMax != null) {
62551
63136
  const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
62552
- const reservedUsdLong = (big16(4) + big16(5)) / divisor * indexMax;
62553
- const reservedUsdShort = (big16(6) + big16(7)) / divisor;
63137
+ const reservedUsdLong = (big18(4) + big18(5)) / divisor * indexMax;
63138
+ const reservedUsdShort = (big18(6) + big18(7)) / divisor;
62554
63139
  const liq = computeLiquidityUsd(
62555
63140
  info?.longTokenUsd,
62556
63141
  info?.shortTokenUsd,
62557
63142
  reservedUsdLong,
62558
63143
  reservedUsdShort,
62559
- big16(8),
62560
- big16(9)
63144
+ big18(8),
63145
+ big18(9)
62561
63146
  );
62562
63147
  if (liq != null)
62563
63148
  value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
@@ -62756,21 +63341,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
62756
63341
  } catch {
62757
63342
  return void 0;
62758
63343
  }
62759
- const big16 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
62760
- const base = big16(0);
62761
- const mult = big16(1);
63344
+ const big18 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
63345
+ const base = big18(0);
63346
+ const mult = big18(1);
62762
63347
  if (base === 0n && mult === 0n) return void 0;
62763
63348
  const PRECISION = 10n ** 30n;
62764
63349
  const adjusted = (opGas) => base + opGas * mult / PRECISION;
62765
63350
  const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
62766
- const glvExtra = big16(6) * GLV_NOMINAL_MARKET_COUNT;
63351
+ const glvExtra = big18(6) * GLV_NOMINAL_MARKET_COUNT;
62767
63352
  return {
62768
63353
  chainId,
62769
63354
  gasPriceWei: gasPriceWei.toString(),
62770
- deposit: fee(big16(2)),
62771
- withdrawal: fee(big16(3)),
62772
- glvDeposit: fee(big16(4) + glvExtra),
62773
- glvWithdrawal: fee(big16(5) + glvExtra)
63355
+ deposit: fee(big18(2)),
63356
+ withdrawal: fee(big18(3)),
63357
+ glvDeposit: fee(big18(4) + glvExtra),
63358
+ glvWithdrawal: fee(big18(5) + glvExtra)
62774
63359
  };
62775
63360
  };
62776
63361
 
@@ -62923,7 +63508,7 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
62923
63508
  // src/vaults/gmx/fetchUser.ts
62924
63509
  var DEFAULT_CAP = 50;
62925
63510
  var isBig = (v) => typeof v === "bigint";
62926
- var str3 = (v) => isBig(v) ? v.toString() : "0";
63511
+ var str4 = (v) => isBig(v) ? v.toString() : "0";
62927
63512
  var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
62928
63513
  const empty = {
62929
63514
  chainId,
@@ -63051,11 +63636,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
63051
63636
  market: a.market.toLowerCase(),
63052
63637
  initialLongToken: a.initialLongToken.toLowerCase(),
63053
63638
  initialShortToken: a.initialShortToken.toLowerCase(),
63054
- initialLongTokenAmount: str3(n.initialLongTokenAmount),
63055
- initialShortTokenAmount: str3(n.initialShortTokenAmount),
63056
- minOut: str3(n.minMarketTokens),
63057
- executionFee: str3(n.executionFee),
63058
- updatedAtTime: str3(n.updatedAtTime)
63639
+ initialLongTokenAmount: str4(n.initialLongTokenAmount),
63640
+ initialShortTokenAmount: str4(n.initialShortTokenAmount),
63641
+ minOut: str4(n.minMarketTokens),
63642
+ executionFee: str4(n.executionFee),
63643
+ updatedAtTime: str4(n.updatedAtTime)
63059
63644
  });
63060
63645
  });
63061
63646
  withdrawalKeys.forEach((key3, i) => {
@@ -63069,11 +63654,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
63069
63654
  account: a.account.toLowerCase(),
63070
63655
  receiver: a.receiver.toLowerCase(),
63071
63656
  market: a.market.toLowerCase(),
63072
- tokenAmount: str3(n.marketTokenAmount),
63073
- minLongTokenAmount: str3(n.minLongTokenAmount),
63074
- minShortTokenAmount: str3(n.minShortTokenAmount),
63075
- executionFee: str3(n.executionFee),
63076
- updatedAtTime: str3(n.updatedAtTime)
63657
+ tokenAmount: str4(n.marketTokenAmount),
63658
+ minLongTokenAmount: str4(n.minLongTokenAmount),
63659
+ minShortTokenAmount: str4(n.minShortTokenAmount),
63660
+ executionFee: str4(n.executionFee),
63661
+ updatedAtTime: str4(n.updatedAtTime)
63077
63662
  });
63078
63663
  });
63079
63664
  const glvDeposits = Array.isArray(glvRes[0]) ? glvRes[0] : [];
@@ -63090,11 +63675,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
63090
63675
  glv: a.glv.toLowerCase(),
63091
63676
  initialLongToken: a.initialLongToken.toLowerCase(),
63092
63677
  initialShortToken: a.initialShortToken.toLowerCase(),
63093
- initialLongTokenAmount: str3(n.initialLongTokenAmount),
63094
- initialShortTokenAmount: str3(n.initialShortTokenAmount),
63095
- minOut: str3(n.minGlvTokens),
63096
- executionFee: str3(n.executionFee),
63097
- updatedAtTime: str3(n.updatedAtTime)
63678
+ initialLongTokenAmount: str4(n.initialLongTokenAmount),
63679
+ initialShortTokenAmount: str4(n.initialShortTokenAmount),
63680
+ minOut: str4(n.minGlvTokens),
63681
+ executionFee: str4(n.executionFee),
63682
+ updatedAtTime: str4(n.updatedAtTime)
63098
63683
  });
63099
63684
  }
63100
63685
  for (const w of glvWithdrawals) {
@@ -63107,11 +63692,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
63107
63692
  receiver: a.receiver.toLowerCase(),
63108
63693
  market: a.market.toLowerCase(),
63109
63694
  glv: a.glv.toLowerCase(),
63110
- tokenAmount: str3(n.glvTokenAmount),
63111
- minLongTokenAmount: str3(n.minLongTokenAmount),
63112
- minShortTokenAmount: str3(n.minShortTokenAmount),
63113
- executionFee: str3(n.executionFee),
63114
- updatedAtTime: str3(n.updatedAtTime)
63695
+ tokenAmount: str4(n.glvTokenAmount),
63696
+ minLongTokenAmount: str4(n.minLongTokenAmount),
63697
+ minShortTokenAmount: str4(n.minShortTokenAmount),
63698
+ executionFee: str4(n.executionFee),
63699
+ updatedAtTime: str4(n.updatedAtTime)
63115
63700
  });
63116
63701
  }
63117
63702
  return {
@@ -65353,10 +65938,10 @@ function resolveMinDebt(input) {
65353
65938
  ];
65354
65939
  for (const c of candidates) {
65355
65940
  if (c == null) continue;
65356
- const str5 = String(c);
65357
- if (str5 === "0" || str5 === "") continue;
65358
- if (!/^\d+$/.test(str5)) continue;
65359
- return str5;
65941
+ const str6 = String(c);
65942
+ if (str6 === "0" || str6 === "") continue;
65943
+ if (!/^\d+$/.test(str6)) continue;
65944
+ return str6;
65360
65945
  }
65361
65946
  return void 0;
65362
65947
  }
@@ -65364,9 +65949,9 @@ function resolveMinCollateral(input) {
65364
65949
  const m = input.market ?? {};
65365
65950
  const raw = m.frankencoin?.minimumCollateral;
65366
65951
  if (raw == null) return void 0;
65367
- const str5 = String(raw);
65368
- if (str5 === "0" || str5 === "" || !/^\d+$/.test(str5)) return void 0;
65369
- return str5;
65952
+ const str6 = String(raw);
65953
+ if (str6 === "0" || str6 === "" || !/^\d+$/.test(str6)) return void 0;
65954
+ return str6;
65370
65955
  }
65371
65956
  function capUtil(total, cap) {
65372
65957
  if (!isNum(cap) || cap <= 0 || !isNum(total)) return void 0;
@@ -66821,9 +67406,9 @@ function minLoanInAssetUnits(minLoanUsdWad, priceUsdWad, decimals) {
66821
67406
  if (floor == null || price2 == null || floor === 0n || price2 === 0n) {
66822
67407
  return void 0;
66823
67408
  }
66824
- const dec = typeof decimals === "number" ? decimals : Number(decimals);
66825
- if (!Number.isFinite(dec) || dec < 0 || dec > 36) return void 0;
66826
- const scaled = floor * 10n ** BigInt(dec);
67409
+ const dec2 = typeof decimals === "number" ? decimals : Number(decimals);
67410
+ if (!Number.isFinite(dec2) || dec2 < 0 || dec2 > 36) return void 0;
67411
+ const scaled = floor * 10n ** BigInt(dec2);
66827
67412
  const units = (scaled + price2 - 1n) / price2;
66828
67413
  return units > 0n ? units.toString() : void 0;
66829
67414
  }
@@ -67612,6 +68197,14 @@ function earnLabel(dimension, key3) {
67612
68197
  function earnDescription(dimension, key3) {
67613
68198
  return EARN_DESCRIPTIONS[dimension][key3];
67614
68199
  }
68200
+ function earnMarketLabel(input) {
68201
+ const asset = input.assetSymbol?.trim();
68202
+ if (!asset) return input.fallbackName ?? "";
68203
+ const collaterals = (input.collateralSymbols ?? []).map((c) => c?.trim()).filter((c) => !!c);
68204
+ const distinct = [...new Set(collaterals)];
68205
+ if (distinct.length === 1) return `${asset} \xB7 vs ${distinct[0]}`;
68206
+ return asset;
68207
+ }
67615
68208
 
67616
68209
  // src/earn/normalize.ts
67617
68210
  function num13(v) {
@@ -67619,13 +68212,13 @@ function num13(v) {
67619
68212
  const n = typeof v === "number" ? v : Number(v);
67620
68213
  return Number.isFinite(n) ? n : void 0;
67621
68214
  }
67622
- function str4(v) {
68215
+ function str5(v) {
67623
68216
  if (typeof v === "string") return v.length > 0 ? v : void 0;
67624
68217
  if (typeof v === "number" && Number.isFinite(v)) return String(v);
67625
68218
  return void 0;
67626
68219
  }
67627
68220
  function addr2(v) {
67628
- return str4(v)?.toLowerCase();
68221
+ return str5(v)?.toLowerCase();
67629
68222
  }
67630
68223
  function yieldProfile(v) {
67631
68224
  return v === "yield-bearing" || v === "volatile" ? v : void 0;
@@ -67708,9 +68301,9 @@ var DEFAULT_EXIT_MODE = {
67708
68301
  pendle: "market-sale"
67709
68302
  };
67710
68303
  function earnMarketFromVault(row, chainId, opts = {}) {
67711
- const provider = str4(row.provider);
67712
- const address = str4(row.vaultAddress)?.toLowerCase();
67713
- const underlying = str4(row.underlying)?.toLowerCase();
68304
+ const provider = str5(row.provider);
68305
+ const address = str5(row.vaultAddress)?.toLowerCase();
68306
+ const underlying = str5(row.underlying)?.toLowerCase();
67714
68307
  if (!provider || !address || !underlying) return void 0;
67715
68308
  const meta = row.providerMeta ?? {};
67716
68309
  const info = row.vaultInfo ?? {};
@@ -67738,22 +68331,22 @@ function earnMarketFromVault(row, chainId, opts = {}) {
67738
68331
  venue: vaultVenue(provider),
67739
68332
  venueKind: "vault",
67740
68333
  // Curator first (it names the actual operator), then the provider brand.
67741
- brand: str4(row.curatorName) ?? venueBrand(vaultVenue(provider)),
67742
- name: str4(info.name) ?? str4(row.displayName) ?? str4(row.name),
68334
+ brand: str5(row.curatorName) ?? venueBrand(vaultVenue(provider)),
68335
+ name: str5(info.name) ?? str5(row.displayName) ?? str5(row.name),
67743
68336
  ref: address,
67744
- logoURI: str4(info.logoURI) ?? str4(row.underlyingInfo?.asset?.logoURI),
68337
+ logoURI: str5(info.logoURI) ?? str5(row.underlyingInfo?.asset?.logoURI),
67745
68338
  asset: {
67746
68339
  address: underlying,
67747
- symbol: str4(row.underlyingInfo?.asset?.symbol) ?? "",
68340
+ symbol: str5(row.underlyingInfo?.asset?.symbol) ?? "",
67748
68341
  decimals: assetDecimals,
67749
- assetGroup: str4(info.assetGroup),
68342
+ assetGroup: str5(info.assetGroup),
67750
68343
  priceUsd: num13(row.underlyingInfo?.prices?.priceUsd)
67751
68344
  },
67752
68345
  // The vault IS a share token by construction; carry it so a withdraw in
67753
68346
  // share units can be built without a second lookup.
67754
68347
  shareToken: {
67755
68348
  address,
67756
- symbol: str4(info.symbol) ?? str4(row.symbol) ?? "",
68349
+ symbol: str5(info.symbol) ?? str5(row.symbol) ?? "",
67757
68350
  decimals: shareDecimals
67758
68351
  },
67759
68352
  rate,
@@ -67772,11 +68365,11 @@ function earnMarketFromVault(row, chainId, opts = {}) {
67772
68365
  liq.liquidityUsd,
67773
68366
  assetDecimals
67774
68367
  ) : void 0,
67775
- depositCapacity: str4(meta.depositCapacity) ?? str4(meta.maxDeposit),
68368
+ depositCapacity: str5(meta.depositCapacity) ?? str5(meta.maxDeposit),
67776
68369
  maturity,
67777
68370
  exit: {
67778
- mode: str4(meta.withdrawalMode) ?? DEFAULT_EXIT_MODE[provider] ?? "instant",
67779
- settlement: str4(meta.redemptionType),
68371
+ mode: str5(meta.withdrawalMode) ?? DEFAULT_EXIT_MODE[provider] ?? "instant",
68372
+ settlement: str5(meta.redemptionType),
67780
68373
  cooldownSecs: num13(meta.withdrawalCooldownSeconds),
67781
68374
  feeBps: num13(meta.withdrawFeeBps)
67782
68375
  },
@@ -67807,7 +68400,7 @@ function resolveRateKind(provider, meta) {
67807
68400
  }
67808
68401
  function resolveAvailability(meta, maturity) {
67809
68402
  const isMintable = meta.isMintable;
67810
- const capacity = str4(meta.depositCapacity) ?? str4(meta.maxDeposit);
68403
+ const capacity = str5(meta.depositCapacity) ?? str5(meta.maxDeposit);
67811
68404
  const capFull = capacity === "0";
67812
68405
  let gating;
67813
68406
  let reason;
@@ -67843,13 +68436,13 @@ function resolveMaturity(meta) {
67843
68436
  return {
67844
68437
  kind: "fixed-date",
67845
68438
  maturity: expiry,
67846
- maturityIso: str4(meta.expiryIso) ?? new Date(expiry * 1e3).toISOString(),
68439
+ maturityIso: str5(meta.expiryIso) ?? new Date(expiry * 1e3).toISOString(),
67847
68440
  // A SNAPSHOT — a cached listing ages, so a countdown must be recomputed
67848
68441
  // from `maturity` rather than ticked down from this.
67849
68442
  secondsToMaturity: Math.max(expiry - nowSecs, 0),
67850
68443
  // A PT simply stops earning: it redeems for the underlying at par and
67851
68444
  // sits there. No penalty, no liquidation, no auto-roll.
67852
- atMaturity: str4(meta.atMaturity) ?? "stops-earning"
68445
+ atMaturity: str5(meta.atMaturity) ?? "stops-earning"
67853
68446
  };
67854
68447
  }
67855
68448
  function isMatured(maturity) {
@@ -67888,7 +68481,7 @@ var USER_SET_RATE_PREFIXES = [
67888
68481
  "EBISU"
67889
68482
  ];
67890
68483
  function earnMarketFromPool(row, fallbackChainId) {
67891
- const marketUid = str4(row.marketUid);
68484
+ const marketUid = str5(row.marketUid);
67892
68485
  if (!marketUid) return void 0;
67893
68486
  let earnUid;
67894
68487
  try {
@@ -67896,8 +68489,8 @@ function earnMarketFromPool(row, fallbackChainId) {
67896
68489
  } catch {
67897
68490
  return void 0;
67898
68491
  }
67899
- const chainId = str4(row.chainId) ?? fallbackChainId;
67900
- const venue = str4(row.lender) ?? str4(row.lenderKey);
68492
+ const chainId = str5(row.chainId) ?? fallbackChainId;
68493
+ const venue = str5(row.lender) ?? str5(row.lenderKey);
67901
68494
  if (!chainId || !venue) return void 0;
67902
68495
  const flags = row.flags ?? {};
67903
68496
  const assetInfo = row.underlyingInfo?.asset ?? row.asset ?? {};
@@ -67931,15 +68524,15 @@ function earnMarketFromPool(row, fallbackChainId) {
67931
68524
  // The family brand ('Morpho Blue'), not the per-market key. The specific
67932
68525
  // market identity survives on `name`.
67933
68526
  brand: venueBrand(venue),
67934
- name: str4(row.name),
68527
+ name: str5(row.name),
67935
68528
  // Never re-derived — the uid's third segment as the origin minted it.
67936
68529
  ref: marketUid.split(":")[2],
67937
- logoURI: str4(assetInfo.logoURI),
68530
+ logoURI: str5(assetInfo.logoURI),
67938
68531
  asset: {
67939
68532
  address: underlying,
67940
- symbol: str4(assetInfo.symbol) ?? "",
68533
+ symbol: str5(assetInfo.symbol) ?? "",
67941
68534
  decimals,
67942
- assetGroup: str4(row.underlyingInfo?.assetGroup) ?? str4(row.asset?.assetGroup),
68535
+ assetGroup: str5(row.underlyingInfo?.assetGroup) ?? str5(row.asset?.assetGroup),
67943
68536
  priceUsd
67944
68537
  },
67945
68538
  // A lending supply position is an aToken/cToken/eToken balance, but the
@@ -68156,6 +68749,6 @@ function supportsCancel(provider, meta) {
68156
68749
  return typeof meta.withdrawQueue === "string" && meta.withdrawQueue.length > 0;
68157
68750
  }
68158
68751
 
68159
- 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, 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, 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, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultEarnUid, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, clearPendleMarketsCache, 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, convertDssMarketsToResponse, 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, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnUidFromMarketUid, earnVenueKind, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchDssMarkets, 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, fetchPendleApiAssets, fetchPendleApiMarkets, fetchPendlePrices, fetchPendlePtMarkets, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, formatRaw, 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, hasPendleMarkets, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, inverseKeyParts, inverseLenderKey, isFailedCall, isLiveMarket as isLivePendleMarket, isStablecoinSymbol, 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, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, 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, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultVenue, venueBrand };
68752
+ 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, 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, 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, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultEarnUid, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, clearPendleMarketsCache, 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, 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, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnMarketLabel, earnUidFromMarketUid, earnVenueKind, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, 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, 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, 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, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, inverseKeyParts, inverseLenderKey, isFailedCall, isLiveMarket as isLivePendleMarket, isStablecoinSymbol, 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, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, 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, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultVenue, venueBrand };
68160
68753
  //# sourceMappingURL=index.js.map
68161
68754
  //# sourceMappingURL=index.js.map