@1delta/margin-fetcher 0.0.404 → 0.0.406

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,12 +1,12 @@
1
- import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, pad, InvalidAddressError, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-Z3MGRQJR.js';
1
+ import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, InvalidAddressError, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-SRWUFRRR.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isInverse, isTermMax, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { 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, tellerConfigByChain, tellerPoolsByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, 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, tellerConfigByChain, tellerPoolsByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxConfigByChain, termMaxLenderKey, inverseConfigFor, inverseChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
8
  import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
9
- import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, GearboxCreditAccountCompressorV310Abi, TermPriceConsumerAbi } from '@1delta/abis';
9
+ import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
10
10
  export { MorphoLensAbi } from '@1delta/abis';
11
11
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
12
12
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
@@ -7516,6 +7516,9 @@ var getLendersForChain = (c) => {
7516
7516
  for (const l of riverLendersByChain(c)) {
7517
7517
  lenders.push(l);
7518
7518
  }
7519
+ for (const l of inverseLendersByChain(c)) {
7520
+ lenders.push(l);
7521
+ }
7519
7522
  if (tellerConfigByChain(c)?.tellerV2 && tellerPoolsByChain(c).length > 0) {
7520
7523
  lenders.push(Lender.TELLER);
7521
7524
  }
@@ -8002,6 +8005,37 @@ function encode(type, value, isArray2 = false) {
8002
8005
  throw new UnsupportedPackedAbiType(type);
8003
8006
  }
8004
8007
 
8008
+ // ../../node_modules/.pnpm/viem@2.45.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@6.0.6_zod@4.3.6/node_modules/viem/_esm/utils/data/isBytes.js
8009
+ function isBytes(value) {
8010
+ if (!value)
8011
+ return false;
8012
+ if (typeof value !== "object")
8013
+ return false;
8014
+ if (!("BYTES_PER_ELEMENT" in value))
8015
+ return false;
8016
+ return value.BYTES_PER_ELEMENT === 1 && value.constructor.name === "Uint8Array";
8017
+ }
8018
+
8019
+ // ../../node_modules/.pnpm/viem@2.45.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@6.0.6_zod@4.3.6/node_modules/viem/_esm/utils/address/getContractAddress.js
8020
+ function getContractAddress(opts) {
8021
+ return getCreate2Address(opts);
8022
+ }
8023
+ function getCreate2Address(opts) {
8024
+ const from = toBytes(getAddress(opts.from));
8025
+ const salt = pad(isBytes(opts.salt) ? opts.salt : toBytes(opts.salt), {
8026
+ size: 32
8027
+ });
8028
+ const bytecodeHash = (() => {
8029
+ if ("bytecodeHash" in opts) {
8030
+ if (isBytes(opts.bytecodeHash))
8031
+ return opts.bytecodeHash;
8032
+ return toBytes(opts.bytecodeHash);
8033
+ }
8034
+ return keccak256(opts.bytecode, "bytes");
8035
+ })();
8036
+ return getAddress(slice(keccak256(concat([toBytes("0xff"), from, salt, bytecodeHash])), 12));
8037
+ }
8038
+
8005
8039
  // ../../node_modules/.pnpm/viem@2.45.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@6.0.6_zod@4.3.6/node_modules/viem/_esm/constants/bytes.js
8006
8040
  var zeroHash = "0x0000000000000000000000000000000000000000000000000000000000000000";
8007
8041
 
@@ -11112,8 +11146,8 @@ async function resolveListaBrokers(chainId, marketKeys, getClient = getEvmClient
11112
11146
  });
11113
11147
  results.forEach((r, i) => {
11114
11148
  const id = missing[i];
11115
- const addr = r.status === "success" && r.result ? r.result : zeroAddress;
11116
- cache[id] = addr.toLowerCase();
11149
+ const addr2 = r.status === "success" && r.result ? r.result : zeroAddress;
11150
+ cache[id] = addr2.toLowerCase();
11117
11151
  });
11118
11152
  } catch {
11119
11153
  }
@@ -11161,15 +11195,15 @@ async function fetchListaFixedTerms(chainId, marketKeys) {
11161
11195
  }
11162
11196
  return out;
11163
11197
  }
11164
- function getCachedListaFixedTerms(chainId, marketKey) {
11165
- return FIXED_TERMS_CACHE[chainId]?.[toBytes32MarketId(marketKey)];
11198
+ function getCachedListaFixedTerms(chainId, marketKey2) {
11199
+ return FIXED_TERMS_CACHE[chainId]?.[toBytes32MarketId(marketKey2)];
11166
11200
  }
11167
11201
  async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs = Math.floor(Date.now() / 1e3), getClient = getEvmClient) {
11168
11202
  const brokers = await resolveListaBrokers(chainId, marketKeys, getClient);
11169
11203
  const ids = Object.keys(brokers);
11170
11204
  const out = {};
11171
- const cacheKey4 = `${chainId}:${account.toLowerCase()}`;
11172
- BROKER_USER_CACHE[cacheKey4] = out;
11205
+ const cacheKey5 = `${chainId}:${account.toLowerCase()}`;
11206
+ BROKER_USER_CACHE[cacheKey5] = out;
11173
11207
  if (ids.length === 0) return out;
11174
11208
  try {
11175
11209
  const client = getClient(chainId);
@@ -11272,8 +11306,8 @@ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs =
11272
11306
  }
11273
11307
  return out;
11274
11308
  }
11275
- function getCachedListaBrokerUserData(chainId, account, marketKey) {
11276
- return BROKER_USER_CACHE[`${chainId}:${account.toLowerCase()}`]?.[toBytes32MarketId(marketKey)];
11309
+ function getCachedListaBrokerUserData(chainId, account, marketKey2) {
11310
+ return BROKER_USER_CACHE[`${chainId}:${account.toLowerCase()}`]?.[toBytes32MarketId(marketKey2)];
11277
11311
  }
11278
11312
  var { chunk } = lodash;
11279
11313
  var MORPHO_LENS = {
@@ -12530,12 +12564,12 @@ function rateToApy(rate) {
12530
12564
  );
12531
12565
  }
12532
12566
  function parseLtv(ltv) {
12533
- let str2 = 0;
12567
+ let str3 = 0;
12534
12568
  try {
12535
- str2 = Number(formatUnits(BigInt(ltv), 18));
12569
+ str3 = Number(formatUnits(BigInt(ltv), 18));
12536
12570
  } catch (e) {
12537
12571
  }
12538
- return str2;
12572
+ return str3;
12539
12573
  }
12540
12574
  function liquidationPenaltyFromLltv(lltv) {
12541
12575
  if (!lltv || lltv <= 0) return 0;
@@ -18424,13 +18458,13 @@ function findVaultInfo(normalizedAddr, vaultData) {
18424
18458
  function buildAdjacencyList(vaultData) {
18425
18459
  const adj = /* @__PURE__ */ new Map();
18426
18460
  const knownVaults = /* @__PURE__ */ new Set();
18427
- for (const addr of vaultData.keys()) {
18428
- const norm = addr.toLowerCase();
18461
+ for (const addr2 of vaultData.keys()) {
18462
+ const norm = addr2.toLowerCase();
18429
18463
  knownVaults.add(norm);
18430
18464
  adj.set(norm, /* @__PURE__ */ new Set());
18431
18465
  }
18432
- for (const [addr, info] of vaultData) {
18433
- const from = addr.toLowerCase();
18466
+ for (const [addr2, info] of vaultData) {
18467
+ const from = addr2.toLowerCase();
18434
18468
  const activeCollaterals = getActiveCollaterals(info.collateralLTVInfo);
18435
18469
  for (const to of activeCollaterals) {
18436
18470
  if (knownVaults.has(to) && from !== to) {
@@ -18473,8 +18507,8 @@ function findConnectedComponents(adj) {
18473
18507
  function deriveGovernor(vaultAddresses, vaultData) {
18474
18508
  const counts = /* @__PURE__ */ new Map();
18475
18509
  const zeroNorm = zeroAddress;
18476
- for (const addr of vaultAddresses) {
18477
- const info = findVaultInfo(addr, vaultData);
18510
+ for (const addr2 of vaultAddresses) {
18511
+ const info = findVaultInfo(addr2, vaultData);
18478
18512
  if (!info) continue;
18479
18513
  const gov = info.governorAdmin?.toLowerCase();
18480
18514
  if (!gov || gov === zeroNorm) continue;
@@ -18499,8 +18533,8 @@ function deriveClusters(vaultData, includeSingletons = false) {
18499
18533
  if (!includeSingletons && component.length < 2) continue;
18500
18534
  if (!includeSingletons) {
18501
18535
  let hasActiveEdge = false;
18502
- for (const addr of component) {
18503
- const neighbors = adj.get(addr);
18536
+ for (const addr2 of component) {
18537
+ const neighbors = adj.get(addr2);
18504
18538
  if (neighbors && neighbors.size > 0) {
18505
18539
  hasActiveEdge = true;
18506
18540
  break;
@@ -18509,9 +18543,9 @@ function deriveClusters(vaultData, includeSingletons = false) {
18509
18543
  if (!hasActiveEdge) continue;
18510
18544
  }
18511
18545
  const clusterVaultData = /* @__PURE__ */ new Map();
18512
- for (const addr of component) {
18513
- const info = findVaultInfo(addr, vaultData);
18514
- if (info) clusterVaultData.set(addr, info);
18546
+ for (const addr2 of component) {
18547
+ const info = findVaultInfo(addr2, vaultData);
18548
+ if (info) clusterVaultData.set(addr2, info);
18515
18549
  }
18516
18550
  clusters.push({
18517
18551
  governor: deriveGovernor(component, vaultData),
@@ -18536,21 +18570,21 @@ function toTokenAmount(raw, decimals) {
18536
18570
  }
18537
18571
  function identifyBorrowVaults(cluster) {
18538
18572
  const borrowVaults = /* @__PURE__ */ new Set();
18539
- for (const [addr, info] of cluster.vaultData) {
18573
+ for (const [addr2, info] of cluster.vaultData) {
18540
18574
  const hasIRM = info.interestRateModel && info.interestRateModel.toLowerCase() !== zeroAddress;
18541
18575
  const hasActiveCollateral = (info.collateralLTVInfo ?? []).some(
18542
18576
  (ltv) => ltv.borrowLTV > 0n
18543
18577
  );
18544
18578
  if (hasIRM && hasActiveCollateral) {
18545
- borrowVaults.add(addr.toLowerCase());
18579
+ borrowVaults.add(addr2.toLowerCase());
18546
18580
  }
18547
18581
  }
18548
18582
  return borrowVaults;
18549
18583
  }
18550
18584
  function buildReverseLTVIndex(cluster) {
18551
18585
  const index = /* @__PURE__ */ new Map();
18552
- for (const [addr, info] of cluster.vaultData) {
18553
- const borrowVault = addr.toLowerCase();
18586
+ for (const [addr2, info] of cluster.vaultData) {
18587
+ const borrowVault = addr2.toLowerCase();
18554
18588
  for (const ltv of info.collateralLTVInfo ?? []) {
18555
18589
  if (ltv.borrowLTV <= 0n) continue;
18556
18590
  const collateral = ltv.collateral.toLowerCase();
@@ -18601,8 +18635,8 @@ function buildTokenConfig(vaultAddr, reverseLTV, borrowVaults, vaultData) {
18601
18635
  }
18602
18636
  function buildEModes(borrowVaults, cluster) {
18603
18637
  const eModes = {};
18604
- for (const addr of borrowVaults) {
18605
- const info = findInfo(addr, cluster.vaultData);
18638
+ for (const addr2 of borrowVaults) {
18639
+ const info = findInfo(addr2, cluster.vaultData);
18606
18640
  if (!info) continue;
18607
18641
  const activeLTVs = info.collateralLTVInfo.filter((l) => l.borrowLTV > 0n);
18608
18642
  const avgBorrowLTV = activeLTVs.length > 0 ? activeLTVs.reduce((sum, l) => sum + ltvToNumber(l.borrowLTV), 0) / activeLTVs.length : 0;
@@ -18610,8 +18644,8 @@ function buildEModes(borrowVaults, cluster) {
18610
18644
  (sum, l) => sum + ltvToNumber(l.liquidationLTV),
18611
18645
  0
18612
18646
  ) / activeLTVs.length : 0;
18613
- eModes[addr] = {
18614
- category: addr,
18647
+ eModes[addr2] = {
18648
+ category: addr2,
18615
18649
  label: `${info.assetSymbol} Borrow (${info.vaultSymbol})`,
18616
18650
  borrowCollateralFactor: avgBorrowLTV,
18617
18651
  collateralFactor: avgLiqLTV,
@@ -18633,11 +18667,11 @@ function buildMetadata(info) {
18633
18667
  }
18634
18668
  function buildTokenEntry(info, config, collateralActive, borrowVaults, opts) {
18635
18669
  if (!info.asset) return void 0;
18636
- const addr = info.asset.toLowerCase();
18637
- const tokenMeta = opts.tokenList?.[addr];
18670
+ const addr2 = info.asset.toLowerCase();
18671
+ const tokenMeta = opts.tokenList?.[addr2];
18638
18672
  const asset = {
18639
18673
  chainId: opts.chainId,
18640
- address: addr,
18674
+ address: addr2,
18641
18675
  name: tokenMeta?.name ?? info.assetName,
18642
18676
  symbol: tokenMeta?.symbol ?? info.assetSymbol,
18643
18677
  decimals: tokenMeta?.decimals ?? Number(info.assetDecimals)
@@ -18698,9 +18732,9 @@ function buildTokenEntry(info, config, collateralActive, borrowVaults, opts) {
18698
18732
  params: { metadata: buildMetadata(info) }
18699
18733
  };
18700
18734
  }
18701
- function findInfo(addr, vaultData) {
18735
+ function findInfo(addr2, vaultData) {
18702
18736
  for (const [key, value] of vaultData) {
18703
- if (key.toLowerCase() === addr) return value;
18737
+ if (key.toLowerCase() === addr2) return value;
18704
18738
  }
18705
18739
  return void 0;
18706
18740
  }
@@ -18715,8 +18749,8 @@ function normalizeCluster(cluster, opts) {
18715
18749
  }
18716
18750
  const eModes = buildEModes(borrowVaults, cluster);
18717
18751
  const data = {};
18718
- for (const [addr, info] of cluster.vaultData) {
18719
- const norm = addr.toLowerCase();
18752
+ for (const [addr2, info] of cluster.vaultData) {
18753
+ const norm = addr2.toLowerCase();
18720
18754
  const config = buildTokenConfig(
18721
18755
  norm,
18722
18756
  reverseLTV,
@@ -18861,8 +18895,8 @@ var getEulerV2ReservesDataConverter = (lender, chainId, prices, additionalYields
18861
18895
  var BASE_CALLS_PER_RESERVE = 5;
18862
18896
  var CALLS_PER_SPOKE_TAIL = 1;
18863
18897
  var MAX_HUB_ASSETS = 25;
18864
- function isValidAddress(addr) {
18865
- return !!addr && addr !== "0x" && addr.length > 2;
18898
+ function isValidAddress(addr2) {
18899
+ return !!addr2 && addr2 !== "0x" && addr2.length > 2;
18866
18900
  }
18867
18901
  function getDynamicConfigCount(spokeEntry) {
18868
18902
  const max = spokeEntry?.dynamicConfigKeyMax ?? 0;
@@ -19206,8 +19240,8 @@ function normalizeAaveV4(spokeDataList, chainId, spokeLenderKeyArg, prices, addi
19206
19240
  }
19207
19241
 
19208
19242
  // src/lending/public-data/aave-v4-type/publicCallParse.ts
19209
- function isValidAddress2(addr) {
19210
- return !!addr && addr !== "0x" && addr.length > 2;
19243
+ function isValidAddress2(addr2) {
19244
+ return !!addr2 && addr2 !== "0x" && addr2.length > 2;
19211
19245
  }
19212
19246
  var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
19213
19247
  const expectedCalls = getAaveV4ExpectedCallCount(chainId, lender);
@@ -19656,7 +19690,7 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
19656
19690
  { self: market.silo0, other: market.silo1 },
19657
19691
  { self: market.silo1, other: market.silo0 }
19658
19692
  ];
19659
- const toBigInt16 = (v) => {
19693
+ const toBigInt17 = (v) => {
19660
19694
  if (v === void 0 || v === null || v === "0x") return 0n;
19661
19695
  if (typeof v === "bigint") return v;
19662
19696
  try {
@@ -19668,8 +19702,8 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
19668
19702
  for (let s = 0; s < 2; s++) {
19669
19703
  const { self, other } = sides[s];
19670
19704
  const slot = s * SILO_V2_CALLS_PER_SIDE;
19671
- const totalAssetsRaw = toBigInt16(data[slot]);
19672
- const debtAssetsRaw = toBigInt16(data[slot + 1]);
19705
+ const totalAssetsRaw = toBigInt17(data[slot]);
19706
+ const debtAssetsRaw = toBigInt17(data[slot + 1]);
19673
19707
  const irmConfigRaw = data[slot + 2];
19674
19708
  const decimals = self.decimals;
19675
19709
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -19824,7 +19858,7 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
19824
19858
  { self: market.silo0, other: market.silo1 },
19825
19859
  { self: market.silo1, other: market.silo0 }
19826
19860
  ];
19827
- const toBigInt16 = (v) => {
19861
+ const toBigInt17 = (v) => {
19828
19862
  if (v === void 0 || v === null || v === "0x") return 0n;
19829
19863
  if (typeof v === "bigint") return v;
19830
19864
  try {
@@ -19836,8 +19870,8 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
19836
19870
  for (let s = 0; s < 2; s++) {
19837
19871
  const { self, other } = sides[s];
19838
19872
  const slot = s * SILO_V3_CALLS_PER_SIDE;
19839
- const totalAssetsRaw = toBigInt16(data[slot]);
19840
- const debtAssetsRaw = toBigInt16(data[slot + 1]);
19873
+ const totalAssetsRaw = toBigInt17(data[slot]);
19874
+ const debtAssetsRaw = toBigInt17(data[slot + 1]);
19841
19875
  const irmConfigRaw = data[slot + 2];
19842
19876
  const decimals = self.decimals;
19843
19877
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -19962,7 +19996,7 @@ var buildFluidCall = (chainId, _lender) => {
19962
19996
 
19963
19997
  // src/lending/public-data/fluid/publicCallParse.ts
19964
19998
  var FLUID_EEE_LOWER = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
19965
- var normalizeUnderlying = (addr) => addr === FLUID_EEE_LOWER ? zeroAddress : addr;
19999
+ var normalizeUnderlying = (addr2) => addr2 === FLUID_EEE_LOWER ? zeroAddress : addr2;
19966
20000
  var FLUID_RATE_SCALE = 100;
19967
20001
  var scaleFluidRate = (raw) => {
19968
20002
  if (raw === void 0 || raw === null) return 0;
@@ -20465,9 +20499,9 @@ var getGearboxV3PublicDataConverter = (_lender, chainId, prices, additionalYield
20465
20499
  const underlyingPrice = prices[underlyingPriceKey] ?? 0;
20466
20500
  const debtByCm = {};
20467
20501
  for (const dp of pool.creditManagerDebtParams ?? []) {
20468
- const addr = (dp?.creditManager ?? "").toString().toLowerCase();
20469
- if (!addr) continue;
20470
- debtByCm[addr] = {
20502
+ const addr2 = (dp?.creditManager ?? "").toString().toLowerCase();
20503
+ if (!addr2) continue;
20504
+ debtByCm[addr2] = {
20471
20505
  borrowed: BigInt(dp.borrowed ?? 0),
20472
20506
  limit: BigInt(dp.limit ?? 0),
20473
20507
  available: BigInt(dp.available ?? 0)
@@ -21091,7 +21125,7 @@ function createMidnightBookSource(chainId, fetchImpl = fetch) {
21091
21125
  var MIDNIGHT_BOOK_LEVELS = 20;
21092
21126
  var LKG_TTL_SEC = 30 * 60;
21093
21127
  var lastGood = /* @__PURE__ */ new Map();
21094
- async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec7) {
21128
+ async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec9) {
21095
21129
  const key = `${chainId}:${marketId}`;
21096
21130
  let fresh = null;
21097
21131
  if (source.getTopAndBook) {
@@ -21101,11 +21135,11 @@ async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec7) {
21101
21135
  if (top) fresh = { top, book: { bids: [], asks: [] } };
21102
21136
  }
21103
21137
  if (fresh) {
21104
- lastGood.set(key, { top: fresh.top, book: fresh.book, at: nowSec7 });
21138
+ lastGood.set(key, { top: fresh.top, book: fresh.book, at: nowSec9 });
21105
21139
  return { top: fresh.top, book: fresh.book };
21106
21140
  }
21107
21141
  const cached = lastGood.get(key);
21108
- if (cached && nowSec7 - cached.at <= LKG_TTL_SEC) {
21142
+ if (cached && nowSec9 - cached.at <= LKG_TTL_SEC) {
21109
21143
  return { top: cached.top, book: cached.book };
21110
21144
  }
21111
21145
  return { top: null, book: null };
@@ -21113,17 +21147,17 @@ async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec7) {
21113
21147
  async function fetchMidnightMarkets(chainId, source = createMidnightBookSource(chainId)) {
21114
21148
  const markets = midnightMarketsByChain(chainId);
21115
21149
  if (markets.length === 0) return [];
21116
- const nowSec7 = Math.floor(Date.now() / 1e3);
21150
+ const nowSec9 = Math.floor(Date.now() / 1e3);
21117
21151
  return Promise.all(
21118
21152
  markets.map(async (config) => {
21119
- if (Number(config.maturity) <= nowSec7) {
21153
+ if (Number(config.maturity) <= nowSec9) {
21120
21154
  return { config, top: null, book: null };
21121
21155
  }
21122
21156
  const { top, book } = await fetchTopAndBookWithFallback(
21123
21157
  source,
21124
21158
  chainId,
21125
21159
  config.marketId,
21126
- nowSec7
21160
+ nowSec9
21127
21161
  );
21128
21162
  return { config, top, book };
21129
21163
  })
@@ -21230,9 +21264,9 @@ function midnightLenderKey(marketId) {
21230
21264
  return "MORPHO_MIDNIGHT_" + marketId.slice(2).toUpperCase();
21231
21265
  }
21232
21266
  function currencyFor(address, decimals, tokens) {
21233
- const lower = address.toLowerCase();
21234
- return tokens[lower] ?? {
21235
- address: lower,
21267
+ const lower3 = address.toLowerCase();
21268
+ return tokens[lower3] ?? {
21269
+ address: lower3,
21236
21270
  symbol: "",
21237
21271
  name: "",
21238
21272
  decimals
@@ -21470,7 +21504,7 @@ var toBig3 = (v) => {
21470
21504
  return 0n;
21471
21505
  }
21472
21506
  };
21473
- function pickAuction(rows, nowSec7 = Math.floor(Date.now() / 1e3)) {
21507
+ function pickAuction(rows, nowSec9 = Math.floor(Date.now() / 1e3)) {
21474
21508
  if (!Array.isArray(rows) || rows.length === 0) return null;
21475
21509
  const live = rows.filter((a) => a && !a.delisted && !a.nonViableAuction).map((a) => ({
21476
21510
  id: String(a.id ?? ""),
@@ -21481,7 +21515,7 @@ function pickAuction(rows, nowSec7 = Math.floor(Date.now() / 1e3)) {
21481
21515
  minOfferAmount: String(a.auctionMinOfferAmount ?? "0"),
21482
21516
  maxBidPriceWad: String(a.auctionMaxBidPrice ?? "0"),
21483
21517
  maxOfferPriceWad: String(a.auctionMaxOfferPrice ?? "0")
21484
- })).filter((a) => a.endTime > nowSec7).sort((a, b) => a.endTime - b.endTime);
21518
+ })).filter((a) => a.endTime > nowSec9).sort((a, b) => a.endTime - b.endTime);
21485
21519
  return live[0] ?? null;
21486
21520
  }
21487
21521
  var TermSubgraphSource = class {
@@ -21704,7 +21738,7 @@ function createTermBookSource(chainId, fetchImpl = fetch) {
21704
21738
  var TERM_BOOK_LEVELS = 20;
21705
21739
  var LKG_TTL_SEC2 = 30 * 60;
21706
21740
  var lastGood2 = /* @__PURE__ */ new Map();
21707
- async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec7) {
21741
+ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
21708
21742
  const key = `${chainId}:${config.termRepoId}`;
21709
21743
  let fresh = null;
21710
21744
  if (source.getTopAndBook) {
@@ -21718,13 +21752,13 @@ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec7) {
21718
21752
  top: fresh.top,
21719
21753
  book: fresh.book,
21720
21754
  auction: fresh.auction ?? null,
21721
- at: nowSec7
21755
+ at: nowSec9
21722
21756
  });
21723
21757
  return { top: fresh.top, book: fresh.book, auction: fresh.auction ?? null };
21724
21758
  }
21725
21759
  const cached = lastGood2.get(key);
21726
- if (cached && nowSec7 - cached.at <= LKG_TTL_SEC2) {
21727
- const stillOpen = cached.auction && cached.auction.endTime > nowSec7 ? cached.auction : null;
21760
+ if (cached && nowSec9 - cached.at <= LKG_TTL_SEC2) {
21761
+ const stillOpen = cached.auction && cached.auction.endTime > nowSec9 ? cached.auction : null;
21728
21762
  return { top: cached.top, book: cached.book, auction: stillOpen };
21729
21763
  }
21730
21764
  return { top: null, book: null, auction: null };
@@ -21732,17 +21766,17 @@ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec7) {
21732
21766
  async function fetchTermMarkets(chainId, source = createTermBookSource(chainId)) {
21733
21767
  const markets = termMarketsByChain(chainId);
21734
21768
  if (markets.length === 0) return [];
21735
- const nowSec7 = Math.floor(Date.now() / 1e3);
21769
+ const nowSec9 = Math.floor(Date.now() / 1e3);
21736
21770
  return Promise.all(
21737
21771
  markets.map(async (config) => {
21738
- if (Number(config.maturity) <= nowSec7) {
21772
+ if (Number(config.maturity) <= nowSec9) {
21739
21773
  return { config, top: null, book: null, auction: null };
21740
21774
  }
21741
21775
  const { top, book, auction } = await fetchTopAndBookWithFallback2(
21742
21776
  source,
21743
21777
  chainId,
21744
21778
  config,
21745
- nowSec7
21779
+ nowSec9
21746
21780
  );
21747
21781
  return { config, top, book, auction };
21748
21782
  })
@@ -21849,8 +21883,8 @@ function toFixedTermAuction(auction, now, matured = false) {
21849
21883
  };
21850
21884
  }
21851
21885
  function currencyFor2(address, decimals, tokens) {
21852
- const lower = address.toLowerCase();
21853
- return tokens[lower] ?? { address: lower, symbol: "", name: "", decimals };
21886
+ const lower3 = address.toLowerCase();
21887
+ return tokens[lower3] ?? { address: lower3, symbol: "", name: "", decimals };
21854
21888
  }
21855
21889
  function convertTermMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
21856
21890
  intrinsicYields: {},
@@ -22100,8 +22134,8 @@ function toHuman(raw, decimals) {
22100
22134
  return Number(raw) / 10 ** decimals;
22101
22135
  }
22102
22136
  function currencyFor3(address, decimals, symbol, tokens) {
22103
- const lower = address.toLowerCase();
22104
- return tokens[lower] ?? { address: lower, symbol, name: symbol, decimals };
22137
+ const lower3 = address.toLowerCase();
22138
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
22105
22139
  }
22106
22140
  function convertExactlyMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
22107
22141
  intrinsicYields: {},
@@ -22371,8 +22405,8 @@ function toHuman2(raw, decimals) {
22371
22405
  return Number(raw) / 10 ** decimals;
22372
22406
  }
22373
22407
  function currencyFor4(address, decimals, symbol, tokens) {
22374
- const lower = address.toLowerCase();
22375
- return tokens[lower] ?? { address: lower, symbol, name: symbol, decimals };
22408
+ const lower3 = address.toLowerCase();
22409
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
22376
22410
  }
22377
22411
  function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
22378
22412
  intrinsicYields: {},
@@ -22648,8 +22682,8 @@ function toHuman3(raw, decimals) {
22648
22682
  return Number(raw) / 10 ** decimals;
22649
22683
  }
22650
22684
  function currencyFor5(address, decimals, symbol, tokens) {
22651
- const lower = address.toLowerCase();
22652
- return tokens[lower] ?? { address: lower, symbol, name: symbol, decimals };
22685
+ const lower3 = address.toLowerCase();
22686
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
22653
22687
  }
22654
22688
  function convertRiverMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
22655
22689
  intrinsicYields: {},
@@ -22878,7 +22912,7 @@ async function fetchTellerMarkets(chainId) {
22878
22912
  } catch {
22879
22913
  return { chainId, pools: [] };
22880
22914
  }
22881
- const big4 = (i) => {
22915
+ const big7 = (i) => {
22882
22916
  const r = results[i];
22883
22917
  if (typeof r === "bigint") return r;
22884
22918
  if (typeof r === "number") return BigInt(r);
@@ -22891,21 +22925,21 @@ async function fetchTellerMarkets(chainId) {
22891
22925
  }
22892
22926
  return null;
22893
22927
  };
22894
- const num6 = (i) => {
22895
- const b = big4(i);
22928
+ const num9 = (i) => {
22929
+ const b = big7(i);
22896
22930
  return b === null ? null : Number(b);
22897
22931
  };
22898
22932
  const pool0 = pools.map((config, i) => {
22899
22933
  const base = i * READS_PER_POOL;
22900
22934
  return {
22901
22935
  config,
22902
- available: big4(base),
22903
- committed: big4(base + 1),
22904
- minRateBps: num6(base + 2),
22905
- collateralPerPrincipal: big4(base + 3),
22906
- maxLoanDuration: num6(base + 4),
22907
- marketId: big4(base + 5),
22908
- totalAssets: big4(base + 6)
22936
+ available: big7(base),
22937
+ committed: big7(base + 1),
22938
+ minRateBps: num9(base + 2),
22939
+ collateralPerPrincipal: big7(base + 3),
22940
+ maxLoanDuration: num9(base + 4),
22941
+ marketId: big7(base + 5),
22942
+ totalAssets: big7(base + 6)
22909
22943
  };
22910
22944
  });
22911
22945
  const attByMarket = /* @__PURE__ */ new Map();
@@ -22976,6 +23010,244 @@ async function fetchTellerMarkets(chainId) {
22976
23010
  });
22977
23011
  return { chainId, pools: out };
22978
23012
  }
23013
+ var DEFAULT_TERMMAX_API = "https://api.termmax.ts.finance";
23014
+ var warn3 = (...args) => {
23015
+ };
23016
+ function termMaxApiBase(chainId) {
23017
+ return termMaxApiBaseUrl(chainId) || DEFAULT_TERMMAX_API;
23018
+ }
23019
+ var toBig4 = (v) => {
23020
+ try {
23021
+ if (v == null) return 0n;
23022
+ if (typeof v === "bigint") return v;
23023
+ if (typeof v === "number") return BigInt(Math.trunc(v));
23024
+ const s = String(v).trim();
23025
+ if (s === "") return 0n;
23026
+ return BigInt(s.includes(".") ? s.slice(0, s.indexOf(".")) : s);
23027
+ } catch {
23028
+ return 0n;
23029
+ }
23030
+ };
23031
+ var toNum2 = (v) => {
23032
+ const n = Number(v);
23033
+ return Number.isFinite(n) ? n : 0;
23034
+ };
23035
+ var lower = (v) => String(v ?? "").toLowerCase();
23036
+ function parseCuts(raw) {
23037
+ if (!Array.isArray(raw)) return [];
23038
+ return raw.map((c) => ({
23039
+ xtReserve: toBig4(c?.xtReserve),
23040
+ liqSquare: toBig4(c?.liqSquare),
23041
+ offset: toBig4(c?.offset)
23042
+ }));
23043
+ }
23044
+ function parseFeeConfig(raw) {
23045
+ if (!raw) return void 0;
23046
+ return {
23047
+ lendTakerFeeRatio: toBig4(raw.lendTakerFeeRatio),
23048
+ lendMakerFeeRatio: toBig4(raw.lendMakerFeeRatio),
23049
+ borrowTakerFeeRatio: toBig4(raw.borrowTakerFeeRatio),
23050
+ borrowMakerFeeRatio: toBig4(raw.borrowMakerFeeRatio),
23051
+ mintGtFeeRatio: toBig4(raw.mintGtFeeRatio),
23052
+ mintGtFeeRef: toBig4(raw.mintGtFeeRef)
23053
+ };
23054
+ }
23055
+ function toUnix(iso) {
23056
+ if (typeof iso === "number") return Math.trunc(iso);
23057
+ const t = Date.parse(String(iso ?? ""));
23058
+ return Number.isFinite(t) ? Math.floor(t / 1e3) : 0;
23059
+ }
23060
+ function parseMarket(raw, assetDecimals) {
23061
+ const c = raw?.contracts;
23062
+ if (!c?.marketAddr || !c?.underlyingAddr || !c?.collateralAddr) return null;
23063
+ const debtToken = lower(c.underlyingAddr);
23064
+ const collateral = lower(c.collateralAddr);
23065
+ return {
23066
+ market: lower(c.marketAddr),
23067
+ ft: lower(c.ftAddr),
23068
+ xt: lower(c.xtAddr),
23069
+ gt: lower(c.gtAddr),
23070
+ debtToken,
23071
+ // A missing entry means the payload changed shape — fall back to 18 so the
23072
+ // row still renders, but flag it so it is visible rather than silent.
23073
+ debtDecimals: assetDecimals.get(debtToken) ?? 18,
23074
+ debtDecimalsResolved: assetDecimals.has(debtToken),
23075
+ collateral,
23076
+ collateralDecimals: assetDecimals.get(collateral) ?? 18,
23077
+ collateralDecimalsResolved: assetDecimals.has(collateral),
23078
+ symbol: raw.symbol,
23079
+ maturity: toUnix(raw.maturity),
23080
+ maxLtv: String(raw.maxLtv ?? "0"),
23081
+ liquidationLtv: String(raw.liquidationLtv ?? "0"),
23082
+ liquidatable: raw.liquidatable !== false,
23083
+ liquidationWindowSeconds: toNum2(raw.liquidationWindowSeconds) || void 0,
23084
+ version: raw.version,
23085
+ feeConfig: parseFeeConfig(raw.defaultFeeConfig),
23086
+ isMatured: raw.isMatured === true,
23087
+ isEnabled: raw.isEnabled !== false
23088
+ };
23089
+ }
23090
+ function parseOrder(raw) {
23091
+ const oc = raw?.orderConfig?.contracts ?? raw?.orderInfo;
23092
+ const orderAddress = lower(oc?.orderAddr ?? raw?.orderInfo?.orderAddress);
23093
+ const marketAddress = lower(oc?.marketAddr ?? raw?.orderInfo?.marketAddress);
23094
+ if (!orderAddress || !marketAddress) return null;
23095
+ const state = raw?.orderInfo?.contractState ?? raw?.contractState ?? {};
23096
+ const meta = raw?.metadata ?? {};
23097
+ const term = raw?.priceInfo?.term ?? {};
23098
+ return {
23099
+ orderAddress,
23100
+ marketAddress,
23101
+ makerAddress: raw?.orderConfig?.makerAddress ? lower(raw.orderConfig.makerAddress) : void 0,
23102
+ makerIsVault: state.makerIsVault === true,
23103
+ virtualXtReserve: toBig4(state.virtualXtReserve),
23104
+ ftReserve: toBig4(state.ftReserve),
23105
+ xtReserve: toBig4(state.xtReserve),
23106
+ maxXtReserve: toBig4(state.maxXtReserve),
23107
+ gtId: toBig4(state.gtId),
23108
+ // ── the crossing ──
23109
+ takerLendCuts: parseCuts(state.borrowCurve),
23110
+ takerBorrowCuts: parseCuts(state.lendCurve),
23111
+ takerLendApr: term?.bcft?.apr != null ? toNum2(term.bcft.apr) : void 0,
23112
+ takerBorrowApr: term?.lcft?.apr != null ? toNum2(term.lcft.apr) : void 0,
23113
+ feeConfig: parseFeeConfig(state.feeConfig),
23114
+ lendCapacityUsd: toNum2(meta.lendCapacityValue),
23115
+ borrowCapacityUsd: toNum2(meta.borrowCapacityValue),
23116
+ lendCapacityAmount: toNum2(meta.lendCapacityAmount),
23117
+ borrowCapacityAmount: toNum2(meta.borrowCapacityAmount)
23118
+ };
23119
+ }
23120
+ function reduceTop2(orders) {
23121
+ let bestLendApr;
23122
+ let bestBorrowApr;
23123
+ let lendDepthUsd = 0;
23124
+ let borrowDepthUsd = 0;
23125
+ let lendDepthAmount = 0;
23126
+ let borrowDepthAmount = 0;
23127
+ for (const o of orders) {
23128
+ lendDepthUsd += o.lendCapacityUsd;
23129
+ borrowDepthUsd += o.borrowCapacityUsd;
23130
+ lendDepthAmount += o.lendCapacityAmount;
23131
+ borrowDepthAmount += o.borrowCapacityAmount;
23132
+ if (o.takerLendApr != null && o.takerLendApr > 0 && o.lendCapacityUsd > 0) {
23133
+ if (bestLendApr === void 0 || o.takerLendApr > bestLendApr) {
23134
+ bestLendApr = o.takerLendApr;
23135
+ }
23136
+ }
23137
+ if (o.takerBorrowApr != null && o.takerBorrowApr > 0 && o.borrowCapacityUsd > 0) {
23138
+ if (bestBorrowApr === void 0 || o.takerBorrowApr < bestBorrowApr) {
23139
+ bestBorrowApr = o.takerBorrowApr;
23140
+ }
23141
+ }
23142
+ }
23143
+ return {
23144
+ bestLendApr,
23145
+ bestBorrowApr,
23146
+ lendDepthUsd,
23147
+ borrowDepthUsd,
23148
+ lendDepthAmount,
23149
+ borrowDepthAmount
23150
+ };
23151
+ }
23152
+ var TermMaxApiSource = class {
23153
+ baseUrl;
23154
+ fetchImpl;
23155
+ constructor(baseUrl, fetchImpl = fetch) {
23156
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
23157
+ this.fetchImpl = (input, init) => fetchImpl.call(globalThis, input, init);
23158
+ }
23159
+ async getChainMarkets(chainId) {
23160
+ const url = `${this.baseUrl}/market/data?chainId=${chainId}`;
23161
+ let json;
23162
+ try {
23163
+ const res = await this.fetchImpl(url);
23164
+ if (!res.ok) {
23165
+ warn3(`market/data ${chainId} \u2192 HTTP ${res.status}`);
23166
+ return null;
23167
+ }
23168
+ json = await res.json();
23169
+ } catch (e) {
23170
+ warn3(`market/data ${chainId} fetch failed:`, e?.message ?? e);
23171
+ return null;
23172
+ }
23173
+ const data = json?.data ?? json;
23174
+ if (!data) return null;
23175
+ const assetDecimals = /* @__PURE__ */ new Map();
23176
+ for (const a of Array.isArray(data.assetConfigs) ? data.assetConfigs : []) {
23177
+ const addr2 = lower(a?.contractAddress ?? a?.assetAddress);
23178
+ const dec = Number(a?.decimals ?? a?.assetDecimals);
23179
+ if (addr2 && Number.isFinite(dec)) assetDecimals.set(addr2, dec);
23180
+ }
23181
+ const markets = [];
23182
+ for (const m of Array.isArray(data.markets) ? data.markets : []) {
23183
+ const parsed = parseMarket(m, assetDecimals);
23184
+ if (parsed && parsed.isEnabled && !parsed.isMatured) markets.push(parsed);
23185
+ }
23186
+ if (markets.length === 0) return [];
23187
+ const ordersByMarket = /* @__PURE__ */ new Map();
23188
+ for (const o of Array.isArray(data.orders) ? data.orders : []) {
23189
+ const parsed = parseOrder(o);
23190
+ if (!parsed) continue;
23191
+ const list = ordersByMarket.get(parsed.marketAddress);
23192
+ if (list) list.push(parsed);
23193
+ else ordersByMarket.set(parsed.marketAddress, [parsed]);
23194
+ }
23195
+ return markets.map((config) => {
23196
+ const orders = ordersByMarket.get(config.market) ?? [];
23197
+ return { config, top: reduceTop2(orders), orders };
23198
+ });
23199
+ }
23200
+ };
23201
+ function createTermMaxDataSource(chainId, fetchImpl = fetch) {
23202
+ return new TermMaxApiSource(termMaxApiBase(chainId), fetchImpl);
23203
+ }
23204
+
23205
+ // src/lending/public-data/termmax/fetchPublic.ts
23206
+ var LKG_TTL_SEC3 = 30 * 60;
23207
+ var lastGood3 = /* @__PURE__ */ new Map();
23208
+ var MARKET_CACHE_TTL_MS = 10 * 6e4;
23209
+ var marketCache = /* @__PURE__ */ new Map();
23210
+ var marketKey = (chainId, market) => `${chainId}:${market.toLowerCase()}`;
23211
+ function rememberMarkets(chainId, raw) {
23212
+ const at = Date.now();
23213
+ for (const { config } of raw) {
23214
+ marketCache.set(marketKey(chainId, config.market), { config, at });
23215
+ }
23216
+ }
23217
+ function getCachedTermMaxMarket(chainId, market) {
23218
+ const hit = marketCache.get(marketKey(chainId, market));
23219
+ if (!hit || Date.now() - hit.at > MARKET_CACHE_TTL_MS) return void 0;
23220
+ return hit.config;
23221
+ }
23222
+ function getCachedTermMaxMarkets(chainId) {
23223
+ const prefix = `${chainId}:`;
23224
+ const now = Date.now();
23225
+ const out = [];
23226
+ for (const [key, hit] of marketCache) {
23227
+ if (!key.startsWith(prefix)) continue;
23228
+ if (now - hit.at > MARKET_CACHE_TTL_MS) continue;
23229
+ out.push(hit.config);
23230
+ }
23231
+ return out;
23232
+ }
23233
+ async function fetchTermMaxMarkets(chainId, source = createTermMaxDataSource(chainId)) {
23234
+ if (!termMaxConfigByChain(chainId)) return [];
23235
+ const nowSec9 = Math.floor(Date.now() / 1e3);
23236
+ const fresh = await source.getChainMarkets(chainId).catch(() => null);
23237
+ if (fresh) {
23238
+ const live = fresh.filter((m) => m.config.maturity > nowSec9);
23239
+ lastGood3.set(chainId, { markets: live, at: nowSec9 });
23240
+ rememberMarkets(chainId, live);
23241
+ return live;
23242
+ }
23243
+ const cached = lastGood3.get(chainId);
23244
+ if (cached && nowSec9 - cached.at <= LKG_TTL_SEC3) {
23245
+ const live = cached.markets.filter((m) => m.config.maturity > nowSec9);
23246
+ rememberMarkets(chainId, live);
23247
+ return live;
23248
+ }
23249
+ return [];
23250
+ }
22979
23251
 
22980
23252
  // src/lending/public-data/teller/math.ts
22981
23253
  function tellerBpsToPercent(bps) {
@@ -23006,8 +23278,8 @@ function tellerPoolFromLenderKey(lender) {
23006
23278
  return body.length === 40 ? "0x" + body.toLowerCase() : void 0;
23007
23279
  }
23008
23280
  function currencyFor6(address, decimals, symbol, tokens) {
23009
- const lower = address.toLowerCase();
23010
- return tokens[lower] ?? { address: lower, symbol, name: symbol, decimals };
23281
+ const lower3 = address.toLowerCase();
23282
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
23011
23283
  }
23012
23284
  function fmtDuration2(sec) {
23013
23285
  if (sec == null || sec <= 0) return "a short window";
@@ -23016,9 +23288,9 @@ function fmtDuration2(sec) {
23016
23288
  return `${Math.round(sec / 86400)} day${sec < 172800 ? "" : "s"}`;
23017
23289
  }
23018
23290
  function priceFor(address, chainId, tokens, prices) {
23019
- const lower = address.toLowerCase();
23020
- const token = tokens[lower];
23021
- const key = toOracleKey(token?.assetGroup) || toGenericPriceKey(lower, chainId);
23291
+ const lower3 = address.toLowerCase();
23292
+ const token = tokens[lower3];
23293
+ const key = toOracleKey(token?.assetGroup) || toGenericPriceKey(lower3, chainId);
23022
23294
  return prices[key] ?? 0;
23023
23295
  }
23024
23296
  function convertTellerMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
@@ -23267,6 +23539,615 @@ function convertTellerMarketsToResponse(raw, chainId, prices = {}, _additionalYi
23267
23539
  return out;
23268
23540
  }
23269
23541
 
23542
+ // src/lending/public-data/termmax/math.ts
23543
+ var DECIMAL_BASE = 100000000n;
23544
+ var DAYS_IN_YEAR2 = 365n;
23545
+ var SECONDS_IN_DAY = 86400n;
23546
+ var MAX_FEE_RATIO = 20000000n;
23547
+ function daysToMaturity(maturity, nowSec9) {
23548
+ const remaining = BigInt(Math.trunc(maturity)) - BigInt(Math.trunc(nowSec9));
23549
+ if (remaining <= 0n) return 0n;
23550
+ return (remaining + SECONDS_IN_DAY - 1n) / SECONDS_IN_DAY;
23551
+ }
23552
+ function calcCutId(cuts, xtReserve) {
23553
+ let id = cuts.length;
23554
+ while (id > 0) {
23555
+ id--;
23556
+ if (xtReserve >= cuts[id].xtReserve) return id;
23557
+ }
23558
+ return cuts.length > 0 ? 0 : -1;
23559
+ }
23560
+ function intervalProps(netInterestFactor, days, cut, xtReserve) {
23561
+ if (days <= 0n) return null;
23562
+ const liqSquare = cut.liqSquare * days * netInterestFactor / (DAYS_IN_YEAR2 * DECIMAL_BASE);
23563
+ const vXtReserve = xtReserve + cut.offset;
23564
+ if (vXtReserve <= 0n) return null;
23565
+ return { liqSquare, vXtReserve, vFtReserve: liqSquare / vXtReserve };
23566
+ }
23567
+ function curveApr(cuts, virtualXtReserve, days) {
23568
+ if (cuts.length === 0 || days <= 0n) return 0n;
23569
+ const id = calcCutId(cuts, virtualXtReserve);
23570
+ if (id < 0) return 0n;
23571
+ const props = intervalProps(DECIMAL_BASE, days, cuts[id], virtualXtReserve);
23572
+ if (!props || props.vXtReserve === 0n) return 0n;
23573
+ return props.vFtReserve * DECIMAL_BASE * DAYS_IN_YEAR2 / (props.vXtReserve * days);
23574
+ }
23575
+ function ratioToNumber(v) {
23576
+ return Number(v) / Number(DECIMAL_BASE);
23577
+ }
23578
+ function ratioToPercent(v) {
23579
+ return Number(v) / Number(DECIMAL_BASE) * 100;
23580
+ }
23581
+ function curveAprNumber(cuts, virtualXtReserve, days) {
23582
+ return ratioToNumber(curveApr(cuts, virtualXtReserve, days));
23583
+ }
23584
+ function lendNif(fee) {
23585
+ const f = fee?.lendTakerFeeRatio ?? 0n;
23586
+ const nif = DECIMAL_BASE - (f > MAX_FEE_RATIO ? MAX_FEE_RATIO : f);
23587
+ return nif > 0n ? nif : DECIMAL_BASE;
23588
+ }
23589
+ function borrowNif(fee) {
23590
+ const f = fee?.borrowTakerFeeRatio ?? 0n;
23591
+ return DECIMAL_BASE + (f > MAX_FEE_RATIO ? MAX_FEE_RATIO : f);
23592
+ }
23593
+ function mintGtFeeRatio(fee, days) {
23594
+ if (!fee || days <= 0n) return 0n;
23595
+ const ratio = fee.mintGtFeeRatio ?? 0n;
23596
+ const ref = fee.mintGtFeeRef ?? 0n;
23597
+ const denom = DAYS_IN_YEAR2 * DECIMAL_BASE + ref * days;
23598
+ if (denom === 0n) return 0n;
23599
+ return days * ratio * ref / denom;
23600
+ }
23601
+ var TERMMAX_LIQUIDATION_PENALTY = 0.1;
23602
+ var TERMMAX_LIQUIDATOR_BONUS = 0.05;
23603
+ var TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD = 1e4;
23604
+ var TERMMAX_PARTIAL_CLOSE_FACTOR = 0.5;
23605
+ var TERMMAX_LIQUIDATION_WINDOW_SECS = 7200;
23606
+ function parseTermMaxLtv(v) {
23607
+ if (v === void 0 || v === null || v === "") return 0;
23608
+ try {
23609
+ return Number(BigInt(v)) / Number(DECIMAL_BASE);
23610
+ } catch {
23611
+ const n = Number(v);
23612
+ return Number.isFinite(n) ? n / Number(DECIMAL_BASE) : 0;
23613
+ }
23614
+ }
23615
+
23616
+ // src/lending/public-data/termmax/convertPublic.ts
23617
+ var nowSec4 = () => Math.floor(Date.now() / 1e3);
23618
+ function currencyFor7(address, decimals, tokens) {
23619
+ const lower3 = address.toLowerCase();
23620
+ return tokens[lower3] ?? {
23621
+ address: lower3,
23622
+ symbol: "",
23623
+ name: "",
23624
+ decimals
23625
+ };
23626
+ }
23627
+ function priceFor2(address, chainId, prices, tokens) {
23628
+ const asset = tokens[address];
23629
+ const key = toOracleKey(asset?.assetGroup) || toGenericPriceKey(address, chainId);
23630
+ return prices[key] ?? 0;
23631
+ }
23632
+ function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
23633
+ intrinsicYields: {},
23634
+ lenderRewards: {},
23635
+ loaded: true
23636
+ }, tokens = {}) {
23637
+ const out = {};
23638
+ const now = nowSec4();
23639
+ for (const { config, top, orders } of raw) {
23640
+ if (!config?.market || !config.debtToken || !config.collateral) continue;
23641
+ const m = termMaxLenderKey(config.market);
23642
+ const maturity = Number(config.maturity);
23643
+ const ttm = maturity - now;
23644
+ const matured = ttm <= 0;
23645
+ const days = daysToMaturity(maturity, now);
23646
+ const supplyAprPct = !matured ? (top?.bestLendApr ?? 0) * 100 : 0;
23647
+ const borrowAprPct = !matured ? (top?.bestBorrowApr ?? 0) * 100 : 0;
23648
+ const debtAddr = config.debtToken;
23649
+ const collAddr = config.collateral;
23650
+ priceFor2(debtAddr, chainId, prices, tokens);
23651
+ const collPrice = priceFor2(collAddr, chainId, prices, tokens);
23652
+ const supplyLiquidity = matured ? 0 : top?.lendDepthAmount ?? 0;
23653
+ const borrowLiquidity = matured ? 0 : top?.borrowDepthAmount ?? 0;
23654
+ const supplyLiquidityUSD = matured ? 0 : top?.lendDepthUsd ?? 0;
23655
+ const borrowLiquidityUSD = matured ? 0 : top?.borrowDepthUsd ?? 0;
23656
+ const maxLtv = parseTermMaxLtv(config.maxLtv);
23657
+ const liquidationLtv = parseTermMaxLtv(config.liquidationLtv);
23658
+ const closeFactor = borrowLiquidityUSD > TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD ? TERMMAX_PARTIAL_CLOSE_FACTOR : 1;
23659
+ const liquidationPenalty = config.liquidatable ? TERMMAX_LIQUIDATION_PENALTY : 0;
23660
+ const terms = borrowAprPct > 0 && !matured ? [
23661
+ {
23662
+ termId: maturity,
23663
+ durationSecs: Math.max(0, ttm),
23664
+ durationDays: ttm / 86400,
23665
+ apr: borrowAprPct
23666
+ }
23667
+ ] : void 0;
23668
+ const originationFeePercent = ratioToPercent(
23669
+ mintGtFeeRatio(config.feeConfig, days)
23670
+ );
23671
+ const entry = { data: {} };
23672
+ const loanUid = createMarketUid(chainId, m, debtAddr);
23673
+ entry.data[loanUid] = {
23674
+ marketUid: loanUid,
23675
+ name: "Loan " + (tokens[debtAddr]?.symbol ?? ""),
23676
+ poolId: debtAddr,
23677
+ underlying: debtAddr,
23678
+ asset: currencyFor7(debtAddr, config.debtDecimals, tokens),
23679
+ totalDeposits: supplyLiquidity,
23680
+ totalDebtStable: 0,
23681
+ totalDebt: 0,
23682
+ totalLiquidity: borrowLiquidity,
23683
+ borrowLiquidity,
23684
+ totalLiquidityUSD: borrowLiquidityUSD,
23685
+ borrowLiquidityUSD,
23686
+ totalDepositsUSD: supplyLiquidityUSD,
23687
+ totalDebtStableUSD: 0,
23688
+ totalDebtUSD: 0,
23689
+ // No utilization curve — price comes from per-maker curves, not a pool.
23690
+ utilization: 0,
23691
+ depositRate: supplyAprPct,
23692
+ variableBorrowRate: borrowAprPct,
23693
+ rateModel: "fixedTerm",
23694
+ // Fixed-rate: mirror onto stableBorrowRate so fixed-rate consumers pick it
23695
+ // up as a term product.
23696
+ stableBorrowRate: borrowAprPct,
23697
+ intrinsicYield: 0,
23698
+ rewards: void 0,
23699
+ decimals: config.debtDecimals,
23700
+ config: {
23701
+ 0: {
23702
+ category: 0,
23703
+ borrowCollateralFactor: 0,
23704
+ collateralFactor: 0,
23705
+ borrowFactor: 1,
23706
+ liquidationPenalty: 0,
23707
+ closeFactor,
23708
+ collateralDisabled: true,
23709
+ debtDisabled: false
23710
+ }
23711
+ },
23712
+ closeFactor,
23713
+ collateralActive: false,
23714
+ borrowingEnabled: !matured && borrowLiquidity > 0,
23715
+ depositsEnabled: !matured,
23716
+ hasStable: false,
23717
+ // Borrowing IS fixed-term (see `terms` + `fixedTerm`), but it is real
23718
+ // borrowing — do NOT set this, or borrowable-only filters hide the market.
23719
+ variableBorrowDisabled: false,
23720
+ isActive: true,
23721
+ isFrozen: false
23722
+ };
23723
+ const collUid = createMarketUid(chainId, m, collAddr);
23724
+ const collCapacityUSD = maxLtv > 0 ? borrowLiquidityUSD / maxLtv : borrowLiquidityUSD;
23725
+ const collCapacity = collPrice > 0 ? collCapacityUSD / collPrice : 0;
23726
+ entry.data[collUid] = {
23727
+ marketUid: collUid,
23728
+ name: "Collateral " + (tokens[collAddr]?.symbol ?? ""),
23729
+ poolId: collAddr,
23730
+ underlying: collAddr,
23731
+ asset: currencyFor7(collAddr, config.collateralDecimals, tokens),
23732
+ totalDeposits: collCapacity,
23733
+ totalDebtStable: 0,
23734
+ totalDebt: 0,
23735
+ totalLiquidity: collCapacity,
23736
+ borrowLiquidity: 0,
23737
+ totalLiquidityUSD: collCapacityUSD,
23738
+ borrowLiquidityUSD: 0,
23739
+ totalDepositsUSD: collCapacityUSD,
23740
+ totalDebtStableUSD: 0,
23741
+ totalDebtUSD: 0,
23742
+ utilization: 0,
23743
+ depositRate: 0,
23744
+ variableBorrowRate: 0,
23745
+ stableBorrowRate: 0,
23746
+ intrinsicYield: 0,
23747
+ rewards: void 0,
23748
+ decimals: config.collateralDecimals,
23749
+ config: {
23750
+ 0: {
23751
+ category: 0,
23752
+ borrowCollateralFactor: liquidationLtv,
23753
+ collateralFactor: maxLtv,
23754
+ borrowFactor: 1,
23755
+ liquidationPenalty,
23756
+ closeFactor,
23757
+ collateralDisabled: false,
23758
+ debtDisabled: true
23759
+ }
23760
+ },
23761
+ closeFactor,
23762
+ collateralActive: true,
23763
+ borrowingEnabled: false,
23764
+ depositsEnabled: !matured,
23765
+ hasStable: false,
23766
+ isActive: true,
23767
+ isFrozen: false
23768
+ };
23769
+ entry.params = {
23770
+ market: {
23771
+ lender: m,
23772
+ name: config.symbol,
23773
+ loanDecimals: config.debtDecimals,
23774
+ collateralDecimals: config.collateralDecimals,
23775
+ id: config.market,
23776
+ lltv: config.liquidationLtv,
23777
+ oracle: config.oracle ?? zeroAddress,
23778
+ irm: zeroAddress,
23779
+ collateralAddress: collAddr,
23780
+ loanAddress: debtAddr,
23781
+ terms,
23782
+ // TermMax-specific extras consumed by the calldata / worker-api
23783
+ // resolvers. FT is the lend position, GT the borrow sub-account.
23784
+ maturity: String(config.maturity),
23785
+ ft: config.ft,
23786
+ xt: config.xt,
23787
+ gt: config.gt,
23788
+ maxLtv: config.maxLtv,
23789
+ liquidationLtv: config.liquidationLtv,
23790
+ liquidatable: config.liquidatable,
23791
+ liquidationWindowSeconds: config.liquidationWindowSeconds,
23792
+ version: config.version,
23793
+ // Executable order set, best-first per side — what a builder quotes
23794
+ // against. Depth caps are hard: an order can refuse beyond them.
23795
+ orders: orders.map((o) => ({
23796
+ order: o.orderAddress,
23797
+ maker: o.makerAddress,
23798
+ makerIsVault: o.makerIsVault,
23799
+ lendApr: o.takerLendApr,
23800
+ borrowApr: o.takerBorrowApr,
23801
+ lendCapacityUsd: o.lendCapacityUsd,
23802
+ borrowCapacityUsd: o.borrowCapacityUsd,
23803
+ lendCapacityAmount: o.lendCapacityAmount,
23804
+ borrowCapacityAmount: o.borrowCapacityAmount
23805
+ })),
23806
+ fixedTerm: {
23807
+ model: "termmax",
23808
+ maturity,
23809
+ fees: {
23810
+ // % of principal, charged once when the GT is minted.
23811
+ originationFeePercent
23812
+ },
23813
+ // Exit early by buying discounted FT and handing it back at par — a
23814
+ // market price, not a penalty. Same as Midnight.
23815
+ earlyRepay: { kind: "none" },
23816
+ // The term is an aggregate of many per-maker order contracts; there is
23817
+ // no single provider at the market level.
23818
+ provider: { kind: "orderbook" }
23819
+ }
23820
+ }
23821
+ };
23822
+ entry.chainId = chainId;
23823
+ out[m] = entry;
23824
+ }
23825
+ return out;
23826
+ }
23827
+ var FIXED_MARKETS_URL = "https://www.inverse.finance/api/f2/fixed-markets";
23828
+ var DBR_URL = "https://www.inverse.finance/api/dbr";
23829
+ var INVERSE_PUBLIC_READ_ABI = [
23830
+ ...InverseMarketAbi,
23831
+ ...InverseOracleAbi,
23832
+ ...InverseDbrAbi,
23833
+ ...Erc20Abi
23834
+ ];
23835
+ var READS_PER_MARKET2 = 4;
23836
+ var fetchJson = async (url, timeoutMs = 6e3) => {
23837
+ const res = await fetch(url, {
23838
+ headers: { accept: "application/json" },
23839
+ signal: AbortSignal.timeout(timeoutMs)
23840
+ });
23841
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
23842
+ return res.json();
23843
+ };
23844
+ var fetchDbrPriceDola = async (snapshot) => {
23845
+ try {
23846
+ const d = await fetchJson(DBR_URL);
23847
+ const p = Number(d?.priceDola);
23848
+ if (Number.isFinite(p) && p > 0) return p;
23849
+ } catch {
23850
+ }
23851
+ const snap = Number(snapshot);
23852
+ return Number.isFinite(snap) && snap > 0 ? snap : null;
23853
+ };
23854
+ async function fetchInverseMarkets(lender, chainId) {
23855
+ const config = inverseConfigFor(lender, chainId);
23856
+ const chainData = inverseChainData(lender, chainId);
23857
+ const markets = chainData?.markets ?? [];
23858
+ const empty = {
23859
+ lender,
23860
+ config,
23861
+ chainData,
23862
+ dbrPriceDola: null,
23863
+ replenishmentPriceBps: null,
23864
+ markets: [],
23865
+ source: "none"
23866
+ };
23867
+ if (!config || markets.length === 0) return empty;
23868
+ const dbrPricePromise = fetchDbrPriceDola(config.dbrPriceDolaSnapshot);
23869
+ try {
23870
+ const api = await fetchJson(FIXED_MARKETS_URL);
23871
+ const byAddr = {};
23872
+ for (const m of api?.markets ?? []) {
23873
+ if (m?.address) byAddr[String(m.address).toLowerCase()] = m;
23874
+ }
23875
+ if (Object.keys(byAddr).length > 0) {
23876
+ const rows = markets.map((market) => {
23877
+ const m = byAddr[market.address.toLowerCase()];
23878
+ const num9 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
23879
+ return {
23880
+ market,
23881
+ totalDebt: num9(m?.totalDebt),
23882
+ dolaLiquidity: num9(m?.dolaLiquidity),
23883
+ leftToBorrow: num9(m?.leftToBorrow),
23884
+ price: num9(m?.price),
23885
+ borrowPaused: typeof m?.borrowPaused === "boolean" ? m.borrowPaused : null,
23886
+ dailyBorrows: num9(m?.dailyBorrows)
23887
+ };
23888
+ });
23889
+ return {
23890
+ lender,
23891
+ config,
23892
+ chainData,
23893
+ dbrPriceDola: await dbrPricePromise,
23894
+ replenishmentPriceBps: num(api, "replenishmentPriceBps"),
23895
+ markets: rows,
23896
+ source: "api"
23897
+ };
23898
+ }
23899
+ } catch {
23900
+ }
23901
+ const calls = [
23902
+ { address: config.dbr, name: "replenishmentPriceBps", params: [] },
23903
+ ...markets.flatMap((m) => [
23904
+ { address: m.address, name: "totalDebt", params: [] },
23905
+ { address: m.address, name: "borrowPaused", params: [] },
23906
+ { address: config.dola, name: "balanceOf", params: [m.address] },
23907
+ {
23908
+ address: config.oracle,
23909
+ name: "viewPrice",
23910
+ params: [m.collToken, BigInt(m.collateralFactorBps)]
23911
+ }
23912
+ ])
23913
+ ];
23914
+ try {
23915
+ const results = await multicallRetryUniversal({
23916
+ chain: chainId,
23917
+ calls,
23918
+ abi: INVERSE_PUBLIC_READ_ABI,
23919
+ allowFailure: true
23920
+ });
23921
+ const bigAt = (i) => {
23922
+ const r = results[i];
23923
+ if (typeof r === "bigint") return r;
23924
+ if (typeof r === "number") return BigInt(r);
23925
+ return null;
23926
+ };
23927
+ const debtDecimals = config.debtDecimals ?? 18;
23928
+ const rows = markets.map((market, i) => {
23929
+ const base = 1 + i * READS_PER_MARKET2;
23930
+ const totalDebt = bigAt(base);
23931
+ const paused = results[base + 1];
23932
+ const liq = bigAt(base + 2);
23933
+ const price2 = bigAt(base + 3);
23934
+ return {
23935
+ market,
23936
+ totalDebt: totalDebt !== null ? Number(totalDebt) / 10 ** debtDecimals : null,
23937
+ dolaLiquidity: liq !== null ? Number(liq) / 10 ** debtDecimals : null,
23938
+ // dailyBorrows lives on the BorrowController (day-bucketed
23939
+ // mapping) — the fallback conservatively caps by liquidity only.
23940
+ leftToBorrow: null,
23941
+ // viewPrice scales so that price * balance / 1e18 is USD-ish:
23942
+ // 10^(36 − collDecimals) per unit — normalize to USD per token.
23943
+ price: price2 !== null ? Number(price2) / 10 ** (36 - market.collDecimals) : null,
23944
+ borrowPaused: typeof paused === "boolean" ? paused : null,
23945
+ dailyBorrows: null
23946
+ };
23947
+ });
23948
+ return {
23949
+ lender,
23950
+ config,
23951
+ chainData,
23952
+ dbrPriceDola: await dbrPricePromise,
23953
+ replenishmentPriceBps: bigAt(0) !== null ? Number(bigAt(0)) : null,
23954
+ markets: rows,
23955
+ source: "chain"
23956
+ };
23957
+ } catch {
23958
+ return { ...empty, dbrPriceDola: await dbrPricePromise };
23959
+ }
23960
+ }
23961
+ function num(api, key) {
23962
+ const v = api?.[key];
23963
+ return typeof v === "number" && Number.isFinite(v) ? v : null;
23964
+ }
23965
+
23966
+ // src/lending/public-data/inverse/convertPublic.ts
23967
+ function inverseLenderKey(lender, market) {
23968
+ return `${lender}_${market.replace(/^0x/i, "").toUpperCase()}`;
23969
+ }
23970
+ function inverseKeyParts(key) {
23971
+ if (!key.startsWith("INVERSE_")) return void 0;
23972
+ const suffix = key.slice("INVERSE_".length);
23973
+ if (!/^[0-9A-F]{40}$/.test(suffix)) return void 0;
23974
+ return { lender: "INVERSE", market: "0x" + suffix.toLowerCase() };
23975
+ }
23976
+ function currencyFor8(address, decimals, symbol, tokens) {
23977
+ const lower3 = address.toLowerCase();
23978
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
23979
+ }
23980
+ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
23981
+ intrinsicYields: {},
23982
+ lenderRewards: {},
23983
+ loaded: true
23984
+ }, tokens = {}) {
23985
+ const out = {};
23986
+ const cfg = raw?.config;
23987
+ const chainData = raw?.chainData;
23988
+ if (!cfg || !chainData) return out;
23989
+ const dolaAddr = cfg.dola.toLowerCase();
23990
+ const debtDecimals = cfg.debtDecimals ?? 18;
23991
+ const dolaToken = tokens[dolaAddr];
23992
+ const dolaPriceKey = toOracleKey(dolaToken?.assetGroup) || toGenericPriceKey(dolaAddr, chainId);
23993
+ const dolaPrice = prices[dolaPriceKey] || 1;
23994
+ const borrowAprPct = raw.dbrPriceDola !== null ? raw.dbrPriceDola * 100 : 0;
23995
+ for (const m of raw.markets ?? []) {
23996
+ const market = m.market;
23997
+ const lenderKey = inverseLenderKey(raw.lender, market.address);
23998
+ const collAddr = market.collToken.toLowerCase();
23999
+ const collDecimals = market.collDecimals;
24000
+ const collToken = tokens[collAddr];
24001
+ const collSymbol = collToken?.symbol ?? market.name ?? "COLL";
24002
+ const marketName = `DOLA / ${market.name ?? collSymbol}`;
24003
+ const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
24004
+ const collPrice = m.price ?? prices[collPriceKey] ?? 0;
24005
+ const totalDebt = m.totalDebt ?? 0;
24006
+ const paused = m.borrowPaused ?? !!market.borrowPaused;
24007
+ const ltv = Number(market.collateralFactorBps) / 1e4;
24008
+ const liqPenalty = Number(market.liquidationIncentiveBps) / 1e4;
24009
+ const closeFactor = Number(market.liquidationFactorBps) / 1e4 || 1;
24010
+ const collateralTotal = 0;
24011
+ let borrowLiquidity = m.leftToBorrow ?? m.dolaLiquidity ?? 0;
24012
+ if (paused) borrowLiquidity = 0;
24013
+ const entry = { data: {} };
24014
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
24015
+ entry.data[collUid] = {
24016
+ marketUid: collUid,
24017
+ name: "Collateral " + collSymbol,
24018
+ poolId: market.address.toLowerCase(),
24019
+ underlying: collAddr,
24020
+ asset: currencyFor8(collAddr, collDecimals, collSymbol, tokens),
24021
+ totalDeposits: collateralTotal,
24022
+ totalDebtStable: 0,
24023
+ totalDebt: 0,
24024
+ totalLiquidity: collateralTotal,
24025
+ borrowLiquidity: 0,
24026
+ totalLiquidityUSD: collateralTotal * collPrice,
24027
+ borrowLiquidityUSD: 0,
24028
+ totalDepositsUSD: collateralTotal * collPrice,
24029
+ totalDebtStableUSD: 0,
24030
+ totalDebtUSD: 0,
24031
+ utilization: 0,
24032
+ depositRate: 0,
24033
+ variableBorrowRate: 0,
24034
+ stableBorrowRate: 0,
24035
+ intrinsicYield: _additionalYields?.intrinsicYields?.[collToken?.assetGroup] ?? 0,
24036
+ rewards: void 0,
24037
+ decimals: collDecimals,
24038
+ config: {
24039
+ 0: {
24040
+ category: 0,
24041
+ borrowCollateralFactor: ltv,
24042
+ collateralFactor: ltv,
24043
+ borrowFactor: 1,
24044
+ liquidationPenalty: liqPenalty,
24045
+ closeFactor,
24046
+ collateralDisabled: false,
24047
+ debtDisabled: true
24048
+ }
24049
+ },
24050
+ closeFactor,
24051
+ collateralActive: true,
24052
+ borrowingEnabled: false,
24053
+ depositsEnabled: true,
24054
+ hasStable: false,
24055
+ isActive: true,
24056
+ isFrozen: false
24057
+ };
24058
+ const loanUid = createMarketUid(chainId, lenderKey, dolaAddr);
24059
+ entry.data[loanUid] = {
24060
+ marketUid: loanUid,
24061
+ name: "DOLA",
24062
+ poolId: market.address.toLowerCase(),
24063
+ underlying: dolaAddr,
24064
+ asset: currencyFor8(dolaAddr, debtDecimals, "DOLA", tokens),
24065
+ totalDeposits: 0,
24066
+ totalDebtStable: 0,
24067
+ totalDebt,
24068
+ totalLiquidity: borrowLiquidity,
24069
+ borrowLiquidity,
24070
+ totalLiquidityUSD: borrowLiquidity * dolaPrice,
24071
+ borrowLiquidityUSD: borrowLiquidity * dolaPrice,
24072
+ totalDepositsUSD: 0,
24073
+ totalDebtStableUSD: 0,
24074
+ totalDebtUSD: totalDebt * dolaPrice,
24075
+ utilization: 0,
24076
+ depositRate: 0,
24077
+ // The DBR price IS the fixed borrow APR (percent). Debt principal
24078
+ // is static — interest burns the user's DBR balance instead.
24079
+ variableBorrowRate: borrowAprPct,
24080
+ stableBorrowRate: 0,
24081
+ rateModel: "dbr",
24082
+ intrinsicYield: 0,
24083
+ rewards: void 0,
24084
+ decimals: debtDecimals,
24085
+ config: {
24086
+ 0: {
24087
+ category: 0,
24088
+ borrowCollateralFactor: 0,
24089
+ collateralFactor: 0,
24090
+ borrowFactor: 1,
24091
+ liquidationPenalty: liqPenalty,
24092
+ closeFactor,
24093
+ collateralDisabled: true,
24094
+ debtDisabled: paused
24095
+ }
24096
+ },
24097
+ closeFactor,
24098
+ collateralActive: false,
24099
+ borrowingEnabled: !paused,
24100
+ depositsEnabled: false,
24101
+ hasStable: false,
24102
+ variableBorrowDisabled: paused,
24103
+ isActive: true,
24104
+ isFrozen: false
24105
+ };
24106
+ entry.params = {
24107
+ market: {
24108
+ lender: lenderKey,
24109
+ name: marketName,
24110
+ loanDecimals: debtDecimals,
24111
+ collateralDecimals: collDecimals,
24112
+ // The Market contract doubles as the market id.
24113
+ id: market.address.toLowerCase(),
24114
+ lltv: String(ltv),
24115
+ oracle: cfg.oracle,
24116
+ irm: zeroAddress,
24117
+ collateralAddress: collAddr,
24118
+ loanAddress: dolaAddr,
24119
+ // --- FiRM descriptor (metadata + live snapshot; consumed by
24120
+ // calldata builders + worker-api resolvers) ---
24121
+ inverse: {
24122
+ escrowImplementation: market.escrowImplementation,
24123
+ /** DOLA units, human numbers as strings. */
24124
+ minDebt: market.minDebt,
24125
+ dailyLimit: market.dailyLimit,
24126
+ dailyBorrows: m.dailyBorrows !== null ? String(m.dailyBorrows) : void 0,
24127
+ dolaLiquidity: m.dolaLiquidity !== null ? String(m.dolaLiquidity) : void 0,
24128
+ leftToBorrow: m.leftToBorrow !== null ? String(m.leftToBorrow) : void 0,
24129
+ liquidationFactorBps: market.liquidationFactorBps,
24130
+ /** Fixed borrow APR as a DECIMAL (DBR price in DOLA). */
24131
+ dbrPriceDola: raw.dbrPriceDola !== null ? String(raw.dbrPriceDola) : void 0,
24132
+ /** Force-replenish penalty (5475 = 54.75% APR on missed DBR). */
24133
+ replenishmentPriceBps: raw.replenishmentPriceBps !== null ? String(raw.replenishmentPriceBps) : void 0,
24134
+ borrowPaused: paused,
24135
+ addresses: {
24136
+ market: market.address,
24137
+ dola: cfg.dola,
24138
+ dbr: cfg.dbr,
24139
+ oracle: cfg.oracle,
24140
+ borrowController: cfg.borrowController
24141
+ }
24142
+ }
24143
+ }
24144
+ };
24145
+ entry.chainId = chainId;
24146
+ out[lenderKey] = entry;
24147
+ }
24148
+ return out;
24149
+ }
24150
+
23270
24151
  // src/lending/public-data/silo-v2/fetchPublic.ts
23271
24152
  var BASE_URL2 = "https://api-v3.silo.finance";
23272
24153
  var SILO_API_SUPPORTED_CHAIN_IDS = /* @__PURE__ */ new Set([
@@ -23863,7 +24744,7 @@ function convertDolomiteSubgraphMarkets(raw, chainId, prices, additionalYields,
23863
24744
  }
23864
24745
  return { data: result, chainId };
23865
24746
  }
23866
- var warn3 = (...args) => {
24747
+ var warn4 = (...args) => {
23867
24748
  };
23868
24749
  async function getLenderDataFromApi(lender, chainId, prices, additionalYields, includeUnlisted = false) {
23869
24750
  if (isMorphoType(lender))
@@ -23874,6 +24755,8 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
23874
24755
  if (isLiquityFamily(lender)) return await fetchLiquityMarkets(lender, chainId);
23875
24756
  if (isRiver(lender)) return await fetchRiverMarkets(lender, chainId);
23876
24757
  if (isTeller(lender)) return await fetchTellerMarkets(chainId);
24758
+ if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
24759
+ if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
23877
24760
  return {};
23878
24761
  }
23879
24762
  function convertLenderDataFromApi(lender, chainId, data, prices, additionalYields, list = {}) {
@@ -23927,6 +24810,22 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
23927
24810
  additionalYields,
23928
24811
  list
23929
24812
  );
24813
+ if (isInverse(lender))
24814
+ return convertInverseMarketsToResponse(
24815
+ data,
24816
+ chainId,
24817
+ prices,
24818
+ additionalYields,
24819
+ list
24820
+ );
24821
+ if (isTermMax(lender))
24822
+ return convertTermMaxMarketsToResponse(
24823
+ data,
24824
+ chainId,
24825
+ prices,
24826
+ additionalYields,
24827
+ list
24828
+ );
23930
24829
  return {};
23931
24830
  }
23932
24831
  var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYields, tokenList = async () => {
@@ -23967,7 +24866,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
23967
24866
  const listResult = settled[0];
23968
24867
  const list = listResult.status === "fulfilled" ? listResult.value : {};
23969
24868
  if (listResult.status === "rejected") {
23970
- warn3(
24869
+ warn4(
23971
24870
  `[lending] tokenList fetch failed on chain ${chainId}:`,
23972
24871
  listResult.reason
23973
24872
  );
@@ -23989,13 +24888,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
23989
24888
  if (converted[lk]) lenderData[lk] = converted[lk];
23990
24889
  }
23991
24890
  } catch (e) {
23992
- warn3(
24891
+ warn4(
23993
24892
  `[lending] Silo v2 API convert failed on chain ${chainId}:`,
23994
24893
  e?.message ?? e
23995
24894
  );
23996
24895
  }
23997
24896
  } else {
23998
- warn3(
24897
+ warn4(
23999
24898
  `[lending] Silo v2 API fetch failed on chain ${chainId}:`,
24000
24899
  siloV2Result.reason?.message ?? siloV2Result.reason
24001
24900
  );
@@ -24017,13 +24916,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
24017
24916
  if (converted[lk]) lenderData[lk] = converted[lk];
24018
24917
  }
24019
24918
  } catch (e) {
24020
- warn3(
24919
+ warn4(
24021
24920
  `[lending] Silo v3 API convert failed on chain ${chainId}:`,
24022
24921
  e?.message ?? e
24023
24922
  );
24024
24923
  }
24025
24924
  } else {
24026
- warn3(
24925
+ warn4(
24027
24926
  `[lending] Silo v3 API fetch failed on chain ${chainId}:`,
24028
24927
  siloV3Result.reason?.message ?? siloV3Result.reason
24029
24928
  );
@@ -24033,7 +24932,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
24033
24932
  try {
24034
24933
  const result = settled[i + 3];
24035
24934
  if (result.status === "rejected") {
24036
- warn3(
24935
+ warn4(
24037
24936
  `[lending] API fetch failed for ${otherLenders[i]} on chain ${chainId}:`,
24038
24937
  result.reason?.message ?? result.reason
24039
24938
  );
@@ -24077,13 +24976,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
24077
24976
  );
24078
24977
  for (const lk of dolomiteLenders) lenderData[lk] = converted;
24079
24978
  } catch (e) {
24080
- warn3(
24979
+ warn4(
24081
24980
  `[lending] Dolomite subgraph convert failed on chain ${chainId}:`,
24082
24981
  e?.message ?? e
24083
24982
  );
24084
24983
  }
24085
24984
  } else if (dolomiteResult.status === "rejected") {
24086
- warn3(
24985
+ warn4(
24087
24986
  `[lending] Dolomite subgraph fetch failed on chain ${chainId}:`,
24088
24987
  dolomiteResult.reason?.message ?? dolomiteResult.reason
24089
24988
  );
@@ -24091,7 +24990,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
24091
24990
  }
24092
24991
  return lenderData;
24093
24992
  };
24094
- var warn4 = (...args) => {
24993
+ var warn5 = (...args) => {
24095
24994
  };
24096
24995
  function lenderApiOnly(lender, chainId) {
24097
24996
  if (lender === Lender.MORPHO_BLUE) {
@@ -24153,7 +25052,7 @@ var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields,
24153
25052
  includeUnlistedMorphoMarkets
24154
25053
  );
24155
25054
  } catch (e) {
24156
- warn4(
25055
+ warn5(
24157
25056
  `[lending] API fetch failed for chain ${chainId}:`,
24158
25057
  e?.message ?? e
24159
25058
  );
@@ -24176,7 +25075,7 @@ var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields,
24176
25075
  tokenList
24177
25076
  );
24178
25077
  } catch (e) {
24179
- warn4(
25078
+ warn5(
24180
25079
  `[lending] on-chain fetch failed for chain ${chainId}:`,
24181
25080
  e?.message ?? e
24182
25081
  );
@@ -24777,8 +25676,8 @@ function getSubAccountAddress(owner, index) {
24777
25676
  const suffix = newLastByte.toString(16).padStart(2, "0");
24778
25677
  return (prefix + suffix).toLowerCase();
24779
25678
  }
24780
- function getSubAccountIndex(addr, owner) {
24781
- const addrLastByte = parseInt(addr.slice(40), 16);
25679
+ function getSubAccountIndex(addr2, owner) {
25680
+ const addrLastByte = parseInt(addr2.slice(40), 16);
24782
25681
  if (!owner) return addrLastByte;
24783
25682
  const ownerLastByte = parseInt(owner.slice(40), 16);
24784
25683
  return (addrLastByte ^ ownerLastByte) & 255;
@@ -25277,6 +26176,46 @@ var buildRiverUserCall = (chainId, lender, account) => {
25277
26176
  });
25278
26177
  return calls;
25279
26178
  };
26179
+ var INVERSE_CALLS_PER_MARKET = 4;
26180
+ var INVERSE_TAIL_CALLS = 3;
26181
+ var proxyInitCode = (impl) => concat([
26182
+ "0x3d602d80600a3d3981f3363d3d373d3d3d363d73",
26183
+ impl,
26184
+ "0x5af43d82803e903d91602b57fd5bf3"
26185
+ ]);
26186
+ function predictInverseEscrow(market, escrowImplementation, user) {
26187
+ return getContractAddress({
26188
+ opcode: "CREATE2",
26189
+ from: market,
26190
+ salt: pad(user, { size: 32 }),
26191
+ bytecodeHash: keccak256(proxyInitCode(escrowImplementation))
26192
+ });
26193
+ }
26194
+ var buildInverseUserCall = (chainId, lender, account) => {
26195
+ const cfg = inverseConfigFor(lender, chainId);
26196
+ const markets = inverseChainData(lender, chainId)?.markets ?? [];
26197
+ if (!cfg || markets.length === 0) return [];
26198
+ const calls = markets.flatMap((m) => [
26199
+ {
26200
+ address: predictInverseEscrow(
26201
+ m.address,
26202
+ m.escrowImplementation,
26203
+ account
26204
+ ),
26205
+ name: "balance",
26206
+ params: []
26207
+ },
26208
+ { address: m.address, name: "debts", params: [account] },
26209
+ { address: m.address, name: "getCreditLimit", params: [account] },
26210
+ { address: m.address, name: "getWithdrawalLimit", params: [account] }
26211
+ ]);
26212
+ calls.push(
26213
+ { address: cfg.dbr, name: "balanceOf", params: [account] },
26214
+ { address: cfg.dbr, name: "deficitOf", params: [account] },
26215
+ { address: cfg.dbr, name: "signedBalanceOf", params: [account] }
26216
+ );
26217
+ return calls;
26218
+ };
25280
26219
  var TELLER_CALLS_PER_BID = 4;
25281
26220
  var CACHE_TTL_MS2 = 5 * 6e4;
25282
26221
  var discoveryCache2 = /* @__PURE__ */ new Map();
@@ -25286,7 +26225,7 @@ var getCachedTellerBids = (chainId, account) => {
25286
26225
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
25287
26226
  return hit;
25288
26227
  };
25289
- var nowSec4 = () => Math.floor(Date.now() / 1e3);
26228
+ var nowSec5 = () => Math.floor(Date.now() / 1e3);
25290
26229
  var toBigints = (arr) => {
25291
26230
  if (!Array.isArray(arr)) return [];
25292
26231
  const out = [];
@@ -25352,7 +26291,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
25352
26291
  });
25353
26292
  discoveryCache2.set(cacheKey2(chainId, account), { bids: kept, at: Date.now() });
25354
26293
  if (kept.length === 0) return [];
25355
- const ts = nowSec4();
26294
+ const ts = nowSec5();
25356
26295
  const calls = [];
25357
26296
  for (const b of kept) {
25358
26297
  calls.push({ address: proto.tellerV2, name: "bids", params: [b.bidId] });
@@ -25374,6 +26313,40 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
25374
26313
  }
25375
26314
  return calls;
25376
26315
  };
26316
+ var TERMMAX_CALLS_PER_ACCOUNT = 1;
26317
+ var CACHE_TTL_MS3 = 5 * 6e4;
26318
+ var discoveryCache3 = /* @__PURE__ */ new Map();
26319
+ var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26320
+ var getCachedTermMaxDiscovery = (chainId, account) => {
26321
+ const hit = discoveryCache3.get(cacheKey3(chainId, account));
26322
+ if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
26323
+ return hit;
26324
+ };
26325
+ var buildTermMaxUserCall = async (chainId, _lender, account) => {
26326
+ const proto = termMaxConfigByChain(chainId);
26327
+ if (!proto?.viewer) return [];
26328
+ let markets = getCachedTermMaxMarkets(chainId);
26329
+ if (markets.length === 0) {
26330
+ try {
26331
+ markets = (await fetchTermMaxMarkets(chainId)).map((m) => m.config);
26332
+ } catch {
26333
+ return [];
26334
+ }
26335
+ }
26336
+ if (markets.length === 0) {
26337
+ discoveryCache3.set(cacheKey3(chainId, account), { markets: [], at: Date.now() });
26338
+ return [];
26339
+ }
26340
+ markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
26341
+ discoveryCache3.set(cacheKey3(chainId, account), { markets, at: Date.now() });
26342
+ return [
26343
+ {
26344
+ address: proto.viewer,
26345
+ name: "getPositionDetails",
26346
+ params: [markets.map((m) => m.market), account]
26347
+ }
26348
+ ];
26349
+ };
25377
26350
 
25378
26351
  // src/lending/user-data/fetch-balances/prepare.ts
25379
26352
  async function buildUserCall(chainId, lender, account, params, getClient) {
@@ -25396,6 +26369,8 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
25396
26369
  return buildLiquityUserCall(chainId, lender, account);
25397
26370
  if (isRiver(lender)) return buildRiverUserCall(chainId, lender, account);
25398
26371
  if (isTeller(lender)) return buildTellerUserCall(chainId, lender, account);
26372
+ if (isTermMax(lender)) return buildTermMaxUserCall(chainId, lender, account);
26373
+ if (isInverse(lender)) return buildInverseUserCall(chainId, lender, account);
25399
26374
  if (isCompoundV3Type(lender))
25400
26375
  return buildCompoundV3UserCall(chainId, lender, account);
25401
26376
  if (isEulerType(lender))
@@ -25423,10 +26398,11 @@ function organizeUserQueries(queries) {
25423
26398
  const liquity = queries.filter((q) => isLiquityFamily(q.lender));
25424
26399
  const river = queries.filter((q) => isRiver(q.lender));
25425
26400
  const teller = queries.filter((q) => isTeller(q.lender));
25426
- if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0)
26401
+ const termMax = queries.filter((q) => isTermMax(q.lender));
26402
+ if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0)
25427
26403
  return queries;
25428
26404
  const others = queries.filter(
25429
- (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender)
26405
+ (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender)
25430
26406
  );
25431
26407
  const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
25432
26408
  const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
@@ -25495,6 +26471,14 @@ function organizeUserQueries(queries) {
25495
26471
  assets: void 0
25496
26472
  });
25497
26473
  }
26474
+ if (termMax.length > 0) {
26475
+ result.push({
26476
+ lender: Lender.TERMMAX,
26477
+ account: termMax[0].account,
26478
+ params: termMax.map((p) => p.lender),
26479
+ assets: void 0
26480
+ });
26481
+ }
25498
26482
  if (liquity.length > 0) {
25499
26483
  for (const base of LIQUITY_FAMILY_LENDERS) {
25500
26484
  const members = liquity.filter((q) => q.lender.startsWith(base));
@@ -27294,7 +28278,7 @@ function toBigInt7(v) {
27294
28278
  }
27295
28279
  }
27296
28280
  var FLUID_EEE_LOWER2 = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
27297
- var normalizeUnderlying2 = (addr) => addr === FLUID_EEE_LOWER2 ? zeroAddress : addr;
28281
+ var normalizeUnderlying2 = (addr2) => addr2 === FLUID_EEE_LOWER2 ? zeroAddress : addr2;
27298
28282
  function toBigInt8(v) {
27299
28283
  if (v === void 0 || v === null || v === "0x") return 0n;
27300
28284
  if (typeof v === "bigint") return v;
@@ -27695,8 +28679,8 @@ var WETH_BY_CHAIN = {
27695
28679
  // populated by the meta's native handling; kept as a hook. Default: identity.
27696
28680
  };
27697
28681
  function normalizeUnderlying3(token) {
27698
- const lower = token.toLowerCase();
27699
- return Object.values(WETH_BY_CHAIN).includes(lower) ? zeroAddress : lower;
28682
+ const lower3 = token.toLowerCase();
28683
+ return Object.values(WETH_BY_CHAIN).includes(lower3) ? zeroAddress : lower3;
27700
28684
  }
27701
28685
  function toBigInt10(v) {
27702
28686
  if (v === void 0 || v === null || v === "0x") return 0n;
@@ -27961,7 +28945,7 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
27961
28945
  totalCalls
27962
28946
  ];
27963
28947
  };
27964
- var nowSec5 = () => Math.floor(Date.now() / 1e3);
28948
+ var nowSec6 = () => Math.floor(Date.now() / 1e3);
27965
28949
  function sumPreview(positions) {
27966
28950
  return positions.reduce((acc, p) => acc + p.previewValue, 0n);
27967
28951
  }
@@ -27983,7 +28967,7 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
27983
28967
  const res = data[0];
27984
28968
  if (!res || res === "0x" || !Array.isArray(res)) return void 0;
27985
28969
  const markets = res;
27986
- const now = nowSec5();
28970
+ const now = nowSec6();
27987
28971
  const out = {};
27988
28972
  for (const m of markets) {
27989
28973
  const lenderKey = exactlyLenderKey(m.market);
@@ -28151,7 +29135,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
28151
29135
  branches.forEach((branch, bi) => {
28152
29136
  const troves = discovery.perBranch[bi] ?? [];
28153
29137
  const callCount = liquityBranchCallCount(branch, troves.length);
28154
- const slice = data.slice(cursor, cursor + callCount);
29138
+ const slice2 = data.slice(cursor, cursor + callCount);
28155
29139
  cursor += callCount;
28156
29140
  const lenderKey = liquityLenderKey(lender, chainId, branch.collIndex);
28157
29141
  const metaMap = meta?.[lenderKey];
@@ -28172,8 +29156,8 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
28172
29156
  const modes = {};
28173
29157
  const hist = {};
28174
29158
  troves.forEach((t, ti) => {
28175
- const troveData = slice[ti * 2];
28176
- const ownerRaw = slice[ti * 2 + 1];
29159
+ const troveData = slice2[ti * 2];
29160
+ const ownerRaw = slice2[ti * 2 + 1];
28177
29161
  const owner = typeof ownerRaw === "string" ? ownerRaw.toLowerCase() : void 0;
28178
29162
  if (owner !== accountLower) return;
28179
29163
  if (!troveData || troveData === "0x") return;
@@ -28251,11 +29235,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
28251
29235
  };
28252
29236
  });
28253
29237
  const spBase = troves.length * 2;
28254
- const spDeposit = big(slice[spBase]);
28255
- const spYield = big(slice[spBase + 1]);
28256
- const spCollGain = big(slice[spBase + 2]);
28257
- const spStashed = big(slice[spBase + 3]);
28258
- const collSurplus = branch.collSurplusPool ? big(slice[spBase + 4]) : 0n;
29238
+ const spDeposit = big(slice2[spBase]);
29239
+ const spYield = big(slice2[spBase + 1]);
29240
+ const spCollGain = big(slice2[spBase + 2]);
29241
+ const spStashed = big(slice2[spBase + 3]);
29242
+ const collSurplus = branch.collSurplusPool ? big(slice2[spBase + 4]) : 0n;
28259
29243
  const spStable = spDeposit + spYield;
28260
29244
  const spColl = spCollGain + spStashed + collSurplus;
28261
29245
  if (spStable > 0n || spColl > 0n) {
@@ -28468,10 +29452,125 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
28468
29452
  expected
28469
29453
  ];
28470
29454
  };
29455
+ var big3 = (v) => {
29456
+ try {
29457
+ if (typeof v === "bigint") return v;
29458
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
29459
+ } catch {
29460
+ }
29461
+ return 0n;
29462
+ };
29463
+ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
29464
+ const cfg = inverseConfigFor(lender, chainId);
29465
+ const markets = inverseChainData(lender, chainId)?.markets ?? [];
29466
+ const expected = cfg && markets.length > 0 ? markets.length * INVERSE_CALLS_PER_MARKET + INVERSE_TAIL_CALLS : 0;
29467
+ return [
29468
+ (data) => {
29469
+ if (!cfg || expected === 0) return void 0;
29470
+ if (!data || data.length < expected) return void 0;
29471
+ const dolaAddr = cfg.dola.toLowerCase();
29472
+ const debtDecimals = cfg.debtDecimals ?? 18;
29473
+ const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
29474
+ const dbrBalance = big3(data[tailBase]);
29475
+ const dbrDeficit = big3(data[tailBase + 1]);
29476
+ const dbrSignedRaw = data[tailBase + 2];
29477
+ const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big3(dbrSignedRaw);
29478
+ const out = {};
29479
+ markets.forEach((market, i) => {
29480
+ const base = i * INVERSE_CALLS_PER_MARKET;
29481
+ const escrowBal = isFailedCall(data[base]) ? 0n : big3(data[base]);
29482
+ const debtRaw = data[base + 1];
29483
+ if (isFailedCall(debtRaw)) return;
29484
+ const debt = big3(debtRaw);
29485
+ if (escrowBal === 0n && debt === 0n) return;
29486
+ const creditLimit = isFailedCall(data[base + 2]) ? 0n : big3(data[base + 2]);
29487
+ const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big3(data[base + 3]);
29488
+ const lenderKey = inverseLenderKey(lender, market.address);
29489
+ const metaMap = meta?.[lenderKey];
29490
+ if (!metaMap) return;
29491
+ const collAddr = market.collToken.toLowerCase();
29492
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
29493
+ const loanUid = createMarketUid(chainId, lenderKey, dolaAddr);
29494
+ const collMeta = metaMap[collUid];
29495
+ const loanMeta = metaMap[loanUid];
29496
+ const collDecimals = collMeta?.asset?.decimals ?? market.collDecimals;
29497
+ const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
29498
+ const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
29499
+ const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
29500
+ const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
29501
+ const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
29502
+ const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
29503
+ const inverseInfo = {
29504
+ creditLimit: creditLimit.toString(),
29505
+ withdrawalLimit: withdrawalLimit.toString(),
29506
+ dbrBalance: dbrBalance.toString(),
29507
+ dbrDeficit: dbrDeficit.toString(),
29508
+ dbrSignedBalance: dbrSigned.toString()
29509
+ };
29510
+ const collStr = parseRawAmount(escrowBal.toString(), collDecimals);
29511
+ const collNum = Number(collStr);
29512
+ const debtStr = parseRawAmount(debt.toString(), debtDecimals);
29513
+ const debtNum = Number(debtStr);
29514
+ const lendingPositions = {
29515
+ "0": {
29516
+ [collUid]: {
29517
+ marketUid: collUid,
29518
+ underlying: collAddr,
29519
+ deposits: collStr,
29520
+ debt: "0",
29521
+ debtStable: "0",
29522
+ depositsUSD: collNum * collDisplay,
29523
+ debtUSD: 0,
29524
+ debtStableUSD: 0,
29525
+ depositsUSDOracle: collNum * collOracle,
29526
+ debtUSDOracle: 0,
29527
+ debtStableUSDOracle: 0,
29528
+ stableBorrowRate: "0",
29529
+ collateralEnabled: true,
29530
+ claimableRewards: 0
29531
+ },
29532
+ [loanUid]: {
29533
+ marketUid: loanUid,
29534
+ underlying: dolaAddr,
29535
+ deposits: "0",
29536
+ debt: debtStr,
29537
+ debtStable: "0",
29538
+ depositsUSD: 0,
29539
+ debtUSD: debtNum * loanDisplay,
29540
+ debtStableUSD: 0,
29541
+ depositsUSDOracle: 0,
29542
+ debtUSDOracle: debtNum * loanOracle,
29543
+ debtStableUSDOracle: 0,
29544
+ stableBorrowRate: "0",
29545
+ collateralEnabled: false,
29546
+ claimableRewards: 0,
29547
+ inverseInfo
29548
+ }
29549
+ }
29550
+ };
29551
+ const modes = { "0": 0 };
29552
+ const hist = {
29553
+ "0": {
29554
+ totalDeposits24h: collNum * collHist,
29555
+ totalDebt24h: debtNum * loanHist
29556
+ }
29557
+ };
29558
+ const userData = createMultiAccountTypeUserState(
29559
+ { chainId, account, lendingPositions, modes },
29560
+ metaMap,
29561
+ hist
29562
+ );
29563
+ if (userData && userData.data.length > 0) out[lenderKey] = userData;
29564
+ });
29565
+ return Object.keys(out).length > 0 ? out : void 0;
29566
+ },
29567
+ expected
29568
+ ];
29569
+ };
28471
29570
 
28472
29571
  // src/lending/user-data/teller/userCallParse.ts
28473
- var nowSec6 = () => Math.floor(Date.now() / 1e3);
28474
- var big3 = (v) => {
29572
+ var nowSec7 = () => Math.floor(Date.now() / 1e3);
29573
+ var big4 = (v) => {
28475
29574
  try {
28476
29575
  if (typeof v === "bigint") return v;
28477
29576
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -28487,13 +29586,13 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
28487
29586
  return [
28488
29587
  (data) => {
28489
29588
  if (expected === 0 || !data || data.length < expected) return void 0;
28490
- const now = nowSec6();
29589
+ const now = nowSec7();
28491
29590
  const perPool = {};
28492
29591
  kept.forEach((b, i) => {
28493
29592
  const base = i * TELLER_CALLS_PER_BID;
28494
29593
  const bidRes = data[base];
28495
29594
  const owed = data[base + 1];
28496
- const collAmount = big3(data[base + 2]);
29595
+ const collAmount = big4(data[base + 2]);
28497
29596
  const defaulted = !!data[base + 3];
28498
29597
  if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
28499
29598
  const pool = b.pool;
@@ -28514,17 +29613,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
28514
29613
  const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
28515
29614
  const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
28516
29615
  const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
28517
- const owedPrincipal = big3(field8(owed, "principal", 0));
28518
- const owedInterest = big3(field8(owed, "interest", 1));
29616
+ const owedPrincipal = big4(field8(owed, "principal", 0));
29617
+ const owedInterest = big4(field8(owed, "interest", 1));
28519
29618
  const owedTotal = owedPrincipal + owedInterest;
28520
29619
  if (owedTotal === 0n && collAmount === 0n) return;
28521
29620
  const loanDetails = field8(bidRes, "loanDetails", 5);
28522
29621
  const terms = field8(bidRes, "terms", 6);
28523
29622
  const acceptedTs = Number(
28524
- big3(field8(loanDetails, "acceptedTimestamp", 4))
29623
+ big4(field8(loanDetails, "acceptedTimestamp", 4))
28525
29624
  );
28526
- const loanDuration = Number(big3(field8(loanDetails, "loanDuration", 6)));
28527
- const aprBps = Number(big3(field8(terms, "APR", 2)));
29625
+ const loanDuration = Number(big4(field8(loanDetails, "loanDuration", 6)));
29626
+ const aprBps = Number(big4(field8(terms, "APR", 2)));
28528
29627
  const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
28529
29628
  const isMatured = defaulted || maturity !== void 0 && maturity < now;
28530
29629
  const collStr = parseRawAmount(collAmount.toString(), collDecimals);
@@ -28612,6 +29711,179 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
28612
29711
  expected
28613
29712
  ];
28614
29713
  };
29714
+ var nowSec8 = () => Math.floor(Date.now() / 1e3);
29715
+ function toBigInt12(v) {
29716
+ if (v === void 0 || v === null || v === "0x") return 0n;
29717
+ if (typeof v === "bigint") return v;
29718
+ try {
29719
+ return BigInt(v);
29720
+ } catch {
29721
+ return 0n;
29722
+ }
29723
+ }
29724
+ function field9(res, name, index) {
29725
+ if (res && typeof res === "object" && !Array.isArray(res) && name in res) {
29726
+ return res[name];
29727
+ }
29728
+ if (Array.isArray(res)) return res[index];
29729
+ return void 0;
29730
+ }
29731
+ function parsePosition(res) {
29732
+ const ftBalance = toBigInt12(field9(res, "ftBalance", 2));
29733
+ const xtBalance = toBigInt12(field9(res, "xtBalance", 3));
29734
+ const rawGts = field9(res, "gtInfo", 4);
29735
+ const gts = [];
29736
+ if (Array.isArray(rawGts)) {
29737
+ for (const g of rawGts) {
29738
+ const loanId = toBigInt12(field9(g, "loanId", 0));
29739
+ if (loanId === 0n) continue;
29740
+ gts.push({
29741
+ loanId: loanId.toString(),
29742
+ collateralAmt: toBigInt12(field9(g, "collateralAmt", 1)),
29743
+ debtAmt: toBigInt12(field9(g, "debtAmt", 2))
29744
+ });
29745
+ }
29746
+ }
29747
+ return { ftBalance, xtBalance, gts };
29748
+ }
29749
+ var getTermMaxUserDataConverter = (_lender, chainId, account, meta) => {
29750
+ const discovery = getCachedTermMaxDiscovery(chainId, account);
29751
+ const markets = discovery?.markets ?? [];
29752
+ const expected = markets.length > 0 ? TERMMAX_CALLS_PER_ACCOUNT : 0;
29753
+ return [
29754
+ (data) => {
29755
+ if (expected === 0) return void 0;
29756
+ if (!data || data.length < expected) return void 0;
29757
+ const positions = data[0];
29758
+ if (!Array.isArray(positions)) return void 0;
29759
+ const now = nowSec8();
29760
+ const out = {};
29761
+ markets.forEach((market, i) => {
29762
+ const parsed = parsePosition(positions[i]);
29763
+ if (!parsed) return;
29764
+ if (parsed.ftBalance === 0n && parsed.gts.length === 0) return;
29765
+ const lenderKey = termMaxLenderKey(market.market);
29766
+ const metaMap = meta?.[lenderKey];
29767
+ if (!metaMap) return;
29768
+ const loanAddr = market.debtToken.toLowerCase();
29769
+ const collAddr = market.collateral.toLowerCase();
29770
+ const loanUid = createMarketUid(chainId, lenderKey, loanAddr);
29771
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
29772
+ const loanMeta = metaMap[loanUid];
29773
+ const collMeta = metaMap[collUid];
29774
+ const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
29775
+ const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
29776
+ const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
29777
+ const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
29778
+ const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
29779
+ const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
29780
+ const loanDec = loanMeta?.asset?.decimals ?? market.debtDecimals;
29781
+ const collDec = collMeta?.asset?.decimals ?? market.collateralDecimals;
29782
+ const maturity = Number(market.maturity);
29783
+ const isMatured = maturity > 0 && maturity <= now;
29784
+ const positionsByAccount = {};
29785
+ const modes = {};
29786
+ const hist = {};
29787
+ if (parsed.ftBalance > 0n) {
29788
+ const ftStr = parseRawAmount(parsed.ftBalance.toString(), loanDec);
29789
+ const ftNum = Number(ftStr);
29790
+ positionsByAccount["0"] = {
29791
+ [loanUid]: {
29792
+ marketUid: loanUid,
29793
+ underlying: loanAddr,
29794
+ deposits: ftStr,
29795
+ debt: "0",
29796
+ debtStable: "0",
29797
+ depositsUSD: ftNum * loanDisplay,
29798
+ debtUSD: 0,
29799
+ debtStableUSD: 0,
29800
+ depositsUSDOracle: ftNum * loanOracle,
29801
+ debtUSDOracle: 0,
29802
+ debtStableUSDOracle: 0,
29803
+ stableBorrowRate: "0",
29804
+ // A TermMax lend position never collateralizes a borrow.
29805
+ collateralEnabled: false,
29806
+ claimableRewards: 0
29807
+ }
29808
+ };
29809
+ modes["0"] = 0;
29810
+ hist["0"] = { totalDeposits24h: ftNum * loanHist, totalDebt24h: 0 };
29811
+ }
29812
+ for (const gt of parsed.gts) {
29813
+ const collStr = parseRawAmount(gt.collateralAmt.toString(), collDec);
29814
+ const collNum = Number(collStr);
29815
+ const debtStr = parseRawAmount(gt.debtAmt.toString(), loanDec);
29816
+ const debtNum = Number(debtStr);
29817
+ if (gt.collateralAmt === 0n && gt.debtAmt === 0n) continue;
29818
+ positionsByAccount[gt.loanId] = {
29819
+ [collUid]: {
29820
+ marketUid: collUid,
29821
+ underlying: collAddr,
29822
+ deposits: collStr,
29823
+ debt: "0",
29824
+ debtStable: "0",
29825
+ depositsUSD: collNum * collDisplay,
29826
+ debtUSD: 0,
29827
+ debtStableUSD: 0,
29828
+ depositsUSDOracle: collNum * collOracle,
29829
+ debtUSDOracle: 0,
29830
+ debtStableUSDOracle: 0,
29831
+ stableBorrowRate: "0",
29832
+ collateralEnabled: true,
29833
+ claimableRewards: 0
29834
+ },
29835
+ [loanUid]: {
29836
+ marketUid: loanUid,
29837
+ underlying: loanAddr,
29838
+ deposits: "0",
29839
+ debt: "0",
29840
+ // Fixed-term debt → stable slot (Exactly / Lista / Teller convention).
29841
+ debtStable: debtStr,
29842
+ depositsUSD: 0,
29843
+ debtUSD: 0,
29844
+ debtStableUSD: debtNum * loanDisplay,
29845
+ depositsUSDOracle: 0,
29846
+ debtUSDOracle: 0,
29847
+ debtStableUSDOracle: debtNum * loanOracle,
29848
+ stableBorrowRate: "0",
29849
+ collateralEnabled: false,
29850
+ claimableRewards: 0,
29851
+ // Fixed-term loan detail. `loanId` = the gtId, which is the target
29852
+ // of every write op (repay / removeCollateral / …). Debt is a
29853
+ // STATIC face value: nothing accrues, so no accruedInterest.
29854
+ term: {
29855
+ loanId: gt.loanId,
29856
+ isDynamic: false,
29857
+ debt: debtStr,
29858
+ maturity: maturity || void 0,
29859
+ isMatured
29860
+ }
29861
+ }
29862
+ };
29863
+ modes[gt.loanId] = 0;
29864
+ hist[gt.loanId] = {
29865
+ totalDeposits24h: collNum * collHist,
29866
+ totalDebt24h: debtNum * loanHist
29867
+ };
29868
+ }
29869
+ if (Object.keys(positionsByAccount).length === 0) return;
29870
+ const userData = createMultiAccountTypeUserState(
29871
+ {
29872
+ chainId,
29873
+ account,
29874
+ lendingPositions: positionsByAccount,
29875
+ modes
29876
+ },
29877
+ metaMap,
29878
+ hist
29879
+ );
29880
+ if (userData && userData.data.length > 0) out[lenderKey] = userData;
29881
+ });
29882
+ return Object.keys(out).length > 0 ? out : void 0;
29883
+ },
29884
+ expected
29885
+ ];
29886
+ };
28615
29887
 
28616
29888
  // src/lending/user-data/fetch-balances/parse.ts
28617
29889
  function getUserDataConverter(lender, chainId, account, params, meta) {
@@ -28645,6 +29917,10 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
28645
29917
  return getRiverUserDataConverter(lender, chainId, account, meta);
28646
29918
  if (isTeller(lender))
28647
29919
  return getTellerUserDataConverter(lender, chainId, account, meta);
29920
+ if (isTermMax(lender))
29921
+ return getTermMaxUserDataConverter(lender, chainId, account, meta);
29922
+ if (isInverse(lender))
29923
+ return getInverseUserDataConverter(lender, chainId, account, meta);
28648
29924
  if (isCompoundV3Type(lender))
28649
29925
  return getCompoundV3UserDataConverter(
28650
29926
  lender,
@@ -33242,6 +34518,8 @@ var getAbi2 = (lender) => {
33242
34518
  return [...RiverTroveManagerAbi, ...RiverStabilityPoolAbi];
33243
34519
  if (isTeller(lender))
33244
34520
  return [...TellerV2Abi, ...TellerCollateralManagerAbi];
34521
+ if (isInverse(lender))
34522
+ return [...InverseMarketAbi, ...InverseEscrowAbi, ...InverseDbrAbi];
33245
34523
  if (isInit(lender)) return InitLensAbi;
33246
34524
  if (isEulerType(lender)) return accountLensAbi;
33247
34525
  if (isCompoundV2Type(lender))
@@ -33798,7 +35076,7 @@ var MORPHO_API_CHAIN_IDS = {
33798
35076
  [Chain.UNICHAIN]: 130
33799
35077
  };
33800
35078
  var FETCH_TIMEOUT_MS = 3e3;
33801
- var CACHE_TTL_MS3 = 2e3;
35079
+ var CACHE_TTL_MS4 = 2e3;
33802
35080
  var buildSubgraphQuery = (account) => `
33803
35081
  {
33804
35082
  account(id: "${account.toLowerCase()}") {
@@ -33853,11 +35131,11 @@ async function fetchJsonWithProxyFallback(url, body, proxyConfig) {
33853
35131
  }
33854
35132
  var inflight = /* @__PURE__ */ new Map();
33855
35133
  var resolved = /* @__PURE__ */ new Map();
33856
- function cacheKey3(chainId, account) {
35134
+ function cacheKey4(chainId, account) {
33857
35135
  return `${chainId}:${account.toLowerCase()}`;
33858
35136
  }
33859
35137
  async function dedupedFetch(chainId, account, loader) {
33860
- const key = cacheKey3(chainId, account);
35138
+ const key = cacheKey4(chainId, account);
33861
35139
  const now = Date.now();
33862
35140
  const cached = resolved.get(key);
33863
35141
  if (cached && cached.expiresAt > now) {
@@ -33866,7 +35144,7 @@ async function dedupedFetch(chainId, account, loader) {
33866
35144
  const existing = inflight.get(key);
33867
35145
  if (existing) return existing;
33868
35146
  const promise = loader().then((value) => {
33869
- resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS3 });
35147
+ resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS4 });
33870
35148
  return value;
33871
35149
  }).finally(() => {
33872
35150
  inflight.delete(key);
@@ -33998,8 +35276,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
33998
35276
  return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
33999
35277
  }
34000
35278
  function calculateWeightedAprs(items) {
34001
- const wa = (field9, weightField) => calculateWeightedAverage(
34002
- items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field9], weight: Math.abs(i[weightField]) }))
35279
+ const wa = (field10, weightField) => calculateWeightedAverage(
35280
+ items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field10], weight: Math.abs(i[weightField]) }))
34003
35281
  );
34004
35282
  return {
34005
35283
  apr: wa("apr", "nav"),
@@ -35743,8 +37021,8 @@ var TIMEOUT_MS = 8e3;
35743
37021
  var slisBnbFetcher = {
35744
37022
  label: "SLISBNB",
35745
37023
  fetch: async () => {
35746
- const nowSec7 = Math.floor(Date.now() / 1e3);
35747
- const url = `${HISTORY_URL}?name=slisBNBRate&cycle=1&startTime=${nowSec7 - LOOKBACK_SECONDS}&endTime=${nowSec7}`;
37024
+ const nowSec9 = Math.floor(Date.now() / 1e3);
37025
+ const url = `${HISTORY_URL}?name=slisBNBRate&cycle=1&startTime=${nowSec9 - LOOKBACK_SECONDS}&endTime=${nowSec9}`;
35748
37026
  const controller = new AbortController();
35749
37027
  const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
35750
37028
  try {
@@ -38338,6 +39616,40 @@ var rwaFundsFetcher = {
38338
39616
  }
38339
39617
  };
38340
39618
 
39619
+ // src/yields/intrinsic/fetchers/inverse.ts
39620
+ var DOLA_STAKING_URL = "https://www.inverse.finance/api/dola-staking";
39621
+ var JDOLA_STAKING_URL = "https://www.inverse.finance/api/junior/jdola-staking";
39622
+ var SDOLA_KEY = "SDOLA";
39623
+ var SDOLA_GROUP_KEY = "sDOLA::SDOLA";
39624
+ var fetchJson2 = async (url) => {
39625
+ const res = await fetch(url, {
39626
+ headers: { accept: "application/json" },
39627
+ signal: AbortSignal.timeout(8e3)
39628
+ });
39629
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
39630
+ return res.json();
39631
+ };
39632
+ var fetchSdolaApyPercent = async () => {
39633
+ try {
39634
+ const d = await fetchJson2(DOLA_STAKING_URL);
39635
+ const apy = Number(d?.calculatedApy);
39636
+ if (Number.isFinite(apy) && apy > 0) return apy;
39637
+ throw new Error("calculatedApy missing");
39638
+ } catch {
39639
+ const d = await fetchJson2(JDOLA_STAKING_URL);
39640
+ const apy = Number(d?.sDolaApy);
39641
+ if (Number.isFinite(apy) && apy > 0) return apy;
39642
+ throw new Error("sDolaApy missing");
39643
+ }
39644
+ };
39645
+ var sdolaFetcher = {
39646
+ label: "SDOLA",
39647
+ fetch: async () => {
39648
+ const apr = apyToAprPercent(await fetchSdolaApyPercent());
39649
+ return { [SDOLA_KEY]: apr, [SDOLA_GROUP_KEY]: apr };
39650
+ }
39651
+ };
39652
+
38341
39653
  // src/yields/intrinsic/fetchers/reProtocol.ts
38342
39654
  var REUSD_KEY = "RE::reUSD";
38343
39655
  var REUSDE_KEY = "RE::reUSDe";
@@ -39848,6 +41160,27 @@ var SINGLE_CHAIN_ENTRIES = {
39848
41160
  yieldFetcher: fraxSavingsFetcher,
39849
41161
  yieldKey: "SFRAX"
39850
41162
  },
41163
+ {
41164
+ // Inverse sDOLA — 4626 auto-compounder over the DOLA Savings
41165
+ // Account; yield is FiRM's DBR revenue via a continuous on-chain
41166
+ // auction, no rehypothecation. Instant permissionless exit
41167
+ // (maxDeposit = uint.max verified 2026-08; ~6.9M DOLA TVL).
41168
+ // Ethereum-only; Inverse propagates the rate cross-chain via
41169
+ // CCIP, so bridged deployments may appear later. The jDOLA
41170
+ // junior tranche (48h exit window + fee, ~$28k) is deliberately
41171
+ // not registered.
41172
+ address: "0xb45ad160634c528cc3d2926d9807104fa3157305",
41173
+ underlying: "0x865377367054516e17014ccded1e7d814edc9ce4",
41174
+ // DOLA
41175
+ symbol: "sDOLA",
41176
+ brand: "Inverse",
41177
+ decimals: 18,
41178
+ isRebasing: false,
41179
+ isMintable: true,
41180
+ withdrawalMode: "instant",
41181
+ yieldFetcher: sdolaFetcher,
41182
+ yieldKey: SDOLA_GROUP_KEY
41183
+ },
39851
41184
  {
39852
41185
  address: "0x83f20f44975d03b1b09e64809b757c47f942beea",
39853
41186
  underlying: "0x6b175474e89094c44da98b954eedeac495271d0f",
@@ -40382,13 +41715,13 @@ var gmxFetcher = {
40382
41715
  fetch: async () => {
40383
41716
  const { apy } = await fetchGmxRawData(GMX_CHAIN, GMX_DEFAULT_APY_PERIOD);
40384
41717
  const rData = {};
40385
- for (const [addr, d] of Object.entries(apy.markets ?? {})) {
40386
- const a = addr.toLowerCase();
41718
+ for (const [addr2, d] of Object.entries(apy.markets ?? {})) {
41719
+ const a = addr2.toLowerCase();
40387
41720
  if (a === gmx_eth_usd_address) rData[gmx_eth_usd] = apyToApr(d.apy) * 100;
40388
41721
  if (a === gmx_btc_usd_address) rData[gmx_btc_usd] = apyToApr(d.apy) * 100;
40389
41722
  }
40390
- for (const [addr, d] of Object.entries(apy.glvs ?? {})) {
40391
- const a = addr.toLowerCase();
41723
+ for (const [addr2, d] of Object.entries(apy.glvs ?? {})) {
41724
+ const a = addr2.toLowerCase();
40392
41725
  if (a === glv_wbtc_usdc_address)
40393
41726
  rData[glv_wbtc_usdc] = apyToApr(d.apy) * 100;
40394
41727
  if (a === glv_weth_usdc_address)
@@ -40872,8 +42205,8 @@ var yearnKatanaFetcher = {
40872
42205
  YEARN_KATANA_URL
40873
42206
  ).then((r) => r.json());
40874
42207
  let map = {};
40875
- Object.entries(res).forEach(([addr, data]) => {
40876
- const key = addressToAssetYearn[addr.toLowerCase()];
42208
+ Object.entries(res).forEach(([addr2, data]) => {
42209
+ const key = addressToAssetYearn[addr2.toLowerCase()];
40877
42210
  if (key) {
40878
42211
  const apr = ((data.apr.netAPR ?? 0) + (data.apr.extra?.extrinsicYield ?? 0) + (data.apr.extra?.katanaNativeYield ?? 0)) * 100;
40879
42212
  map[key] = apr;
@@ -42041,6 +43374,76 @@ var riverFetcher = {
42041
43374
  parse: parseRiverResults,
42042
43375
  getAbi: getRiverAbi
42043
43376
  };
43377
+ function getInverseCalls(chainId) {
43378
+ const results = [];
43379
+ for (const lender of inverseLendersByChain(chainId)) {
43380
+ const config = inverseConfigFor(lender, chainId);
43381
+ const markets = inverseChainData(lender, chainId)?.markets ?? [];
43382
+ if (!config?.oracle || markets.length === 0) continue;
43383
+ for (const m of markets) {
43384
+ if (!m.address || !m.collToken) continue;
43385
+ const calls = [
43386
+ {
43387
+ address: config.oracle,
43388
+ name: "viewPrice",
43389
+ params: [m.collToken, BigInt(m.collateralFactorBps)]
43390
+ }
43391
+ ];
43392
+ results.push({
43393
+ calls,
43394
+ meta: {
43395
+ lender,
43396
+ chainId,
43397
+ market: m.address.toLowerCase(),
43398
+ collToken: m.collToken.toLowerCase(),
43399
+ collDecimals: m.collDecimals,
43400
+ dola: config.dola?.toLowerCase()
43401
+ },
43402
+ lender: inverseLenderKey(lender, m.address)
43403
+ });
43404
+ }
43405
+ }
43406
+ return results;
43407
+ }
43408
+ function parseInverseResults(data, meta, context) {
43409
+ const { chainId } = context;
43410
+ const key = inverseLenderKey(meta.lender, meta.market);
43411
+ const entries = [];
43412
+ const raw = data?.[0];
43413
+ const price2 = typeof raw === "bigint" ? raw : raw != null && raw !== "0x" ? BigInt(raw) : 0n;
43414
+ const collUSD = Number(price2) / 10 ** (36 - meta.collDecimals);
43415
+ if (collUSD > 0 && collUSD < 1e9) {
43416
+ entries.push({
43417
+ asset: meta.collToken,
43418
+ price: collUSD,
43419
+ priceUSD: collUSD,
43420
+ marketUid: createMarketUid(chainId, key, meta.collToken),
43421
+ targetLender: key,
43422
+ description: "Inverse FiRM pessimistic oracle (USD, ~2-day low)"
43423
+ });
43424
+ }
43425
+ if (meta.dola) {
43426
+ entries.push({
43427
+ asset: meta.dola,
43428
+ price: 1,
43429
+ priceUSD: 1,
43430
+ marketUid: createMarketUid(chainId, key, meta.dola),
43431
+ targetLender: key,
43432
+ description: "Inverse DOLA (par)",
43433
+ staticBase: true,
43434
+ baseAsset: meta.dola
43435
+ });
43436
+ }
43437
+ return entries;
43438
+ }
43439
+ function getInverseAbi() {
43440
+ return InverseOracleAbi;
43441
+ }
43442
+ var inverseFetcher = {
43443
+ getCalls: getInverseCalls,
43444
+ parse: parseInverseResults,
43445
+ getAbi: getInverseAbi
43446
+ };
42044
43447
  function getTellerCalls(chainId) {
42045
43448
  const pools = tellerPoolsByChain(chainId);
42046
43449
  if (pools.length === 0) return [];
@@ -42075,9 +43478,9 @@ function parseTellerResults(data, meta, context) {
42075
43478
  const principal = meta.principal;
42076
43479
  const collateral = meta.collateral;
42077
43480
  const lenderKey = tellerLenderKey(meta.pool);
42078
- const usdOf = (addr) => {
42079
- const key = tokenList?.[addr]?.assetGroup ?? `${chainId}-${addr}`;
42080
- return usdPrices[key] ?? usdPrices[addr];
43481
+ const usdOf = (addr2) => {
43482
+ const key = tokenList?.[addr2]?.assetGroup ?? `${chainId}-${addr2}`;
43483
+ return usdPrices[key] ?? usdPrices[addr2];
42081
43484
  };
42082
43485
  const principalUSD = usdOf(principal);
42083
43486
  const collateralUSD = usdOf(collateral);
@@ -42143,6 +43546,86 @@ var tellerFetcher = {
42143
43546
  parse: parseTellerResults,
42144
43547
  getAbi: getTellerAbi
42145
43548
  };
43549
+ function getTermMaxCalls(chainId) {
43550
+ const proto = termMaxConfigByChain(chainId);
43551
+ if (!proto?.oracleAggregatorV2) return [];
43552
+ const markets = getCachedTermMaxMarkets(chainId);
43553
+ if (markets.length === 0) return [];
43554
+ const oracle = proto.oracleAggregatorV2;
43555
+ const results = [];
43556
+ for (const m of markets) {
43557
+ if (!m.market || !m.debtToken || !m.collateral) continue;
43558
+ const calls = [
43559
+ { address: oracle, name: "getPrice", params: [m.debtToken] },
43560
+ { address: oracle, name: "getPrice", params: [m.collateral] }
43561
+ ];
43562
+ results.push({
43563
+ calls,
43564
+ meta: {
43565
+ market: m.market.toLowerCase(),
43566
+ debtToken: m.debtToken.toLowerCase(),
43567
+ collateral: m.collateral.toLowerCase()
43568
+ },
43569
+ lender: termMaxLenderKey(m.market)
43570
+ });
43571
+ }
43572
+ return results;
43573
+ }
43574
+ function readUsdPrice(res) {
43575
+ if (res == null || res === "0x") return void 0;
43576
+ let raw;
43577
+ let dec;
43578
+ if (Array.isArray(res)) {
43579
+ raw = res[0];
43580
+ dec = res[1];
43581
+ } else if (typeof res === "object") {
43582
+ raw = res.price;
43583
+ dec = res.decimals;
43584
+ } else {
43585
+ return void 0;
43586
+ }
43587
+ let price2;
43588
+ try {
43589
+ price2 = BigInt(raw);
43590
+ } catch {
43591
+ return void 0;
43592
+ }
43593
+ if (price2 <= 0n) return void 0;
43594
+ const decimals = Number(dec);
43595
+ if (!Number.isFinite(decimals) || decimals < 0 || decimals > 36) return void 0;
43596
+ const usd = Number(price2) / 10 ** decimals;
43597
+ return Number.isFinite(usd) && usd > 0 ? usd : void 0;
43598
+ }
43599
+ function parseTermMaxResults(data, meta, context) {
43600
+ const { chainId } = context;
43601
+ const lenderKey = termMaxLenderKey(meta.market);
43602
+ const entries = [];
43603
+ const legs = [
43604
+ [meta.debtToken, data?.[0], "TermMax oracle (debt asset)"],
43605
+ [meta.collateral, data?.[1], "TermMax oracle (collateral)"]
43606
+ ];
43607
+ for (const [asset, res, description] of legs) {
43608
+ const usd = readUsdPrice(res);
43609
+ if (usd === void 0) continue;
43610
+ entries.push({
43611
+ asset,
43612
+ price: usd,
43613
+ priceUSD: usd,
43614
+ marketUid: createMarketUid(chainId, lenderKey, asset),
43615
+ targetLender: lenderKey,
43616
+ description
43617
+ });
43618
+ }
43619
+ return entries;
43620
+ }
43621
+ function getTermMaxAbi() {
43622
+ return TermMaxOracleAggregatorV2Abi;
43623
+ }
43624
+ var termMaxFetcher = {
43625
+ getCalls: getTermMaxCalls,
43626
+ parse: parseTermMaxResults,
43627
+ getAbi: getTermMaxAbi
43628
+ };
42146
43629
  var CompoundV2OracleAbi = [
42147
43630
  {
42148
43631
  inputs: [{ internalType: "address", name: "cToken", type: "address" }],
@@ -42482,8 +43965,8 @@ var priceLensAbi = [
42482
43965
  // src/prices/oracle-prices/fetchers/euler.ts
42483
43966
  var MAX_VIRTUAL_ADDRESS = 65535;
42484
43967
  var MAX_SANE_PRICE_USD = 1e7;
42485
- function isUsdUnitOfAccount(addr) {
42486
- const numeric = parseInt(addr, 16);
43968
+ function isUsdUnitOfAccount(addr2) {
43969
+ const numeric = parseInt(addr2, 16);
42487
43970
  return numeric <= MAX_VIRTUAL_ADDRESS;
42488
43971
  }
42489
43972
  var PRICE_LENS_ADDRESS = "0x6392892f3C57c658d2c748fc64c6fe57680E889F";
@@ -43041,7 +44524,7 @@ var siloV3Fetcher = {
43041
44524
  getAbi: getSiloV3Abi
43042
44525
  };
43043
44526
  var FLUID_EEE_LOWER3 = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
43044
- var normalizeUnderlying4 = (addr) => addr === FLUID_EEE_LOWER3 ? zeroAddress : addr;
44527
+ var normalizeUnderlying4 = (addr2) => addr2 === FLUID_EEE_LOWER3 ? zeroAddress : addr2;
43045
44528
  function priceColInDebt(raw, colDec, debtDec) {
43046
44529
  return formatMorphoPrice(raw, debtDec, colDec + 9);
43047
44530
  }
@@ -43699,8 +45182,6 @@ function resolveDerivation(entry, groupDefault) {
43699
45182
  if (entry.baseAsset && !entry.staticBase) return "quoted";
43700
45183
  return groupDefault ?? "direct";
43701
45184
  }
43702
-
43703
- // src/prices/oracle-prices/fetchOraclePrices.ts
43704
45185
  function countFailures(data, offset, count) {
43705
45186
  let failures = 0;
43706
45187
  for (let i = offset; i < offset + count; i++) {
@@ -43812,6 +45293,9 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
43812
45293
  const multicallErrors = [];
43813
45294
  const active = onlyFetchers ? new Set(onlyFetchers.map((f) => f.toLowerCase())) : null;
43814
45295
  const isActive = (name) => !active || active.has(name);
45296
+ if (isActive("termmax") && termMaxConfigByChain(chainId)) {
45297
+ await fetchTermMaxMarkets(chainId).catch(() => []);
45298
+ }
43815
45299
  const aaveResults = isActive("aave") ? safeGetCalls(
43816
45300
  "aave",
43817
45301
  () => aaveFetcher.getCalls(chainId),
@@ -43881,11 +45365,21 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
43881
45365
  () => riverFetcher.getCalls(chainId),
43882
45366
  getCallsErrors
43883
45367
  ) : [];
45368
+ const inverseResults = isActive("inverse") ? safeGetCalls(
45369
+ "inverse",
45370
+ () => inverseFetcher.getCalls(chainId),
45371
+ getCallsErrors
45372
+ ) : [];
43884
45373
  const tellerResults = isActive("teller") ? safeGetCalls(
43885
45374
  "teller",
43886
45375
  () => tellerFetcher.getCalls(chainId),
43887
45376
  getCallsErrors
43888
45377
  ) : [];
45378
+ const termMaxResults = isActive("termmax") ? safeGetCalls(
45379
+ "termmax",
45380
+ () => termMaxFetcher.getCalls(chainId),
45381
+ getCallsErrors
45382
+ ) : [];
43889
45383
  const siloV2Results = isActive("silov2") ? safeGetCalls(
43890
45384
  "siloV2",
43891
45385
  () => siloV2Fetcher.getCalls(chainId),
@@ -43995,6 +45489,13 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
43995
45489
  getRiverAbi(),
43996
45490
  "direct"
43997
45491
  );
45492
+ const inverseGroup = buildGroup(
45493
+ "inverse",
45494
+ inverseResults,
45495
+ inverseFetcher.parse,
45496
+ getInverseAbi(),
45497
+ "direct"
45498
+ );
43998
45499
  const tellerGroup = buildGroup(
43999
45500
  "teller",
44000
45501
  tellerResults,
@@ -44002,6 +45503,15 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44002
45503
  getTellerAbi(),
44003
45504
  "derived"
44004
45505
  );
45506
+ const termMaxGroup = buildGroup(
45507
+ "termmax",
45508
+ termMaxResults,
45509
+ termMaxFetcher.parse,
45510
+ getTermMaxAbi(),
45511
+ // DIRECT: `OracleAggregatorV2.getPrice` returns a USD price outright —
45512
+ // nothing is derived from another asset's price.
45513
+ "direct"
45514
+ );
44005
45515
  const siloV2Group = buildGroup(
44006
45516
  "siloV2",
44007
45517
  siloV2Results,
@@ -44050,7 +45560,9 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44050
45560
  termGroup,
44051
45561
  liquityGroup,
44052
45562
  riverGroup,
45563
+ inverseGroup,
44053
45564
  tellerGroup,
45565
+ termMaxGroup,
44054
45566
  siloV2Group,
44055
45567
  siloV3Group,
44056
45568
  fluidGroup,
@@ -44096,7 +45608,9 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44096
45608
  termData,
44097
45609
  liquityData,
44098
45610
  riverData,
45611
+ inverseData,
44099
45612
  tellerData,
45613
+ termMaxData,
44100
45614
  morphoGqlEntries,
44101
45615
  siloV2GqlEntries,
44102
45616
  siloV3GqlEntries
@@ -44213,6 +45727,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44213
45727
  allowFailure,
44214
45728
  rpcOverrides
44215
45729
  ),
45730
+ executeGroup(
45731
+ inverseGroup,
45732
+ chainId,
45733
+ chainBatchSize,
45734
+ retries,
45735
+ allowFailure,
45736
+ rpcOverrides
45737
+ ),
44216
45738
  executeGroup(
44217
45739
  tellerGroup,
44218
45740
  chainId,
@@ -44221,6 +45743,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44221
45743
  allowFailure,
44222
45744
  rpcOverrides
44223
45745
  ),
45746
+ executeGroup(
45747
+ termMaxGroup,
45748
+ chainId,
45749
+ chainBatchSize,
45750
+ retries,
45751
+ allowFailure,
45752
+ rpcOverrides
45753
+ ),
44224
45754
  morphoGqlPromise,
44225
45755
  siloV2GqlPromise,
44226
45756
  siloV3GqlPromise
@@ -44273,6 +45803,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44273
45803
  { group: dolomiteGroup, data: dolomiteData },
44274
45804
  { group: midnightGroup, data: midnightData },
44275
45805
  { group: tellerGroup, data: tellerData },
45806
+ { group: termMaxGroup, data: termMaxData },
44276
45807
  ...siloV2GqlEntries != null ? [] : [{ group: siloV2Group, data: siloV2Data }],
44277
45808
  ...siloV3GqlEntries != null ? [] : [{ group: siloV3Group, data: siloV3Data }],
44278
45809
  // In hybrid mode the on-chain multicall ran too — surface its errors.
@@ -44332,6 +45863,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44332
45863
  parseTrackers(listaGroup, listaData.results);
44333
45864
  parseTrackers(eulerGroup, eulerData.results);
44334
45865
  parseTrackers(aaveV4Group, aaveV4Data.results);
45866
+ parseTrackers(termMaxGroup, termMaxData.results);
44335
45867
  parseTrackers(
44336
45868
  aaveGroup,
44337
45869
  aaveData.results,
@@ -44345,6 +45877,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
44345
45877
  parseTrackers(termGroup, termData.results);
44346
45878
  parseTrackers(liquityGroup, liquityData.results);
44347
45879
  parseTrackers(riverGroup, riverData.results);
45880
+ parseTrackers(inverseGroup, inverseData.results);
44348
45881
  if (siloV2GqlEntries != null) {
44349
45882
  const diag2 = {
44350
45883
  lender: "SILO_V2 (GraphQL)",
@@ -44581,9 +46114,9 @@ function rejectOutliers(candidates, guard = DEFAULT_OUTLIER_GUARD) {
44581
46114
  const reference = consensusReference(candidates, guard);
44582
46115
  if (reference === void 0) return candidates;
44583
46116
  const upper = reference * guard.rejectFactor;
44584
- const lower = reference / guard.rejectFactor;
46117
+ const lower3 = reference / guard.rejectFactor;
44585
46118
  const kept = candidates.filter(
44586
- (c) => c.priceUSD <= upper && c.priceUSD >= lower
46119
+ (c) => c.priceUSD <= upper && c.priceUSD >= lower3
44587
46120
  );
44588
46121
  return kept.length > 0 ? kept : candidates;
44589
46122
  }
@@ -44942,10 +46475,10 @@ function createAssetArrayPerChain() {
44942
46475
  return assetsPerChain;
44943
46476
  }
44944
46477
  var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
44945
- function createSimpleArrayPerChain(fork, field9 = void 0) {
46478
+ function createSimpleArrayPerChain(fork, field10 = void 0) {
44946
46479
  let pools = {};
44947
46480
  Object.entries(fork ?? {}).forEach(([b2, data]) => {
44948
- Object.entries(field9 ? data[field9] : data).forEach(
46481
+ Object.entries(field10 ? data[field10] : data).forEach(
44949
46482
  ([chainId, address]) => {
44950
46483
  if (!pools[chainId]) pools[chainId] = [];
44951
46484
  pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
@@ -45301,7 +46834,7 @@ var composeVaultDisplayName = (brand, curatorName, asset, fallbackName) => {
45301
46834
 
45302
46835
  // src/vaults/fluid/publicCallParse.ts
45303
46836
  var FLUID_EEE_LOWER4 = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
45304
- var normalizeUnderlying5 = (addr) => addr === FLUID_EEE_LOWER4 ? zeroAddress : addr;
46837
+ var normalizeUnderlying5 = (addr2) => addr2 === FLUID_EEE_LOWER4 ? zeroAddress : addr2;
45305
46838
  var FLUID_RATE_SCALE2 = 100;
45306
46839
  var scaleFluidRate2 = (raw) => {
45307
46840
  if (raw === void 0 || raw === null) return 0;
@@ -45542,10 +47075,10 @@ function deriveConvertToAssets(totalAssetsRaw, totalSupplyRaw, shareDecimals) {
45542
47075
 
45543
47076
  // src/vaults/gearbox/publicCallParse.ts
45544
47077
  var WETH_MAINNET = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
45545
- var normalizeUnderlying6 = (addr, chainId) => {
45546
- const lower = addr.toLowerCase();
45547
- if (chainId === "1" && lower === WETH_MAINNET) return zeroAddress;
45548
- return lower;
47078
+ var normalizeUnderlying6 = (addr2, chainId) => {
47079
+ const lower3 = addr2.toLowerCase();
47080
+ if (chainId === "1" && lower3 === WETH_MAINNET) return zeroAddress;
47081
+ return lower3;
45549
47082
  };
45550
47083
  var RAY_TO_PERCENT2 = 1e25;
45551
47084
  var scaleRate = (raw) => {
@@ -46004,9 +47537,9 @@ var VAULT_V2_ADAPTER_ABI = parseAbi([
46004
47537
  ]);
46005
47538
  var PHASE1_ABI = [...MetaMorphoAbi, ...VAULT_V2_PHASE1_ABI];
46006
47539
  var FEE_SCALE = 1e18;
46007
- var isHex40 = (addr) => typeof addr === "string" && /^0x[0-9a-f]{40}$/i.test(addr);
47540
+ var isHex40 = (addr2) => typeof addr2 === "string" && /^0x[0-9a-f]{40}$/i.test(addr2);
46008
47541
  var isHex64 = (v) => typeof v === "string" && /^0x[0-9a-f]{64}$/i.test(v);
46009
- var lcOrUndefined = (addr) => isHex40(addr) ? addr.toLowerCase() : void 0;
47542
+ var lcOrUndefined = (addr2) => isHex40(addr2) ? addr2.toLowerCase() : void 0;
46010
47543
  var toNumberSafe = (raw, fallback = 0) => {
46011
47544
  if (raw === void 0 || raw === null) return fallback;
46012
47545
  const n = Number(raw);
@@ -46153,12 +47686,12 @@ var fetchMorphoVaultsFromChain = async (chainId, multicallRetry, prices = {}, to
46153
47686
  for (let i = 0; i < entries.length; i++) {
46154
47687
  const { entry } = entries[i];
46155
47688
  const base = i * PHASE1_PER_VAULT;
46156
- const slice = phase1.slice(base, base + CALLS_PER_VAULT);
47689
+ const slice2 = phase1.slice(base, base + CALLS_PER_VAULT);
46157
47690
  const v2 = isV2[i] ? v2ByVault.get(entry.vault.toLowerCase()) ?? null : null;
46158
47691
  const v2FeePercent = isV2[i] ? toNumberSafe(phase1[base + PERFORMANCE_FEE_INDEX]) / FEE_SCALE * 100 : void 0;
46159
47692
  const parsed = parseVault3(
46160
47693
  entry,
46161
- slice,
47694
+ slice2,
46162
47695
  chainId,
46163
47696
  prices,
46164
47697
  tokenList,
@@ -46544,11 +48077,11 @@ var PHASE1_CALLS2 = [
46544
48077
  var PHASE1_PER_VAULT2 = PHASE1_CALLS2.length;
46545
48078
  var WITHDRAW_QUEUE_LENGTH_INDEX2 = 8;
46546
48079
  var FEE_SCALE2 = 1e18;
46547
- var isHex402 = (addr) => typeof addr === "string" && /^0x[0-9a-f]{40}$/i.test(addr);
46548
- var lcOrUndefined2 = (addr) => {
46549
- if (!isHex402(addr)) return void 0;
46550
- const lower = addr.toLowerCase();
46551
- return lower === zeroAddress ? void 0 : lower;
48080
+ var isHex402 = (addr2) => typeof addr2 === "string" && /^0x[0-9a-f]{40}$/i.test(addr2);
48081
+ var lcOrUndefined2 = (addr2) => {
48082
+ if (!isHex402(addr2)) return void 0;
48083
+ const lower3 = addr2.toLowerCase();
48084
+ return lower3 === zeroAddress ? void 0 : lower3;
46552
48085
  };
46553
48086
  var isHex642 = (val) => typeof val === "string" && /^0x[0-9a-f]{64}$/i.test(val);
46554
48087
  var toNumberSafe2 = (raw, fallback = 0) => {
@@ -46659,10 +48192,10 @@ var fetchListaVaultsFromChain = async (chainId, multicallRetry, prices = {}, tok
46659
48192
  const out = {};
46660
48193
  for (let i = 0; i < entries.length; i++) {
46661
48194
  const entry = entries[i];
46662
- const slice = phase1.slice(i * PHASE1_PER_VAULT2, (i + 1) * PHASE1_PER_VAULT2);
48195
+ const slice2 = phase1.slice(i * PHASE1_PER_VAULT2, (i + 1) * PHASE1_PER_VAULT2);
46663
48196
  const parsed = parseVault4(
46664
48197
  entry,
46665
- slice,
48198
+ slice2,
46666
48199
  curatorAddrByVault[i],
46667
48200
  chainId,
46668
48201
  prices,
@@ -47154,9 +48687,9 @@ query EvkByAssets($assets: [Bytes!]!) {
47154
48687
  `;
47155
48688
  var ZERO = 0n;
47156
48689
  var RAY_TO_PERCENT3 = 1e25;
47157
- function readAddress2(field9) {
47158
- if (!field9) return void 0;
47159
- return field9.toLowerCase();
48690
+ function readAddress2(field10) {
48691
+ if (!field10) return void 0;
48692
+ return field10.toLowerCase();
47160
48693
  }
47161
48694
  function parseVaultFee(v) {
47162
48695
  if (v.performanceFee == null) return 0;
@@ -47515,6 +49048,300 @@ var fetchEulerEarnVaults = async (chainId, prices = {}, tokenList = {}, multical
47515
49048
  ).catch(() => void 0);
47516
49049
  return isNonEmpty(fromSubgraph) ? fromSubgraph : fromApi ?? {};
47517
49050
  };
49051
+ var warn6 = (...args) => {
49052
+ };
49053
+ var num2 = (v) => {
49054
+ const n = Number(v);
49055
+ return Number.isFinite(n) ? n : 0;
49056
+ };
49057
+ var big5 = (v) => {
49058
+ try {
49059
+ if (v === void 0 || v === null || v === "") return "0";
49060
+ const s = String(v);
49061
+ return BigInt(s.includes(".") ? s.slice(0, s.indexOf(".")) : s).toString();
49062
+ } catch {
49063
+ return "0";
49064
+ }
49065
+ };
49066
+ var lower2 = (v) => String(v ?? "").toLowerCase();
49067
+ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, fetchImpl = fetch) {
49068
+ const url = `${termMaxApiBase(chainId)}/vault/list?chainId=${chainId}`;
49069
+ let rows;
49070
+ try {
49071
+ const res = await fetchImpl.call(globalThis, url);
49072
+ if (!res.ok) {
49073
+ warn6(`vault/list ${chainId} \u2192 HTTP ${res.status}`);
49074
+ return null;
49075
+ }
49076
+ const json = await res.json();
49077
+ rows = Array.isArray(json?.data) ? json.data : [];
49078
+ } catch (e) {
49079
+ warn6(`vault/list ${chainId} failed:`, e?.message ?? e);
49080
+ return null;
49081
+ }
49082
+ const out = {};
49083
+ for (const r of rows) {
49084
+ const address = lower2(r?.vaultAddress);
49085
+ const underlying = lower2(r?.asset?.contractAddress);
49086
+ if (!address || !underlying) continue;
49087
+ if (r.isEnabled === false) continue;
49088
+ const assetDecimals = num2(r?.asset?.decimals) || 18;
49089
+ const scale = 10 ** assetDecimals;
49090
+ const assetEntry = tokenList[underlying];
49091
+ const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
49092
+ const priceUsd = prices[priceKey];
49093
+ const totalAssets = big5(r.totalAssets);
49094
+ const totalSupply = big5(r.totalSupplyAmt);
49095
+ const totalAssetsFormatted = Number(totalAssets) / scale;
49096
+ const supplyRate = num2(r.apr) * 100;
49097
+ const rewardsRate = num2(r?.incentiveData?.TMX_APR) * 100;
49098
+ const rawLiquidity = BigInt(big5(r.redeemableAmt ?? r.idleFunds ?? "0"));
49099
+ const totalAssetsBig = BigInt(totalAssets);
49100
+ const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
49101
+ const liquidityFormatted = Number(liquidity) / scale;
49102
+ const totalSupplyValue = num2(r.totalSupplyValue);
49103
+ out[address] = {
49104
+ address,
49105
+ underlying,
49106
+ symbol: String(r.symbol ?? ""),
49107
+ name: String(r.name ?? ""),
49108
+ // Share decimals are not reported; TermMax vault shares track the
49109
+ // asset's decimals (verified on-chain: 6-dec USDC vault, 18-dec WETH).
49110
+ decimals: assetDecimals,
49111
+ assetDecimals,
49112
+ totalAssets,
49113
+ totalSupply,
49114
+ convertToAssets: BigInt(totalSupply) > 0n ? (BigInt(totalAssets) * 10n ** BigInt(assetDecimals) / BigInt(totalSupply)).toString() : "0",
49115
+ supplyRate,
49116
+ rewardsRate,
49117
+ depositRate: supplyRate + rewardsRate,
49118
+ // 1e8-scaled upstream (10000000 = 10%).
49119
+ fee: num2(r.performanceFeeRate) / 1e6,
49120
+ timelock: num2(r.timeLockSeconds) || void 0,
49121
+ curator: r?.curator?.curatorAddress ? lower2(r.curator.curatorAddress) : void 0,
49122
+ // The API is the ONLY source for this — do not derive it from `name`.
49123
+ curatorName: r?.curator?.name || void 0,
49124
+ guardian: r?.guardianAddress ? lower2(r.guardianAddress) : void 0,
49125
+ asset: assetEntry,
49126
+ priceUsd,
49127
+ totalAssetsFormatted,
49128
+ totalAssetsUsd: totalSupplyValue > 0 ? totalSupplyValue : priceUsd ? totalAssetsFormatted * priceUsd : 0,
49129
+ liquidity,
49130
+ liquidityFormatted,
49131
+ liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
49132
+ version: r.version,
49133
+ isPaused: r.isPaused === true || void 0,
49134
+ supplyCap: r.capacity ? big5(r.capacity) : void 0,
49135
+ basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
49136
+ };
49137
+ }
49138
+ return out;
49139
+ }
49140
+
49141
+ // src/vaults/termmax/abi.ts
49142
+ var TermMaxVaultAbi = [
49143
+ { type: "function", name: "name", stateMutability: "view", inputs: [], outputs: [{ type: "string" }] },
49144
+ { type: "function", name: "symbol", stateMutability: "view", inputs: [], outputs: [{ type: "string" }] },
49145
+ { type: "function", name: "decimals", stateMutability: "view", inputs: [], outputs: [{ type: "uint8" }] },
49146
+ { type: "function", name: "asset", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
49147
+ { type: "function", name: "totalAssets", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
49148
+ { type: "function", name: "totalSupply", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
49149
+ {
49150
+ type: "function",
49151
+ name: "convertToAssets",
49152
+ stateMutability: "view",
49153
+ inputs: [{ name: "shares", type: "uint256" }],
49154
+ outputs: [{ type: "uint256" }]
49155
+ },
49156
+ {
49157
+ type: "function",
49158
+ name: "balanceOf",
49159
+ stateMutability: "view",
49160
+ inputs: [{ name: "account", type: "address" }],
49161
+ outputs: [{ type: "uint256" }]
49162
+ },
49163
+ // GROSS annual interest in underlying units. The performance fee is deducted
49164
+ // from it on accrual, so it must be netted before publishing a rate.
49165
+ { type: "function", name: "annualizedInterest", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
49166
+ // Depositors' accruing claim — the correct APR denominator. REVERTS on 2.0.0.
49167
+ { type: "function", name: "accretingPrincipal", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
49168
+ // 1e8-scaled (0.1e8 = 10%).
49169
+ { type: "function", name: "performanceFeeRate", stateMutability: "view", inputs: [], outputs: [{ type: "uint64" }] },
49170
+ // Pre-computed net APY. REVERTS on 2.0.0 — we derive instead.
49171
+ { type: "function", name: "apr", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
49172
+ { type: "function", name: "curator", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
49173
+ { type: "function", name: "guardian", stateMutability: "view", inputs: [], outputs: [{ type: "address" }] },
49174
+ { type: "function", name: "timelock", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
49175
+ { type: "function", name: "getVersion", stateMutability: "pure", inputs: [], outputs: [{ type: "string" }] }
49176
+ ];
49177
+ var Erc20DecimalsBalanceAbi = [
49178
+ { type: "function", name: "decimals", stateMutability: "view", inputs: [], outputs: [{ type: "uint8" }] },
49179
+ {
49180
+ type: "function",
49181
+ name: "balanceOf",
49182
+ stateMutability: "view",
49183
+ inputs: [{ name: "account", type: "address" }],
49184
+ outputs: [{ type: "uint256" }]
49185
+ }
49186
+ ];
49187
+
49188
+ // src/vaults/termmax/fetchFromChain.ts
49189
+ var DECIMAL_BASE2 = 100000000n;
49190
+ var big6 = (v) => {
49191
+ if (v === void 0 || v === null || v === "0x") return 0n;
49192
+ try {
49193
+ return typeof v === "bigint" ? v : BigInt(v);
49194
+ } catch {
49195
+ return 0n;
49196
+ }
49197
+ };
49198
+ var num3 = (v) => {
49199
+ const n = Number(v);
49200
+ return Number.isFinite(n) ? n : void 0;
49201
+ };
49202
+ var str = (v) => typeof v === "string" && v.length > 0 ? v : void 0;
49203
+ var addr = (v) => typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v) && !/^0x0{40}$/.test(v) ? v.toLowerCase() : void 0;
49204
+ async function discoverVaultAddresses(chainId) {
49205
+ const markets = await fetchTermMaxMarkets(chainId).catch(() => []);
49206
+ const seen = /* @__PURE__ */ new Set();
49207
+ for (const m of markets) {
49208
+ for (const o of m.orders) {
49209
+ if (!o.makerIsVault) continue;
49210
+ const maker = addr(o.makerAddress);
49211
+ if (maker) seen.add(maker);
49212
+ }
49213
+ }
49214
+ return [...seen];
49215
+ }
49216
+ var VAULT_READS = [
49217
+ "name",
49218
+ "symbol",
49219
+ "decimals",
49220
+ "asset",
49221
+ "totalAssets",
49222
+ "totalSupply",
49223
+ "annualizedInterest",
49224
+ "accretingPrincipal",
49225
+ "performanceFeeRate",
49226
+ "apr",
49227
+ "curator",
49228
+ "guardian",
49229
+ "timelock",
49230
+ "getVersion"
49231
+ ];
49232
+ var READS_PER_VAULT = VAULT_READS.length;
49233
+ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
49234
+ if (!termMaxConfigByChain(chainId)) return {};
49235
+ const vaults = await discoverVaultAddresses(chainId);
49236
+ if (vaults.length === 0) return {};
49237
+ const calls = vaults.flatMap(
49238
+ (address) => VAULT_READS.map((name) => ({
49239
+ address,
49240
+ name,
49241
+ params: []
49242
+ }))
49243
+ );
49244
+ const res = await multicallRetry({
49245
+ chain: chainId,
49246
+ calls,
49247
+ abi: TermMaxVaultAbi,
49248
+ allowFailure: true
49249
+ });
49250
+ const rows = [];
49251
+ vaults.forEach((address, i) => {
49252
+ const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
49253
+ const asset = addr(at("asset"));
49254
+ const totalAssets = big6(at("totalAssets"));
49255
+ if (!asset || totalAssets === 0n) return;
49256
+ rows.push({
49257
+ address,
49258
+ name: str(at("name")),
49259
+ symbol: str(at("symbol")),
49260
+ decimals: num3(at("decimals")) ?? 18,
49261
+ asset,
49262
+ totalAssets,
49263
+ totalSupply: big6(at("totalSupply")),
49264
+ annualizedInterest: big6(at("annualizedInterest")),
49265
+ accretingPrincipal: big6(at("accretingPrincipal")),
49266
+ performanceFeeRate: big6(at("performanceFeeRate")),
49267
+ aprRaw: at("apr") != null ? big6(at("apr")) : void 0,
49268
+ curator: addr(at("curator")),
49269
+ guardian: addr(at("guardian")),
49270
+ timelock: num3(at("timelock")),
49271
+ version: str(at("getVersion"))
49272
+ });
49273
+ });
49274
+ if (rows.length === 0) return {};
49275
+ const round2 = rows.flatMap((r) => [
49276
+ { address: r.asset, name: "decimals", params: [] },
49277
+ { address: r.asset, name: "balanceOf", params: [r.address] }
49278
+ ]);
49279
+ const res2 = await multicallRetry({
49280
+ chain: chainId,
49281
+ calls: round2,
49282
+ abi: Erc20DecimalsBalanceAbi,
49283
+ allowFailure: true
49284
+ });
49285
+ const out = {};
49286
+ rows.forEach((r, i) => {
49287
+ const assetDecimals = num3(res2[i * 2]) ?? r.decimals;
49288
+ const idle = big6(res2[i * 2 + 1]);
49289
+ const assetEntry = tokenList[r.asset];
49290
+ const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
49291
+ const priceUsd = prices[priceKey];
49292
+ const denominator = r.accretingPrincipal > 0n ? r.accretingPrincipal : r.totalAssets;
49293
+ const feeRate = r.performanceFeeRate;
49294
+ let supplyRate = 0;
49295
+ if (denominator > 0n && r.annualizedInterest > 0n) {
49296
+ const netAnnual = r.annualizedInterest * (DECIMAL_BASE2 - feeRate) / DECIMAL_BASE2;
49297
+ supplyRate = Number(netAnnual) / Number(denominator) * 100;
49298
+ }
49299
+ if (r.aprRaw !== void 0 && r.aprRaw > 0n) {
49300
+ supplyRate = Number(r.aprRaw) / Number(DECIMAL_BASE2) * 100;
49301
+ }
49302
+ const scale = 10 ** assetDecimals;
49303
+ const totalAssetsFormatted = Number(r.totalAssets) / scale;
49304
+ const liquidityFormatted = Number(idle) / scale;
49305
+ const convertToAssets = r.totalSupply > 0n ? (r.totalAssets * 10n ** BigInt(r.decimals) / r.totalSupply).toString() : "0";
49306
+ const entry = {
49307
+ address: r.address,
49308
+ underlying: r.asset,
49309
+ symbol: r.symbol ?? "",
49310
+ name: r.name ?? "",
49311
+ decimals: r.decimals,
49312
+ assetDecimals,
49313
+ totalAssets: r.totalAssets.toString(),
49314
+ totalSupply: r.totalSupply.toString(),
49315
+ convertToAssets,
49316
+ supplyRate,
49317
+ rewardsRate: 0,
49318
+ depositRate: supplyRate,
49319
+ fee: Number(feeRate) / Number(DECIMAL_BASE2) * 100,
49320
+ timelock: r.timelock,
49321
+ curator: r.curator,
49322
+ curatorName: curatorNameFromVaultName(r.name),
49323
+ guardian: r.guardian,
49324
+ asset: assetEntry,
49325
+ priceUsd,
49326
+ totalAssetsFormatted,
49327
+ totalAssetsUsd: priceUsd ? totalAssetsFormatted * priceUsd : 0,
49328
+ liquidity: idle.toString(),
49329
+ liquidityFormatted,
49330
+ liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
49331
+ version: r.version
49332
+ };
49333
+ out[r.address] = entry;
49334
+ });
49335
+ return out;
49336
+ };
49337
+
49338
+ // src/vaults/termmax/fetchPublic.ts
49339
+ var fetchTermMaxVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
49340
+ if (!termMaxConfigByChain(chainId)) return {};
49341
+ const fromApi = await fetchTermMaxVaultsFromApi(chainId, prices, tokenList);
49342
+ if (fromApi !== null) return fromApi;
49343
+ return fetchTermMaxVaultsFromChain(chainId, multicallRetry, prices, tokenList);
49344
+ };
47518
49345
 
47519
49346
  // src/vaults/lst/abis/beets.ts
47520
49347
  var BeetsStSAbi = [
@@ -47590,7 +49417,7 @@ var Multicall3BalanceAbi = [
47590
49417
  outputs: [{ type: "uint256" }]
47591
49418
  }
47592
49419
  ];
47593
- var toBigInt12 = (v) => {
49420
+ var toBigInt13 = (v) => {
47594
49421
  if (v === void 0 || v === null) return void 0;
47595
49422
  if (typeof v === "bigint") return v;
47596
49423
  if (typeof v === "number") return BigInt(v);
@@ -47614,12 +49441,12 @@ var readerBeetsStS = (entry) => ({
47614
49441
  ],
47615
49442
  abis: [TotalSupplyAbi, BeetsStSAbi, BeetsStSAbi],
47616
49443
  parse: ([supply, rate, pool]) => {
47617
- const totalSupply = toBigInt12(supply);
47618
- const exchangeRate = toBigInt12(rate);
49444
+ const totalSupply = toBigInt13(supply);
49445
+ const exchangeRate = toBigInt13(rate);
47619
49446
  if (totalSupply === void 0 || exchangeRate === void 0) {
47620
49447
  return void 0;
47621
49448
  }
47622
- const liquidity = toBigInt12(pool);
49449
+ const liquidity = toBigInt13(pool);
47623
49450
  return {
47624
49451
  totalAssets: totalSupply * exchangeRate / ONE_E187,
47625
49452
  totalSupply,
@@ -47660,12 +49487,12 @@ var readerBenqiSavax = (entry) => ({
47660
49487
  ],
47661
49488
  abis: [TotalSupplyAbi, BenqiSavaxAbi, BenqiSavaxAbi],
47662
49489
  parse: ([supply, rate, totalPooled]) => {
47663
- const totalSupply = toBigInt12(supply);
47664
- const exchangeRate = toBigInt12(rate);
49490
+ const totalSupply = toBigInt13(supply);
49491
+ const exchangeRate = toBigInt13(rate);
47665
49492
  if (totalSupply === void 0 || exchangeRate === void 0) {
47666
49493
  return void 0;
47667
49494
  }
47668
- const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E187;
49495
+ const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E187;
47669
49496
  return {
47670
49497
  totalAssets,
47671
49498
  totalSupply,
@@ -47679,7 +49506,7 @@ var readerBgtWrapper1to1 = (entry) => ({
47679
49506
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
47680
49507
  abis: [TotalSupplyAbi],
47681
49508
  parse: ([supply]) => {
47682
- const totalSupply = toBigInt12(supply);
49509
+ const totalSupply = toBigInt13(supply);
47683
49510
  if (totalSupply === void 0) return void 0;
47684
49511
  return {
47685
49512
  totalAssets: totalSupply,
@@ -47708,8 +49535,8 @@ var readerDineroBeraEth = (entry) => ({
47708
49535
  ],
47709
49536
  abis: [TotalSupplyAbi, DineroBeraEthAbi],
47710
49537
  parse: ([supply, rate]) => {
47711
- const totalSupply = toBigInt12(supply);
47712
- const exchangeRate = toBigInt12(rate);
49538
+ const totalSupply = toBigInt13(supply);
49539
+ const exchangeRate = toBigInt13(rate);
47713
49540
  if (totalSupply === void 0 || exchangeRate === void 0) {
47714
49541
  return void 0;
47715
49542
  }
@@ -47730,9 +49557,9 @@ var readerErc4626 = (entry) => ({
47730
49557
  ],
47731
49558
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
47732
49559
  parse: ([assets, supply, rate]) => {
47733
- const totalAssets = toBigInt12(assets);
47734
- const totalSupply = toBigInt12(supply);
47735
- const exchangeRate = toBigInt12(rate);
49560
+ const totalAssets = toBigInt13(assets);
49561
+ const totalSupply = toBigInt13(supply);
49562
+ const exchangeRate = toBigInt13(rate);
47736
49563
  if (totalAssets === void 0 || totalSupply === void 0 || exchangeRate === void 0) {
47737
49564
  return void 0;
47738
49565
  }
@@ -47747,9 +49574,9 @@ var readerErc4626PreviewRedeem = (entry) => ({
47747
49574
  ],
47748
49575
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
47749
49576
  parse: ([assets, supply, rate]) => {
47750
- const totalAssets = toBigInt12(assets);
47751
- const totalSupply = toBigInt12(supply);
47752
- const exchangeRate = toBigInt12(rate);
49577
+ const totalAssets = toBigInt13(assets);
49578
+ const totalSupply = toBigInt13(supply);
49579
+ const exchangeRate = toBigInt13(rate);
47753
49580
  if (totalAssets === void 0 || totalSupply === void 0 || exchangeRate === void 0) {
47754
49581
  return void 0;
47755
49582
  }
@@ -47808,16 +49635,16 @@ var readerEtherFiWeEth = (entry) => {
47808
49635
  return {
47809
49636
  calls,
47810
49637
  abis,
47811
- parse: (slice) => {
47812
- const totalSupply = toBigInt12(slice[0]);
47813
- const exchangeRate = toBigInt12(slice[1]);
49638
+ parse: (slice2) => {
49639
+ const totalSupply = toBigInt13(slice2[0]);
49640
+ const exchangeRate = toBigInt13(slice2[1]);
47814
49641
  if (totalSupply === void 0 || exchangeRate === void 0) {
47815
49642
  return void 0;
47816
49643
  }
47817
49644
  let liquidity;
47818
49645
  if (lp) {
47819
- const lpBalance = toBigInt12(slice[2]);
47820
- const locked = toBigInt12(slice[3]);
49646
+ const lpBalance = toBigInt13(slice2[2]);
49647
+ const locked = toBigInt13(slice2[3]);
47821
49648
  if (lpBalance !== void 0 && locked !== void 0) {
47822
49649
  liquidity = lpBalance > locked ? lpBalance - locked : 0n;
47823
49650
  }
@@ -47851,7 +49678,7 @@ var readerHyperbeatBeHype = (entry) => {
47851
49678
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
47852
49679
  abis: [TotalSupplyAbi],
47853
49680
  parse: ([supply]) => {
47854
- const totalSupply = toBigInt12(supply);
49681
+ const totalSupply = toBigInt13(supply);
47855
49682
  if (totalSupply === void 0) return void 0;
47856
49683
  return {
47857
49684
  totalAssets: totalSupply,
@@ -47868,8 +49695,8 @@ var readerHyperbeatBeHype = (entry) => {
47868
49695
  ],
47869
49696
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
47870
49697
  parse: ([supply, rate]) => {
47871
- const totalSupply = toBigInt12(supply);
47872
- const exchangeRate = toBigInt12(rate);
49698
+ const totalSupply = toBigInt13(supply);
49699
+ const exchangeRate = toBigInt13(rate);
47873
49700
  if (totalSupply === void 0 || exchangeRate === void 0) {
47874
49701
  return void 0;
47875
49702
  }
@@ -47901,7 +49728,7 @@ var readerKelpRsEth = (entry) => {
47901
49728
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
47902
49729
  abis: [TotalSupplyAbi],
47903
49730
  parse: ([supply]) => {
47904
- const totalSupply = toBigInt12(supply);
49731
+ const totalSupply = toBigInt13(supply);
47905
49732
  if (totalSupply === void 0) return void 0;
47906
49733
  return {
47907
49734
  totalAssets: totalSupply,
@@ -47918,8 +49745,8 @@ var readerKelpRsEth = (entry) => {
47918
49745
  ],
47919
49746
  abis: [TotalSupplyAbi, KelpLrtOracleAbi],
47920
49747
  parse: ([supply, rate]) => {
47921
- const totalSupply = toBigInt12(supply);
47922
- const exchangeRate = toBigInt12(rate);
49748
+ const totalSupply = toBigInt13(supply);
49749
+ const exchangeRate = toBigInt13(rate);
47923
49750
  if (totalSupply === void 0 || exchangeRate === void 0) {
47924
49751
  return void 0;
47925
49752
  }
@@ -47951,7 +49778,7 @@ var readerKinetiqKHype = (entry) => {
47951
49778
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
47952
49779
  abis: [TotalSupplyAbi],
47953
49780
  parse: ([supply]) => {
47954
- const totalSupply = toBigInt12(supply);
49781
+ const totalSupply = toBigInt13(supply);
47955
49782
  if (totalSupply === void 0) return void 0;
47956
49783
  return {
47957
49784
  totalAssets: totalSupply,
@@ -47968,8 +49795,8 @@ var readerKinetiqKHype = (entry) => {
47968
49795
  ],
47969
49796
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
47970
49797
  parse: ([supply, rate]) => {
47971
- const totalSupply = toBigInt12(supply);
47972
- const exchangeRate = toBigInt12(rate);
49798
+ const totalSupply = toBigInt13(supply);
49799
+ const exchangeRate = toBigInt13(rate);
47973
49800
  if (totalSupply === void 0 || exchangeRate === void 0) {
47974
49801
  return void 0;
47975
49802
  }
@@ -48009,12 +49836,12 @@ var readerLairStKaia = (entry) => ({
48009
49836
  ],
48010
49837
  abis: [TotalSupplyAbi, LairStKaiaAbi, LairStKaiaAbi],
48011
49838
  parse: ([supply, rate, totalStaking]) => {
48012
- const totalSupply = toBigInt12(supply);
48013
- const exchangeRate = toBigInt12(rate);
49839
+ const totalSupply = toBigInt13(supply);
49840
+ const exchangeRate = toBigInt13(rate);
48014
49841
  if (totalSupply === void 0 || exchangeRate === void 0) {
48015
49842
  return void 0;
48016
49843
  }
48017
- const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E187;
49844
+ const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E187;
48018
49845
  return {
48019
49846
  totalAssets,
48020
49847
  totalSupply,
@@ -48042,8 +49869,8 @@ var readerLidoWstEth = (entry) => ({
48042
49869
  ],
48043
49870
  abis: [TotalSupplyAbi, LidoWstEthAbi],
48044
49871
  parse: ([supply, rate]) => {
48045
- const totalSupply = toBigInt12(supply);
48046
- const exchangeRate = toBigInt12(rate);
49872
+ const totalSupply = toBigInt13(supply);
49873
+ const exchangeRate = toBigInt13(rate);
48047
49874
  if (totalSupply === void 0 || exchangeRate === void 0) {
48048
49875
  return void 0;
48049
49876
  }
@@ -48081,7 +49908,7 @@ var readerListaSlisBnb = (entry) => {
48081
49908
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48082
49909
  abis: [TotalSupplyAbi],
48083
49910
  parse: ([supply]) => {
48084
- const totalSupply = toBigInt12(supply);
49911
+ const totalSupply = toBigInt13(supply);
48085
49912
  if (totalSupply === void 0) return void 0;
48086
49913
  return {
48087
49914
  totalAssets: totalSupply,
@@ -48099,12 +49926,12 @@ var readerListaSlisBnb = (entry) => {
48099
49926
  ],
48100
49927
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
48101
49928
  parse: ([supply, rate, pooled]) => {
48102
- const totalSupply = toBigInt12(supply);
48103
- const exchangeRate = toBigInt12(rate);
49929
+ const totalSupply = toBigInt13(supply);
49930
+ const exchangeRate = toBigInt13(rate);
48104
49931
  if (totalSupply === void 0 || exchangeRate === void 0) {
48105
49932
  return void 0;
48106
49933
  }
48107
- const pooledBnb = toBigInt12(pooled);
49934
+ const pooledBnb = toBigInt13(pooled);
48108
49935
  const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E187;
48109
49936
  return { totalAssets, totalSupply, exchangeRate };
48110
49937
  }
@@ -48130,7 +49957,7 @@ var readerMantleMEth = (entry) => {
48130
49957
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48131
49958
  abis: [TotalSupplyAbi],
48132
49959
  parse: ([supply]) => {
48133
- const totalSupply = toBigInt12(supply);
49960
+ const totalSupply = toBigInt13(supply);
48134
49961
  if (totalSupply === void 0) return void 0;
48135
49962
  return {
48136
49963
  totalAssets: totalSupply,
@@ -48147,8 +49974,8 @@ var readerMantleMEth = (entry) => {
48147
49974
  ],
48148
49975
  abis: [TotalSupplyAbi, MantleStakingAbi],
48149
49976
  parse: ([supply, rate]) => {
48150
- const totalSupply = toBigInt12(supply);
48151
- const exchangeRate = toBigInt12(rate);
49977
+ const totalSupply = toBigInt13(supply);
49978
+ const exchangeRate = toBigInt13(rate);
48152
49979
  if (totalSupply === void 0 || exchangeRate === void 0) {
48153
49980
  return void 0;
48154
49981
  }
@@ -48169,7 +49996,7 @@ var readerOffChain = (entry) => {
48169
49996
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48170
49997
  abis: [TotalSupplyAbi],
48171
49998
  parse: ([supply]) => {
48172
- const totalSupply = toBigInt12(supply);
49999
+ const totalSupply = toBigInt13(supply);
48173
50000
  if (totalSupply === void 0) return void 0;
48174
50001
  return {
48175
50002
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
@@ -48203,7 +50030,7 @@ var readerRenzoEzEth = (entry) => {
48203
50030
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48204
50031
  abis: [TotalSupplyAbi],
48205
50032
  parse: ([supply]) => {
48206
- const totalSupply = toBigInt12(supply);
50033
+ const totalSupply = toBigInt13(supply);
48207
50034
  if (totalSupply === void 0) return void 0;
48208
50035
  return {
48209
50036
  totalAssets: totalSupply,
@@ -48220,9 +50047,9 @@ var readerRenzoEzEth = (entry) => {
48220
50047
  ],
48221
50048
  abis: [TotalSupplyAbi, RenzoRestakeManagerAbi],
48222
50049
  parse: ([supply, tvls]) => {
48223
- const totalSupply = toBigInt12(supply);
50050
+ const totalSupply = toBigInt13(supply);
48224
50051
  if (totalSupply === void 0 || totalSupply === 0n) return void 0;
48225
- const totalTvl = Array.isArray(tvls) && tvls.length >= 3 ? toBigInt12(tvls[2]) : void 0;
50052
+ const totalTvl = Array.isArray(tvls) && tvls.length >= 3 ? toBigInt13(tvls[2]) : void 0;
48226
50053
  if (totalTvl === void 0) return void 0;
48227
50054
  return {
48228
50055
  totalAssets: totalTvl,
@@ -48275,13 +50102,13 @@ var readerRocketReth = (entry) => {
48275
50102
  return {
48276
50103
  calls,
48277
50104
  abis,
48278
- parse: (slice) => {
48279
- const totalSupply = toBigInt12(slice[0]);
48280
- const exchangeRate = toBigInt12(slice[1]);
50105
+ parse: (slice2) => {
50106
+ const totalSupply = toBigInt13(slice2[0]);
50107
+ const exchangeRate = toBigInt13(slice2[1]);
48281
50108
  if (totalSupply === void 0 || exchangeRate === void 0) {
48282
50109
  return void 0;
48283
50110
  }
48284
- const liquidity = depositPool ? toBigInt12(slice[2]) : void 0;
50111
+ const liquidity = depositPool ? toBigInt13(slice2[2]) : void 0;
48285
50112
  return {
48286
50113
  totalAssets: totalSupply * exchangeRate / ONE_E187,
48287
50114
  totalSupply,
@@ -48320,7 +50147,7 @@ var readerStaderEthx = (entry) => {
48320
50147
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48321
50148
  abis: [TotalSupplyAbi],
48322
50149
  parse: ([supply]) => {
48323
- const totalSupply = toBigInt12(supply);
50150
+ const totalSupply = toBigInt13(supply);
48324
50151
  if (totalSupply === void 0) return void 0;
48325
50152
  return {
48326
50153
  totalAssets: totalSupply,
@@ -48337,8 +50164,8 @@ var readerStaderEthx = (entry) => {
48337
50164
  ],
48338
50165
  abis: [TotalSupplyAbi, StaderEthxAbi],
48339
50166
  parse: ([supply, rate]) => {
48340
- const totalSupply = toBigInt12(supply);
48341
- const exchangeRate = toBigInt12(rate);
50167
+ const totalSupply = toBigInt13(supply);
50168
+ const exchangeRate = toBigInt13(rate);
48342
50169
  if (totalSupply === void 0 || exchangeRate === void 0) {
48343
50170
  return void 0;
48344
50171
  }
@@ -48366,10 +50193,10 @@ var readerStaderMaticX = (entry) => {
48366
50193
  ],
48367
50194
  abis: [TotalSupplyAbi, StaderMaticXAbi],
48368
50195
  parse: ([supply, tup]) => {
48369
- const totalSupply = toBigInt12(supply);
50196
+ const totalSupply = toBigInt13(supply);
48370
50197
  if (!Array.isArray(tup) || tup.length < 3) return void 0;
48371
- const amountInMatic = toBigInt12(tup[0]);
48372
- const totalPooledMatic = toBigInt12(tup[2]);
50198
+ const amountInMatic = toBigInt13(tup[0]);
50199
+ const totalPooledMatic = toBigInt13(tup[2]);
48373
50200
  if (totalSupply === void 0 || amountInMatic === void 0) {
48374
50201
  return void 0;
48375
50202
  }
@@ -48402,7 +50229,7 @@ var readerStakeWiseOsEth = (entry) => {
48402
50229
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48403
50230
  abis: [TotalSupplyAbi],
48404
50231
  parse: ([supply]) => {
48405
- const totalSupply = toBigInt12(supply);
50232
+ const totalSupply = toBigInt13(supply);
48406
50233
  if (totalSupply === void 0) return void 0;
48407
50234
  return {
48408
50235
  totalAssets: totalSupply,
@@ -48419,8 +50246,8 @@ var readerStakeWiseOsEth = (entry) => {
48419
50246
  ],
48420
50247
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
48421
50248
  parse: ([supply, rate]) => {
48422
- const totalSupply = toBigInt12(supply);
48423
- const exchangeRate = toBigInt12(rate);
50249
+ const totalSupply = toBigInt13(supply);
50250
+ const exchangeRate = toBigInt13(rate);
48424
50251
  if (totalSupply === void 0 || exchangeRate === void 0) {
48425
50252
  return void 0;
48426
50253
  }
@@ -48452,7 +50279,7 @@ var readerStCelo = (entry) => {
48452
50279
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48453
50280
  abis: [TotalSupplyAbi],
48454
50281
  parse: ([supply]) => {
48455
- const totalSupply = toBigInt12(supply);
50282
+ const totalSupply = toBigInt13(supply);
48456
50283
  if (totalSupply === void 0) return void 0;
48457
50284
  return {
48458
50285
  totalAssets: totalSupply,
@@ -48469,8 +50296,8 @@ var readerStCelo = (entry) => {
48469
50296
  ],
48470
50297
  abis: [TotalSupplyAbi, StCeloManagerAbi],
48471
50298
  parse: ([supply, rate]) => {
48472
- const totalSupply = toBigInt12(supply);
48473
- const exchangeRate = toBigInt12(rate);
50299
+ const totalSupply = toBigInt13(supply);
50300
+ const exchangeRate = toBigInt13(rate);
48474
50301
  if (totalSupply === void 0 || exchangeRate === void 0) {
48475
50302
  return void 0;
48476
50303
  }
@@ -48502,8 +50329,8 @@ var readerSwellGetRate = (entry) => ({
48502
50329
  ],
48503
50330
  abis: [TotalSupplyAbi, SwellGetRateAbi],
48504
50331
  parse: ([supply, rate]) => {
48505
- const totalSupply = toBigInt12(supply);
48506
- const exchangeRate = toBigInt12(rate);
50332
+ const totalSupply = toBigInt13(supply);
50333
+ const exchangeRate = toBigInt13(rate);
48507
50334
  if (totalSupply === void 0 || exchangeRate === void 0) {
48508
50335
  return void 0;
48509
50336
  }
@@ -48534,7 +50361,7 @@ var readerValantisWstHype = (entry) => {
48534
50361
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48535
50362
  abis: [TotalSupplyAbi],
48536
50363
  parse: ([supply]) => {
48537
- const totalSupply = toBigInt12(supply);
50364
+ const totalSupply = toBigInt13(supply);
48538
50365
  if (totalSupply === void 0) return void 0;
48539
50366
  return {
48540
50367
  totalAssets: totalSupply,
@@ -48551,8 +50378,8 @@ var readerValantisWstHype = (entry) => {
48551
50378
  ],
48552
50379
  abis: [TotalSupplyAbi, ValantisStHypeAbi],
48553
50380
  parse: ([supply, rate]) => {
48554
- const totalSupply = toBigInt12(supply);
48555
- const exchangeRate = toBigInt12(rate);
50381
+ const totalSupply = toBigInt13(supply);
50382
+ const exchangeRate = toBigInt13(rate);
48556
50383
  if (totalSupply === void 0 || exchangeRate === void 0) {
48557
50384
  return void 0;
48558
50385
  }
@@ -48586,7 +50413,7 @@ var readerVedaAccountant = (entry) => {
48586
50413
  calls: [{ address: entry.address, name: "totalSupply", params: [] }],
48587
50414
  abis: [TotalSupplyAbi],
48588
50415
  parse: ([supply]) => {
48589
- const totalSupply = toBigInt12(supply);
50416
+ const totalSupply = toBigInt13(supply);
48590
50417
  if (totalSupply === void 0) return void 0;
48591
50418
  return {
48592
50419
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
@@ -48604,8 +50431,8 @@ var readerVedaAccountant = (entry) => {
48604
50431
  ],
48605
50432
  abis: [TotalSupplyAbi, VedaAccountantGetRateAbi],
48606
50433
  parse: ([supply, rate]) => {
48607
- const totalSupply = toBigInt12(supply);
48608
- const rawRate = toBigInt12(rate);
50434
+ const totalSupply = toBigInt13(supply);
50435
+ const rawRate = toBigInt13(rate);
48609
50436
  if (totalSupply === void 0 || rawRate === void 0) return void 0;
48610
50437
  const exchangeRate = rawRate * scale;
48611
50438
  return {
@@ -48640,8 +50467,8 @@ var readerAnkrRatio = (entry) => ({
48640
50467
  ],
48641
50468
  abis: [TotalSupplyAbi, AnkrRatioAbi],
48642
50469
  parse: ([supply, ratio]) => {
48643
- const totalSupply = toBigInt12(supply);
48644
- const r = toBigInt12(ratio);
50470
+ const totalSupply = toBigInt13(supply);
50471
+ const r = toBigInt13(ratio);
48645
50472
  if (totalSupply === void 0 || r === void 0 || r === 0n) {
48646
50473
  return void 0;
48647
50474
  }
@@ -48684,8 +50511,8 @@ var readerCoreEarnRate = (entry) => {
48684
50511
  ],
48685
50512
  abis: [CoreEarnRateAbi, TotalSupplyAbi],
48686
50513
  parse: ([rate, supply]) => {
48687
- const r = toBigInt12(rate);
48688
- const totalSupply = toBigInt12(supply);
50514
+ const r = toBigInt13(rate);
50515
+ const totalSupply = toBigInt13(supply);
48689
50516
  if (r === void 0 || r === 0n || totalSupply === void 0) {
48690
50517
  return void 0;
48691
50518
  }
@@ -48706,8 +50533,8 @@ var readerCoreStakedRatio = (entry) => {
48706
50533
  ],
48707
50534
  abis: [CoreTotalStakedAbi, TotalSupplyAbi],
48708
50535
  parse: ([staked, supply]) => {
48709
- const totalStaked = toBigInt12(staked);
48710
- const totalSupply = toBigInt12(supply);
50536
+ const totalStaked = toBigInt13(staked);
50537
+ const totalSupply = toBigInt13(supply);
48711
50538
  if (totalStaked === void 0 || totalSupply === void 0 || totalSupply === 0n) {
48712
50539
  return void 0;
48713
50540
  }
@@ -48751,12 +50578,12 @@ var readerStellaStDot = (entry) => ({
48751
50578
  ],
48752
50579
  abis: [TotalSupplyAbi, StellaStDotAbi, StellaStDotAbi],
48753
50580
  parse: ([supply, rate, pooled]) => {
48754
- const totalSupply = toBigInt12(supply);
48755
- const exchangeRate = toBigInt12(rate);
50581
+ const totalSupply = toBigInt13(supply);
50582
+ const exchangeRate = toBigInt13(rate);
48756
50583
  if (totalSupply === void 0 || exchangeRate === void 0) {
48757
50584
  return void 0;
48758
50585
  }
48759
- const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E187;
50586
+ const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E187;
48760
50587
  return {
48761
50588
  totalAssets,
48762
50589
  totalSupply,
@@ -48791,8 +50618,8 @@ var readerKintsuSMon = (entry) => ({
48791
50618
  ],
48792
50619
  abis: [KintsuSMonAbi, KintsuSMonAbi],
48793
50620
  parse: ([pooled, shares]) => {
48794
- const totalAssets = toBigInt12(pooled);
48795
- const totalSupply = toBigInt12(shares);
50621
+ const totalAssets = toBigInt13(pooled);
50622
+ const totalSupply = toBigInt13(shares);
48796
50623
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
48797
50624
  const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E187 / totalSupply : ONE_E187;
48798
50625
  return { totalAssets, totalSupply, exchangeRate };
@@ -49313,7 +51140,7 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
49313
51140
  const validatorsByAddress = new Map(validatorEntries);
49314
51141
  const idleByAddress = /* @__PURE__ */ new Map();
49315
51142
  idleEntries.forEach((e, i) => {
49316
- const bal = toBigInt12(idleResults[i]);
51143
+ const bal = toBigInt13(idleResults[i]);
49317
51144
  if (bal !== void 0) idleByAddress.set(e.address.toLowerCase(), bal);
49318
51145
  });
49319
51146
  const rawResults = new Array(allCalls.length);
@@ -49328,9 +51155,9 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
49328
51155
  for (let i = 0; i < entries.length; i++) {
49329
51156
  const entry = entries[i];
49330
51157
  const reader = readers[i];
49331
- const slice = rawResults.slice(cursor, cursor + reader.calls.length);
51158
+ const slice2 = rawResults.slice(cursor, cursor + reader.calls.length);
49332
51159
  cursor += reader.calls.length;
49333
- const state = reader.parse(slice);
51160
+ const state = reader.parse(slice2);
49334
51161
  if (!state) continue;
49335
51162
  const addressLc = entry.address.toLowerCase();
49336
51163
  const underlyingLc = entry.underlying.toLowerCase();
@@ -49443,7 +51270,7 @@ var BeetsStSWithdrawalAbi = [
49443
51270
  ];
49444
51271
 
49445
51272
  // src/vaults/lst/withdrawals/readers/shared.ts
49446
- var toBigInt13 = (v) => {
51273
+ var toBigInt14 = (v) => {
49447
51274
  if (v === void 0 || v === null) return void 0;
49448
51275
  if (typeof v === "bigint") return v;
49449
51276
  if (typeof v === "number") return BigInt(v);
@@ -49458,7 +51285,7 @@ var toBigInt13 = (v) => {
49458
51285
  return void 0;
49459
51286
  };
49460
51287
  var toNumber = (v) => {
49461
- const b = toBigInt13(v);
51288
+ const b = toBigInt14(v);
49462
51289
  if (b === void 0) return void 0;
49463
51290
  if (b > BigInt(Number.MAX_SAFE_INTEGER)) return void 0;
49464
51291
  return Number(b);
@@ -49495,7 +51322,7 @@ var readerBeets = {
49495
51322
  const out = [];
49496
51323
  for (let i = 0; i < reqs.length; i++) {
49497
51324
  const r = reqs[i];
49498
- const amount = toBigInt13(r.assetAmount);
51325
+ const amount = toBigInt14(r.assetAmount);
49499
51326
  const ts = toNumber(r.requestTimestamp);
49500
51327
  const isWithdrawn = Boolean(r.isWithdrawn);
49501
51328
  if (amount === void 0 || ts === void 0) continue;
@@ -49587,13 +51414,13 @@ var readerBeHype = {
49587
51414
  const q = stage2[i * 2];
49588
51415
  const canClaim = Boolean(stage2[i * 2 + 1]);
49589
51416
  if (!q) continue;
49590
- const hypeAmount = Array.isArray(q) ? toBigInt13(q[2]) : toBigInt13(q.hypeAmount);
51417
+ const hypeAmount = Array.isArray(q) ? toBigInt14(q[2]) : toBigInt14(q.hypeAmount);
49591
51418
  if (hypeAmount === void 0) continue;
49592
51419
  out.push({
49593
51420
  lst: entry.lst,
49594
51421
  brand: entry.brand,
49595
51422
  symbol: entry.symbol,
49596
- requestId: String(toBigInt13(ids[i]) ?? i),
51423
+ requestId: String(toBigInt14(ids[i]) ?? i),
49597
51424
  amountUnderlying: hypeAmount.toString(),
49598
51425
  status: canClaim ? "claimable" : "pending"
49599
51426
  });
@@ -49696,7 +51523,7 @@ var readerBenqi = {
49696
51523
  for (let i = 0; i < reqs.length; i++) {
49697
51524
  const r = reqs[i];
49698
51525
  const startedAt = toNumber(r.startedAt);
49699
- const shareAmount = toBigInt13(r.shareAmount);
51526
+ const shareAmount = toBigInt14(r.shareAmount);
49700
51527
  if (startedAt === void 0 || shareAmount === void 0) continue;
49701
51528
  const readyAt = startedAt + cooldown;
49702
51529
  const expiresAt = readyAt + claimWindow;
@@ -49759,8 +51586,8 @@ var readerBeraPaw = {
49759
51586
  }
49760
51587
  const pos = res[0];
49761
51588
  if (!pos) return [];
49762
- const queued = Array.isArray(pos) ? toBigInt13(pos[0]) : toBigInt13(pos.queued);
49763
- const available = Array.isArray(pos) ? toBigInt13(pos[1]) : toBigInt13(pos.available);
51589
+ const queued = Array.isArray(pos) ? toBigInt14(pos[0]) : toBigInt14(pos.queued);
51590
+ const available = Array.isArray(pos) ? toBigInt14(pos[1]) : toBigInt14(pos.available);
49764
51591
  const out = [];
49765
51592
  if (available !== void 0 && available > 0n) {
49766
51593
  out.push({
@@ -49842,7 +51669,7 @@ var readerIbera = {
49842
51669
  return [];
49843
51670
  }
49844
51671
  const length = toNumber(stage1[0]) ?? 0;
49845
- const frontier = toBigInt13(stage1[1]) ?? 0n;
51672
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
49846
51673
  if (length === 0) return [];
49847
51674
  const start = length > MAX_SCAN ? length - MAX_SCAN : 0;
49848
51675
  const ids = Array.from({ length: length - start }, (_3, k) => start + k);
@@ -49866,7 +51693,7 @@ var readerIbera = {
49866
51693
  const r = stage2[k];
49867
51694
  if (!r) continue;
49868
51695
  const receiver = Array.isArray(r) ? r[2] : r.receiver;
49869
- const amount = Array.isArray(r) ? toBigInt13(r[3]) : toBigInt13(r.amount);
51696
+ const amount = Array.isArray(r) ? toBigInt14(r[3]) : toBigInt14(r.amount);
49870
51697
  if (typeof receiver !== "string" || receiver.toLowerCase() !== target || amount === void 0 || amount === 0n) {
49871
51698
  continue;
49872
51699
  }
@@ -49939,7 +51766,7 @@ var readerPrimeStaking = {
49939
51766
  return [];
49940
51767
  }
49941
51768
  const length = toNumber(stage1[0]) ?? 0;
49942
- const frontier = toBigInt13(stage1[1]) ?? 0n;
51769
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
49943
51770
  if (length === 0) return [];
49944
51771
  const start = length > MAX_SCAN2 ? length - MAX_SCAN2 : 0;
49945
51772
  const ids = Array.from({ length: length - start }, (_3, k) => start + k);
@@ -49963,7 +51790,7 @@ var readerPrimeStaking = {
49963
51790
  const r = stage2[k];
49964
51791
  if (!r) continue;
49965
51792
  const receiver = Array.isArray(r) ? r[1] : r.receiver;
49966
- const assets = Array.isArray(r) ? toBigInt13(r[3]) : toBigInt13(r.assets);
51793
+ const assets = Array.isArray(r) ? toBigInt14(r[3]) : toBigInt14(r.assets);
49967
51794
  const processed = Array.isArray(r) ? r[4] : r.processed;
49968
51795
  if (typeof receiver !== "string" || receiver.toLowerCase() !== target || assets === void 0 || assets === 0n) {
49969
51796
  continue;
@@ -50033,8 +51860,8 @@ var readerErc7540 = {
50033
51860
  ],
50034
51861
  abi: [Erc7540Abi, Erc7540Abi]
50035
51862
  });
50036
- const pending = toBigInt13(stage1[0]) ?? 0n;
50037
- const claimable = toBigInt13(stage1[1]) ?? 0n;
51863
+ const pending = toBigInt14(stage1[0]) ?? 0n;
51864
+ const claimable = toBigInt14(stage1[1]) ?? 0n;
50038
51865
  const out = [];
50039
51866
  if (claimable > 0n) {
50040
51867
  const stage2 = await multicallRetry({
@@ -50048,7 +51875,7 @@ var readerErc7540 = {
50048
51875
  ],
50049
51876
  abi: [Erc7540Abi]
50050
51877
  });
50051
- const amount = toBigInt13(stage2[0]) ?? claimable;
51878
+ const amount = toBigInt14(stage2[0]) ?? claimable;
50052
51879
  out.push({
50053
51880
  lst: entry.lst,
50054
51881
  brand: entry.brand,
@@ -50102,11 +51929,11 @@ var readerEthenaCooldown = {
50102
51929
  let cooldownEnd;
50103
51930
  let amount;
50104
51931
  if (Array.isArray(cell)) {
50105
- cooldownEnd = toBigInt13(cell[0]);
50106
- amount = toBigInt13(cell[1]);
51932
+ cooldownEnd = toBigInt14(cell[0]);
51933
+ amount = toBigInt14(cell[1]);
50107
51934
  } else if (cell && typeof cell === "object") {
50108
- cooldownEnd = toBigInt13(cell.cooldownEnd);
50109
- amount = toBigInt13(cell.underlyingAmount);
51935
+ cooldownEnd = toBigInt14(cell.cooldownEnd);
51936
+ amount = toBigInt14(cell.underlyingAmount);
50110
51937
  }
50111
51938
  if (!amount || amount === 0n) return [];
50112
51939
  const readyAt = Number(cooldownEnd ?? 0n);
@@ -50201,7 +52028,7 @@ var readerEtherFi = {
50201
52028
  calls: enumCalls,
50202
52029
  abi: enumCalls.map(() => EtherFiWithdrawRequestAbi)
50203
52030
  });
50204
- const ids = stage2.map(toBigInt13).filter((v) => v !== void 0);
52031
+ const ids = stage2.map(toBigInt14).filter((v) => v !== void 0);
50205
52032
  if (ids.length === 0) return [];
50206
52033
  const detailCalls = ids.flatMap((id) => [
50207
52034
  { address: entry.withdrawalContract, name: "getRequest", params: [id] },
@@ -50221,7 +52048,7 @@ var readerEtherFi = {
50221
52048
  const isValid = Boolean(stage3[i * 3 + 2]);
50222
52049
  if (!req) continue;
50223
52050
  if (!isValid) continue;
50224
- const amount = toBigInt13(req.amountOfEEth);
52051
+ const amount = toBigInt14(req.amountOfEEth);
50225
52052
  if (amount === void 0) continue;
50226
52053
  out.push({
50227
52054
  lst: entry.lst,
@@ -50316,7 +52143,7 @@ var readerKelp = {
50316
52143
  }
50317
52144
  ],
50318
52145
  abi: [KelpWithdrawalManagerAbi]
50319
- }).then((res) => toBigInt13(res[0]) ?? 0n)
52146
+ }).then((res) => toBigInt14(res[0]) ?? 0n)
50320
52147
  ]);
50321
52148
  lengths = storageReads;
50322
52149
  currentBlock = block;
@@ -50346,9 +52173,9 @@ var readerKelp = {
50346
52173
  for (let i = 0; i < detailCalls.length; i++) {
50347
52174
  const r = stage2[i];
50348
52175
  if (!r) continue;
50349
- const expected = Array.isArray(r) ? toBigInt13(r[1]) : toBigInt13(r.expectedAssetAmount);
50350
- const startBlock = Array.isArray(r) ? toBigInt13(r[2]) : toBigInt13(r.withdrawalStartBlock);
50351
- const nonce = Array.isArray(r) ? toBigInt13(r[3]) : toBigInt13(r.userNonce);
52176
+ const expected = Array.isArray(r) ? toBigInt14(r[1]) : toBigInt14(r.expectedAssetAmount);
52177
+ const startBlock = Array.isArray(r) ? toBigInt14(r[2]) : toBigInt14(r.withdrawalStartBlock);
52178
+ const nonce = Array.isArray(r) ? toBigInt14(r[3]) : toBigInt14(r.userNonce);
50352
52179
  if (expected === void 0 || startBlock === void 0) continue;
50353
52180
  const claimable = currentBlock >= startBlock + delayBlocks;
50354
52181
  out.push({
@@ -50425,7 +52252,7 @@ var readerLido = {
50425
52252
  abi: [LidoWithdrawalQueueAbi, LidoWithdrawalQueueAbi]
50426
52253
  });
50427
52254
  const ids = stage1[0];
50428
- const frontier = toBigInt13(stage1[1]) ?? 0n;
52255
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
50429
52256
  if (!Array.isArray(ids) || ids.length === 0) return [];
50430
52257
  const stage2 = await multicallRetry({
50431
52258
  chain: chainId,
@@ -50442,10 +52269,10 @@ var readerLido = {
50442
52269
  if (!Array.isArray(statuses)) return [];
50443
52270
  const out = [];
50444
52271
  for (let i = 0; i < ids.length; i++) {
50445
- const id = toBigInt13(ids[i]);
52272
+ const id = toBigInt14(ids[i]);
50446
52273
  const s = statuses[i];
50447
52274
  if (id === void 0 || !s) continue;
50448
- const amountOfStETH = toBigInt13(s.amountOfStETH);
52275
+ const amountOfStETH = toBigInt14(s.amountOfStETH);
50449
52276
  const isFinalized = Boolean(s.isFinalized);
50450
52277
  const isClaimed = Boolean(s.isClaimed);
50451
52278
  if (amountOfStETH === void 0) continue;
@@ -50554,11 +52381,11 @@ var readerLista = {
50554
52381
  const status = stage2[i];
50555
52382
  if (!status) continue;
50556
52383
  const isClaimable = Array.isArray(status) ? Boolean(status[0]) : Boolean(status._isClaimable);
50557
- const bnbAmount = Array.isArray(status) ? toBigInt13(status[1]) : toBigInt13(status._amount);
50558
- const snbnbAmount = Array.isArray(req) ? toBigInt13(req[1]) : toBigInt13(req?.amountInSnBnb);
52384
+ const bnbAmount = Array.isArray(status) ? toBigInt14(status[1]) : toBigInt14(status._amount);
52385
+ const snbnbAmount = Array.isArray(req) ? toBigInt14(req[1]) : toBigInt14(req?.amountInSnBnb);
50559
52386
  const amount = bnbAmount ?? snbnbAmount;
50560
52387
  if (amount === void 0) continue;
50561
- const uuid = Array.isArray(req) ? toBigInt13(req[0]) : toBigInt13(req?.uuid);
52388
+ const uuid = Array.isArray(req) ? toBigInt14(req[0]) : toBigInt14(req?.uuid);
50562
52389
  out.push({
50563
52390
  lst: entry.lst,
50564
52391
  brand: entry.brand,
@@ -50643,7 +52470,7 @@ var readerRenzo = {
50643
52470
  for (let i = 0; i < count; i++) {
50644
52471
  const tup = stage2[i];
50645
52472
  if (!Array.isArray(tup) || tup.length < 5) continue;
50646
- const amountToRedeem = toBigInt13(tup[2]);
52473
+ const amountToRedeem = toBigInt14(tup[2]);
50647
52474
  const createdAt = toNumber(tup[4]);
50648
52475
  if (amountToRedeem === void 0 || createdAt === void 0) continue;
50649
52476
  const readyAt = createdAt + cooldown;
@@ -50716,9 +52543,9 @@ var readerStaderEthx2 = {
50716
52543
  ]
50717
52544
  });
50718
52545
  const ids = stage1[0];
50719
- const frontier = toBigInt13(stage1[1]) ?? 0n;
52546
+ const frontier = toBigInt14(stage1[1]) ?? 0n;
50720
52547
  if (!Array.isArray(ids) || ids.length === 0) return [];
50721
- const idBigInts = ids.map(toBigInt13).filter((v) => v !== void 0);
52548
+ const idBigInts = ids.map(toBigInt14).filter((v) => v !== void 0);
50722
52549
  const detailCalls = idBigInts.map((id) => ({
50723
52550
  address: entry.withdrawalContract,
50724
52551
  name: "userWithdrawRequests",
@@ -50734,8 +52561,8 @@ var readerStaderEthx2 = {
50734
52561
  const id = idBigInts[i];
50735
52562
  const tup = stage2[i];
50736
52563
  if (!Array.isArray(tup) || tup.length < 5) continue;
50737
- const ethExpected = toBigInt13(tup[2]) ?? 0n;
50738
- const ethFinalized = toBigInt13(tup[3]) ?? 0n;
52564
+ const ethExpected = toBigInt14(tup[2]) ?? 0n;
52565
+ const ethFinalized = toBigInt14(tup[3]) ?? 0n;
50739
52566
  const isFinalized = id < frontier && ethFinalized > 0n;
50740
52567
  const queuePosition = isFinalized ? 0 : Number(id - frontier);
50741
52568
  out.push({
@@ -50814,13 +52641,13 @@ var readerStaderMaticX2 = {
50814
52641
  });
50815
52642
  const arr = stage1[0];
50816
52643
  if (!Array.isArray(arr)) return [];
50817
- const currentEpoch = stakeManager ? toBigInt13(stage1[1]) ?? 0n : 0n;
50818
- const delay = stakeManager ? toBigInt13(stage1[2]) ?? 0n : 0n;
52644
+ const currentEpoch = stakeManager ? toBigInt14(stage1[1]) ?? 0n : 0n;
52645
+ const delay = stakeManager ? toBigInt14(stage1[2]) ?? 0n : 0n;
50819
52646
  const out = [];
50820
52647
  for (let i = 0; i < arr.length; i++) {
50821
52648
  const r = arr[i];
50822
- const amount = toBigInt13(r.amount) ?? 0n;
50823
- const requestEpoch = toBigInt13(r.requestEpoch);
52649
+ const amount = toBigInt14(r.amount) ?? 0n;
52650
+ const requestEpoch = toBigInt14(r.requestEpoch);
50824
52651
  if (requestEpoch === void 0) continue;
50825
52652
  const ready = stakeManager ? currentEpoch >= requestEpoch + delay : false;
50826
52653
  out.push({
@@ -50907,9 +52734,9 @@ var readerMantle = {
50907
52734
  if (typeof requester === "string" && requester.toLowerCase() !== lcUser) {
50908
52735
  continue;
50909
52736
  }
50910
- const ethRequested = Array.isArray(detail) ? toBigInt13(detail[3]) : toBigInt13(detail.ethRequested);
52737
+ const ethRequested = Array.isArray(detail) ? toBigInt14(detail[3]) : toBigInt14(detail.ethRequested);
50911
52738
  const isFinalized = Array.isArray(info) ? Boolean(info[0]) : Boolean(info.isFinalized);
50912
- const claimable = Array.isArray(info) ? toBigInt13(info[1]) : toBigInt13(info.claimableAmount);
52739
+ const claimable = Array.isArray(info) ? toBigInt14(info[1]) : toBigInt14(info.claimableAmount);
50913
52740
  if (ethRequested === void 0) continue;
50914
52741
  out.push({
50915
52742
  lst: entry.lst,
@@ -50988,8 +52815,8 @@ var readerPuffer = {
50988
52815
  calls,
50989
52816
  abi: calls.map(() => PufferWithdrawalManagerAbi)
50990
52817
  });
50991
- const finalizedBatch = toBigInt13(results[detailCalls.length]) ?? 0n;
50992
- const batchSize = toBigInt13(results[detailCalls.length + 1]) ?? 0n;
52818
+ const finalizedBatch = toBigInt14(results[detailCalls.length]) ?? 0n;
52819
+ const batchSize = toBigInt14(results[detailCalls.length + 1]) ?? 0n;
50993
52820
  const out = [];
50994
52821
  const lcUser = user.toLowerCase();
50995
52822
  for (let i = 0; i < ids.length; i++) {
@@ -50999,7 +52826,7 @@ var readerPuffer = {
50999
52826
  if (typeof recipient === "string" && recipient.toLowerCase() !== lcUser) {
51000
52827
  continue;
51001
52828
  }
51002
- const pufETHAmount = Array.isArray(d) ? toBigInt13(d[0]) : toBigInt13(d.pufETHAmount);
52829
+ const pufETHAmount = Array.isArray(d) ? toBigInt14(d[0]) : toBigInt14(d.pufETHAmount);
51003
52830
  if (pufETHAmount === void 0) continue;
51004
52831
  const batchIdx = batchSize > 0n ? ids[i] / batchSize : 0n;
51005
52832
  const claimable = batchIdx <= finalizedBatch;
@@ -51097,7 +52924,7 @@ var readerKinetiq = {
51097
52924
  for (let i = 0; i < count; i++) {
51098
52925
  const r = stage2[i];
51099
52926
  if (!r) continue;
51100
- const hypeAmount = Array.isArray(r) ? toBigInt13(r[0]) : toBigInt13(r.hypeAmount);
52927
+ const hypeAmount = Array.isArray(r) ? toBigInt14(r[0]) : toBigInt14(r.hypeAmount);
51101
52928
  const timestamp = Array.isArray(r) ? toNumber(r[4]) : toNumber(r.timestamp);
51102
52929
  if (hypeAmount === void 0 || hypeAmount === 0n || timestamp === void 0) {
51103
52930
  continue;
@@ -51225,7 +53052,7 @@ var readerStakeWise = {
51225
53052
  const claimedByIdx = /* @__PURE__ */ new Map();
51226
53053
  for (let i = 0; i < onChainChecks.length; i++) {
51227
53054
  const cell = checkResults[i];
51228
- const claimed = Array.isArray(cell) ? toBigInt13(cell[2]) : toBigInt13(cell?.claimedAssets);
53055
+ const claimed = Array.isArray(cell) ? toBigInt14(cell[2]) : toBigInt14(cell?.claimedAssets);
51229
53056
  if (claimed !== void 0 && claimed > 0n) {
51230
53057
  claimedByIdx.set(onChainChecks[i].idx, claimed);
51231
53058
  }
@@ -51233,7 +53060,7 @@ var readerStakeWise = {
51233
53060
  const out = [];
51234
53061
  for (let i = 0; i < requests.length; i++) {
51235
53062
  const r = requests[i];
51236
- const amount = toBigInt13(r.totalAssets) ?? 0n;
53063
+ const amount = toBigInt14(r.totalAssets) ?? 0n;
51237
53064
  const onChainClaimed = claimedByIdx.get(i);
51238
53065
  const claimable = onChainClaimed !== void 0 || r.isClaimable;
51239
53066
  out.push({
@@ -51290,7 +53117,7 @@ var readerStCelo2 = {
51290
53117
  const timestamps = cell[1] ?? [];
51291
53118
  const out = [];
51292
53119
  for (let i = 0; i < values.length; i++) {
51293
- const amount = toBigInt13(values[i]);
53120
+ const amount = toBigInt14(values[i]);
51294
53121
  const readyAt = toNumber(timestamps[i]);
51295
53122
  if (amount === void 0 || readyAt === void 0) continue;
51296
53123
  out.push({
@@ -51335,11 +53162,11 @@ var readerStellaUnbond = {
51335
53162
  let waiting;
51336
53163
  let unbonded;
51337
53164
  if (Array.isArray(cell)) {
51338
- waiting = toBigInt13(cell[0]);
51339
- unbonded = toBigInt13(cell[1]);
53165
+ waiting = toBigInt14(cell[0]);
53166
+ unbonded = toBigInt14(cell[1]);
51340
53167
  } else if (cell && typeof cell === "object") {
51341
- waiting = toBigInt13(cell.waiting);
51342
- unbonded = toBigInt13(cell.unbonded);
53168
+ waiting = toBigInt14(cell.waiting);
53169
+ unbonded = toBigInt14(cell.unbonded);
51343
53170
  }
51344
53171
  const out = [];
51345
53172
  if (unbonded && unbonded > 0n) {
@@ -51429,7 +53256,7 @@ var readerSwell = {
51429
53256
  abi: [SwellRswExitAbi, SwellRswExitAbi]
51430
53257
  });
51431
53258
  const count = toNumber(stage1[0]) ?? 0;
51432
- const lastProcessed = toBigInt13(stage1[1]) ?? 0n;
53259
+ const lastProcessed = toBigInt14(stage1[1]) ?? 0n;
51433
53260
  if (count === 0) return [];
51434
53261
  const enumCalls = Array.from({ length: count }, (_3, i) => ({
51435
53262
  address: entry.withdrawalContract,
@@ -51441,7 +53268,7 @@ var readerSwell = {
51441
53268
  calls: enumCalls,
51442
53269
  abi: enumCalls.map(() => SwellRswExitAbi)
51443
53270
  });
51444
- const ids = stage2.map(toBigInt13).filter((v) => v !== void 0);
53271
+ const ids = stage2.map(toBigInt14).filter((v) => v !== void 0);
51445
53272
  if (ids.length === 0) return [];
51446
53273
  const detailCalls = ids.map((id) => ({
51447
53274
  address: entry.withdrawalContract,
@@ -51458,7 +53285,7 @@ var readerSwell = {
51458
53285
  const id = ids[i];
51459
53286
  const r = stage3[i];
51460
53287
  if (!r) continue;
51461
- const amount = toBigInt13(r.amount);
53288
+ const amount = toBigInt14(r.amount);
51462
53289
  if (amount === void 0) continue;
51463
53290
  const claimable = id <= lastProcessed;
51464
53291
  out.push({
@@ -51532,14 +53359,14 @@ var readerValantis = {
51532
53359
  for (let i = 0; i < burns.length; i++) {
51533
53360
  const b = burns[i];
51534
53361
  if (!b) continue;
51535
- const amount = Array.isArray(b) ? toBigInt13(b[0]) : toBigInt13(b.amount);
53362
+ const amount = Array.isArray(b) ? toBigInt14(b[0]) : toBigInt14(b.amount);
51536
53363
  const completed = Array.isArray(b) ? Boolean(b[2]) : Boolean(b.completed);
51537
53364
  if (amount === void 0 || completed) continue;
51538
53365
  out.push({
51539
53366
  lst: entry.lst,
51540
53367
  brand: entry.brand,
51541
53368
  symbol: entry.symbol,
51542
- requestId: String(toBigInt13(ids[i]) ?? i),
53369
+ requestId: String(toBigInt14(ids[i]) ?? i),
51543
53370
  amountUnderlying: amount.toString(),
51544
53371
  status: redeemable[i] ? "claimable" : "pending"
51545
53372
  });
@@ -51612,7 +53439,7 @@ var readerTruFin = {
51612
53439
  if (typeof recipient === "string" && recipient.toLowerCase() !== lcUser) {
51613
53440
  continue;
51614
53441
  }
51615
- const amount = Array.isArray(w) ? toBigInt13(w[1]) : toBigInt13(w.amount);
53442
+ const amount = Array.isArray(w) ? toBigInt14(w[1]) : toBigInt14(w.amount);
51616
53443
  if (amount === void 0 || amount === 0n) continue;
51617
53444
  out.push({
51618
53445
  lst: entry.lst,
@@ -51708,7 +53535,7 @@ var readerYieldNest = {
51708
53535
  calls: enumCalls,
51709
53536
  abi: enumCalls.map(() => YieldNestWithdrawalQueueAbi)
51710
53537
  });
51711
- const ids = stage2.map(toBigInt13).filter((v) => v !== void 0);
53538
+ const ids = stage2.map(toBigInt14).filter((v) => v !== void 0);
51712
53539
  if (ids.length === 0) return [];
51713
53540
  const detailCalls = ids.map((id) => ({
51714
53541
  address: entry.withdrawalContract,
@@ -51727,7 +53554,7 @@ var readerYieldNest = {
51727
53554
  const id = ids[i];
51728
53555
  const r = stage3[i];
51729
53556
  if (!r) continue;
51730
- const amount = toBigInt13(r.amount);
53557
+ const amount = toBigInt14(r.amount);
51731
53558
  const created = toNumber(r.creationTimestamp);
51732
53559
  const processed = Boolean(r.processed);
51733
53560
  if (amount === void 0 || created === void 0) continue;
@@ -52320,7 +54147,7 @@ var getLstWithdrawalRegistry = (chainId, extraEntries) => {
52320
54147
  const extra = extraEntries.filter((e) => !seen.has(e.lst.toLowerCase()));
52321
54148
  return extra.length === 0 ? base : [...base, ...extra];
52322
54149
  };
52323
- var warn5 = (...args) => {
54150
+ var warn7 = (...args) => {
52324
54151
  };
52325
54152
  var getLstWithdrawalRequests = async (user, chainId, multicallRetry, options) => {
52326
54153
  const entries = getLstWithdrawalRegistry(chainId, options?.extraEntries);
@@ -52335,7 +54162,7 @@ var getLstWithdrawalRequests = async (user, chainId, multicallRetry, options) =>
52335
54162
  try {
52336
54163
  return await reader.fetch(lcUser, multicallRetry, chainId, entry, ids);
52337
54164
  } catch (e) {
52338
- warn5(
54165
+ warn7(
52339
54166
  `[lst-withdrawals] ${entry.brand} ${entry.symbol} (${entry.lst}) failed:`,
52340
54167
  e?.message ?? e
52341
54168
  );
@@ -52404,7 +54231,7 @@ var NavOracleReadAbi = [
52404
54231
 
52405
54232
  // src/vaults/savings/readers/shared.ts
52406
54233
  var ONE_E189 = 10n ** 18n;
52407
- var toBigInt14 = (v) => {
54234
+ var toBigInt15 = (v) => {
52408
54235
  if (v === void 0 || v === null) return void 0;
52409
54236
  if (typeof v === "bigint") return v;
52410
54237
  if (typeof v === "number") return BigInt(v);
@@ -52435,9 +54262,9 @@ var readerErc46262 = (entry) => {
52435
54262
  ],
52436
54263
  abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2],
52437
54264
  parse: ([assets, supply, rate]) => {
52438
- const totalAssets = toBigInt14(assets);
52439
- const totalSupply = toBigInt14(supply);
52440
- const convertToAssetsRaw = toBigInt14(rate);
54265
+ const totalAssets = toBigInt15(assets);
54266
+ const totalSupply = toBigInt15(supply);
54267
+ const convertToAssetsRaw = toBigInt15(rate);
52441
54268
  if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
52442
54269
  return void 0;
52443
54270
  }
@@ -52531,13 +54358,13 @@ var readerErc4626Idle = (entry) => {
52531
54358
  ],
52532
54359
  abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2, BalanceOfAbi],
52533
54360
  parse: ([assets, supply, rate, inventoryBalance]) => {
52534
- const totalAssets = toBigInt14(assets);
52535
- const totalSupply = toBigInt14(supply);
52536
- const convertToAssetsRaw = toBigInt14(rate);
54361
+ const totalAssets = toBigInt15(assets);
54362
+ const totalSupply = toBigInt15(supply);
54363
+ const convertToAssetsRaw = toBigInt15(rate);
52537
54364
  if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
52538
54365
  return void 0;
52539
54366
  }
52540
- const capacity = toBigInt14(inventoryBalance);
54367
+ const capacity = toBigInt15(inventoryBalance);
52541
54368
  return {
52542
54369
  totalAssets,
52543
54370
  totalSupply,
@@ -52568,10 +54395,10 @@ var readerNavOracle = (entry) => {
52568
54395
  ],
52569
54396
  abis: [TotalSupplyAbi2, NavOracleReadAbi],
52570
54397
  parse: ([supply, round]) => {
52571
- const totalSupply = toBigInt14(supply);
54398
+ const totalSupply = toBigInt15(supply);
52572
54399
  if (totalSupply === void 0) return void 0;
52573
54400
  const raw = Array.isArray(round) ? round[1] : round?.answer;
52574
- const exchangeRate = toBigInt14(raw);
54401
+ const exchangeRate = toBigInt15(raw);
52575
54402
  if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
52576
54403
  return {
52577
54404
  totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E189 * shareUnit),
@@ -52613,14 +54440,14 @@ var readerNativeWnlp = (entry) => {
52613
54440
  NativeWithdrawQueueReadAbi
52614
54441
  ],
52615
54442
  parse: ([supply, rate, feeBips, instantEnabled, inventory, window]) => {
52616
- const totalSupply = toBigInt14(supply);
52617
- const exchangeRate = toBigInt14(rate);
54443
+ const totalSupply = toBigInt15(supply);
54444
+ const exchangeRate = toBigInt15(rate);
52618
54445
  if (totalSupply === void 0 || exchangeRate === void 0) {
52619
54446
  return void 0;
52620
54447
  }
52621
- const capacity = toBigInt14(inventory);
52622
- const windowSeconds = toBigInt14(window);
52623
- const bips = toBigInt14(feeBips);
54448
+ const capacity = toBigInt15(inventory);
54449
+ const windowSeconds = toBigInt15(window);
54450
+ const bips = toBigInt15(feeBips);
52624
54451
  return {
52625
54452
  totalAssets: totalSupply * exchangeRate / ONE_E189,
52626
54453
  totalSupply,
@@ -52678,9 +54505,9 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
52678
54505
  for (let i = 0; i < entries.length; i++) {
52679
54506
  const entry = entries[i];
52680
54507
  const reader = readers[i];
52681
- const slice = rawResults.slice(cursor, cursor + reader.calls.length);
54508
+ const slice2 = rawResults.slice(cursor, cursor + reader.calls.length);
52682
54509
  cursor += reader.calls.length;
52683
- const state = reader.parse(slice);
54510
+ const state = reader.parse(slice2);
52684
54511
  if (!state) continue;
52685
54512
  const addressLc = entry.address.toLowerCase();
52686
54513
  const underlyingLc = entry.underlying.toLowerCase();
@@ -52884,7 +54711,7 @@ var pickApr = (apr) => {
52884
54711
  if (apr.inception != null) return { rate: apr.inception, window: "inception" };
52885
54712
  return { rate: 0, window: "none" };
52886
54713
  };
52887
- var num = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
54714
+ var num4 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
52888
54715
  function parseVault7(v, chainId, prices, tokenList) {
52889
54716
  const address = (v?.address ?? "").toLowerCase();
52890
54717
  const assetAddr = (v?.asset?.address ?? "").toLowerCase();
@@ -52900,14 +54727,14 @@ function parseVault7(v, chainId, prices, tokenList) {
52900
54727
  parseRawAmount(totalAssetsRaw, assetDecimals)
52901
54728
  );
52902
54729
  const apr = {
52903
- weekly: num(state.weeklyApr?.twrrNetApr),
52904
- monthly: num(state.monthlyApr?.twrrNetApr),
52905
- yearly: num(state.yearlyApr?.twrrNetApr),
52906
- inception: num(state.inceptionApr?.twrrNetApr)
54730
+ weekly: num4(state.weeklyApr?.twrrNetApr),
54731
+ monthly: num4(state.monthlyApr?.twrrNetApr),
54732
+ yearly: num4(state.yearlyApr?.twrrNetApr),
54733
+ inception: num4(state.inceptionApr?.twrrNetApr)
52907
54734
  };
52908
54735
  const { rate: supplyRate, window: aprWindow } = pickApr(apr);
52909
54736
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
52910
- const apiTotalAssetsUsd = num(state.totalAssetsUsd) ?? 0;
54737
+ const apiTotalAssetsUsd = num4(state.totalAssetsUsd) ?? 0;
52911
54738
  const impliedPriceUsd = totalAssetsFormatted > 0 ? apiTotalAssetsUsd / totalAssetsFormatted : 0;
52912
54739
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? impliedPriceUsd;
52913
54740
  const totalAssetsUsd = apiTotalAssetsUsd || totalAssetsFormatted * priceUsd;
@@ -52927,7 +54754,7 @@ function parseVault7(v, chainId, prices, tokenList) {
52927
54754
  totalAssets: totalAssetsRaw,
52928
54755
  totalSupply: totalSupplyRaw,
52929
54756
  pricePerShare: state.pricePerShare?.toString() ?? "0",
52930
- pricePerShareUsd: num(state.pricePerShareUsd) ?? void 0,
54757
+ pricePerShareUsd: num4(state.pricePerShareUsd) ?? void 0,
52931
54758
  supplyRate,
52932
54759
  rewardsRate: 0,
52933
54760
  depositRate: supplyRate,
@@ -53039,9 +54866,9 @@ async function fetchAaveEarnApiVaults(chainId, targets) {
53039
54866
  const target = Number(chainId);
53040
54867
  const byAddress = /* @__PURE__ */ new Map();
53041
54868
  const keep = (it) => {
53042
- const addr = it?.address?.toLowerCase();
53043
- if (!addr || Number(it.chainId) !== target) return;
53044
- if (!byAddress.has(addr)) byAddress.set(addr, it);
54869
+ const addr2 = it?.address?.toLowerCase();
54870
+ if (!addr2 || Number(it.chainId) !== target) return;
54871
+ if (!byAddress.has(addr2)) byAddress.set(addr2, it);
53045
54872
  };
53046
54873
  for (const owner of targets.owners) {
53047
54874
  let cursor = null;
@@ -53110,7 +54937,7 @@ var resolveAaveEarnCuratorName = (chainId, owner) => {
53110
54937
 
53111
54938
  // src/vaults/aave-earn/fetchPublic.ts
53112
54939
  var BRAND2 = "Aave";
53113
- var toBigInt15 = (v) => {
54940
+ var toBigInt16 = (v) => {
53114
54941
  if (v === void 0 || v === null) return void 0;
53115
54942
  if (typeof v === "bigint") return v;
53116
54943
  if (typeof v === "number") return BigInt(v);
@@ -53124,7 +54951,7 @@ var toBigInt15 = (v) => {
53124
54951
  }
53125
54952
  return void 0;
53126
54953
  };
53127
- var num2 = (v) => {
54954
+ var num5 = (v) => {
53128
54955
  const n = Number(v);
53129
54956
  return Number.isFinite(n) ? n : 0;
53130
54957
  };
@@ -53165,28 +54992,28 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
53165
54992
  for (let i = 0; i < usable.length; i++) {
53166
54993
  const v = usable[i];
53167
54994
  const base = i * CALLS_PER_VAULT2;
53168
- const slice = rawResults.slice(base, base + CALLS_PER_VAULT2);
54995
+ const slice2 = rawResults.slice(base, base + CALLS_PER_VAULT2);
53169
54996
  const addressLc = v.address.toLowerCase();
53170
54997
  const token = v.usedReserve.underlyingToken;
53171
54998
  const underlyingLc = token.address.toLowerCase();
53172
54999
  const assetDecimals = token.decimals;
53173
- const shareDecOnChain = toBigInt15(slice[1]);
55000
+ const shareDecOnChain = toBigInt16(slice2[1]);
53174
55001
  const decimals = shareDecOnChain !== void 0 ? Number(shareDecOnChain) : assetDecimals;
53175
- const totalSupply = toBigInt15(slice[2]);
55002
+ const totalSupply = toBigInt16(slice2[2]);
53176
55003
  if (totalSupply === void 0) continue;
53177
55004
  const shareUnit = 10n ** BigInt(decimals);
53178
55005
  const underlyingUnit = 10n ** BigInt(assetDecimals);
53179
- const convertToAssets = toBigInt15(slice[3]) ?? 0n;
55006
+ const convertToAssets = toBigInt16(slice2[3]) ?? 0n;
53180
55007
  const convertToShares = convertToAssets > 0n ? shareUnit * underlyingUnit / convertToAssets : 0n;
53181
- const totalAssets = toBigInt15(slice[0]) ?? totalSupply * convertToAssets / shareUnit;
55008
+ const totalAssets = toBigInt16(slice2[0]) ?? totalSupply * convertToAssets / shareUnit;
53182
55009
  const totalAssetsFormatted = Number(totalAssets) / 10 ** assetDecimals;
53183
55010
  const asset = tokenList[underlyingLc];
53184
- const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num2(v.balance.usdPerToken) : void 0);
55011
+ const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num5(v.balance.usdPerToken) : void 0);
53185
55012
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
53186
- const supplyRate = num2(v.vaultApr?.formatted);
55013
+ const supplyRate = num5(v.vaultApr?.formatted);
53187
55014
  const rewardsRate = 0;
53188
55015
  const depositRate = supplyRate + rewardsRate;
53189
- const fee = num2(v.fee?.value);
55016
+ const fee = num5(v.fee?.value);
53190
55017
  const symbol = (v.shareSymbol ?? "").trim();
53191
55018
  const shareName = (v.shareName ?? "").trim();
53192
55019
  const name = shareName || symbol;
@@ -53223,7 +55050,7 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
53223
55050
  };
53224
55051
 
53225
55052
  // src/vaults/upshift/fetchPublic.ts
53226
- var num3 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
55053
+ var num6 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
53227
55054
  var isEvmAddress = (a) => /^0x[0-9a-fA-F]{40}$/.test(a);
53228
55055
  var derivePricePerShare = (totalAssetsRaw, totalSupplyRaw, shareDecimals) => {
53229
55056
  try {
@@ -53250,12 +55077,12 @@ function parseVault8(v, chainId, prices, tokenList) {
53250
55077
  const totalAssetsFormatted = Number(
53251
55078
  parseRawAmount(totalAssetsRaw, assetDecimals)
53252
55079
  );
53253
- const base = num3(v.apy?.apy) ?? 0;
53254
- const campaign = num3(v.apy?.campaignApy);
55080
+ const base = num6(v.apy?.apy) ?? 0;
55081
+ const campaign = num6(v.apy?.campaignApy);
53255
55082
  const supplyRate = apyToAprPercent(base);
53256
55083
  const rewardsRate = campaign != null ? apyToAprPercent(campaign) : 0;
53257
55084
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
53258
- const apiTvlUsd = num3(v.latest_reported_tvl) ?? 0;
55085
+ const apiTvlUsd = num6(v.latest_reported_tvl) ?? 0;
53259
55086
  const impliedPriceUsd = totalAssetsFormatted > 0 ? apiTvlUsd / totalAssetsFormatted : 0;
53260
55087
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? impliedPriceUsd;
53261
55088
  const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
@@ -53280,10 +55107,10 @@ function parseVault8(v, chainId, prices, tokenList) {
53280
55107
  rewardsRate,
53281
55108
  depositRate: supplyRate + rewardsRate,
53282
55109
  apy: {
53283
- base: num3(v.apy?.apy),
55110
+ base: num6(v.apy?.apy),
53284
55111
  campaign,
53285
- points: num3(v.apy?.pointsApy),
53286
- underlying: num3(v.apy?.underlyingApy)
55112
+ points: num6(v.apy?.pointsApy),
55113
+ underlying: num6(v.apy?.underlyingApy)
53287
55114
  },
53288
55115
  isDepositPaused: v.isDepositPaused ?? false,
53289
55116
  isWithdrawalPaused: v.isWithdrawalPaused ?? false,
@@ -53392,9 +55219,9 @@ var asBig = (v) => {
53392
55219
  return null;
53393
55220
  }
53394
55221
  };
53395
- var num4 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
55222
+ var num7 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
53396
55223
  var toPct = (v) => {
53397
- const n = num4(v);
55224
+ const n = num7(v);
53398
55225
  return n == null ? 0 : n * 100;
53399
55226
  };
53400
55227
  var deriveTotalSupply = (totalAssetsRaw, pricePerShareRaw, decimals) => {
@@ -53426,16 +55253,16 @@ function parseVault9(v, chainId, prices, tokenList) {
53426
55253
  const totalAssetsFormatted = Number(
53427
55254
  parseRawAmount(totalAssetsRaw, assetDecimals)
53428
55255
  );
53429
- const realized = num4(v.apr?.netAPR);
53430
- const forward = num4(v.apr?.forwardAPR?.netAPR);
55256
+ const realized = num7(v.apr?.netAPR);
55257
+ const forward = num7(v.apr?.forwardAPR?.netAPR);
53431
55258
  const isForwardApr = realized == null && forward != null;
53432
55259
  const supplyRate = toPct(realized ?? forward);
53433
55260
  const rewardsRate = toPct(v.apr?.extra?.stakingRewardsAPR);
53434
55261
  const fee = toPct(v.apr?.fees?.performance);
53435
55262
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
53436
- const apiPrice = num4(v.tvl?.price) ?? 0;
55263
+ const apiPrice = num7(v.tvl?.price) ?? 0;
53437
55264
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? apiPrice;
53438
- const apiTvlUsd = num4(v.tvl?.tvl) ?? 0;
55265
+ const apiTvlUsd = num7(v.tvl?.tvl) ?? 0;
53439
55266
  const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
53440
55267
  const name = (v.name ?? "").trim();
53441
55268
  const symbol = (v.symbol ?? "").trim();
@@ -53871,6 +55698,7 @@ var stampVaultClassification = (data, chainId, tokenList = {}) => {
53871
55698
  stampBag(data.lista, "lista");
53872
55699
  stampBag(data.silo, "silo");
53873
55700
  stampBag(data["euler-earn"], "euler-earn");
55701
+ stampBag(data.termmax, "termmax");
53874
55702
  stampBag(data.lst, "lst");
53875
55703
  stampBag(data.savings, "savings");
53876
55704
  stampBag(data.lagoon, "lagoon");
@@ -54422,23 +56250,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
54422
56250
  const indexMax = price(prices, m.indexToken)?.max;
54423
56251
  if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
54424
56252
  const base = i * SLOTS;
54425
- const big4 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
56253
+ const big7 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
54426
56254
  const cap = computeDepositCapacityUsd(
54427
- [info?.longTokenAmount, longMax, big4(0), big4(2)],
54428
- [info?.shortTokenAmount, shortMax, big4(1), big4(3)]
56255
+ [info?.longTokenAmount, longMax, big7(0), big7(2)],
56256
+ [info?.shortTokenAmount, shortMax, big7(1), big7(3)]
54429
56257
  );
54430
56258
  if (cap != null) value.depositCapacityUsd = cap;
54431
56259
  if (indexMax != null) {
54432
56260
  const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
54433
- const reservedUsdLong = (big4(4) + big4(5)) / divisor * indexMax;
54434
- const reservedUsdShort = (big4(6) + big4(7)) / divisor;
56261
+ const reservedUsdLong = (big7(4) + big7(5)) / divisor * indexMax;
56262
+ const reservedUsdShort = (big7(6) + big7(7)) / divisor;
54435
56263
  const liq = computeLiquidityUsd(
54436
56264
  info?.longTokenUsd,
54437
56265
  info?.shortTokenUsd,
54438
56266
  reservedUsdLong,
54439
56267
  reservedUsdShort,
54440
- big4(8),
54441
- big4(9)
56268
+ big7(8),
56269
+ big7(9)
54442
56270
  );
54443
56271
  if (liq != null)
54444
56272
  value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
@@ -54637,27 +56465,27 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
54637
56465
  } catch {
54638
56466
  return void 0;
54639
56467
  }
54640
- const big4 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
54641
- const base = big4(0);
54642
- const mult = big4(1);
56468
+ const big7 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
56469
+ const base = big7(0);
56470
+ const mult = big7(1);
54643
56471
  if (base === 0n && mult === 0n) return void 0;
54644
56472
  const PRECISION = 10n ** 30n;
54645
56473
  const adjusted = (opGas) => base + opGas * mult / PRECISION;
54646
56474
  const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
54647
- const glvExtra = big4(6) * GLV_NOMINAL_MARKET_COUNT;
56475
+ const glvExtra = big7(6) * GLV_NOMINAL_MARKET_COUNT;
54648
56476
  return {
54649
56477
  chainId,
54650
56478
  gasPriceWei: gasPriceWei.toString(),
54651
- deposit: fee(big4(2)),
54652
- withdrawal: fee(big4(3)),
54653
- glvDeposit: fee(big4(4) + glvExtra),
54654
- glvWithdrawal: fee(big4(5) + glvExtra)
56479
+ deposit: fee(big7(2)),
56480
+ withdrawal: fee(big7(3)),
56481
+ glvDeposit: fee(big7(4) + glvExtra),
56482
+ glvWithdrawal: fee(big7(5) + glvExtra)
54655
56483
  };
54656
56484
  };
54657
56485
 
54658
56486
  // src/vaults/gmx/fetchPublic.ts
54659
56487
  var GMX_TOKEN_DECIMALS = 18;
54660
- var num5 = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
56488
+ var num8 = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
54661
56489
  var minDefined = (a, b) => a == null ? b : b == null ? a : Math.min(a, b);
54662
56490
  var glvMarketRoomUsd = (cap, priceUsd) => {
54663
56491
  const currentUsd = Number(cap.balanceAmount) / 1e18 * priceUsd;
@@ -54691,9 +56519,9 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
54691
56519
  indexToken: indexToken ? indexToken.toLowerCase() : void 0,
54692
56520
  longSymbol,
54693
56521
  shortSymbol,
54694
- apy: num5(entry?.apy),
54695
- baseApy: num5(entry?.baseApy),
54696
- bonusApr: num5(entry?.bonusApr),
56522
+ apy: num8(entry?.apy),
56523
+ baseApy: num8(entry?.baseApy),
56524
+ bonusApr: num8(entry?.bonusApr),
54697
56525
  yieldProfile: "volatile",
54698
56526
  denomination: denominationFor(longSymbol, shortSymbol)
54699
56527
  };
@@ -54752,8 +56580,8 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
54752
56580
  marketIndexToken
54753
56581
  )
54754
56582
  ]);
54755
- for (const [addr, v] of gmValues) {
54756
- const e = out[addr];
56583
+ for (const [addr2, v] of gmValues) {
56584
+ const e = out[addr2];
54757
56585
  if (e) {
54758
56586
  e.priceUsd = v.priceUsd;
54759
56587
  e.tvlUsd = v.tvlUsd;
@@ -54761,12 +56589,12 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
54761
56589
  e.depositCapacityUsd = v.depositCapacityUsd;
54762
56590
  }
54763
56591
  }
54764
- for (const [addr, v] of glv.values) {
54765
- const e = out[addr];
56592
+ for (const [addr2, v] of glv.values) {
56593
+ const e = out[addr2];
54766
56594
  if (!e) continue;
54767
56595
  e.priceUsd = v.priceUsd;
54768
56596
  e.tvlUsd = v.tvlUsd;
54769
- const markets2 = glv.glvMarkets.get(addr) ?? [];
56597
+ const markets2 = glv.glvMarkets.get(addr2) ?? [];
54770
56598
  let liqSum = 0;
54771
56599
  let tvlSum = 0;
54772
56600
  for (const m of markets2) {
@@ -54778,7 +56606,7 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
54778
56606
  }
54779
56607
  if (tvlSum > 0 && v.tvlUsd != null)
54780
56608
  e.liquidityUsd = v.tvlUsd * (liqSum / tvlSum);
54781
- const caps = glv.glvCaps.get(addr) ?? [];
56609
+ const caps = glv.glvCaps.get(addr2) ?? [];
54782
56610
  let capacity = 0;
54783
56611
  let known = false;
54784
56612
  for (const cap of caps) {
@@ -54804,7 +56632,7 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
54804
56632
  // src/vaults/gmx/fetchUser.ts
54805
56633
  var DEFAULT_CAP = 50;
54806
56634
  var isBig = (v) => typeof v === "bigint";
54807
- var str = (v) => isBig(v) ? v.toString() : "0";
56635
+ var str2 = (v) => isBig(v) ? v.toString() : "0";
54808
56636
  var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
54809
56637
  const empty = {
54810
56638
  chainId,
@@ -54932,11 +56760,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
54932
56760
  market: a.market.toLowerCase(),
54933
56761
  initialLongToken: a.initialLongToken.toLowerCase(),
54934
56762
  initialShortToken: a.initialShortToken.toLowerCase(),
54935
- initialLongTokenAmount: str(n.initialLongTokenAmount),
54936
- initialShortTokenAmount: str(n.initialShortTokenAmount),
54937
- minOut: str(n.minMarketTokens),
54938
- executionFee: str(n.executionFee),
54939
- updatedAtTime: str(n.updatedAtTime)
56763
+ initialLongTokenAmount: str2(n.initialLongTokenAmount),
56764
+ initialShortTokenAmount: str2(n.initialShortTokenAmount),
56765
+ minOut: str2(n.minMarketTokens),
56766
+ executionFee: str2(n.executionFee),
56767
+ updatedAtTime: str2(n.updatedAtTime)
54940
56768
  });
54941
56769
  });
54942
56770
  withdrawalKeys.forEach((key, i) => {
@@ -54950,11 +56778,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
54950
56778
  account: a.account.toLowerCase(),
54951
56779
  receiver: a.receiver.toLowerCase(),
54952
56780
  market: a.market.toLowerCase(),
54953
- tokenAmount: str(n.marketTokenAmount),
54954
- minLongTokenAmount: str(n.minLongTokenAmount),
54955
- minShortTokenAmount: str(n.minShortTokenAmount),
54956
- executionFee: str(n.executionFee),
54957
- updatedAtTime: str(n.updatedAtTime)
56781
+ tokenAmount: str2(n.marketTokenAmount),
56782
+ minLongTokenAmount: str2(n.minLongTokenAmount),
56783
+ minShortTokenAmount: str2(n.minShortTokenAmount),
56784
+ executionFee: str2(n.executionFee),
56785
+ updatedAtTime: str2(n.updatedAtTime)
54958
56786
  });
54959
56787
  });
54960
56788
  const glvDeposits = Array.isArray(glvRes[0]) ? glvRes[0] : [];
@@ -54971,11 +56799,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
54971
56799
  glv: a.glv.toLowerCase(),
54972
56800
  initialLongToken: a.initialLongToken.toLowerCase(),
54973
56801
  initialShortToken: a.initialShortToken.toLowerCase(),
54974
- initialLongTokenAmount: str(n.initialLongTokenAmount),
54975
- initialShortTokenAmount: str(n.initialShortTokenAmount),
54976
- minOut: str(n.minGlvTokens),
54977
- executionFee: str(n.executionFee),
54978
- updatedAtTime: str(n.updatedAtTime)
56802
+ initialLongTokenAmount: str2(n.initialLongTokenAmount),
56803
+ initialShortTokenAmount: str2(n.initialShortTokenAmount),
56804
+ minOut: str2(n.minGlvTokens),
56805
+ executionFee: str2(n.executionFee),
56806
+ updatedAtTime: str2(n.updatedAtTime)
54979
56807
  });
54980
56808
  }
54981
56809
  for (const w of glvWithdrawals) {
@@ -54988,11 +56816,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
54988
56816
  receiver: a.receiver.toLowerCase(),
54989
56817
  market: a.market.toLowerCase(),
54990
56818
  glv: a.glv.toLowerCase(),
54991
- tokenAmount: str(n.glvTokenAmount),
54992
- minLongTokenAmount: str(n.minLongTokenAmount),
54993
- minShortTokenAmount: str(n.minShortTokenAmount),
54994
- executionFee: str(n.executionFee),
54995
- updatedAtTime: str(n.updatedAtTime)
56819
+ tokenAmount: str2(n.glvTokenAmount),
56820
+ minLongTokenAmount: str2(n.minLongTokenAmount),
56821
+ minShortTokenAmount: str2(n.minShortTokenAmount),
56822
+ executionFee: str2(n.executionFee),
56823
+ updatedAtTime: str2(n.updatedAtTime)
54996
56824
  });
54997
56825
  }
54998
56826
  return {
@@ -55083,11 +56911,11 @@ function buildVaultLookup(data) {
55083
56911
  const addEntries = (bag, provider) => {
55084
56912
  if (!bag) return;
55085
56913
  for (const v of Object.values(bag)) {
55086
- const addr = v.address.toLowerCase();
55087
- if (map.has(addr)) continue;
55088
- map.set(addr, {
56914
+ const addr2 = v.address.toLowerCase();
56915
+ if (map.has(addr2)) continue;
56916
+ map.set(addr2, {
55089
56917
  provider,
55090
- address: addr,
56918
+ address: addr2,
55091
56919
  underlying: v.underlying.toLowerCase(),
55092
56920
  symbol: v.symbol,
55093
56921
  name: v.name,
@@ -55114,6 +56942,7 @@ function buildVaultLookup(data) {
55114
56942
  addEntries(data.lista, "lista");
55115
56943
  addEntries(data.silo, "silo");
55116
56944
  addEntries(data["euler-earn"], "euler-earn");
56945
+ addEntries(data.termmax, "termmax");
55117
56946
  addEntries(data.lst, "lst");
55118
56947
  addEntries(data.savings, "savings");
55119
56948
  addEntries(data.lagoon, "lagoon");
@@ -55122,7 +56951,7 @@ function buildVaultLookup(data) {
55122
56951
  addEntries(data.yearn, "yearn");
55123
56952
  return map;
55124
56953
  }
55125
- var warn6 = (...args) => {
56954
+ var warn8 = (...args) => {
55126
56955
  };
55127
56956
  var HYPERCORE_PROVIDER_CHAIN = "999";
55128
56957
  var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices = {}, tokenList = {}, options) => {
@@ -55135,7 +56964,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55135
56964
  fetchFluidFTokens(chainId, multicallRetry, prices, tokenList).then((res) => {
55136
56965
  out.fluid = res;
55137
56966
  }).catch((e) => {
55138
- warn6(
56967
+ warn8(
55139
56968
  `[vaults] fluid fetch failed for chain ${chainId}:`,
55140
56969
  e?.message ?? e
55141
56970
  );
@@ -55147,7 +56976,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55147
56976
  fetchGearboxV3Pools(chainId, multicallRetry, prices, tokenList).then((res) => {
55148
56977
  out.gearbox = res;
55149
56978
  }).catch((e) => {
55150
- warn6(
56979
+ warn8(
55151
56980
  `[vaults] gearbox fetch failed for chain ${chainId}:`,
55152
56981
  e?.message ?? e
55153
56982
  );
@@ -55159,7 +56988,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55159
56988
  fetchMorphoVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
55160
56989
  out.morpho = res;
55161
56990
  }).catch((e) => {
55162
- warn6(
56991
+ warn8(
55163
56992
  `[vaults] morpho fetch failed for chain ${chainId}:`,
55164
56993
  e?.message ?? e
55165
56994
  );
@@ -55171,7 +57000,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55171
57000
  fetchListaVaultsFromChain(chainId, multicallRetry, prices, tokenList).then((res) => {
55172
57001
  out.lista = res;
55173
57002
  }).catch((e) => {
55174
- warn6(
57003
+ warn8(
55175
57004
  `[vaults] lista fetch failed for chain ${chainId}:`,
55176
57005
  e?.message ?? e
55177
57006
  );
@@ -55186,7 +57015,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55186
57015
  }).then((res) => {
55187
57016
  out.silo = res;
55188
57017
  }).catch((e) => {
55189
- warn6(
57018
+ warn8(
55190
57019
  `[vaults] silo fetch failed for chain ${chainId}:`,
55191
57020
  e?.message ?? e
55192
57021
  );
@@ -55198,19 +57027,31 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55198
57027
  fetchEulerEarnVaults(chainId, prices, tokenList, multicallRetry).then((res) => {
55199
57028
  out["euler-earn"] = res;
55200
57029
  }).catch((e) => {
55201
- warn6(
57030
+ warn8(
55202
57031
  `[vaults] euler-earn fetch failed for chain ${chainId}:`,
55203
57032
  e?.message ?? e
55204
57033
  );
55205
57034
  })
55206
57035
  );
55207
57036
  }
57037
+ if (requested.has("termmax")) {
57038
+ tasks.push(
57039
+ fetchTermMaxVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
57040
+ out.termmax = res;
57041
+ }).catch((e) => {
57042
+ warn8(
57043
+ `[vaults] termmax fetch failed for chain ${chainId}:`,
57044
+ e?.message ?? e
57045
+ );
57046
+ })
57047
+ );
57048
+ }
55208
57049
  if (requested.has("lst")) {
55209
57050
  tasks.push(
55210
57051
  fetchLstShareTokens(chainId, multicallRetry, prices, tokenList).then((res) => {
55211
57052
  out.lst = res;
55212
57053
  }).catch((e) => {
55213
- warn6(
57054
+ warn8(
55214
57055
  `[vaults] lst fetch failed for chain ${chainId}:`,
55215
57056
  e?.message ?? e
55216
57057
  );
@@ -55222,7 +57063,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55222
57063
  fetchSavingsVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
55223
57064
  out.savings = res;
55224
57065
  }).catch((e) => {
55225
- warn6(
57066
+ warn8(
55226
57067
  `[vaults] savings fetch failed for chain ${chainId}:`,
55227
57068
  e?.message ?? e
55228
57069
  );
@@ -55234,7 +57075,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55234
57075
  fetchLagoonVaults(chainId, prices, tokenList).then((res) => {
55235
57076
  out.lagoon = res;
55236
57077
  }).catch((e) => {
55237
- warn6(
57078
+ warn8(
55238
57079
  `[vaults] lagoon fetch failed for chain ${chainId}:`,
55239
57080
  e?.message ?? e
55240
57081
  );
@@ -55246,7 +57087,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55246
57087
  fetchAaveEarnVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
55247
57088
  out["aave-earn"] = res;
55248
57089
  }).catch((e) => {
55249
- warn6(
57090
+ warn8(
55250
57091
  `[vaults] aave-earn fetch failed for chain ${chainId}:`,
55251
57092
  e?.message ?? e
55252
57093
  );
@@ -55258,7 +57099,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55258
57099
  fetchUpshiftVaults(chainId, prices, tokenList).then((res) => {
55259
57100
  out.upshift = res;
55260
57101
  }).catch((e) => {
55261
- warn6(
57102
+ warn8(
55262
57103
  `[vaults] upshift fetch failed for chain ${chainId}:`,
55263
57104
  e?.message ?? e
55264
57105
  );
@@ -55270,7 +57111,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55270
57111
  fetchYearnVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
55271
57112
  out.yearn = res;
55272
57113
  }).catch((e) => {
55273
- warn6(
57114
+ warn8(
55274
57115
  `[vaults] yearn fetch failed for chain ${chainId}:`,
55275
57116
  e?.message ?? e
55276
57117
  );
@@ -55282,7 +57123,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55282
57123
  fetchHypercoreVaults().then((res) => {
55283
57124
  out.hypercore = res;
55284
57125
  }).catch((e) => {
55285
- warn6(
57126
+ warn8(
55286
57127
  `[vaults] hypercore fetch failed for chain ${chainId}:`,
55287
57128
  e?.message ?? e
55288
57129
  );
@@ -55294,7 +57135,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55294
57135
  fetchGmxVaults(chainId, multicallRetry).then((res) => {
55295
57136
  out.gmx = res;
55296
57137
  }).catch((e) => {
55297
- warn6(
57138
+ warn8(
55298
57139
  `[vaults] gmx fetch failed for chain ${chainId}:`,
55299
57140
  e?.message ?? e
55300
57141
  );
@@ -55310,7 +57151,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
55310
57151
  );
55311
57152
  if (fees) out.gmxExecutionFees = fees;
55312
57153
  })().catch((e) => {
55313
- warn6(
57154
+ warn8(
55314
57155
  `[vaults] gmx execution-fee fetch failed for chain ${chainId}:`,
55315
57156
  e?.message ?? e
55316
57157
  );
@@ -55618,32 +57459,32 @@ async function fetchTokenMetadata(chain, addrs) {
55618
57459
  const results = await client.multicall({
55619
57460
  allowFailure: false,
55620
57461
  batchSize: 300,
55621
- contracts: addrs.map((addr) => [
57462
+ contracts: addrs.map((addr2) => [
55622
57463
  {
55623
57464
  abi: ERC20MetadataAbi,
55624
57465
  functionName: "name",
55625
- address: addr,
57466
+ address: addr2,
55626
57467
  args: []
55627
57468
  },
55628
57469
  {
55629
57470
  abi: ERC20MetadataAbi,
55630
57471
  functionName: "symbol",
55631
- address: addr,
57472
+ address: addr2,
55632
57473
  args: []
55633
57474
  },
55634
57475
  {
55635
57476
  abi: ERC20MetadataAbi,
55636
57477
  functionName: "decimals",
55637
- address: addr,
57478
+ address: addr2,
55638
57479
  args: []
55639
57480
  }
55640
57481
  ]).flat()
55641
57482
  });
55642
- addrs.forEach((addr, i) => {
57483
+ addrs.forEach((addr2, i) => {
55643
57484
  const name = results[i * 3];
55644
57485
  const symbol = results[i * 3 + 1];
55645
57486
  const decimals = results[i * 3 + 2];
55646
- const address = addr.toLowerCase();
57487
+ const address = addr2.toLowerCase();
55647
57488
  tokens[address] = {
55648
57489
  chainId: String(chain),
55649
57490
  decimals,
@@ -55857,6 +57698,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
55857
57698
  return parseTokenBalanceResult(rawResult, prepared.query);
55858
57699
  }
55859
57700
 
55860
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, EMPTY_BALANCE, 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, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, 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, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, positivePart2 as positivePart, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats };
57701
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, 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, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, 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, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, 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, unflattenLenderData, updateFeedStats };
55861
57702
  //# sourceMappingURL=index.js.map
55862
57703
  //# sourceMappingURL=index.js.map