@1delta/margin-fetcher 5.0.2 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, stringToHex, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-YILYOOYB.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isUsdd, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isUsdd, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isCurvance, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { hasCrossMarginRisk, isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
- import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, llamaLendLendersByChain, usddLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, usddConfigFor, usddChainData, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, 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, llamaLendLendersByChain, usddLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, usddConfigFor, usddChainData, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
8
  import { Chain } from '@1delta/chain-registry';
9
9
  import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
10
- import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, ResupplyUtilitiesAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
10
+ import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, ResupplyUtilitiesAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, CurvanceMarketManagerAbi, CurvanceCTokenAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, CurvanceProtocolReaderAbi, CurvanceCentralRegistryAbi, TermPriceConsumerAbi, CurvanceOracleManagerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
11
11
  export { MorphoLensAbi } from '@1delta/abis';
12
12
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
13
13
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
@@ -6430,6 +6430,9 @@ var getLendersForChain = (c) => {
6430
6430
  for (const l of resupplyLendersByChain(c)) {
6431
6431
  lenders.push(l);
6432
6432
  }
6433
+ for (const l of curvanceLendersByChain(c)) {
6434
+ lenders.push(l);
6435
+ }
6433
6436
  if (tellerConfigByChain(c)?.tellerV2 && tellerPoolsByChain(c).length > 0) {
6434
6437
  lenders.push(Lender.TELLER);
6435
6438
  }
@@ -7050,9 +7053,9 @@ var calculateRateForCompoundType2 = (n) => {
7050
7053
  const rate = Number(formatEther(BigInt(n)));
7051
7054
  return (Math.pow(rate * 60 * 60 * 24 / 12 + 1, 365) - 1) * 100;
7052
7055
  };
7053
- var calculateRateForCompoundType = (n, chainId, scale = 1 /* SECOND */) => {
7056
+ var calculateRateForCompoundType = (n, chainId, scale2 = 1 /* SECOND */) => {
7054
7057
  const rate = Number(formatEther(BigInt(n)));
7055
- if (scale === 0 /* BLOCK */)
7058
+ if (scale2 === 0 /* BLOCK */)
7056
7059
  return (Math.pow(
7057
7060
  rate * 60 * 60 * 24 / (BLOCK_TIMES[chainId] ?? "1") + 1,
7058
7061
  365
@@ -7226,6 +7229,31 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
7226
7229
  }
7227
7230
  }
7228
7231
  };
7232
+
7233
+ // src/lending/public-data/aave-v3-type/reserveIndexSanity.ts
7234
+ var RAY = 10n ** 27n;
7235
+ var MAX_PLAUSIBLE_INDEX_MULTIPLE = 1000n;
7236
+ function isReserveIndexSane(index) {
7237
+ if (index === void 0 || index === null) return true;
7238
+ let value;
7239
+ try {
7240
+ value = BigInt(index);
7241
+ } catch {
7242
+ return true;
7243
+ }
7244
+ if (value === 0n) return true;
7245
+ return value <= RAY * MAX_PLAUSIBLE_INDEX_MULTIPLE;
7246
+ }
7247
+ function reserveIndicesAreSane(params) {
7248
+ const { chainId, lender, asset, liquidityIndex, variableBorrowIndex } = params;
7249
+ const liquidityOk = isReserveIndexSane(liquidityIndex);
7250
+ const borrowOk = isReserveIndexSane(variableBorrowIndex);
7251
+ if (liquidityOk && borrowOk) return true;
7252
+ console.error(
7253
+ `[reserve-index-sanity] dropping ${lender} ${asset} on chain ${chainId}: liquidityIndex=${liquidityIndex} variableBorrowIndex=${variableBorrowIndex} \u2014 implausible accumulator, refusing to publish derived balances`
7254
+ );
7255
+ return false;
7256
+ }
7229
7257
  var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
7230
7258
  if (isAaveV32Type(lender))
7231
7259
  return parseAave32(
@@ -7284,6 +7312,14 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
7284
7312
  const debtCeiling = data[i * stride + 4];
7285
7313
  const reserveEMode = data[i * stride + 5];
7286
7314
  const aTokenBalanceRaw = data[i * stride + 6];
7315
+ if (!reserveIndicesAreSane({
7316
+ chainId,
7317
+ lender,
7318
+ asset,
7319
+ liquidityIndex: reserveData?.[9 /* liquidityIndex */],
7320
+ variableBorrowIndex: reserveData?.[10 /* variableBorrowIndex */]
7321
+ }))
7322
+ continue;
7287
7323
  const assetMeta = tokenList[asset];
7288
7324
  const decimals = assetMeta?.decimals ?? 18;
7289
7325
  const totalDeposits = parseRawAmount(
@@ -7300,7 +7336,9 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
7300
7336
  );
7301
7337
  const aTokenHasAddress = !!aaveTokenMap[asset]?.aToken;
7302
7338
  const availableLiquidityRaw = aTokenHasAddress && aTokenBalanceRaw !== "0x" ? aTokenBalanceRaw : void 0;
7303
- const liquidity = availableLiquidityRaw !== void 0 ? Number(parseRawAmount(availableLiquidityRaw?.toString(), decimals)) : Math.max(
7339
+ const liquidity = availableLiquidityRaw !== void 0 ? Number(
7340
+ parseRawAmount(availableLiquidityRaw?.toString(), decimals)
7341
+ ) : Math.max(
7304
7342
  0,
7305
7343
  Number(totalDeposits) - Number(totalDebt) - Number(totalDebtStable)
7306
7344
  );
@@ -7387,7 +7425,13 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
7387
7425
  ...(() => {
7388
7426
  const bc = Number(reserveCaps[0]?.toString());
7389
7427
  const liq = resultReserves[marketUid].totalLiquidity;
7390
- const bl = bc > 0 ? Math.min(liq, Math.max(0, bc - Number(totalDebt) - Number(totalDebtStable))) : liq;
7428
+ const bl = bc > 0 ? Math.min(
7429
+ liq,
7430
+ Math.max(
7431
+ 0,
7432
+ bc - Number(totalDebt) - Number(totalDebtStable)
7433
+ )
7434
+ ) : liq;
7391
7435
  return {
7392
7436
  borrowLiquidity: bl,
7393
7437
  borrowLiquidityUSD: bl * price2
@@ -7553,7 +7597,9 @@ function parseYLDRCall(chainId, lender, additionalYields, prices, tokenList) {
7553
7597
  );
7554
7598
  const aTokenHasAddress = !!aaveTokenMap[asset]?.aToken;
7555
7599
  const availableLiquidityRaw = aTokenHasAddress && aTokenBalanceRaw !== "0x" ? aTokenBalanceRaw : void 0;
7556
- const liquidity = availableLiquidityRaw !== void 0 ? Number(parseRawAmount(availableLiquidityRaw?.toString(), decimals)) : Math.max(0, Number(totalAToken) - Number(totalVariableDebt));
7600
+ const liquidity = availableLiquidityRaw !== void 0 ? Number(
7601
+ parseRawAmount(availableLiquidityRaw?.toString(), decimals)
7602
+ ) : Math.max(0, Number(totalAToken) - Number(totalVariableDebt));
7557
7603
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(asset, chainId);
7558
7604
  const price2 = prices[oracleKey] ?? 0;
7559
7605
  const totalDepositsUSD = Number(totalAToken) * price2;
@@ -7695,6 +7741,14 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
7695
7741
  const reserveCaps = data[i * stride + 3];
7696
7742
  const debtCeiling = data[i * stride + 4];
7697
7743
  const aTokenBalanceRaw = data[i * stride + 5];
7744
+ if (!reserveIndicesAreSane({
7745
+ chainId,
7746
+ lender,
7747
+ asset,
7748
+ liquidityIndex: reserveData?.[9 /* liquidityIndex */],
7749
+ variableBorrowIndex: reserveData?.[10 /* variableBorrowIndex */]
7750
+ }))
7751
+ continue;
7698
7752
  const assetMeta = tokenList[asset];
7699
7753
  const decimals = assetMeta?.decimals ?? 18;
7700
7754
  const totalDeposits = parseRawAmount(
@@ -7711,7 +7765,9 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
7711
7765
  );
7712
7766
  const aTokenHasAddress = !!aaveTokenMap[asset]?.aToken;
7713
7767
  const availableLiquidityRaw = aTokenHasAddress && aTokenBalanceRaw !== "0x" ? aTokenBalanceRaw : void 0;
7714
- const liquidity = availableLiquidityRaw !== void 0 ? Number(parseRawAmount(availableLiquidityRaw?.toString(), decimals)) : Math.max(
7768
+ const liquidity = availableLiquidityRaw !== void 0 ? Number(
7769
+ parseRawAmount(availableLiquidityRaw?.toString(), decimals)
7770
+ ) : Math.max(
7715
7771
  0,
7716
7772
  Number(totalDeposits) - Number(totalDebt) - Number(totalDebtStable)
7717
7773
  );
@@ -7800,7 +7856,13 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
7800
7856
  ...(() => {
7801
7857
  const bc = Number(reserveCaps[0]?.toString());
7802
7858
  const liq = resultReserves[marketUid].totalLiquidity;
7803
- const bl = bc > 0 ? Math.min(liq, Math.max(0, bc - Number(totalDebt) - Number(totalDebtStable))) : liq;
7859
+ const bl = bc > 0 ? Math.min(
7860
+ liq,
7861
+ Math.max(
7862
+ 0,
7863
+ bc - Number(totalDebt) - Number(totalDebtStable)
7864
+ )
7865
+ ) : liq;
7804
7866
  return {
7805
7867
  borrowLiquidity: bl,
7806
7868
  borrowLiquidityUSD: bl * price2
@@ -7945,9 +8007,9 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
7945
8007
  });
7946
8008
  });
7947
8009
  Object.entries(eModes).forEach(([modeId, modeData]) => {
7948
- Object.entries(result).forEach(([key, _3]) => {
7949
- if (!result[key].config[modeId]) {
7950
- result[key].config[modeId] = {
8010
+ Object.entries(result).forEach(([key2, _3]) => {
8011
+ if (!result[key2].config[modeId]) {
8012
+ result[key2].config[modeId] = {
7951
8013
  label: modeData.label,
7952
8014
  category: modeData.category,
7953
8015
  debtDisabled: true,
@@ -10019,8 +10081,8 @@ var brokerAbi = parseAbi([
10019
10081
  var BROKER_CACHE = {};
10020
10082
  var FIXED_TERMS_CACHE = {};
10021
10083
  var BROKER_USER_CACHE = {};
10022
- function toBytes32MarketId(key) {
10023
- const raw = key.startsWith("LISTA_DAO_") ? "0x" + key.slice("LISTA_DAO_".length) : key;
10084
+ function toBytes32MarketId(key2) {
10085
+ const raw = key2.startsWith("LISTA_DAO_") ? "0x" + key2.slice("LISTA_DAO_".length) : key2;
10024
10086
  return raw.toLowerCase();
10025
10087
  }
10026
10088
  function ceilDiv(a, b) {
@@ -10055,8 +10117,8 @@ async function resolveListaBrokers(chainId, marketKeys, getClient = getEvmClient
10055
10117
  if (!moolah || marketKeys.length === 0) return out;
10056
10118
  const cache = BROKER_CACHE[chainId] ??= {};
10057
10119
  const missing = [];
10058
- for (const key of marketKeys) {
10059
- const id = toBytes32MarketId(key);
10120
+ for (const key2 of marketKeys) {
10121
+ const id = toBytes32MarketId(key2);
10060
10122
  if (cache[id] === void 0) missing.push(id);
10061
10123
  }
10062
10124
  if (missing.length > 0) {
@@ -10079,8 +10141,8 @@ async function resolveListaBrokers(chainId, marketKeys, getClient = getEvmClient
10079
10141
  } catch {
10080
10142
  }
10081
10143
  }
10082
- for (const key of marketKeys) {
10083
- const id = toBytes32MarketId(key);
10144
+ for (const key2 of marketKeys) {
10145
+ const id = toBytes32MarketId(key2);
10084
10146
  const broker = cache[id];
10085
10147
  if (broker && broker !== zeroAddress) out[id] = broker;
10086
10148
  }
@@ -10402,15 +10464,15 @@ function createBaseTypeUserState(payload, lenderData, totalDeposits24h = 0, tota
10402
10464
  oracleDebt += debtStableUSDOracle;
10403
10465
  oracleDebt += debtUSDOracle;
10404
10466
  (rewards ?? []).forEach((rewardData) => {
10405
- const key = rewardData.asset;
10467
+ const key2 = rewardData.asset;
10406
10468
  rewardDepositAccrual += rewardData.depositRate * depositsUSD;
10407
10469
  rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
10408
10470
  const rewDepo = rewardData.depositRate * depositsUSD;
10409
10471
  const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
10410
- if (!rewardsPerAsset[key])
10411
- rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
10412
- if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
10413
- if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
10472
+ if (!rewardsPerAsset[key2])
10473
+ rewardsPerAsset[key2] = { depositApr: 0, borrowApr: 0 };
10474
+ if (rewDepo > 0) rewardsPerAsset[key2].depositApr += rewDepo;
10475
+ if (rewDebt > 0) rewardsPerAsset[key2].borrowApr += rewDebt;
10414
10476
  });
10415
10477
  stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
10416
10478
  stakingBorrowAccrual += (intrinsicYield ?? 0) * (debtStableUSD + debtUSD);
@@ -11136,15 +11198,15 @@ function createSumerUserState(payload, lenderData, totalDeposits24h = 0, totalDe
11136
11198
  oracleDebt += debtStableUSDOracle;
11137
11199
  oracleDebt += debtUSDOracle;
11138
11200
  (rewards ?? []).forEach((rewardData) => {
11139
- const key = rewardData.asset;
11201
+ const key2 = rewardData.asset;
11140
11202
  rewardDepositAccrual += rewardData.depositRate * depositsUSD;
11141
11203
  rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
11142
11204
  const rewDepo = rewardData.depositRate * depositsUSD;
11143
11205
  const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
11144
- if (!rewardsPerAsset[key])
11145
- rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
11146
- if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
11147
- if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
11206
+ if (!rewardsPerAsset[key2])
11207
+ rewardsPerAsset[key2] = { depositApr: 0, borrowApr: 0 };
11208
+ if (rewDepo > 0) rewardsPerAsset[key2].depositApr += rewDepo;
11209
+ if (rewDebt > 0) rewardsPerAsset[key2].borrowApr += rewDebt;
11148
11210
  });
11149
11211
  stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
11150
11212
  stakingBorrowAccrual += (intrinsicYield ?? 0) * (debtStableUSD + debtUSD);
@@ -11490,12 +11552,12 @@ function rateToApy(rate) {
11490
11552
  );
11491
11553
  }
11492
11554
  function parseLtv(ltv) {
11493
- let str3 = 0;
11555
+ let str4 = 0;
11494
11556
  try {
11495
- str3 = Number(formatUnits(BigInt(ltv), 18));
11557
+ str4 = Number(formatUnits(BigInt(ltv), 18));
11496
11558
  } catch (e) {
11497
11559
  }
11498
- return str3;
11560
+ return str4;
11499
11561
  }
11500
11562
  function liquidationPenaltyFromLltv(lltv) {
11501
11563
  if (!lltv || lltv <= 0) return 0;
@@ -15138,11 +15200,11 @@ function toAddress(value) {
15138
15200
  return value.toString();
15139
15201
  throw new Error(`Cannot convert value to address string: ${String(value)}`);
15140
15202
  }
15141
- function field(src, key, index) {
15203
+ function field(src, key2, index) {
15142
15204
  if (src == null) throw new Error("Source is null/undefined");
15143
- if (key in src) return src[key];
15205
+ if (key2 in src) return src[key2];
15144
15206
  if (Array.isArray(src)) return src[index];
15145
- return src[key];
15207
+ return src[key2];
15146
15208
  }
15147
15209
  function parseMarketIncentives(input) {
15148
15210
  return {
@@ -15213,11 +15275,11 @@ function toBigInt2(value) {
15213
15275
  }
15214
15276
  throw new Error(`Cannot convert value to bigint: ${String(value)}`);
15215
15277
  }
15216
- function field2(src, key, index) {
15278
+ function field2(src, key2, index) {
15217
15279
  if (src == null) throw new Error("Source is null/undefined");
15218
- if (key in src) return src[key];
15280
+ if (key2 in src) return src[key2];
15219
15281
  if (Array.isArray(src)) return src[index];
15220
- return src[key];
15282
+ return src[key2];
15221
15283
  }
15222
15284
  function computeApy(rateRaw, timestampsPerYear) {
15223
15285
  const rate = Number(formatEther(rateRaw));
@@ -15278,11 +15340,11 @@ function toBool3(value) {
15278
15340
  if (typeof value === "number") return value !== 0;
15279
15341
  return Boolean(value);
15280
15342
  }
15281
- function field3(src, key, index) {
15343
+ function field3(src, key2, index) {
15282
15344
  if (src == null) throw new Error("Source is null/undefined");
15283
- if (key in src) return src[key];
15345
+ if (key2 in src) return src[key2];
15284
15346
  if (Array.isArray(src)) return src[index];
15285
- return src[key];
15347
+ return src[key2];
15286
15348
  }
15287
15349
  function parseTectonicMarketData(input) {
15288
15350
  return {
@@ -15350,11 +15412,11 @@ function toBool4(value) {
15350
15412
  if (typeof value === "number") return value !== 0;
15351
15413
  return Boolean(value);
15352
15414
  }
15353
- function field4(src, key, index) {
15415
+ function field4(src, key2, index) {
15354
15416
  if (src == null) throw new Error("Source is null/undefined");
15355
- if (key in src) return src[key];
15417
+ if (key2 in src) return src[key2];
15356
15418
  if (Array.isArray(src)) return src[index];
15357
- return src[key];
15419
+ return src[key2];
15358
15420
  }
15359
15421
  function parseKineticMarketMetadata(input) {
15360
15422
  return {
@@ -15793,11 +15855,11 @@ function toBool5(value) {
15793
15855
  if (typeof value === "number") return value !== 0;
15794
15856
  return Boolean(value);
15795
15857
  }
15796
- function field5(src, key, index) {
15858
+ function field5(src, key2, index) {
15797
15859
  if (src == null) throw new Error("Source is null/undefined");
15798
- if (key in src) return src[key];
15860
+ if (key2 in src) return src[key2];
15799
15861
  if (Array.isArray(src)) return src[index];
15800
- return src[key];
15862
+ return src[key2];
15801
15863
  }
15802
15864
  function parseToken(raw) {
15803
15865
  return {
@@ -16025,11 +16087,11 @@ function capRate(rate) {
16025
16087
  if (!Number.isFinite(rate)) return MAX_RATE;
16026
16088
  return Math.min(rate, MAX_RATE);
16027
16089
  }
16028
- function pick(meta, key, index) {
16090
+ function pick(meta, key2, index) {
16029
16091
  if (meta == null) return void 0;
16030
- if (key in meta) return meta[key];
16092
+ if (key2 in meta) return meta[key2];
16031
16093
  if (Array.isArray(meta)) return meta[index];
16032
- return meta[key];
16094
+ return meta[key2];
16033
16095
  }
16034
16096
  var DEFAULT_PAUSED_ACTIONS = {
16035
16097
  [0 /* MINT */]: false,
@@ -17373,8 +17435,8 @@ function getActiveCollaterals(ltvInfo) {
17373
17435
  return active;
17374
17436
  }
17375
17437
  function findVaultInfo(normalizedAddr, vaultData) {
17376
- for (const [key, value] of vaultData) {
17377
- if (key.toLowerCase() === normalizedAddr) return value;
17438
+ for (const [key2, value] of vaultData) {
17439
+ if (key2.toLowerCase() === normalizedAddr) return value;
17378
17440
  }
17379
17441
  return void 0;
17380
17442
  }
@@ -17484,9 +17546,9 @@ var LTV_SCALE = 10000n;
17484
17546
  function ltvToNumber(ltv) {
17485
17547
  return Number(ltv) / Number(LTV_SCALE);
17486
17548
  }
17487
- var RAY = 10n ** 27n;
17549
+ var RAY2 = 10n ** 27n;
17488
17550
  function rayToNumber(ray) {
17489
- return Number(ray) / Number(RAY);
17551
+ return Number(ray) / Number(RAY2);
17490
17552
  }
17491
17553
  function toTokenAmount(raw, decimals) {
17492
17554
  return Number(raw) / 10 ** Number(decimals);
@@ -17656,8 +17718,8 @@ function buildTokenEntry(info, config, collateralActive, borrowVaults, opts) {
17656
17718
  };
17657
17719
  }
17658
17720
  function findInfo(addr2, vaultData) {
17659
- for (const [key, value] of vaultData) {
17660
- if (key.toLowerCase() === addr2) return value;
17721
+ for (const [key2, value] of vaultData) {
17722
+ if (key2.toLowerCase() === addr2) return value;
17661
17723
  }
17662
17724
  return void 0;
17663
17725
  }
@@ -17859,11 +17921,11 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17859
17921
  { address: spokeAddr, name: "getReserveDebt", params: [rid] },
17860
17922
  { address: spokeAddr, name: "getReserveTotalDebt", params: [rid] }
17861
17923
  );
17862
- for (let key = 0; key < dynConfigCount; key++) {
17924
+ for (let key2 = 0; key2 < dynConfigCount; key2++) {
17863
17925
  calls.push({
17864
17926
  address: spokeAddr,
17865
17927
  name: "getDynamicReserveConfig",
17866
- params: [rid, key]
17928
+ params: [rid, key2]
17867
17929
  });
17868
17930
  }
17869
17931
  }
@@ -17947,12 +18009,12 @@ function toTokenNumber(raw, decimals) {
17947
18009
  if (raw === 0n) return 0;
17948
18010
  return parseFloat(toTokenAmount2(raw, decimals));
17949
18011
  }
17950
- var RAY2 = 1e27;
18012
+ var RAY3 = 1e27;
17951
18013
  var MAX_SPOKE_CAP = 2 ** 40 - 1;
17952
18014
  var RAY_BIGINT = 10n ** 27n;
17953
18015
  function rayRateToApr(rateRay) {
17954
18016
  if (rateRay === 0n) return 0;
17955
- return Number(rateRay) / RAY2 * 100;
18017
+ return Number(rateRay) / RAY3 * 100;
17956
18018
  }
17957
18019
  function normalizeAaveV4(spokeDataList, chainId, spokeLenderKeyArg, prices, additionalYields, tokenList, lenderShortNameFn, createMarketUidFn, toOracleKeyFn, toGenericPriceKeyFn) {
17958
18020
  const spokeData = spokeDataList[0];
@@ -18188,11 +18250,11 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18188
18250
  const rawTotalDebt = data[offset + 4];
18189
18251
  offset += BASE_CALLS_PER_RESERVE;
18190
18252
  const dynamicConfigs = {};
18191
- for (let key = 0; key < dynConfigCount; key++) {
18253
+ for (let key2 = 0; key2 < dynConfigCount; key2++) {
18192
18254
  const rawDynConfig = data[offset];
18193
18255
  offset += 1;
18194
18256
  if (rawDynConfig && rawDynConfig !== "0x") {
18195
- dynamicConfigs[key] = {
18257
+ dynamicConfigs[key2] = {
18196
18258
  collateralFactor: Number(rawDynConfig?.collateralFactor ?? 0),
18197
18259
  maxLiquidationBonus: Number(
18198
18260
  rawDynConfig?.maxLiquidationBonus ?? 0
@@ -20049,7 +20111,7 @@ var MIDNIGHT_BOOK_LEVELS = 20;
20049
20111
  var LKG_TTL_SEC = 30 * 60;
20050
20112
  var lastGood = /* @__PURE__ */ new Map();
20051
20113
  async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec9) {
20052
- const key = `${chainId}:${marketId}`;
20114
+ const key2 = `${chainId}:${marketId}`;
20053
20115
  let fresh = null;
20054
20116
  if (source.getTopAndBook) {
20055
20117
  fresh = await source.getTopAndBook(marketId, MIDNIGHT_BOOK_LEVELS).catch(() => null);
@@ -20058,10 +20120,10 @@ async function fetchTopAndBookWithFallback(source, chainId, marketId, nowSec9) {
20058
20120
  if (top) fresh = { top, book: { bids: [], asks: [] } };
20059
20121
  }
20060
20122
  if (fresh) {
20061
- lastGood.set(key, { top: fresh.top, book: fresh.book, at: nowSec9 });
20123
+ lastGood.set(key2, { top: fresh.top, book: fresh.book, at: nowSec9 });
20062
20124
  return { top: fresh.top, book: fresh.book };
20063
20125
  }
20064
- const cached = lastGood.get(key);
20126
+ const cached = lastGood.get(key2);
20065
20127
  if (cached && nowSec9 - cached.at <= LKG_TTL_SEC) {
20066
20128
  return { top: cached.top, book: cached.book };
20067
20129
  }
@@ -20529,8 +20591,8 @@ var TermSubgraphSource = class {
20529
20591
  const auction = data.termAuctions?.[0];
20530
20592
  const clearingRate = toNum(auction?.auctionClearingPrice);
20531
20593
  const aprPct = clearingRate > 0 ? clearingRate / WAD3 * 100 : 0;
20532
- const scale = Math.pow(10, config.loanDecimals);
20533
- const toLoan = (repoUnits) => Number(repoUnits * redemptionRatio / BigInt(WAD3)) / scale;
20594
+ const scale2 = Math.pow(10, config.loanDecimals);
20595
+ const toLoan = (repoUnits) => Number(repoUnits * redemptionRatio / BigInt(WAD3)) / scale2;
20534
20596
  const orders = (data.termOrders ?? []).map((o) => ({
20535
20597
  remaining: toBig3(o.originalOrderAmount) - toBig3(o.filledAmount),
20536
20598
  isAsk: String(o.makerToken).toLowerCase() === repoToken
@@ -20619,7 +20681,7 @@ var TermSubgraphSource = class {
20619
20681
  { term, who }
20620
20682
  );
20621
20683
  if (!data) return null;
20622
- const scale = Math.pow(10, config.loanDecimals);
20684
+ const scale2 = Math.pow(10, config.loanDecimals);
20623
20685
  const toOrder = (o, side, revealedRaw) => {
20624
20686
  const a = o.auction ?? {};
20625
20687
  const complete = Boolean(a.auctionComplete);
@@ -20631,7 +20693,7 @@ var TermSubgraphSource = class {
20631
20693
  auctionId: String(a.id ?? ""),
20632
20694
  account,
20633
20695
  amount: String(o.amount ?? "0"),
20634
- assets: Number(toBig3(o.amount)) / scale,
20696
+ assets: Number(toBig3(o.amount)) / scale2,
20635
20697
  assignedAmount: String(o.assignedAmount ?? "0"),
20636
20698
  locked: Boolean(o.locked),
20637
20699
  revealed,
@@ -20662,7 +20724,7 @@ var TERM_BOOK_LEVELS = 20;
20662
20724
  var LKG_TTL_SEC2 = 30 * 60;
20663
20725
  var lastGood2 = /* @__PURE__ */ new Map();
20664
20726
  async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
20665
- const key = `${chainId}:${config.termRepoId}`;
20727
+ const key2 = `${chainId}:${config.termRepoId}`;
20666
20728
  let fresh = null;
20667
20729
  if (source.getTopAndBook) {
20668
20730
  fresh = await source.getTopAndBook(config, TERM_BOOK_LEVELS).catch(() => null);
@@ -20671,7 +20733,7 @@ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
20671
20733
  if (top) fresh = { top, book: { bids: [], asks: [] }, auction: null };
20672
20734
  }
20673
20735
  if (fresh) {
20674
- lastGood2.set(key, {
20736
+ lastGood2.set(key2, {
20675
20737
  top: fresh.top,
20676
20738
  book: fresh.book,
20677
20739
  auction: fresh.auction ?? null,
@@ -20679,7 +20741,7 @@ async function fetchTopAndBookWithFallback2(source, chainId, config, nowSec9) {
20679
20741
  });
20680
20742
  return { top: fresh.top, book: fresh.book, auction: fresh.auction ?? null };
20681
20743
  }
20682
- const cached = lastGood2.get(key);
20744
+ const cached = lastGood2.get(key2);
20683
20745
  if (cached && nowSec9 - cached.at <= LKG_TTL_SEC2) {
20684
20746
  const stillOpen = cached.auction && cached.auction.endTime > nowSec9 ? cached.auction : null;
20685
20747
  return { top: cached.top, book: cached.book, auction: stillOpen };
@@ -21270,10 +21332,10 @@ async function fetchLiquityMarkets(lender, chainId) {
21270
21332
  function liquityLenderKey(lender, chainId, collIndex) {
21271
21333
  return `${lender}_${chainId}_${collIndex}`;
21272
21334
  }
21273
- function liquityKeyParts(key) {
21274
- const base = LIQUITY_FAMILY_LENDERS.find((b) => key.startsWith(b + "_"));
21335
+ function liquityKeyParts(key2) {
21336
+ const base = LIQUITY_FAMILY_LENDERS.find((b) => key2.startsWith(b + "_"));
21275
21337
  if (!base) return void 0;
21276
- const suffix = key.slice(base.length + 1);
21338
+ const suffix = key2.slice(base.length + 1);
21277
21339
  const m = suffix.match(/^(\d+)_(\d+)$/);
21278
21340
  if (!m) return void 0;
21279
21341
  return { lender: base, chainId: m[1], collIndex: Number(m[2]) };
@@ -21317,7 +21379,7 @@ function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalY
21317
21379
  const collDecimals = branch.collDecimals;
21318
21380
  const collToken = tokens[collAddr];
21319
21381
  const collSymbol = collToken?.symbol ?? branch.name?.split(" / ").pop() ?? "COLL";
21320
- const marketName = branch.name ?? `${stableSymbol} / ${collSymbol}`;
21382
+ const marketName2 = branch.name ?? `${stableSymbol} / ${collSymbol}`;
21321
21383
  const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
21322
21384
  const collPrice = liquityCollateralPrice(b.collPrice, collDecimals, branch.priceDecimals) || (prices[collPriceKey] ?? 0);
21323
21385
  const entireDebt = b.entireDebt !== null ? toHuman2(b.entireDebt, stableDecimals) : 0;
@@ -21439,7 +21501,7 @@ function convertLiquityMarketsToResponse(raw, chainId, prices = {}, _additionalY
21439
21501
  entry.params = {
21440
21502
  market: {
21441
21503
  lender: lenderKey,
21442
- name: marketName,
21504
+ name: marketName2,
21443
21505
  loanDecimals: stableDecimals,
21444
21506
  collateralDecimals: collDecimals,
21445
21507
  // TroveManager doubles as the branch/market id (marketUid address).
@@ -21557,9 +21619,9 @@ async function fetchRiverMarkets(lender, chainId) {
21557
21619
  function riverLenderKey(lender, chainId, index) {
21558
21620
  return `${lender}_${chainId}_${index}`;
21559
21621
  }
21560
- function riverKeyParts(key) {
21561
- if (!key.startsWith("RIVER_")) return void 0;
21562
- const suffix = key.slice("RIVER_".length);
21622
+ function riverKeyParts(key2) {
21623
+ if (!key2.startsWith("RIVER_")) return void 0;
21624
+ const suffix = key2.slice("RIVER_".length);
21563
21625
  const m = suffix.match(/^(\d+)_(\d+)$/);
21564
21626
  if (!m) return void 0;
21565
21627
  return { lender: "RIVER", chainId: m[1], index: Number(m[2]) };
@@ -21595,7 +21657,7 @@ function convertRiverMarketsToResponse(raw, chainId, prices = {}, _additionalYie
21595
21657
  const collDecimals = market.collDecimals;
21596
21658
  const collToken = tokens[collAddr];
21597
21659
  const collSymbol = collToken?.symbol ?? market.name?.split(" / ").pop() ?? "COLL";
21598
- const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
21660
+ const marketName2 = market.name ?? `${debtSymbol} / ${collSymbol}`;
21599
21661
  const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
21600
21662
  const collPrice = (m.price !== null ? Number(m.price) / WAD7 : 0) || (prices[collPriceKey] ?? 0);
21601
21663
  const entireDebt = m.entireDebt !== null ? toHuman3(m.entireDebt, debtDecimals) : 0;
@@ -21720,7 +21782,7 @@ function convertRiverMarketsToResponse(raw, chainId, prices = {}, _additionalYie
21720
21782
  entry.params = {
21721
21783
  market: {
21722
21784
  lender: lenderKey,
21723
- name: marketName,
21785
+ name: marketName2,
21724
21786
  loanDecimals: debtDecimals,
21725
21787
  collateralDecimals: collDecimals,
21726
21788
  // TroveManager doubles as the market id (marketUid address).
@@ -21799,7 +21861,7 @@ async function fetchTellerMarkets(chainId) {
21799
21861
  } catch {
21800
21862
  return { chainId, pools: [] };
21801
21863
  }
21802
- const big13 = (i) => {
21864
+ const big15 = (i) => {
21803
21865
  const r = results[i];
21804
21866
  if (typeof r === "bigint") return r;
21805
21867
  if (typeof r === "number") return BigInt(r);
@@ -21812,21 +21874,21 @@ async function fetchTellerMarkets(chainId) {
21812
21874
  }
21813
21875
  return null;
21814
21876
  };
21815
- const num11 = (i) => {
21816
- const b = big13(i);
21877
+ const num12 = (i) => {
21878
+ const b = big15(i);
21817
21879
  return b === null ? null : Number(b);
21818
21880
  };
21819
21881
  const pool0 = pools.map((config, i) => {
21820
21882
  const base = i * READS_PER_POOL;
21821
21883
  return {
21822
21884
  config,
21823
- available: big13(base),
21824
- committed: big13(base + 1),
21825
- minRateBps: num11(base + 2),
21826
- collateralPerPrincipal: big13(base + 3),
21827
- maxLoanDuration: num11(base + 4),
21828
- marketId: big13(base + 5),
21829
- totalAssets: big13(base + 6)
21885
+ available: big15(base),
21886
+ committed: big15(base + 1),
21887
+ minRateBps: num12(base + 2),
21888
+ collateralPerPrincipal: big15(base + 3),
21889
+ maxLoanDuration: num12(base + 4),
21890
+ marketId: big15(base + 5),
21891
+ totalAssets: big15(base + 6)
21830
21892
  };
21831
21893
  });
21832
21894
  const attByMarket = /* @__PURE__ */ new Map();
@@ -22110,8 +22172,8 @@ function getCachedTermMaxMarkets(chainId) {
22110
22172
  const prefix = `${chainId}:`;
22111
22173
  const now = Date.now();
22112
22174
  const out = [];
22113
- for (const [key, hit] of marketCache) {
22114
- if (!key.startsWith(prefix)) continue;
22175
+ for (const [key2, hit] of marketCache) {
22176
+ if (!key2.startsWith(prefix)) continue;
22115
22177
  if (now - hit.at > MARKET_CACHE_TTL_MS) continue;
22116
22178
  out.push(hit.config);
22117
22179
  }
@@ -22177,8 +22239,8 @@ function fmtDuration2(sec) {
22177
22239
  function priceFor(address, chainId, tokens, prices) {
22178
22240
  const lower3 = address.toLowerCase();
22179
22241
  const token = tokens[lower3];
22180
- const key = toOracleKey(token?.assetGroup) || toGenericPriceKey(lower3, chainId);
22181
- return prices[key] ?? 0;
22242
+ const key2 = toOracleKey(token?.assetGroup) || toGenericPriceKey(lower3, chainId);
22243
+ return prices[key2] ?? 0;
22182
22244
  }
22183
22245
  function convertTellerMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
22184
22246
  intrinsicYields: {},
@@ -22521,8 +22583,8 @@ function currencyFor7(address, decimals, tokens) {
22521
22583
  }
22522
22584
  function priceFor2(address, chainId, prices, tokens) {
22523
22585
  const asset = tokens[address];
22524
- const key = toOracleKey(asset?.assetGroup) || toGenericPriceKey(address, chainId);
22525
- return prices[key] ?? 0;
22586
+ const key2 = toOracleKey(asset?.assetGroup) || toGenericPriceKey(address, chainId);
22587
+ return prices[key2] ?? 0;
22526
22588
  }
22527
22589
  function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
22528
22590
  intrinsicYields: {},
@@ -22787,20 +22849,20 @@ async function fetchInverseMarkets(lender, chainId) {
22787
22849
  if (Object.keys(byAddr).length > 0) {
22788
22850
  const rows = markets.map((market) => {
22789
22851
  const m = byAddr[market.address.toLowerCase()];
22790
- const num11 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
22852
+ const num12 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
22791
22853
  return {
22792
22854
  market,
22793
- totalDebt: num11(m?.totalDebt),
22794
- dolaLiquidity: num11(m?.dolaLiquidity),
22795
- leftToBorrow: num11(m?.leftToBorrow),
22796
- price: num11(m?.price),
22855
+ totalDebt: num12(m?.totalDebt),
22856
+ dolaLiquidity: num12(m?.dolaLiquidity),
22857
+ leftToBorrow: num12(m?.leftToBorrow),
22858
+ price: num12(m?.price),
22797
22859
  borrowPaused: typeof m?.borrowPaused === "boolean" ? m.borrowPaused : null,
22798
- dailyBorrows: num11(m?.dailyBorrows),
22860
+ dailyBorrows: num12(m?.dailyBorrows),
22799
22861
  // The API serves it as a DECIMAL (`replenishmentIncentive: 0.1`),
22800
22862
  // unlike the on-chain bps — normalize here, and fall back to the
22801
22863
  // curated metadata value when the field is missing.
22802
22864
  replenishmentIncentiveBps: (() => {
22803
- const dec = num11(m?.replenishmentIncentive);
22865
+ const dec = num12(m?.replenishmentIncentive);
22804
22866
  if (dec !== null) return Math.round(dec * 1e4);
22805
22867
  const meta = Number(market.replenishmentIncentiveBps);
22806
22868
  return Number.isFinite(meta) ? meta : null;
@@ -22885,8 +22947,8 @@ async function fetchInverseMarkets(lender, chainId) {
22885
22947
  return { ...empty, dbrPriceDola: await dbrPricePromise };
22886
22948
  }
22887
22949
  }
22888
- function num(api, key) {
22889
- const v = api?.[key];
22950
+ function num(api, key2) {
22951
+ const v = api?.[key2];
22890
22952
  return typeof v === "number" && Number.isFinite(v) ? v : null;
22891
22953
  }
22892
22954
  var BANDS_ENDPOINTS = [4, 10, 20, 50];
@@ -23338,13 +23400,354 @@ async function fetchResupplyMarkets(lender, chainId) {
23338
23400
  return { lender, config, pairs };
23339
23401
  }
23340
23402
 
23403
+ // src/prices/oracle-prices/fetchers/curvanceRoster.ts
23404
+ var rosterCache = /* @__PURE__ */ new Map();
23405
+ var key = (chainId, lender) => `${chainId}:${lender}`;
23406
+ function setCurvanceAssetRoster(chainId, lender, markets) {
23407
+ if (markets.length === 0) return;
23408
+ rosterCache.set(key(chainId, lender), markets);
23409
+ }
23410
+ function getCurvanceAssetRoster(chainId, lender) {
23411
+ return rosterCache.get(key(chainId, lender)) ?? [];
23412
+ }
23413
+
23414
+ // src/lending/public-data/curvance/fetchPublic.ts
23415
+ var FALLBACK_TOKEN_READS = 12;
23416
+ var zero = "0x0000000000000000000000000000000000000000";
23417
+ var big2 = (v) => {
23418
+ if (typeof v === "bigint") return v;
23419
+ if (typeof v === "number") return BigInt(v);
23420
+ if (typeof v === "string" && v !== "0x") {
23421
+ try {
23422
+ return BigInt(v);
23423
+ } catch {
23424
+ }
23425
+ }
23426
+ return 0n;
23427
+ };
23428
+ var num3 = (v, fallback) => {
23429
+ const n = Number(v);
23430
+ return Number.isFinite(n) && n > 0 ? n : fallback;
23431
+ };
23432
+ var str = (v, fallback) => typeof v === "string" && v.length > 0 ? v : fallback;
23433
+ async function fetchCurvanceMarkets(lender, chainId) {
23434
+ const config = curvanceConfigFor(lender, chainId);
23435
+ if (!config?.centralRegistry) return { lender, config, markets: [] };
23436
+ let result = { lender, config, markets: [] };
23437
+ if (config.protocolReader) {
23438
+ result = await fetchViaReader(lender, chainId, config);
23439
+ }
23440
+ if (result.markets.length === 0) {
23441
+ result = await fetchViaMulticall(lender, chainId, config);
23442
+ }
23443
+ setCurvanceAssetRoster(
23444
+ chainId,
23445
+ lender,
23446
+ result.markets.map((m) => ({
23447
+ marketManager: m.marketManager,
23448
+ assets: m.tokens.map((t) => t.asset.toLowerCase()).filter((a) => a && a !== zero)
23449
+ }))
23450
+ );
23451
+ return result;
23452
+ }
23453
+ async function fetchViaReader(lender, chainId, config) {
23454
+ const reader = config.protocolReader;
23455
+ let staticData = [];
23456
+ let dynamicData = [];
23457
+ for (let rpcId = 0; rpcId < 3 && staticData.length === 0; rpcId++) {
23458
+ try {
23459
+ const client = getEvmClientUniversal({ chain: chainId, rpcId });
23460
+ const [staticRes, dynamicRes] = await Promise.all([
23461
+ client.readContract({
23462
+ address: reader,
23463
+ abi: CurvanceProtocolReaderAbi,
23464
+ functionName: "getStaticMarketData"
23465
+ }),
23466
+ client.readContract({
23467
+ address: reader,
23468
+ abi: CurvanceProtocolReaderAbi,
23469
+ functionName: "getAllDynamicState",
23470
+ args: [zero]
23471
+ }).catch(() => void 0)
23472
+ ]);
23473
+ if (Array.isArray(staticRes)) staticData = staticRes;
23474
+ if (Array.isArray(dynamicRes) && Array.isArray(dynamicRes[0])) {
23475
+ dynamicData = dynamicRes[0];
23476
+ }
23477
+ } catch {
23478
+ }
23479
+ }
23480
+ if (staticData.length === 0) return { lender, config, markets: [] };
23481
+ const dynamicByToken = /* @__PURE__ */ new Map();
23482
+ for (const m of dynamicData) {
23483
+ for (const t of m?.tokens ?? []) {
23484
+ if (t?._address) dynamicByToken.set(String(t._address).toLowerCase(), t);
23485
+ }
23486
+ }
23487
+ const allow = allowlist(config);
23488
+ const markets = [];
23489
+ for (const m of staticData) {
23490
+ const marketManager = String(m?._address ?? "");
23491
+ if (!marketManager.startsWith("0x")) continue;
23492
+ if (allow && !allow.has(marketManager.toLowerCase())) continue;
23493
+ const tokens = [];
23494
+ for (const t of m?.tokens ?? []) {
23495
+ const cToken = String(t?._address ?? "");
23496
+ if (!cToken.startsWith("0x")) continue;
23497
+ if (t?.isListed === false) continue;
23498
+ const d = dynamicByToken.get(cToken.toLowerCase());
23499
+ tokens.push({
23500
+ cToken,
23501
+ symbol: str(t?.symbol, "c?"),
23502
+ name: str(t?.name, "Curvance"),
23503
+ decimals: num3(t?.decimals, 18),
23504
+ asset: String(t?.asset?._address ?? zero),
23505
+ assetSymbol: str(t?.asset?.symbol, "?"),
23506
+ assetName: str(t?.asset?.name, "?"),
23507
+ assetDecimals: num3(t?.asset?.decimals, 18),
23508
+ collRatio: big2(t?.collRatio),
23509
+ collReqSoft: big2(t?.collReqSoft),
23510
+ collReqHard: big2(t?.collReqHard),
23511
+ liqIncBase: big2(t?.liqIncBase),
23512
+ liqIncCurve: big2(t?.liqIncCurve),
23513
+ closeFactorBase: big2(t?.closeFactorBase),
23514
+ maxLeverage: big2(t?.maxLeverage),
23515
+ collateralCap: big2(t?.collateralCap),
23516
+ debtCap: big2(t?.debtCap),
23517
+ mintPaused: !!t?.mintPaused,
23518
+ collateralizationPaused: !!t?.collateralizationPaused,
23519
+ borrowPaused: !!t?.borrowPaused,
23520
+ redeemPaused: !!t?.redeemPaused,
23521
+ totalAssets: big2(d?.totalAssets),
23522
+ totalSupply: big2(d?.totalSupply),
23523
+ exchangeRate: big2(d?.exchangeRate),
23524
+ collateral: big2(d?.collateral),
23525
+ debt: big2(d?.debt),
23526
+ liquidity: big2(d?.liquidity),
23527
+ assetPrice: big2(d?.assetPrice),
23528
+ assetPriceLower: big2(d?.assetPriceLower),
23529
+ borrowRate: big2(d?.borrowRate),
23530
+ predictedBorrowRate: big2(d?.predictedBorrowRate),
23531
+ supplyRate: big2(d?.supplyRate),
23532
+ utilizationRate: big2(d?.utilizationRate),
23533
+ interestFee: big2(t?.interestFee),
23534
+ irmTargetRate: big2(t?.irmTargetRate),
23535
+ irmMaxRate: big2(t?.irmMaxRate),
23536
+ irmTargetUtilization: big2(t?.irmTargetUtilization)
23537
+ });
23538
+ }
23539
+ if (tokens.length === 0) continue;
23540
+ markets.push({
23541
+ marketManager,
23542
+ cooldownLength: big2(m?.cooldownLength),
23543
+ tokens
23544
+ });
23545
+ }
23546
+ return { lender, config, markets };
23547
+ }
23548
+ async function fetchViaMulticall(lender, chainId, config) {
23549
+ let managers = [];
23550
+ try {
23551
+ const [res] = await multicallRetryUniversal({
23552
+ chain: chainId,
23553
+ calls: [
23554
+ {
23555
+ address: config.centralRegistry,
23556
+ name: "marketManagers",
23557
+ params: []
23558
+ }
23559
+ ],
23560
+ abi: CurvanceCentralRegistryAbi,
23561
+ allowFailure: true
23562
+ });
23563
+ if (Array.isArray(res)) {
23564
+ managers = res.filter(
23565
+ (a) => typeof a === "string" && a.startsWith("0x")
23566
+ );
23567
+ }
23568
+ } catch {
23569
+ return { lender, config, markets: [] };
23570
+ }
23571
+ const allow = allowlist(config);
23572
+ if (allow) managers = managers.filter((m) => allow.has(m.toLowerCase()));
23573
+ if (managers.length === 0) return { lender, config, markets: [] };
23574
+ let listed = [];
23575
+ try {
23576
+ listed = await multicallRetryUniversal({
23577
+ chain: chainId,
23578
+ calls: managers.flatMap((mm) => [
23579
+ { address: mm, name: "queryTokensListed", params: [] },
23580
+ { address: mm, name: "redeemPaused", params: [] }
23581
+ ]),
23582
+ abi: managers.flatMap(() => [
23583
+ CurvanceMarketManagerAbi,
23584
+ CurvanceMarketManagerAbi
23585
+ ]),
23586
+ allowFailure: true
23587
+ });
23588
+ } catch {
23589
+ return { lender, config, markets: [] };
23590
+ }
23591
+ const pairs = [];
23592
+ managers.forEach((mm, i) => {
23593
+ const toks = listed[i * 2];
23594
+ const redeemPaused = big2(listed[i * 2 + 1]) === 2n;
23595
+ if (!Array.isArray(toks)) return;
23596
+ for (const t of toks) {
23597
+ if (typeof t === "string" && t.startsWith("0x")) {
23598
+ pairs.push({ mm, cToken: t, redeemPaused });
23599
+ }
23600
+ }
23601
+ });
23602
+ if (pairs.length === 0) return { lender, config, markets: [] };
23603
+ const calls = [];
23604
+ const abis = [];
23605
+ for (const { mm, cToken } of pairs) {
23606
+ calls.push(
23607
+ { address: mm, name: "collConfig", params: [cToken] },
23608
+ { address: mm, name: "liquidationConfig", params: [cToken] },
23609
+ { address: mm, name: "collateralCaps", params: [cToken] },
23610
+ { address: mm, name: "debtCaps", params: [cToken] },
23611
+ { address: mm, name: "actionsPaused", params: [cToken] },
23612
+ { address: cToken, name: "symbol", params: [] },
23613
+ { address: cToken, name: "decimals", params: [] },
23614
+ { address: cToken, name: "asset", params: [] },
23615
+ { address: cToken, name: "totalAssets", params: [] },
23616
+ { address: cToken, name: "marketOutstandingDebt", params: [] },
23617
+ { address: cToken, name: "assetsHeld", params: [] },
23618
+ { address: cToken, name: "interestFee", params: [] }
23619
+ );
23620
+ abis.push(
23621
+ CurvanceMarketManagerAbi,
23622
+ CurvanceMarketManagerAbi,
23623
+ CurvanceMarketManagerAbi,
23624
+ CurvanceMarketManagerAbi,
23625
+ CurvanceMarketManagerAbi,
23626
+ CurvanceCTokenAbi,
23627
+ CurvanceCTokenAbi,
23628
+ CurvanceCTokenAbi,
23629
+ CurvanceCTokenAbi,
23630
+ CurvanceCTokenAbi,
23631
+ CurvanceCTokenAbi,
23632
+ CurvanceCTokenAbi
23633
+ );
23634
+ }
23635
+ const TOKENS_PER_BATCH = 8;
23636
+ const results = [];
23637
+ for (let i = 0; i < pairs.length; i += TOKENS_PER_BATCH) {
23638
+ const from = i * FALLBACK_TOKEN_READS;
23639
+ const to = Math.min(i + TOKENS_PER_BATCH, pairs.length) * FALLBACK_TOKEN_READS;
23640
+ try {
23641
+ const chunk7 = await multicallRetryUniversal({
23642
+ chain: chainId,
23643
+ calls: calls.slice(from, to),
23644
+ abi: abis.slice(from, to),
23645
+ allowFailure: true
23646
+ });
23647
+ results.push(...chunk7);
23648
+ } catch {
23649
+ results.push(...new Array(to - from).fill("0x"));
23650
+ }
23651
+ }
23652
+ const assets = pairs.map((_3, i) => results[i * FALLBACK_TOKEN_READS + 7]);
23653
+ let assetMeta = [];
23654
+ try {
23655
+ assetMeta = await multicallRetryUniversal({
23656
+ chain: chainId,
23657
+ calls: assets.flatMap((a) => [
23658
+ { address: a ?? zero, name: "symbol", params: [] },
23659
+ { address: a ?? zero, name: "decimals", params: [] },
23660
+ { address: a ?? zero, name: "name", params: [] }
23661
+ ]),
23662
+ abi: assets.flatMap(() => [
23663
+ CurvanceCTokenAbi,
23664
+ CurvanceCTokenAbi,
23665
+ CurvanceCTokenAbi
23666
+ ]),
23667
+ allowFailure: true
23668
+ });
23669
+ } catch {
23670
+ assetMeta = [];
23671
+ }
23672
+ const byManager = /* @__PURE__ */ new Map();
23673
+ pairs.forEach((p, i) => {
23674
+ const base = i * FALLBACK_TOKEN_READS;
23675
+ const coll = results[base];
23676
+ const liq = results[base + 1];
23677
+ const paused = results[base + 4];
23678
+ const asset = results[base + 7];
23679
+ if (!Array.isArray(coll) || typeof asset !== "string") return;
23680
+ const tuple = (v, idx) => Array.isArray(v) ? big2(v[idx]) : 0n;
23681
+ const held = big2(results[base + 10]);
23682
+ const debt = big2(results[base + 9]);
23683
+ const token = {
23684
+ cToken: p.cToken,
23685
+ symbol: str(results[base + 5], "c?"),
23686
+ name: str(results[base + 5], "Curvance"),
23687
+ decimals: num3(results[base + 6], 18),
23688
+ asset,
23689
+ assetSymbol: str(assetMeta[i * 3], "?"),
23690
+ assetDecimals: num3(assetMeta[i * 3 + 1], 18),
23691
+ assetName: str(assetMeta[i * 3 + 2], "?"),
23692
+ collRatio: tuple(coll, 0),
23693
+ collReqSoft: tuple(coll, 1),
23694
+ collReqHard: tuple(coll, 2),
23695
+ liqIncBase: tuple(liq, 0),
23696
+ liqIncCurve: tuple(liq, 1),
23697
+ closeFactorBase: tuple(liq, 4),
23698
+ maxLeverage: 0n,
23699
+ collateralCap: big2(results[base + 2]),
23700
+ debtCap: big2(results[base + 3]),
23701
+ mintPaused: Array.isArray(paused) ? !!paused[0] : false,
23702
+ collateralizationPaused: Array.isArray(paused) ? !!paused[1] : false,
23703
+ borrowPaused: Array.isArray(paused) ? !!paused[2] : false,
23704
+ redeemPaused: p.redeemPaused,
23705
+ totalAssets: big2(results[base + 8]),
23706
+ totalSupply: 0n,
23707
+ exchangeRate: 0n,
23708
+ collateral: 0n,
23709
+ debt,
23710
+ liquidity: held,
23711
+ // No reader ⇒ no prices from here. Left at 0 and treated as UNKNOWN by
23712
+ // the converter, which then falls back to the shared price map.
23713
+ assetPrice: 0n,
23714
+ assetPriceLower: 0n,
23715
+ borrowRate: 0n,
23716
+ predictedBorrowRate: 0n,
23717
+ supplyRate: 0n,
23718
+ utilizationRate: held + debt > 0n ? debt * 10n ** 18n / (held + debt) : 0n,
23719
+ interestFee: big2(results[base + 11]),
23720
+ irmTargetRate: 0n,
23721
+ irmMaxRate: 0n,
23722
+ irmTargetUtilization: 0n
23723
+ };
23724
+ const existing = byManager.get(p.mm);
23725
+ if (existing) existing.tokens.push(token);
23726
+ else
23727
+ byManager.set(p.mm, {
23728
+ marketManager: p.mm,
23729
+ // `MIN_HOLD_PERIOD` is a constant on every deployment; hardcoding the
23730
+ // known value here beats an extra round-trip in the fallback path.
23731
+ cooldownLength: 1200n,
23732
+ tokens: [token]
23733
+ });
23734
+ });
23735
+ return { lender, config, markets: [...byManager.values()] };
23736
+ }
23737
+ function allowlist(config) {
23738
+ if (!config.marketAllowlist || config.marketAllowlist.length === 0) {
23739
+ return void 0;
23740
+ }
23741
+ return new Set(config.marketAllowlist.map((m) => m.toLowerCase()));
23742
+ }
23743
+
23341
23744
  // src/lending/public-data/inverse/convertPublic.ts
23342
23745
  function inverseLenderKey(lender, market) {
23343
23746
  return `${lender}_${market.replace(/^0x/i, "").toUpperCase()}`;
23344
23747
  }
23345
- function inverseKeyParts(key) {
23346
- if (!key.startsWith("INVERSE_")) return void 0;
23347
- const suffix = key.slice("INVERSE_".length);
23748
+ function inverseKeyParts(key2) {
23749
+ if (!key2.startsWith("INVERSE_")) return void 0;
23750
+ const suffix = key2.slice("INVERSE_".length);
23348
23751
  if (!/^[0-9A-F]{40}$/.test(suffix)) return void 0;
23349
23752
  return { lender: "INVERSE", market: "0x" + suffix.toLowerCase() };
23350
23753
  }
@@ -23374,7 +23777,7 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
23374
23777
  const collDecimals = market.collDecimals;
23375
23778
  const collToken = tokens[collAddr];
23376
23779
  const collSymbol = collToken?.symbol ?? market.name ?? "COLL";
23377
- const marketName = `DOLA / ${market.name ?? collSymbol}`;
23780
+ const marketName2 = `DOLA / ${market.name ?? collSymbol}`;
23378
23781
  const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
23379
23782
  const collPrice = m.price ?? prices[collPriceKey] ?? 0;
23380
23783
  const totalDebt = m.totalDebt ?? 0;
@@ -23481,7 +23884,7 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
23481
23884
  entry.params = {
23482
23885
  market: {
23483
23886
  lender: lenderKey,
23484
- name: marketName,
23887
+ name: marketName2,
23485
23888
  loanDecimals: debtDecimals,
23486
23889
  collateralDecimals: collDecimals,
23487
23890
  // The Market contract doubles as the market id.
@@ -23532,9 +23935,9 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
23532
23935
  function llamaLendLenderKey(lender, controller) {
23533
23936
  return `${lender}_${controller.replace(/^0x/i, "").toUpperCase()}`;
23534
23937
  }
23535
- function llamaLendKeyParts(key) {
23536
- if (!key.startsWith("LLAMALEND_")) return void 0;
23537
- const suffix = key.slice("LLAMALEND_".length);
23938
+ function llamaLendKeyParts(key2) {
23939
+ if (!key2.startsWith("LLAMALEND_")) return void 0;
23940
+ const suffix = key2.slice("LLAMALEND_".length);
23538
23941
  if (!/^[0-9A-F]{40}$/.test(suffix)) return void 0;
23539
23942
  return { lender: "LLAMALEND", controller: "0x" + suffix.toLowerCase() };
23540
23943
  }
@@ -23561,7 +23964,7 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
23561
23964
  const loanToken = tokens[loanAddr];
23562
23965
  const collSymbol = collToken?.symbol ?? market.collateralSymbol ?? "COLL";
23563
23966
  const loanSymbol = loanToken?.symbol ?? market.borrowedSymbol ?? "LOAN";
23564
- const marketName = market.name ?? `${loanSymbol} / ${collSymbol}`;
23967
+ const marketName2 = market.name ?? `${loanSymbol} / ${collSymbol}`;
23565
23968
  const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
23566
23969
  const loanPriceKey = toOracleKey(loanToken?.assetGroup) || toGenericPriceKey(loanAddr, chainId);
23567
23970
  prices[collPriceKey] || m.collateralPriceUsd || 0;
@@ -23678,7 +24081,7 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
23678
24081
  entry.params = {
23679
24082
  market: {
23680
24083
  lender: lenderKey,
23681
- name: marketName,
24084
+ name: marketName2,
23682
24085
  loanDecimals,
23683
24086
  collateralDecimals: collDecimals,
23684
24087
  // The Controller doubles as the market id.
@@ -23789,9 +24192,9 @@ function resolveWrappedMarket(chainId, collateralVault, pairName) {
23789
24192
  function resupplyLenderKey(lender, chainId, pair) {
23790
24193
  return `${lender}_${chainId}_${pair.replace(/^0x/i, "").toUpperCase()}`;
23791
24194
  }
23792
- function resupplyKeyParts(key) {
23793
- if (!key.startsWith("RESUPPLY_")) return void 0;
23794
- const suffix = key.slice("RESUPPLY_".length);
24195
+ function resupplyKeyParts(key2) {
24196
+ if (!key2.startsWith("RESUPPLY_")) return void 0;
24197
+ const suffix = key2.slice("RESUPPLY_".length);
23795
24198
  const m = suffix.match(/^(\d+)_([0-9A-Fa-f]{40})$/);
23796
24199
  if (!m) return void 0;
23797
24200
  return {
@@ -24021,6 +24424,233 @@ function convertResupplyMarketsToResponse(raw, chainId, prices = {}, _additional
24021
24424
  }
24022
24425
  return out;
24023
24426
  }
24427
+
24428
+ // src/lending/public-data/curvance/convertPublic.ts
24429
+ function curvanceLenderKey(lender, chainId, marketManager) {
24430
+ return `${lender}_${chainId}_${marketManager.replace(/^0x/i, "").toUpperCase()}`;
24431
+ }
24432
+ var SECONDS_PER_YEAR10 = 31536e3;
24433
+ var BPS2 = 1e4;
24434
+ function ratePerSecToApr2(rate) {
24435
+ return Number(rate) / 1e18 * SECONDS_PER_YEAR10 * 100;
24436
+ }
24437
+ function currencyFor11(address, decimals, symbol, name, tokens) {
24438
+ const lower3 = address.toLowerCase();
24439
+ return tokens[lower3] ?? { address: lower3, symbol, name, decimals };
24440
+ }
24441
+ var toFloat = (raw, decimals) => Number(raw) / 10 ** decimals;
24442
+ function convertCurvanceMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
24443
+ intrinsicYields: {},
24444
+ lenderRewards: {},
24445
+ loaded: true
24446
+ }, tokens = {}) {
24447
+ const out = {};
24448
+ const cfg = raw?.config;
24449
+ if (!cfg) return out;
24450
+ for (const market of raw.markets ?? []) {
24451
+ if (!market.tokens || market.tokens.length === 0) continue;
24452
+ const lenderKey = curvanceLenderKey(
24453
+ raw.lender,
24454
+ chainId,
24455
+ market.marketManager
24456
+ );
24457
+ const entry = { data: {} };
24458
+ const descriptors = [];
24459
+ let published = 0;
24460
+ for (const t of market.tokens) {
24461
+ const assetAddr = t.asset.toLowerCase();
24462
+ if (assetAddr === zeroAddress) continue;
24463
+ const token = tokens[assetAddr];
24464
+ const priceKey = toOracleKey(token?.assetGroup) || toGenericPriceKey(assetAddr, chainId);
24465
+ const collPrice = t.assetPriceLower > 0n ? Number(t.assetPriceLower) / 1e18 : prices[priceKey] || 0;
24466
+ const debtPrice = t.assetPrice > 0n ? Number(t.assetPrice) / 1e18 : prices[priceKey] || 0;
24467
+ const dec = t.assetDecimals;
24468
+ const totalDeposits = toFloat(t.totalAssets, dec);
24469
+ const totalDebt = toFloat(t.debt, dec);
24470
+ const liquidity = toFloat(t.liquidity, dec);
24471
+ const borrowable = t.debtCap > 0n;
24472
+ const debtHeadroom = borrowable ? Math.max(toFloat(t.debtCap, dec) - totalDebt, 0) : 0;
24473
+ const borrowLiquidity = borrowable ? Math.min(liquidity, debtHeadroom) : 0;
24474
+ const collateralActive = t.collRatio > 0n && t.collateralCap > 0n;
24475
+ const ltv = Number(t.collRatio) / BPS2;
24476
+ const liqThresholdSoft = t.collReqSoft > 0n ? BPS2 / Number(t.collReqSoft) : 0;
24477
+ const liqThresholdHard = t.collReqHard > 0n ? BPS2 / Number(t.collReqHard) : 0;
24478
+ const liquidationPenalty = t.liqIncBase > BigInt(BPS2) ? Number(t.liqIncBase) / BPS2 - 1 : 0;
24479
+ const liquidationPenaltyMax = t.liqIncBase + t.liqIncCurve > BigInt(BPS2) ? Number(t.liqIncBase + t.liqIncCurve) / BPS2 - 1 : liquidationPenalty;
24480
+ const closeFactor = t.closeFactorBase > 0n ? Number(t.closeFactorBase) / BPS2 : 1;
24481
+ const borrowApr = ratePerSecToApr2(t.borrowRate);
24482
+ const supplyApr = ratePerSecToApr2(t.supplyRate);
24483
+ const utilization = Number(t.utilizationRate) / 1e18;
24484
+ const borrowHalted = !borrowable || t.borrowPaused || debtHeadroom <= 0;
24485
+ const depositsHalted = t.mintPaused;
24486
+ const uid = createMarketUid(chainId, lenderKey, assetAddr);
24487
+ entry.data[uid] = {
24488
+ marketUid: uid,
24489
+ name: t.assetSymbol,
24490
+ poolId: market.marketManager.toLowerCase(),
24491
+ underlying: assetAddr,
24492
+ asset: currencyFor11(assetAddr, dec, t.assetSymbol, t.assetName, tokens),
24493
+ totalDeposits,
24494
+ totalDebtStable: 0,
24495
+ totalDebt,
24496
+ totalLiquidity: liquidity,
24497
+ borrowLiquidity,
24498
+ totalLiquidityUSD: liquidity * collPrice,
24499
+ borrowLiquidityUSD: borrowLiquidity * debtPrice,
24500
+ totalDepositsUSD: totalDeposits * collPrice,
24501
+ totalDebtStableUSD: 0,
24502
+ totalDebtUSD: totalDebt * debtPrice,
24503
+ utilization,
24504
+ // A collateral-only leg genuinely pays 0% — there is no lender side on
24505
+ // it. Its return is the underlying's own yield, joined in elsewhere.
24506
+ depositRate: borrowable ? supplyApr : 0,
24507
+ variableBorrowRate: borrowable ? borrowApr : 0,
24508
+ stableBorrowRate: 0,
24509
+ rateModel: "curvance-dynamic",
24510
+ intrinsicYield: 0,
24511
+ rewards: void 0,
24512
+ decimals: dec,
24513
+ config: {
24514
+ 0: {
24515
+ category: 0,
24516
+ borrowCollateralFactor: ltv,
24517
+ // The SOFT threshold — where the position first becomes
24518
+ // liquidatable, which is the number a risk display must show.
24519
+ collateralFactor: liqThresholdSoft,
24520
+ borrowFactor: 1,
24521
+ liquidationPenalty,
24522
+ closeFactor,
24523
+ collateralDisabled: !collateralActive,
24524
+ debtDisabled: borrowHalted
24525
+ }
24526
+ },
24527
+ closeFactor,
24528
+ collateralActive,
24529
+ borrowingEnabled: !borrowHalted,
24530
+ // Deposits stay open on a borrow-paused market so users can top up to
24531
+ // avoid liquidation; only the paused action itself is stopped.
24532
+ depositsEnabled: !depositsHalted,
24533
+ hasStable: false,
24534
+ variableBorrowDisabled: borrowHalted,
24535
+ isActive: !(depositsHalted && borrowHalted),
24536
+ isFrozen: depositsHalted && borrowHalted
24537
+ };
24538
+ published++;
24539
+ descriptors.push({
24540
+ cToken: t.cToken,
24541
+ underlying: assetAddr,
24542
+ symbol: t.symbol,
24543
+ assetSymbol: t.assetSymbol,
24544
+ decimals: t.decimals,
24545
+ assetDecimals: dec,
24546
+ /** THE borrowability gate — never `isBorrowable()`. */
24547
+ borrowable,
24548
+ debtCap: t.debtCap.toString(),
24549
+ collateralCap: t.collateralCap.toString(),
24550
+ /** BPS, verbatim, so a caller can reproduce the protocol's own math. */
24551
+ collRatioBps: t.collRatio.toString(),
24552
+ collReqSoftBps: t.collReqSoft.toString(),
24553
+ collReqHardBps: t.collReqHard.toString(),
24554
+ liqIncBaseBps: t.liqIncBase.toString(),
24555
+ liqIncCurveBps: t.liqIncCurve.toString(),
24556
+ closeFactorBaseBps: t.closeFactorBase.toString(),
24557
+ /** Inverted to liquidation-threshold form for convenience. */
24558
+ liquidationThresholdSoft: liqThresholdSoft,
24559
+ liquidationThresholdHard: liqThresholdHard,
24560
+ liquidationPenaltySoft: liquidationPenalty,
24561
+ liquidationPenaltyHard: liquidationPenaltyMax,
24562
+ maxLeverage: t.maxLeverage.toString(),
24563
+ mintPaused: t.mintPaused,
24564
+ collateralizationPaused: t.collateralizationPaused,
24565
+ borrowPaused: t.borrowPaused,
24566
+ redeemPaused: t.redeemPaused,
24567
+ /** Per-second WAD, as stored. Annualise nominally. */
24568
+ borrowRatePerSecond: t.borrowRate.toString(),
24569
+ /** One 600 s adjustment period ahead — the vertex multiplier moves. */
24570
+ predictedBorrowRatePerSecond: t.predictedBorrowRate.toString(),
24571
+ supplyRatePerSecond: t.supplyRate.toString(),
24572
+ interestFeeBps: t.interestFee.toString(),
24573
+ irmTargetRate: t.irmTargetRate.toString(),
24574
+ irmMaxRate: t.irmMaxRate.toString(),
24575
+ irmTargetUtilization: t.irmTargetUtilization.toString(),
24576
+ /** WAD USD from Curvance's own dual oracle, pessimistic both ways. */
24577
+ assetPrice: t.assetPrice.toString(),
24578
+ assetPriceLower: t.assetPriceLower.toString()
24579
+ });
24580
+ }
24581
+ if (published === 0) continue;
24582
+ const collLeg = market.tokens.find((t) => t.debtCap === 0n);
24583
+ const debtLeg = market.tokens.find((t) => t.debtCap > 0n);
24584
+ const positionManagers = resolvePositionManagers(cfg, market.marketManager);
24585
+ entry.params = {
24586
+ market: {
24587
+ lender: lenderKey,
24588
+ name: marketName(market.tokens),
24589
+ loanDecimals: debtLeg?.assetDecimals ?? 18,
24590
+ collateralDecimals: collLeg?.assetDecimals ?? 18,
24591
+ id: market.marketManager.toLowerCase(),
24592
+ lltv: (collLeg ?? market.tokens[0]).collRatio.toString(),
24593
+ // Pricing is the shared per-chain OracleManager, not a per-market feed.
24594
+ oracle: cfg.oracleManager ?? zeroAddress,
24595
+ irm: zeroAddress,
24596
+ collateralAddress: (collLeg ?? market.tokens[0]).asset.toLowerCase(),
24597
+ loanAddress: (debtLeg ?? market.tokens[0]).asset.toLowerCase(),
24598
+ // --- Curvance descriptor (consumed by the calldata builders, the
24599
+ // worker-api resolvers and the loop quoter) ---
24600
+ curvance: {
24601
+ marketManager: market.marketManager,
24602
+ tokens: descriptors,
24603
+ /**
24604
+ * `MIN_HOLD_PERIOD` in seconds. Stamped per account per market by
24605
+ * POSTING COLLATERAL and by BORROWING, and while it runs REPAYMENT,
24606
+ * REDEMPTION and share transfers all revert. So a position cannot be
24607
+ * closed, deleveraged or migrated out for 20 minutes after it is
24608
+ * opened or topped up — gate every exit flow on it.
24609
+ */
24610
+ holdPeriodSeconds: Number(market.cooldownLength || 1200n),
24611
+ /**
24612
+ * Native-leverage entry points for this market, or `undefined` when
24613
+ * none is registered — which is a REAL state, not a gap: 5 of the 25
24614
+ * live Monad markets have no Position Manager, including the largest
24615
+ * one. `undefined` here means no one-click loop on this market.
24616
+ */
24617
+ positionManagers,
24618
+ addresses: {
24619
+ centralRegistry: cfg.centralRegistry,
24620
+ oracleManager: cfg.oracleManager ?? void 0,
24621
+ protocolReader: cfg.protocolReader ?? void 0
24622
+ },
24623
+ /**
24624
+ * Swap targets with a registered calldata checker. The native
24625
+ * leverage path REJECTS any other target, and the mapping is
24626
+ * DAO-mutable in both directions, so treat this as a hint and probe
24627
+ * `externalCalldataChecker(target)` live before encoding.
24628
+ */
24629
+ swapTargets: cfg.swapTargets ?? void 0
24630
+ }
24631
+ }
24632
+ };
24633
+ entry.chainId = chainId;
24634
+ out[lenderKey] = entry;
24635
+ }
24636
+ return out;
24637
+ }
24638
+ function marketName(tokens) {
24639
+ const coll = tokens.find((t) => t.debtCap === 0n) ?? tokens[0];
24640
+ const debt = tokens.find((t) => t !== coll) ?? tokens[tokens.length - 1];
24641
+ return `${coll.assetSymbol} / ${debt.assetSymbol}`;
24642
+ }
24643
+ function resolvePositionManagers(cfg, marketManager) {
24644
+ const map = cfg.positionManagers;
24645
+ if (!map) return void 0;
24646
+ const direct = map[marketManager];
24647
+ if (direct) return { ...direct };
24648
+ const target = marketManager.toLowerCase();
24649
+ for (const key2 of Object.keys(map)) {
24650
+ if (key2.toLowerCase() === target) return { ...map[key2] };
24651
+ }
24652
+ return void 0;
24653
+ }
24024
24654
  var READS_PER_ILK = 4;
24025
24655
  var USDD_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi, erc20Abi];
24026
24656
  var usddIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
@@ -24051,12 +24681,12 @@ async function fetchUsddMarkets(lender, chainId) {
24051
24681
  } catch {
24052
24682
  return { lender, config, chainData, markets: [] };
24053
24683
  }
24054
- const big13 = (v) => {
24684
+ const big15 = (v) => {
24055
24685
  if (typeof v === "bigint") return v;
24056
24686
  if (typeof v === "number") return BigInt(v);
24057
24687
  return null;
24058
24688
  };
24059
- const field12 = (res, name, idx) => big13(res?.[name] ?? res?.[idx]);
24689
+ const field12 = (res, name, idx) => big15(res?.[name] ?? res?.[idx]);
24060
24690
  const out = markets.map((market, i) => {
24061
24691
  const base = i * READS_PER_ILK;
24062
24692
  const vatIlk = results[base];
@@ -24071,7 +24701,7 @@ async function fetchUsddMarkets(lender, chainId) {
24071
24701
  dust: field12(vatIlk, "dust", 4),
24072
24702
  duty: field12(jugIlk, "duty", 0),
24073
24703
  mat: field12(spotIlk, "mat", 1),
24074
- joinBalance: big13(results[base + 3])
24704
+ joinBalance: big15(results[base + 3])
24075
24705
  };
24076
24706
  });
24077
24707
  return { lender, config, chainData, markets: out };
@@ -24081,21 +24711,21 @@ async function fetchUsddMarkets(lender, chainId) {
24081
24711
  function usddLenderKey(lender, chainId, ilk) {
24082
24712
  return `${lender}_${chainId}_${ilk}`;
24083
24713
  }
24084
- function usddKeyParts(key) {
24085
- if (!key.startsWith("USDD_")) return void 0;
24086
- const suffix = key.slice("USDD_".length);
24714
+ function usddKeyParts(key2) {
24715
+ if (!key2.startsWith("USDD_")) return void 0;
24716
+ const suffix = key2.slice("USDD_".length);
24087
24717
  const m = suffix.match(/^(\d+)_([A-Z0-9][A-Z0-9-]*)$/);
24088
24718
  if (!m) return void 0;
24089
24719
  return { lender: "USDD", chainId: m[1], ilk: m[2] };
24090
24720
  }
24091
- var WAD8 = 1e18;
24092
- var RAY3 = 1e27;
24721
+ var WAD9 = 1e18;
24722
+ var RAY4 = 1e27;
24093
24723
  var RAD = 1e45;
24094
24724
  var YEAR_SECONDS2 = 31536e3;
24095
24725
  function toHuman4(raw, decimals) {
24096
24726
  return Number(raw) / 10 ** decimals;
24097
24727
  }
24098
- function currencyFor11(address, decimals, symbol, tokens) {
24728
+ function currencyFor12(address, decimals, symbol, tokens) {
24099
24729
  const lower3 = address.toLowerCase();
24100
24730
  return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
24101
24731
  }
@@ -24121,18 +24751,18 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
24121
24751
  const collDecimals = market.collDecimals;
24122
24752
  const collToken = tokens[collAddr];
24123
24753
  const collSymbol = collToken?.symbol ?? market.collSymbol ?? market.ilk.split("-")[0];
24124
- const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
24754
+ const marketName2 = market.name ?? `${debtSymbol} / ${collSymbol}`;
24125
24755
  const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
24126
- const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) / RAY3 * (Number(m.mat) / RAY3) : 0;
24756
+ const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) / RAY4 * (Number(m.mat) / RAY4) : 0;
24127
24757
  const collPrice = spotDerivedPrice || (prices[collPriceKey] ?? 0);
24128
24758
  const totalDebt = m.Art !== null && m.rate !== null ? Number(m.Art * m.rate / BigInt(1e27)) / 10 ** debtDecimals : 0;
24129
24759
  const totalColl = m.joinBalance !== null ? toHuman4(m.joinBalance, collDecimals) : 0;
24130
- const mat = m.mat !== null ? Number(m.mat) / RAY3 : Number(market.mat) / RAY3 || 1.5;
24760
+ const mat = m.mat !== null ? Number(m.mat) / RAY4 : Number(market.mat) / RAY4 || 1.5;
24131
24761
  const ltv = mat > 0 ? 1 / mat : 0;
24132
- const chop = market.chop ? Number(market.chop) / WAD8 : 0;
24762
+ const chop = market.chop ? Number(market.chop) / WAD9 : 0;
24133
24763
  const liqPenalty = chop > 1 ? chop - 1 : 0;
24134
24764
  const duty = m.duty !== null ? m.duty : BigInt(market.duty ?? 0);
24135
- const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY3 * YEAR_SECONDS2 * 100 : 0;
24765
+ const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY4 * YEAR_SECONDS2 * 100 : 0;
24136
24766
  const line = m.line !== null ? Number(m.line) / RAD : 0;
24137
24767
  let borrowLiquidity = Math.max(0, line - totalDebt);
24138
24768
  const halted = line === 0;
@@ -24143,7 +24773,7 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
24143
24773
  name: "Collateral " + collSymbol,
24144
24774
  poolId: market.gemJoin.toLowerCase(),
24145
24775
  underlying: collAddr,
24146
- asset: currencyFor11(collAddr, collDecimals, collSymbol, tokens),
24776
+ asset: currencyFor12(collAddr, collDecimals, collSymbol, tokens),
24147
24777
  totalDeposits: totalColl,
24148
24778
  totalDebtStable: 0,
24149
24779
  totalDebt: 0,
@@ -24187,7 +24817,7 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
24187
24817
  name: debtSymbol,
24188
24818
  poolId: cfg.vat.toLowerCase(),
24189
24819
  underlying: debtAddr,
24190
- asset: currencyFor11(debtAddr, debtDecimals, debtSymbol, tokens),
24820
+ asset: currencyFor12(debtAddr, debtDecimals, debtSymbol, tokens),
24191
24821
  totalDeposits: 0,
24192
24822
  totalDebtStable: 0,
24193
24823
  totalDebt,
@@ -24232,7 +24862,7 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
24232
24862
  entry.params = {
24233
24863
  market: {
24234
24864
  lender: lenderKey,
24235
- name: marketName,
24865
+ name: marketName2,
24236
24866
  loanDecimals: debtDecimals,
24237
24867
  collateralDecimals: collDecimals,
24238
24868
  // The gem join doubles as the market id (marketUid address) — one
@@ -24326,26 +24956,26 @@ async function fetchFrankencoinMarkets(lender, chainId) {
24326
24956
  } catch {
24327
24957
  return { lender, config, chainData, markets: [] };
24328
24958
  }
24329
- const big13 = (v) => {
24959
+ const big15 = (v) => {
24330
24960
  if (typeof v === "bigint") return v;
24331
24961
  if (typeof v === "number") return BigInt(v);
24332
24962
  return null;
24333
24963
  };
24334
24964
  const out = markets.map((market, i) => {
24335
24965
  const base = i * READS_PER_MARKET3;
24336
- const expiration = big13(results[base + 7]);
24966
+ const expiration = big15(results[base + 7]);
24337
24967
  return {
24338
24968
  market,
24339
- price: big13(results[base]),
24340
- minted: big13(results[base + 1]),
24341
- availableForClones: big13(results[base + 2]),
24342
- annualInterestPPM: big13(results[base + 3]),
24343
- currentFeePPM: big13(results[base + 4]),
24344
- reserveContribution: big13(results[base + 5]),
24345
- challengedAmount: big13(results[base + 6]),
24969
+ price: big15(results[base]),
24970
+ minted: big15(results[base + 1]),
24971
+ availableForClones: big15(results[base + 2]),
24972
+ annualInterestPPM: big15(results[base + 3]),
24973
+ currentFeePPM: big15(results[base + 4]),
24974
+ reserveContribution: big15(results[base + 5]),
24975
+ challengedAmount: big15(results[base + 6]),
24346
24976
  expiration,
24347
24977
  isClosed: typeof results[base + 8] === "boolean" ? results[base + 8] : null,
24348
- collateralBalance: big13(results[base + 9])
24978
+ collateralBalance: big15(results[base + 9])
24349
24979
  };
24350
24980
  });
24351
24981
  return { lender, config, chainData, markets: out };
@@ -24355,9 +24985,9 @@ async function fetchFrankencoinMarkets(lender, chainId) {
24355
24985
  function frankencoinLenderKey(lender, chainId, position) {
24356
24986
  return `${lender}_${chainId}_${position.replace(/^0x/i, "").toUpperCase()}`;
24357
24987
  }
24358
- function frankencoinKeyParts(key) {
24359
- if (!key.startsWith("FRANKENCOIN_")) return void 0;
24360
- const suffix = key.slice("FRANKENCOIN_".length);
24988
+ function frankencoinKeyParts(key2) {
24989
+ if (!key2.startsWith("FRANKENCOIN_")) return void 0;
24990
+ const suffix = key2.slice("FRANKENCOIN_".length);
24361
24991
  const m = suffix.match(/^(\d+)_([0-9A-Fa-f]{40})$/);
24362
24992
  if (!m) return void 0;
24363
24993
  return {
@@ -24367,7 +24997,7 @@ function frankencoinKeyParts(key) {
24367
24997
  };
24368
24998
  }
24369
24999
  var PPM = 1e6;
24370
- function currencyFor12(address, decimals, symbol, tokens) {
25000
+ function currencyFor13(address, decimals, symbol, tokens) {
24371
25001
  const lower3 = address.toLowerCase();
24372
25002
  return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
24373
25003
  }
@@ -24394,7 +25024,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
24394
25024
  const collDecimals = market.collDecimals;
24395
25025
  const collToken = tokens[collAddr];
24396
25026
  const collSymbol = collToken?.symbol ?? market.collSymbol ?? "COLL";
24397
- const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
25027
+ const marketName2 = market.name ?? `${debtSymbol} / ${collSymbol}`;
24398
25028
  const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
24399
25029
  const collPrice = prices[collPriceKey] ?? 0;
24400
25030
  const declaredPrice = m.price !== null ? Number(m.price) / 10 ** (36 - collDecimals) : Number(market.price) / 10 ** (36 - collDecimals);
@@ -24418,7 +25048,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
24418
25048
  name: "Collateral " + collSymbol,
24419
25049
  poolId: market.position.toLowerCase(),
24420
25050
  underlying: collAddr,
24421
- asset: currencyFor12(collAddr, collDecimals, collSymbol, tokens),
25051
+ asset: currencyFor13(collAddr, collDecimals, collSymbol, tokens),
24422
25052
  totalDeposits: totalColl,
24423
25053
  totalDebtStable: 0,
24424
25054
  totalDebt: 0,
@@ -24465,7 +25095,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
24465
25095
  name: debtSymbol,
24466
25096
  poolId: cfg.mintingHub.toLowerCase(),
24467
25097
  underlying: debtAddr,
24468
- asset: currencyFor12(debtAddr, debtDecimals, debtSymbol, tokens),
25098
+ asset: currencyFor13(debtAddr, debtDecimals, debtSymbol, tokens),
24469
25099
  totalDeposits: 0,
24470
25100
  totalDebtStable: 0,
24471
25101
  totalDebt,
@@ -24514,7 +25144,7 @@ function convertFrankencoinMarketsToResponse(raw, chainId, prices = {}, _additio
24514
25144
  entry.params = {
24515
25145
  market: {
24516
25146
  lender: lenderKey,
24517
- name: marketName,
25147
+ name: marketName2,
24518
25148
  loanDecimals: debtDecimals,
24519
25149
  collateralDecimals: collDecimals,
24520
25150
  // The original position doubles as the market id.
@@ -25188,6 +25818,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
25188
25818
  if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
25189
25819
  if (isLlamaLend(lender)) return await fetchLlamaLendMarkets(lender, chainId);
25190
25820
  if (isResupply(lender)) return await fetchResupplyMarkets(lender, chainId);
25821
+ if (isCurvance(lender)) return await fetchCurvanceMarkets(lender, chainId);
25191
25822
  if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
25192
25823
  if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
25193
25824
  if (isFrankencoin(lender))
@@ -25269,6 +25900,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
25269
25900
  additionalYields,
25270
25901
  list
25271
25902
  );
25903
+ if (isCurvance(lender))
25904
+ return convertCurvanceMarketsToResponse(
25905
+ data,
25906
+ chainId,
25907
+ prices,
25908
+ additionalYields,
25909
+ list
25910
+ );
25272
25911
  if (isFrankencoin(lender))
25273
25912
  return convertFrankencoinMarketsToResponse(
25274
25913
  data,
@@ -25495,6 +26134,7 @@ function lenderApiOnly(lender, chainId) {
25495
26134
  if (isInverse(lender)) return true;
25496
26135
  if (isTermMax(lender)) return true;
25497
26136
  if (isResupply(lender)) return true;
26137
+ if (isCurvance(lender)) return true;
25498
26138
  if (isUsdd(lender)) return true;
25499
26139
  if (isFrankencoin(lender)) return true;
25500
26140
  if (isLlamaLend(lender)) return true;
@@ -26138,20 +26778,20 @@ var getCompoundV2UserDataConverter = (lender, chainId, account, metaMap) => {
26138
26778
  const asstsIn = assetsInRaw.map((a) => a.toLowerCase());
26139
26779
  for (let i = 0; i < tokens.length; i++) {
26140
26780
  const { cToken } = tokens[i];
26141
- const key = createMarketUid(chainId, lender, cToken);
26781
+ const key2 = createMarketUid(chainId, lender, cToken);
26142
26782
  const { dataForAsset, addedDebt, addedDeposits } = createCompoundV2Entry(
26143
26783
  i,
26144
26784
  data,
26145
- key,
26785
+ key2,
26146
26786
  asstsIn,
26147
26787
  cToken,
26148
- metaMap[key],
26788
+ metaMap[key2],
26149
26789
  0
26150
26790
  );
26151
26791
  if (!dataForAsset) continue;
26152
26792
  totalDebt24h += addedDebt;
26153
26793
  totalDeposits24h += addedDeposits;
26154
- lendingPositions[key] = dataForAsset;
26794
+ lendingPositions[key2] = dataForAsset;
26155
26795
  }
26156
26796
  const payload = {
26157
26797
  chainId,
@@ -26173,7 +26813,7 @@ var getCompoundV2UserDataConverter = (lender, chainId, account, metaMap) => {
26173
26813
  }
26174
26814
  }
26175
26815
  };
26176
- function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRewards) {
26816
+ function createCompoundV2Entry(i, data, key2, assetsIn, vToken, meta, claimableRewards) {
26177
26817
  if (isFailedCall(data[3 * i]) || isFailedCall(data[3 * i + 1])) {
26178
26818
  return {
26179
26819
  dataForAsset: void 0,
@@ -26200,7 +26840,7 @@ function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRe
26200
26840
  const oPrice = getOraclePrice(meta);
26201
26841
  const priceHist = meta?.price?.priceUsd24h ?? price2;
26202
26842
  const dataForAsset = {
26203
- marketUid: key,
26843
+ marketUid: key2,
26204
26844
  underlying: assetMeta.address,
26205
26845
  deposits: currentATokenBalance,
26206
26846
  debtStable: "0",
@@ -26301,14 +26941,14 @@ function indexesFromApiPositions(positions, owner) {
26301
26941
  return [...set];
26302
26942
  }
26303
26943
  function fetchEulerActiveIndexesViaApi(chainId, owner) {
26304
- const key = `${chainId}:${owner.toLowerCase()}`;
26305
- const cached = accountCache.get(key);
26944
+ const key2 = `${chainId}:${owner.toLowerCase()}`;
26945
+ const cached = accountCache.get(key2);
26306
26946
  if (cached) return cached.promise;
26307
26947
  const promise = fetchEulerPositionsFromApi(chainId, owner).then(
26308
26948
  (positions) => positions === void 0 ? void 0 : indexesFromApiPositions(positions, owner)
26309
26949
  ).catch(() => void 0);
26310
- const timer = setTimeout(() => accountCache.delete(key), ACCOUNT_CACHE_TTL_MS);
26311
- accountCache.set(key, { promise, timer });
26950
+ const timer = setTimeout(() => accountCache.delete(key2), ACCOUNT_CACHE_TTL_MS);
26951
+ accountCache.set(key2, { promise, timer });
26312
26952
  return promise;
26313
26953
  }
26314
26954
  async function fetchEulerSubAccountIndexes(chainId, owner) {
@@ -26323,14 +26963,14 @@ function getResolvedEulerSubAccountIndexes(chainId, account) {
26323
26963
  return resolvedIndexesStore.get(`${chainId}:${account.toLowerCase()}`)?.indexes;
26324
26964
  }
26325
26965
  function storeResolvedIndexes(chainId, account, indexes) {
26326
- const key = `${chainId}:${account.toLowerCase()}`;
26327
- const existing = resolvedIndexesStore.get(key);
26966
+ const key2 = `${chainId}:${account.toLowerCase()}`;
26967
+ const existing = resolvedIndexesStore.get(key2);
26328
26968
  if (existing) clearTimeout(existing.timer);
26329
26969
  const timer = setTimeout(
26330
- () => resolvedIndexesStore.delete(key),
26970
+ () => resolvedIndexesStore.delete(key2),
26331
26971
  RESOLVED_STORE_TTL_MS
26332
26972
  );
26333
- resolvedIndexesStore.set(key, { indexes, timer });
26973
+ resolvedIndexesStore.set(key2, { indexes, timer });
26334
26974
  }
26335
26975
  function getSubAccountAddress(owner, index) {
26336
26976
  const prefix = owner.slice(0, 40);
@@ -26553,12 +27193,12 @@ var SUBGRAPH_CACHE_TTL_MS = 3e4;
26553
27193
  var SUBGRAPH_TIMEOUT_MS2 = 1e4;
26554
27194
  var subgraphCache = /* @__PURE__ */ new Map();
26555
27195
  function fetchDolomiteAccountNumbers(chainId, owner) {
26556
- const key = `${chainId}:${owner.toLowerCase()}`;
26557
- const cached = subgraphCache.get(key);
27196
+ const key2 = `${chainId}:${owner.toLowerCase()}`;
27197
+ const cached = subgraphCache.get(key2);
26558
27198
  if (cached) return cached.promise;
26559
27199
  const promise = fetchAccountNumbersFromSubgraph(chainId, owner).then((ns) => dedupeWithDefault(ns)).catch(() => ["0"]);
26560
- const timer = setTimeout(() => subgraphCache.delete(key), SUBGRAPH_CACHE_TTL_MS);
26561
- subgraphCache.set(key, { promise, timer });
27200
+ const timer = setTimeout(() => subgraphCache.delete(key2), SUBGRAPH_CACHE_TTL_MS);
27201
+ subgraphCache.set(key2, { promise, timer });
26562
27202
  return promise;
26563
27203
  }
26564
27204
  function dedupeWithDefault(numbers) {
@@ -26601,14 +27241,14 @@ function getResolvedDolomiteAccountNumbers(chainId, account) {
26601
27241
  return resolvedStore.get(`${chainId}:${account.toLowerCase()}`)?.numbers;
26602
27242
  }
26603
27243
  function storeResolvedNumbers(chainId, account, numbers) {
26604
- const key = `${chainId}:${account.toLowerCase()}`;
26605
- const existing = resolvedStore.get(key);
27244
+ const key2 = `${chainId}:${account.toLowerCase()}`;
27245
+ const existing = resolvedStore.get(key2);
26606
27246
  if (existing) clearTimeout(existing.timer);
26607
27247
  const timer = setTimeout(
26608
- () => resolvedStore.delete(key),
27248
+ () => resolvedStore.delete(key2),
26609
27249
  RESOLVED_STORE_TTL_MS2
26610
27250
  );
26611
- resolvedStore.set(key, { numbers, timer });
27251
+ resolvedStore.set(key2, { numbers, timer });
26612
27252
  }
26613
27253
  var buildDolomiteUserCall = async (chainId, _lender, account, accountNumbers) => {
26614
27254
  const margin = dolomiteConfigs()?.[chainId]?.dolomiteMargin;
@@ -26899,13 +27539,13 @@ var ONE3 = 10n ** 18n;
26899
27539
  var ROSTER_TTL_MS = 5 * 6e4;
26900
27540
  var DISCOVERY_TTL_MS = 6e4;
26901
27541
  var SNAPSHOT_CHUNK = 12;
26902
- var rosterCache = /* @__PURE__ */ new Map();
27542
+ var rosterCache2 = /* @__PURE__ */ new Map();
26903
27543
  var discoveryCache2 = /* @__PURE__ */ new Map();
26904
27544
  var rosterKey = (chainId, lender) => `${chainId}:${lender}`;
26905
27545
  var discoveryKey = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
26906
27546
  var getCachedResupplyDiscovery = (chainId, lender, account) => discoveryCache2.get(discoveryKey(chainId, lender, account));
26907
- var fetchRoster = async (chainId, lender, registry, allowlist) => {
26908
- const cached = rosterCache.get(rosterKey(chainId, lender));
27547
+ var fetchRoster = async (chainId, lender, registry, allowlist2) => {
27548
+ const cached = rosterCache2.get(rosterKey(chainId, lender));
26909
27549
  if (cached && Date.now() - cached.at < ROSTER_TTL_MS) return cached;
26910
27550
  let addresses = [];
26911
27551
  const [raw] = await multicallRetryUniversal({
@@ -26919,13 +27559,13 @@ var fetchRoster = async (chainId, lender, registry, allowlist) => {
26919
27559
  (a) => typeof a === "string" && a.startsWith("0x")
26920
27560
  );
26921
27561
  }
26922
- if (allowlist && allowlist.length > 0) {
26923
- const allow = new Set(allowlist.map((p) => p.toLowerCase()));
27562
+ if (allowlist2 && allowlist2.length > 0) {
27563
+ const allow = new Set(allowlist2.map((p) => p.toLowerCase()));
26924
27564
  addresses = addresses.filter((p) => allow.has(p.toLowerCase()));
26925
27565
  }
26926
27566
  if (addresses.length === 0) {
26927
27567
  const empty = { pairs: [], at: Date.now() };
26928
- rosterCache.set(rosterKey(chainId, lender), empty);
27568
+ rosterCache2.set(rosterKey(chainId, lender), empty);
26929
27569
  return empty;
26930
27570
  }
26931
27571
  const cols = await multicallRetryUniversal({
@@ -26942,7 +27582,7 @@ var fetchRoster = async (chainId, lender, registry, allowlist) => {
26942
27582
  (p) => typeof p.collateral === "string" && p.collateral.startsWith("0x")
26943
27583
  );
26944
27584
  const roster = { pairs, at: Date.now() };
26945
- rosterCache.set(rosterKey(chainId, lender), roster);
27585
+ rosterCache2.set(rosterKey(chainId, lender), roster);
26946
27586
  return roster;
26947
27587
  };
26948
27588
  var discoverPositions = async (chainId, pairs, account) => {
@@ -26977,8 +27617,8 @@ var discoverPositions = async (chainId, pairs, account) => {
26977
27617
  };
26978
27618
  var buildResupplyUserCall = async (chainId, lender, account) => {
26979
27619
  const cfg = resupplyConfigFor(lender, chainId);
26980
- const key = discoveryKey(chainId, lender, account);
26981
- const stash = (positions2) => discoveryCache2.set(key, { positions: positions2, at: Date.now() });
27620
+ const key2 = discoveryKey(chainId, lender, account);
27621
+ const stash = (positions2) => discoveryCache2.set(key2, { positions: positions2, at: Date.now() });
26982
27622
  if (!cfg?.registry) {
26983
27623
  stash([]);
26984
27624
  return [];
@@ -26993,7 +27633,7 @@ var buildResupplyUserCall = async (chainId, lender, account) => {
26993
27633
  stash([]);
26994
27634
  return [];
26995
27635
  }
26996
- const cachedDiscovery = discoveryCache2.get(key);
27636
+ const cachedDiscovery = discoveryCache2.get(key2);
26997
27637
  const positions = cachedDiscovery && Date.now() - cachedDiscovery.at < DISCOVERY_TTL_MS ? cachedDiscovery.positions : await discoverPositions(chainId, roster.pairs, account);
26998
27638
  stash(positions);
26999
27639
  if (positions.length === 0) return [];
@@ -27005,20 +27645,187 @@ var buildResupplyUserCall = async (chainId, lender, account) => {
27005
27645
  ]);
27006
27646
  };
27007
27647
  function __resetResupplyUserCaches() {
27008
- rosterCache.clear();
27648
+ rosterCache2.clear();
27009
27649
  discoveryCache2.clear();
27010
27650
  }
27651
+ var ROSTER_TTL_MS2 = 5 * 6e4;
27652
+ var DISCOVERY_TTL_MS2 = 6e4;
27653
+ var CURVANCE_MARKET_READS = 2;
27654
+ var CURVANCE_READS_PER_TOKEN = 4;
27655
+ var rosterCache3 = /* @__PURE__ */ new Map();
27656
+ var discoveryCache3 = /* @__PURE__ */ new Map();
27657
+ var rosterKey2 = (chainId, lender) => `${chainId}:${lender}`;
27658
+ var discoveryKey2 = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
27659
+ var getCachedCurvanceDiscovery = (chainId, lender, account) => discoveryCache3.get(discoveryKey2(chainId, lender, account));
27660
+ var fetchRoster2 = async (chainId, lender, centralRegistry, allowlist2) => {
27661
+ const cached = rosterCache3.get(rosterKey2(chainId, lender));
27662
+ if (cached && Date.now() - cached.at < ROSTER_TTL_MS2) return cached;
27663
+ let managers = [];
27664
+ const [raw] = await multicallRetryUniversal({
27665
+ chain: chainId,
27666
+ calls: [{ address: centralRegistry, name: "marketManagers", params: [] }],
27667
+ abi: CurvanceCentralRegistryAbi,
27668
+ allowFailure: true
27669
+ });
27670
+ if (Array.isArray(raw)) {
27671
+ managers = raw.filter(
27672
+ (a) => typeof a === "string" && a.startsWith("0x")
27673
+ );
27674
+ }
27675
+ if (allowlist2 && allowlist2.length > 0) {
27676
+ const allow = new Set(allowlist2.map((m) => m.toLowerCase()));
27677
+ managers = managers.filter((m) => allow.has(m.toLowerCase()));
27678
+ }
27679
+ if (managers.length === 0) {
27680
+ const empty = { markets: [], at: Date.now() };
27681
+ rosterCache3.set(rosterKey2(chainId, lender), empty);
27682
+ return empty;
27683
+ }
27684
+ const listed = await multicallRetryUniversal({
27685
+ chain: chainId,
27686
+ calls: managers.map((mm) => ({
27687
+ address: mm,
27688
+ name: "queryTokensListed",
27689
+ params: []
27690
+ })),
27691
+ abi: managers.map(() => CurvanceMarketManagerAbi),
27692
+ allowFailure: true
27693
+ });
27694
+ const withTokens = managers.map((marketManager, i) => ({
27695
+ marketManager,
27696
+ addresses: Array.isArray(listed[i]) ? listed[i].filter(
27697
+ (t) => typeof t === "string" && t.startsWith("0x")
27698
+ ) : []
27699
+ })).filter((m) => m.addresses.length > 0);
27700
+ const flat = withTokens.flatMap(
27701
+ (m) => m.addresses.map((cToken) => ({ mm: m.marketManager, cToken }))
27702
+ );
27703
+ let assets = [];
27704
+ try {
27705
+ assets = await multicallRetryUniversal({
27706
+ chain: chainId,
27707
+ calls: flat.map((f) => ({
27708
+ address: f.cToken,
27709
+ name: "asset",
27710
+ params: []
27711
+ })),
27712
+ abi: flat.map(() => CurvanceCTokenAbi),
27713
+ allowFailure: true
27714
+ });
27715
+ } catch {
27716
+ assets = [];
27717
+ }
27718
+ const assetByToken = /* @__PURE__ */ new Map();
27719
+ flat.forEach((f, i) => {
27720
+ const a = assets[i];
27721
+ if (typeof a === "string" && a.startsWith("0x")) {
27722
+ assetByToken.set(f.cToken.toLowerCase(), a.toLowerCase());
27723
+ }
27724
+ });
27725
+ const markets = withTokens.map((m) => ({
27726
+ marketManager: m.marketManager,
27727
+ cTokens: m.addresses.map((cToken) => ({
27728
+ cToken,
27729
+ asset: assetByToken.get(cToken.toLowerCase()) ?? ""
27730
+ })).filter((t) => t.asset !== "")
27731
+ })).filter((m) => m.cTokens.length > 0);
27732
+ const roster = { markets, at: Date.now() };
27733
+ rosterCache3.set(rosterKey2(chainId, lender), roster);
27734
+ return roster;
27735
+ };
27736
+ var discoverPositions2 = async (chainId, markets, account) => {
27737
+ const CHUNK = 15;
27738
+ const active = [];
27739
+ for (let i = 0; i < markets.length; i += CHUNK) {
27740
+ const slice2 = markets.slice(i, i + CHUNK);
27741
+ let res = [];
27742
+ try {
27743
+ res = await multicallRetryUniversal({
27744
+ chain: chainId,
27745
+ calls: slice2.map((m) => ({
27746
+ address: m.marketManager,
27747
+ name: "assetsOf",
27748
+ params: [account]
27749
+ })),
27750
+ abi: slice2.map(() => CurvanceMarketManagerAbi),
27751
+ allowFailure: true
27752
+ });
27753
+ } catch {
27754
+ continue;
27755
+ }
27756
+ slice2.forEach((m, j) => {
27757
+ const assets = res[j];
27758
+ if (!Array.isArray(assets) || assets.length === 0) return;
27759
+ const open = new Set(
27760
+ assets.filter((a) => typeof a === "string").map((a) => a.toLowerCase())
27761
+ );
27762
+ const activeTokens = m.cTokens.filter(
27763
+ (t) => open.has(t.cToken.toLowerCase())
27764
+ );
27765
+ if (activeTokens.length === 0) return;
27766
+ active.push({ ...m, activeTokens });
27767
+ });
27768
+ }
27769
+ return active;
27770
+ };
27771
+ var buildCurvanceUserCall = async (chainId, lender, account) => {
27772
+ const cfg = curvanceConfigFor(lender, chainId);
27773
+ const key2 = discoveryKey2(chainId, lender, account);
27774
+ const stash = (positions2) => discoveryCache3.set(key2, { positions: positions2, at: Date.now() });
27775
+ if (!cfg?.centralRegistry) {
27776
+ stash([]);
27777
+ return [];
27778
+ }
27779
+ let roster;
27780
+ try {
27781
+ roster = await fetchRoster2(
27782
+ chainId,
27783
+ lender,
27784
+ cfg.centralRegistry,
27785
+ cfg.marketAllowlist
27786
+ );
27787
+ } catch {
27788
+ return [];
27789
+ }
27790
+ if (roster.markets.length === 0) {
27791
+ stash([]);
27792
+ return [];
27793
+ }
27794
+ const cached = discoveryCache3.get(key2);
27795
+ const positions = cached && Date.now() - cached.at < DISCOVERY_TTL_MS2 ? cached.positions : await discoverPositions2(chainId, roster.markets, account);
27796
+ stash(positions);
27797
+ if (positions.length === 0) return [];
27798
+ return positions.flatMap((p) => [
27799
+ // The hold-period stamp. `cooldownTimestamp + MIN_HOLD_PERIOD` is when
27800
+ // repay / redeem / transfer become possible again — a first-class gate on
27801
+ // every exit flow, not a display detail.
27802
+ { address: p.marketManager, name: "accountAssets", params: [account] },
27803
+ // `(collateral, maxDebt, debt)` in WAD USD, priced by Curvance's own
27804
+ // pessimistic dual oracle — i.e. the numbers the protocol itself
27805
+ // liquidates against.
27806
+ { address: p.marketManager, name: "statusOf", params: [account] },
27807
+ ...p.activeTokens.flatMap(({ cToken }) => [
27808
+ { address: cToken, name: "balanceOf", params: [account] },
27809
+ { address: cToken, name: "collateralPosted", params: [account] },
27810
+ { address: cToken, name: "debtBalanceUpdated", params: [account] },
27811
+ // `assets per 1e18 shares` — the divisor is WAD regardless of the
27812
+ // cToken's own decimals. Read live: it drifts up with accrued interest,
27813
+ // so a cached rate under-reports a collateral balance.
27814
+ { address: cToken, name: "exchangeRate", params: [] }
27815
+ ])
27816
+ ]);
27817
+ };
27011
27818
  var USDD_CALLS_PER_CDP = 1;
27012
27819
  var MAX_CDP_WALK = 64;
27013
27820
  var CACHE_TTL_MS2 = 5 * 6e4;
27014
- var discoveryCache3 = /* @__PURE__ */ new Map();
27821
+ var discoveryCache4 = /* @__PURE__ */ new Map();
27015
27822
  var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
27016
27823
  var getCachedUsddCdps = (chainId, account) => {
27017
- const hit = discoveryCache3.get(cacheKey2(chainId, account));
27824
+ const hit = discoveryCache4.get(cacheKey2(chainId, account));
27018
27825
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
27019
27826
  return hit;
27020
27827
  };
27021
- var big2 = (v) => {
27828
+ var big3 = (v) => {
27022
27829
  try {
27023
27830
  if (typeof v === "bigint") return v;
27024
27831
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -27030,13 +27837,13 @@ var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
27030
27837
  var buildUsddUserCall = async (chainId, lender, account) => {
27031
27838
  const cfg = usddConfigFor(lender, chainId);
27032
27839
  const markets = usddChainData(lender, chainId)?.markets ?? [];
27033
- const stash = (d) => discoveryCache3.set(cacheKey2(chainId, account), d);
27840
+ const stash = (d) => discoveryCache4.set(cacheKey2(chainId, account), d);
27034
27841
  if (!cfg || markets.length === 0) {
27035
27842
  stash({ cdps: [], ilks: [], at: Date.now() });
27036
27843
  return [];
27037
27844
  }
27038
27845
  const curated = new Set(markets.map((m) => m.ilk));
27039
- const zero = "0x0000000000000000000000000000000000000000";
27846
+ const zero2 = "0x0000000000000000000000000000000000000000";
27040
27847
  const owners = [];
27041
27848
  try {
27042
27849
  const [rawCount, rawFirst, rawProxy] = await multicallRetryUniversal({
@@ -27049,9 +27856,9 @@ var buildUsddUserCall = async (chainId, lender, account) => {
27049
27856
  ],
27050
27857
  allowFailure: false
27051
27858
  });
27052
- owners.push({ owner: account, count: big2(rawCount), cursor: big2(rawFirst) });
27053
- const proxy = String(rawProxy ?? zero);
27054
- if (proxy.toLowerCase() !== zero) {
27859
+ owners.push({ owner: account, count: big3(rawCount), cursor: big3(rawFirst) });
27860
+ const proxy = String(rawProxy ?? zero2);
27861
+ if (proxy.toLowerCase() !== zero2) {
27055
27862
  const [pCount, pFirst] = await multicallRetryUniversal({
27056
27863
  chain: chainId,
27057
27864
  abi: UsddCdpManagerAbi,
@@ -27061,7 +27868,7 @@ var buildUsddUserCall = async (chainId, lender, account) => {
27061
27868
  ],
27062
27869
  allowFailure: false
27063
27870
  });
27064
- owners.push({ owner: proxy, count: big2(pCount), cursor: big2(pFirst) });
27871
+ owners.push({ owner: proxy, count: big3(pCount), cursor: big3(pFirst) });
27065
27872
  }
27066
27873
  } catch {
27067
27874
  return [];
@@ -27102,7 +27909,7 @@ var buildUsddUserCall = async (chainId, lender, account) => {
27102
27909
  if (curated.has(ilk)) {
27103
27910
  cdps.push({ cdpId: cursor.toString(), urn: String(urn), ilk });
27104
27911
  }
27105
- cursor = big2(field6(link, "next", 1));
27912
+ cursor = big3(field6(link, "next", 1));
27106
27913
  }
27107
27914
  }
27108
27915
  } catch {
@@ -27127,7 +27934,7 @@ var buildUsddUserCall = async (chainId, lender, account) => {
27127
27934
  };
27128
27935
  var FRANKENCOIN_CALLS_PER_POSITION = 6;
27129
27936
  var BOOK_TTL_MS = 5 * 6e4;
27130
- var DISCOVERY_TTL_MS2 = 5 * 6e4;
27937
+ var DISCOVERY_TTL_MS3 = 5 * 6e4;
27131
27938
  var API_BASE = "https://api.frankencoin.com";
27132
27939
  var bookCache;
27133
27940
  var fetchBook = async () => {
@@ -27151,17 +27958,17 @@ var fetchBook = async () => {
27151
27958
  bookCache = { at: Date.now(), entries };
27152
27959
  return entries;
27153
27960
  };
27154
- var discoveryCache4 = /* @__PURE__ */ new Map();
27961
+ var discoveryCache5 = /* @__PURE__ */ new Map();
27155
27962
  var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
27156
27963
  var getCachedFrankencoinPositions = (chainId, account) => {
27157
- const hit = discoveryCache4.get(cacheKey3(chainId, account));
27158
- if (!hit || Date.now() - hit.at > DISCOVERY_TTL_MS2) return void 0;
27964
+ const hit = discoveryCache5.get(cacheKey3(chainId, account));
27965
+ if (!hit || Date.now() - hit.at > DISCOVERY_TTL_MS3) return void 0;
27159
27966
  return hit;
27160
27967
  };
27161
27968
  var buildFrankencoinUserCall = async (chainId, lender, account) => {
27162
27969
  const cfg = frankencoinConfigFor(lender, chainId);
27163
27970
  const markets = frankencoinChainData(lender, chainId)?.markets ?? [];
27164
- const stash = (d) => discoveryCache4.set(cacheKey3(chainId, account), d);
27971
+ const stash = (d) => discoveryCache5.set(cacheKey3(chainId, account), d);
27165
27972
  if (!cfg || markets.length === 0) {
27166
27973
  stash({ positions: [], at: Date.now() });
27167
27974
  return [];
@@ -27198,10 +28005,10 @@ var buildFrankencoinUserCall = async (chainId, lender, account) => {
27198
28005
  };
27199
28006
  var TELLER_CALLS_PER_BID = 4;
27200
28007
  var CACHE_TTL_MS3 = 5 * 6e4;
27201
- var discoveryCache5 = /* @__PURE__ */ new Map();
28008
+ var discoveryCache6 = /* @__PURE__ */ new Map();
27202
28009
  var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
27203
28010
  var getCachedTellerBids = (chainId, account) => {
27204
- const hit = discoveryCache5.get(cacheKey4(chainId, account));
28011
+ const hit = discoveryCache6.get(cacheKey4(chainId, account));
27205
28012
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
27206
28013
  return hit;
27207
28014
  };
@@ -27242,7 +28049,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
27242
28049
  return [];
27243
28050
  }
27244
28051
  if (ids.length === 0) {
27245
- discoveryCache5.set(cacheKey4(chainId, account), { bids: [], at: Date.now() });
28052
+ discoveryCache6.set(cacheKey4(chainId, account), { bids: [], at: Date.now() });
27246
28053
  return [];
27247
28054
  }
27248
28055
  const poolByAddr = /* @__PURE__ */ new Map();
@@ -27269,7 +28076,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
27269
28076
  const pool = poolByAddr.get(lenderAddr);
27270
28077
  if (pool) kept.push({ bidId: id, pool });
27271
28078
  });
27272
- discoveryCache5.set(cacheKey4(chainId, account), { bids: kept, at: Date.now() });
28079
+ discoveryCache6.set(cacheKey4(chainId, account), { bids: kept, at: Date.now() });
27273
28080
  if (kept.length === 0) return [];
27274
28081
  const ts = nowSec5();
27275
28082
  const calls = [];
@@ -27295,10 +28102,10 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
27295
28102
  };
27296
28103
  var TERMMAX_CALLS_PER_ACCOUNT = 1;
27297
28104
  var CACHE_TTL_MS4 = 5 * 6e4;
27298
- var discoveryCache6 = /* @__PURE__ */ new Map();
28105
+ var discoveryCache7 = /* @__PURE__ */ new Map();
27299
28106
  var cacheKey5 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
27300
28107
  var getCachedTermMaxDiscovery = (chainId, account) => {
27301
- const hit = discoveryCache6.get(cacheKey5(chainId, account));
28108
+ const hit = discoveryCache7.get(cacheKey5(chainId, account));
27302
28109
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS4) return void 0;
27303
28110
  return hit;
27304
28111
  };
@@ -27314,11 +28121,11 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
27314
28121
  }
27315
28122
  }
27316
28123
  if (markets.length === 0) {
27317
- discoveryCache6.set(cacheKey5(chainId, account), { markets: [], at: Date.now() });
28124
+ discoveryCache7.set(cacheKey5(chainId, account), { markets: [], at: Date.now() });
27318
28125
  return [];
27319
28126
  }
27320
28127
  markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
27321
- discoveryCache6.set(cacheKey5(chainId, account), { markets, at: Date.now() });
28128
+ discoveryCache7.set(cacheKey5(chainId, account), { markets, at: Date.now() });
27322
28129
  return [
27323
28130
  {
27324
28131
  address: proto.viewer,
@@ -27354,6 +28161,7 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
27354
28161
  if (isLlamaLend(lender))
27355
28162
  return buildLlamaLendUserCall(chainId, lender, account);
27356
28163
  if (isResupply(lender)) return buildResupplyUserCall(chainId, lender, account);
28164
+ if (isCurvance(lender)) return buildCurvanceUserCall(chainId, lender, account);
27357
28165
  if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
27358
28166
  if (isFrankencoin(lender))
27359
28167
  return buildFrankencoinUserCall(chainId, lender, account);
@@ -27532,13 +28340,13 @@ var getAaveV2UserDataConverter = (lender, chainId, account, metaMap) => {
27532
28340
  let totalDeposits24h = 0;
27533
28341
  for (let i = 0; i < assetsToQuery.length; i++) {
27534
28342
  const asset = assetsToQuery[i];
27535
- const key = createMarketUid(chainId, lender, asset);
27536
- const metaEntity = metaMap?.[key];
27537
- const { dataForAsset, addedDebt, addedDeposits } = createAaveV2Entry(i, data, key, metaEntity, 0);
28343
+ const key2 = createMarketUid(chainId, lender, asset);
28344
+ const metaEntity = metaMap?.[key2];
28345
+ const { dataForAsset, addedDebt, addedDeposits } = createAaveV2Entry(i, data, key2, metaEntity, 0);
27538
28346
  if (!dataForAsset) continue;
27539
28347
  totalDebt24h += addedDebt;
27540
28348
  totalDeposits24h += addedDeposits;
27541
- lendingPositions[key] = dataForAsset;
28349
+ lendingPositions[key2] = dataForAsset;
27542
28350
  }
27543
28351
  const payload = {
27544
28352
  chainId,
@@ -27559,7 +28367,7 @@ var getAaveV2UserDataConverter = (lender, chainId, account, metaMap) => {
27559
28367
  }
27560
28368
  }
27561
28369
  };
27562
- function createAaveV2Entry(i, data, key, meta, claimableRewards) {
28370
+ function createAaveV2Entry(i, data, key2, meta, claimableRewards) {
27563
28371
  const reserveData = data[i];
27564
28372
  if (isFailedCall(reserveData)) {
27565
28373
  return { dataForAsset: void 0, addedDeposits: 0, addedDebt: 0 };
@@ -27583,7 +28391,7 @@ function createAaveV2Entry(i, data, key, meta, claimableRewards) {
27583
28391
  const oPrice = getOraclePrice(meta);
27584
28392
  const priceHist = meta?.price?.priceUsd24h ?? price2;
27585
28393
  const dataForAsset = {
27586
- marketUid: key,
28394
+ marketUid: key2,
27587
28395
  underlying: assetMeta.address,
27588
28396
  deposits: currentATokenBalance,
27589
28397
  debtStable: currentStableDebt,
@@ -27628,18 +28436,18 @@ var getAaveV3UserDataConverter = (lender, chainId, account, metaMap) => {
27628
28436
  let totalDeposits24h = 0;
27629
28437
  for (let i = 0; i < assetsToQuery.length; i++) {
27630
28438
  const asset = assetsToQuery[i];
27631
- const key = createMarketUid(chainId, lender, asset);
27632
- const metaEntity = metaMap?.[key];
28439
+ const key2 = createMarketUid(chainId, lender, asset);
28440
+ const metaEntity = metaMap?.[key2];
27633
28441
  const { dataForAsset, addedDebt, addedDeposits } = createAaveV3Entry(
27634
28442
  i,
27635
28443
  data,
27636
- key,
28444
+ key2,
27637
28445
  metaEntity
27638
28446
  );
27639
28447
  if (!dataForAsset) continue;
27640
28448
  totalDebt24h += addedDebt;
27641
28449
  totalDeposits24h += addedDeposits;
27642
- lendingPositions[key] = dataForAsset;
28450
+ lendingPositions[key2] = dataForAsset;
27643
28451
  }
27644
28452
  const payload = {
27645
28453
  chainId,
@@ -27659,7 +28467,7 @@ var getAaveV3UserDataConverter = (lender, chainId, account, metaMap) => {
27659
28467
  expectedNumberOfCalls
27660
28468
  ];
27661
28469
  };
27662
- function createAaveV3Entry(i, data, key, meta) {
28470
+ function createAaveV3Entry(i, data, key2, meta) {
27663
28471
  const reserveData = data[i];
27664
28472
  if (isFailedCall(reserveData)) {
27665
28473
  return { dataForAsset: void 0, addedDeposits: 0, addedDebt: 0 };
@@ -27683,7 +28491,7 @@ function createAaveV3Entry(i, data, key, meta) {
27683
28491
  const oPrice = getOraclePrice(meta);
27684
28492
  const priceHist = meta?.price?.priceUsd24h ?? price2;
27685
28493
  const dataForAsset = {
27686
- marketUid: key,
28494
+ marketUid: key2,
27687
28495
  underlying: assetMeta.address,
27688
28496
  deposits: currentATokenBalance,
27689
28497
  debtStable: currentStableDebt,
@@ -27727,8 +28535,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
27727
28535
  (c) => {
27728
28536
  const pool = c.pool.toLowerCase();
27729
28537
  allPools[pool] = c.underlying.toLowerCase();
27730
- const key = createMarketUid(chainId, lender, pool);
27731
- const metaEntity = metaMap?.[key];
28538
+ const key2 = createMarketUid(chainId, lender, pool);
28539
+ const metaEntity = metaMap?.[key2];
27732
28540
  const decimals = metaEntity.asset?.decimals ?? 18;
27733
28541
  const depositsRaw = c.amount.toString();
27734
28542
  return {
@@ -27744,8 +28552,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
27744
28552
  ...data[2 /* debts */][index].map((c) => {
27745
28553
  const pool = c.pool.toLowerCase();
27746
28554
  allPools[pool] = c.underlying.toLowerCase();
27747
- const key = createMarketUid(chainId, lender, pool);
27748
- const metaEntity = metaMap?.[key];
28555
+ const key2 = createMarketUid(chainId, lender, pool);
28556
+ const metaEntity = metaMap?.[key2];
27749
28557
  const decimals = metaEntity.asset?.decimals ?? 18;
27750
28558
  return {
27751
28559
  [pool]: {
@@ -27759,8 +28567,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
27759
28567
  {},
27760
28568
  ...Object.entries(allPools).map(
27761
28569
  ([pool, underlying]) => {
27762
- const key = createMarketUid(chainId, lender, pool);
27763
- const metaEntity = metaMap?.[key];
28570
+ const key2 = createMarketUid(chainId, lender, pool);
28571
+ const metaEntity = metaMap?.[key2];
27764
28572
  const price2 = getDisplayPrice(metaEntity);
27765
28573
  const oPrice = getOraclePrice(metaEntity);
27766
28574
  const priceHist = metaEntity?.price?.priceUsd24h ?? price2;
@@ -27774,8 +28582,8 @@ function parseSingleBrokerData(data, validOwner, brokerAddress, lender, chainId,
27774
28582
  histData[id].totalDebt24h += Number(debt) * priceHist;
27775
28583
  histData[id].totalDeposits24h += Number(deposits) * priceHist;
27776
28584
  return {
27777
- [key]: {
27778
- marketUid: key,
28585
+ [key2]: {
28586
+ marketUid: key2,
27779
28587
  underlying,
27780
28588
  deposits,
27781
28589
  debt,
@@ -27862,8 +28670,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
27862
28670
  let result = {};
27863
28671
  for (let i = 0; i < assetsNoBase.length; i++) {
27864
28672
  const asset = assetsNoBase[i];
27865
- const key2 = createMarketUid(chainId, lender, asset);
27866
- const metaEntity2 = metaMap?.[key2];
28673
+ const key3 = createMarketUid(chainId, lender, asset);
28674
+ const metaEntity2 = metaMap?.[key3];
27867
28675
  const assetMeta = metaEntity2.asset;
27868
28676
  const decimals = assetMeta?.decimals ?? 18;
27869
28677
  if (isFailedCall(data[i])) continue;
@@ -27874,8 +28682,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
27874
28682
  const oPrice2 = getOraclePrice(metaEntity2);
27875
28683
  const priceHist2 = metaEntity2?.price?.priceUsd24h ?? price3;
27876
28684
  totalDeposits24h += Number(deposits2) * priceHist2;
27877
- result[key2] = {
27878
- marketUid: key2,
28685
+ result[key3] = {
28686
+ marketUid: key3,
27879
28687
  underlying: asset,
27880
28688
  deposits: deposits2,
27881
28689
  depositsUSD: Number(deposits2) * price3,
@@ -27892,8 +28700,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
27892
28700
  const baseFailed = isFailedCall(data[assetsNoBase.length]) || isFailedCall(data[assetsNoBase.length + 1]);
27893
28701
  const depositsRaw = data[assetsNoBase.length]?.toString();
27894
28702
  const debtRaw = data[assetsNoBase.length + 1]?.toString();
27895
- const key = createMarketUid(chainId, lender, baseAsset);
27896
- const metaEntity = metaMap?.[key];
28703
+ const key2 = createMarketUid(chainId, lender, baseAsset);
28704
+ const metaEntity = metaMap?.[key2];
27897
28705
  const baseMeta = metaEntity.asset;
27898
28706
  const baseDecimals = baseMeta.decimals ?? 18;
27899
28707
  const deposits = baseFailed ? "0" : parseRawAmount(depositsRaw, baseDecimals);
@@ -27904,8 +28712,8 @@ var getCompoundV3UserDataConverter = (lender, chainId, account, metaMap) => {
27904
28712
  totalDebt24h += Number(debt) * priceHist;
27905
28713
  totalDeposits24h += Number(deposits) * priceHist;
27906
28714
  const resultBase = baseFailed || depositsRaw === "0" && debtRaw === "0" ? {} : {
27907
- [key]: {
27908
- marketUid: key,
28715
+ [key2]: {
28716
+ marketUid: key2,
27909
28717
  underlying: baseAsset,
27910
28718
  deposits,
27911
28719
  debt,
@@ -27964,18 +28772,18 @@ var getYldrUserDataConverter = (lender, chainId, account, metaMap) => {
27964
28772
  let totalDeposits24h = 0;
27965
28773
  for (let i = 0; i < assetsToQuery.length; i++) {
27966
28774
  const asset = assetsToQuery[i];
27967
- const key = createMarketUid(chainId, lender, asset);
27968
- const metaEntity = metaMap?.[key];
28775
+ const key2 = createMarketUid(chainId, lender, asset);
28776
+ const metaEntity = metaMap?.[key2];
27969
28777
  const { dataForAsset, addedDebt, addedDeposits } = createAaveV3Entry2(
27970
28778
  i,
27971
28779
  data,
27972
- key,
28780
+ key2,
27973
28781
  metaEntity
27974
28782
  );
27975
28783
  if (!dataForAsset) continue;
27976
28784
  totalDebt24h += addedDebt;
27977
28785
  totalDeposits24h += addedDeposits;
27978
- lendingPositions[key] = dataForAsset;
28786
+ lendingPositions[key2] = dataForAsset;
27979
28787
  }
27980
28788
  const payload = {
27981
28789
  chainId,
@@ -27995,7 +28803,7 @@ var getYldrUserDataConverter = (lender, chainId, account, metaMap) => {
27995
28803
  expectedNumberOfCalls
27996
28804
  ];
27997
28805
  };
27998
- function createAaveV3Entry2(i, data, key, meta) {
28806
+ function createAaveV3Entry2(i, data, key2, meta) {
27999
28807
  const reserveData = data[i];
28000
28808
  if (isFailedCall(reserveData)) {
28001
28809
  return { dataForAsset: void 0, addedDeposits: 0, addedDebt: 0 };
@@ -28017,7 +28825,7 @@ function createAaveV3Entry2(i, data, key, meta) {
28017
28825
  const oPrice = getOraclePrice(meta);
28018
28826
  const priceHist = meta?.price?.priceUsd24h ?? price2;
28019
28827
  const dataForAsset = {
28020
- marketUid: key,
28828
+ marketUid: key2,
28021
28829
  underlying: assetMeta.address,
28022
28830
  deposits: currentATokenBalance,
28023
28831
  debtStable: "0",
@@ -28394,8 +29202,8 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
28394
29202
  const termPositions = {};
28395
29203
  let aggregateDebtToken = borrowDec;
28396
29204
  if (brokerData) {
28397
- const mkTermPosition = (key, debtToken, term) => {
28398
- termPositions[key] = {
29205
+ const mkTermPosition = (key2, debtToken, term) => {
29206
+ termPositions[key2] = {
28399
29207
  marketUid: loanMarketUid,
28400
29208
  underlying: loanAddress,
28401
29209
  loanId: term.loanId,
@@ -28824,15 +29632,15 @@ function createAaveV4UserState(payload, lenderData, totalDeposits24h = 0, totalD
28824
29632
  debt += debtUSD + (debtStableUSD ?? 0);
28825
29633
  oracleDebt += debtUSDOracle + (pos.debtStableUSDOracle ?? debtStableUSD ?? 0);
28826
29634
  (rewards ?? []).forEach((rewardData) => {
28827
- const key = rewardData.asset;
29635
+ const key2 = rewardData.asset;
28828
29636
  rewardDepositAccrual += rewardData.depositRate * depositsUSD;
28829
29637
  rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD;
28830
29638
  const rewDepo = rewardData.depositRate * depositsUSD;
28831
29639
  const rewDebt = rewardData.variableBorrowRate * debtUSD;
28832
- if (!rewardsPerAsset[key])
28833
- rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
28834
- if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
28835
- if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
29640
+ if (!rewardsPerAsset[key2])
29641
+ rewardsPerAsset[key2] = { depositApr: 0, borrowApr: 0 };
29642
+ if (rewDepo > 0) rewardsPerAsset[key2].depositApr += rewDepo;
29643
+ if (rewDebt > 0) rewardsPerAsset[key2].borrowApr += rewDebt;
28836
29644
  });
28837
29645
  stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
28838
29646
  stakingBorrowAccrual += (intrinsicYield ?? 0) * debtUSD;
@@ -28990,8 +29798,8 @@ var getAaveV4UserDataConverter = (lender, chainId, account, meta) => {
28990
29798
  const r = reserves[i];
28991
29799
  const underlying = (r.underlying ?? "").toLowerCase();
28992
29800
  if (!underlying) continue;
28993
- const key = createMarketUid(chainId, lender, String(r.reserveId));
28994
- const metaEntity = flatMeta[key];
29801
+ const key2 = createMarketUid(chainId, lender, String(r.reserveId));
29802
+ const metaEntity = flatMeta[key2];
28995
29803
  if (!metaEntity) continue;
28996
29804
  const base = i * USER_CALLS_PER_RESERVE;
28997
29805
  const userPositionResult = data[base + 3];
@@ -29001,7 +29809,7 @@ var getAaveV4UserDataConverter = (lender, chainId, account, meta) => {
29001
29809
  const { dataForAsset, addedDebt, addedDeposits } = createAaveV4Entry(
29002
29810
  base,
29003
29811
  data,
29004
- key,
29812
+ key2,
29005
29813
  metaEntity,
29006
29814
  spokeAddrLc
29007
29815
  );
@@ -29009,7 +29817,7 @@ var getAaveV4UserDataConverter = (lender, chainId, account, meta) => {
29009
29817
  dataForAsset.userConfigKey = String(userDynConfigKey);
29010
29818
  totalDebt24h += addedDebt;
29011
29819
  totalDeposits24h += addedDeposits;
29012
- lendingPositions[key] = dataForAsset;
29820
+ lendingPositions[key2] = dataForAsset;
29013
29821
  }
29014
29822
  const payload = {
29015
29823
  chainId,
@@ -29034,7 +29842,7 @@ function getConfigOraclePrice(meta, spokeAddr) {
29034
29842
  }
29035
29843
  return getOraclePrice(meta);
29036
29844
  }
29037
- function createAaveV4Entry(base, data, key, meta, spokeAddr) {
29845
+ function createAaveV4Entry(base, data, key2, meta, spokeAddr) {
29038
29846
  const rawSupply = data[base];
29039
29847
  const debtResult = data[base + 1];
29040
29848
  const statusResult = data[base + 2];
@@ -29058,7 +29866,7 @@ function createAaveV4Entry(base, data, key, meta, spokeAddr) {
29058
29866
  const oPrice = getConfigOraclePrice(meta, spokeAddr);
29059
29867
  const priceHist = meta?.price?.priceUsd24h ?? price2;
29060
29868
  const dataForAsset = {
29061
- marketUid: key,
29869
+ marketUid: key2,
29062
29870
  underlying: assetMeta.address,
29063
29871
  deposits: currentDeposits,
29064
29872
  debtStable: "0",
@@ -29657,8 +30465,8 @@ var getDolomiteUserDataConverter = (lender, chainId, account, metaMap) => {
29657
30465
  const wei = weis[k];
29658
30466
  if (!wei) return;
29659
30467
  const underlying = normalizeUnderlying3(token);
29660
- const key = createMarketUid(chainId, lender, String(marketIds[k]));
29661
- const meta = metaMap?.[key];
30468
+ const key2 = createMarketUid(chainId, lender, String(marketIds[k]));
30469
+ const meta = metaMap?.[key2];
29662
30470
  if (!meta) return;
29663
30471
  const decimals = meta.asset?.decimals ?? 18;
29664
30472
  const amount = parseRawAmount(wei.value, decimals);
@@ -29671,8 +30479,8 @@ var getDolomiteUserDataConverter = (lender, chainId, account, metaMap) => {
29671
30479
  const priceHist = meta?.price?.priceUsd24h ?? price2;
29672
30480
  histData[id].totalDeposits24h += Number(deposits) * priceHist;
29673
30481
  histData[id].totalDebt24h += Number(debt) * priceHist;
29674
- lendingPositions[id][key] = {
29675
- marketUid: key,
30482
+ lendingPositions[id][key2] = {
30483
+ marketUid: key2,
29676
30484
  underlying,
29677
30485
  deposits,
29678
30486
  debt,
@@ -29850,7 +30658,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
29850
30658
  totalCalls
29851
30659
  ];
29852
30660
  };
29853
- var WAD9 = 1000000000000000000n;
30661
+ var WAD10 = 1000000000000000000n;
29854
30662
  function toBigInt11(v) {
29855
30663
  if (v === void 0 || v === null || v === "0x") return 0n;
29856
30664
  if (typeof v === "bigint") return v;
@@ -29892,8 +30700,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
29892
30700
  const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
29893
30701
  const debtNum = Number(debtStr);
29894
30702
  const repoBalance = toBigInt11(balanceResult);
29895
- const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD9;
29896
- const lentUnits = repoBalance * redemptionValue / WAD9;
30703
+ const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD10;
30704
+ const lentUnits = repoBalance * redemptionValue / WAD10;
29897
30705
  const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
29898
30706
  const depositsNum = Number(depositsStr);
29899
30707
  const posData = {};
@@ -29971,7 +30779,7 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
29971
30779
  };
29972
30780
  var nowSec6 = () => Math.floor(Date.now() / 1e3);
29973
30781
  var DAY_SECONDS = 86400n;
29974
- var WAD10 = 10n ** 18n;
30782
+ var WAD11 = 10n ** 18n;
29975
30783
  function sumPreview(positions) {
29976
30784
  return positions.reduce((acc, p) => acc + p.previewValue, 0n);
29977
30785
  }
@@ -29995,7 +30803,7 @@ function toDetail(positions, kind, now, penaltyRate, penaltyApr) {
29995
30803
  ...kind === "borrow" ? {
29996
30804
  ...overdue ? { latePenalty: excess.toString() } : { earlyRepayDiscount: gap.toString() },
29997
30805
  // face × penaltyRate × 1 day — what another day of being late adds.
29998
- latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD10).toString(),
30806
+ latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD11).toString(),
29999
30807
  latePenaltyApr: penaltyApr
30000
30808
  } : {
30001
30809
  ...overdue ? {} : { earlyExitCost: gap.toString() },
@@ -30124,7 +30932,7 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
30124
30932
  latePenalty: penalty,
30125
30933
  /** further penalty per day overdue — linear on face */
30126
30934
  latePenaltyPerDay: parseRawAmount(
30127
- (face * m.penaltyRate * DAY_SECONDS / WAD10).toString(),
30935
+ (face * m.penaltyRate * DAY_SECONDS / WAD11).toString(),
30128
30936
  decimals
30129
30937
  ),
30130
30938
  latePenaltyApr: penaltyApr,
@@ -30155,7 +30963,7 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
30155
30963
  expected
30156
30964
  ];
30157
30965
  };
30158
- var big3 = (v) => {
30966
+ var big4 = (v) => {
30159
30967
  try {
30160
30968
  if (typeof v === "bigint") return v;
30161
30969
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -30163,7 +30971,7 @@ var big3 = (v) => {
30163
30971
  }
30164
30972
  return 0n;
30165
30973
  };
30166
- var field7 = (res, name, idx) => big3(res?.[name] ?? res?.[idx]);
30974
+ var field7 = (res, name, idx) => big4(res?.[name] ?? res?.[idx]);
30167
30975
  var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
30168
30976
  const cfg = liquityConfigFor(lender, chainId);
30169
30977
  const branches = liquityBranchesByChain(lender, chainId);
@@ -30284,11 +31092,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
30284
31092
  };
30285
31093
  });
30286
31094
  const spBase = troves.length * 2;
30287
- const spDeposit = big3(slice2[spBase]);
30288
- const spYield = big3(slice2[spBase + 1]);
30289
- const spCollGain = big3(slice2[spBase + 2]);
30290
- const spStashed = big3(slice2[spBase + 3]);
30291
- const collSurplus = branch.collSurplusPool ? big3(slice2[spBase + 4]) : 0n;
31095
+ const spDeposit = big4(slice2[spBase]);
31096
+ const spYield = big4(slice2[spBase + 1]);
31097
+ const spCollGain = big4(slice2[spBase + 2]);
31098
+ const spStashed = big4(slice2[spBase + 3]);
31099
+ const collSurplus = branch.collSurplusPool ? big4(slice2[spBase + 4]) : 0n;
30292
31100
  const spStable = spDeposit + spYield;
30293
31101
  const spColl = spCollGain + spStashed + collSurplus;
30294
31102
  if (spStable > 0n || spColl > 0n) {
@@ -30367,7 +31175,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
30367
31175
  expected
30368
31176
  ];
30369
31177
  };
30370
- var big4 = (v) => {
31178
+ var big5 = (v) => {
30371
31179
  try {
30372
31180
  if (typeof v === "bigint") return v;
30373
31181
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -30375,7 +31183,7 @@ var big4 = (v) => {
30375
31183
  }
30376
31184
  return 0n;
30377
31185
  };
30378
- var field8 = (res, name, idx) => big4(res?.[name] ?? res?.[idx]);
31186
+ var field8 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
30379
31187
  var getRiverUserDataConverter = (lender, chainId, account, meta) => {
30380
31188
  const cfg = riverConfigFor(lender, chainId);
30381
31189
  const markets = riverChainData(lender, chainId)?.markets ?? [];
@@ -30387,13 +31195,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
30387
31195
  const debtAddr = cfg.debtToken.toLowerCase();
30388
31196
  const debtDecimals = cfg.debtDecimals ?? 18;
30389
31197
  const out = {};
30390
- const spDeposit = big4(data[markets.length * RIVER_CALLS_PER_MARKET]);
31198
+ const spDeposit = big5(data[markets.length * RIVER_CALLS_PER_MARKET]);
30391
31199
  markets.forEach((market, i) => {
30392
31200
  const base = i * RIVER_CALLS_PER_MARKET;
30393
31201
  const entire = data[base];
30394
31202
  if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
30395
- const status = Number(big4(data[base + 1]));
30396
- const surplus = big4(data[base + 2]);
31203
+ const status = Number(big5(data[base + 1]));
31204
+ const surplus = big5(data[base + 2]);
30397
31205
  const lenderKey = riverLenderKey(lender, chainId, market.index);
30398
31206
  const metaMap = meta?.[lenderKey];
30399
31207
  if (!metaMap) return;
@@ -30501,7 +31309,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
30501
31309
  expected
30502
31310
  ];
30503
31311
  };
30504
- var big5 = (v) => {
31312
+ var big6 = (v) => {
30505
31313
  try {
30506
31314
  if (typeof v === "bigint") return v;
30507
31315
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -30520,24 +31328,24 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
30520
31328
  const dolaAddr = cfg.dola.toLowerCase();
30521
31329
  const debtDecimals = cfg.debtDecimals ?? 18;
30522
31330
  const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
30523
- const dbrBalance = big5(data[tailBase]);
30524
- const dbrDeficit = big5(data[tailBase + 1]);
31331
+ const dbrBalance = big6(data[tailBase]);
31332
+ const dbrDeficit = big6(data[tailBase + 1]);
30525
31333
  const dbrSignedRaw = data[tailBase + 2];
30526
- const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big5(dbrSignedRaw);
31334
+ const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big6(dbrSignedRaw);
30527
31335
  const dbrTotalDebtRaw = data[tailBase + 3];
30528
- const dbrTotalDebt = isFailedCall(dbrTotalDebtRaw) ? 0n : big5(dbrTotalDebtRaw);
31336
+ const dbrTotalDebt = isFailedCall(dbrTotalDebtRaw) ? 0n : big6(dbrTotalDebtRaw);
30529
31337
  const dbrRunway = dbrTotalDebt > 0n ? dbrBalance * 31536000n / dbrTotalDebt : 0n;
30530
31338
  const nowSec9 = BigInt(Math.floor(Date.now() / 1e3));
30531
31339
  const out = {};
30532
31340
  markets.forEach((market, i) => {
30533
31341
  const base = i * INVERSE_CALLS_PER_MARKET;
30534
- const escrowBal = isFailedCall(data[base]) ? 0n : big5(data[base]);
31342
+ const escrowBal = isFailedCall(data[base]) ? 0n : big6(data[base]);
30535
31343
  const debtRaw = data[base + 1];
30536
31344
  if (isFailedCall(debtRaw)) return;
30537
- const debt = big5(debtRaw);
31345
+ const debt = big6(debtRaw);
30538
31346
  if (escrowBal === 0n && debt === 0n) return;
30539
- const creditLimit = isFailedCall(data[base + 2]) ? 0n : big5(data[base + 2]);
30540
- const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big5(data[base + 3]);
31347
+ const creditLimit = isFailedCall(data[base + 2]) ? 0n : big6(data[base + 2]);
31348
+ const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big6(data[base + 3]);
30541
31349
  const lenderKey = inverseLenderKey(lender, market.address);
30542
31350
  const metaMap = meta?.[lenderKey];
30543
31351
  if (!metaMap) return;
@@ -30623,7 +31431,7 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
30623
31431
  expected
30624
31432
  ];
30625
31433
  };
30626
- var big6 = (v) => {
31434
+ var big7 = (v) => {
30627
31435
  try {
30628
31436
  if (typeof v === "bigint") return v;
30629
31437
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -30633,7 +31441,7 @@ var big6 = (v) => {
30633
31441
  };
30634
31442
  var arrAt = (v, i) => {
30635
31443
  if (isFailedCall(v) || !Array.isArray(v)) return 0n;
30636
- return big6(v[i]);
31444
+ return big7(v[i]);
30637
31445
  };
30638
31446
  var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
30639
31447
  const cfg = llamaLendConfigFor(lender, chainId);
@@ -30648,18 +31456,18 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
30648
31456
  const base = i * LLAMALEND_CALLS_PER_MARKET;
30649
31457
  const stateRaw = data[base];
30650
31458
  if (isFailedCall(stateRaw) || !Array.isArray(stateRaw)) return;
30651
- const collateral = big6(stateRaw[0]);
30652
- const bandBorrowed = big6(stateRaw[1]);
30653
- const debt = big6(stateRaw[2]);
30654
- const bandCount = Number(big6(stateRaw[3]));
31459
+ const collateral = big7(stateRaw[0]);
31460
+ const bandBorrowed = big7(stateRaw[1]);
31461
+ const debt = big7(stateRaw[2]);
31462
+ const bandCount = Number(big7(stateRaw[3]));
30655
31463
  if (collateral === 0n && debt === 0n && bandBorrowed === 0n) return;
30656
31464
  const healthRaw = data[base + 1];
30657
- const health = isFailedCall(healthRaw) ? 0n : big6(healthRaw);
31465
+ const health = isFailedCall(healthRaw) ? 0n : big7(healthRaw);
30658
31466
  const pricesRaw = data[base + 2];
30659
31467
  const priceUpper = arrAt(pricesRaw, 0);
30660
31468
  const priceLower = arrAt(pricesRaw, 1);
30661
31469
  const ticksRaw = data[base + 3];
30662
- const bands = isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(big6(ticksRaw[0])), Number(big6(ticksRaw[1]))];
31470
+ const bands = isFailedCall(ticksRaw) || !Array.isArray(ticksRaw) ? void 0 : [Number(big7(ticksRaw[0])), Number(big7(ticksRaw[1]))];
30663
31471
  const approvalRaw = data[base + 4];
30664
31472
  const delegated = isFailedCall(approvalRaw) ? false : approvalRaw === true;
30665
31473
  const lenderKey = llamaLendLenderKey(lender, market.controller);
@@ -30756,7 +31564,7 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
30756
31564
  expected
30757
31565
  ];
30758
31566
  };
30759
- var big7 = (v) => {
31567
+ var big8 = (v) => {
30760
31568
  try {
30761
31569
  if (typeof v === "bigint") return v;
30762
31570
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -30764,7 +31572,7 @@ var big7 = (v) => {
30764
31572
  }
30765
31573
  return 0n;
30766
31574
  };
30767
- var tupleAt = (v, i) => Array.isArray(v) ? big7(v[i]) : 0n;
31575
+ var tupleAt = (v, i) => Array.isArray(v) ? big8(v[i]) : 0n;
30768
31576
  var ONE4 = 10n ** 18n;
30769
31577
  function sharesToAmount(shares, totalAmount, totalShares) {
30770
31578
  if (totalShares === 0n || shares === 0n) return 0n;
@@ -30790,7 +31598,7 @@ var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
30790
31598
  if (isFailedCall(accounting) || !Array.isArray(accounting)) return;
30791
31599
  const totalBorrowAmount = tupleAt(accounting, 1);
30792
31600
  const totalBorrowShares = tupleAt(accounting, 2);
30793
- const sharePrice = isFailedCall(data[base + 1]) ? 0n : big7(data[base + 1]);
31601
+ const sharePrice = isFailedCall(data[base + 1]) ? 0n : big8(data[base + 1]);
30794
31602
  const lenderKey = resupplyLenderKey(lender, chainId, pair);
30795
31603
  const metaMap = meta?.[lenderKey];
30796
31604
  if (!metaMap) return;
@@ -30888,8 +31696,124 @@ var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
30888
31696
  expected
30889
31697
  ];
30890
31698
  };
30891
- var RAY4 = 10n ** 27n;
30892
- var big8 = (v) => {
31699
+ var WAD12 = 10n ** 18n;
31700
+ var big9 = (v) => {
31701
+ try {
31702
+ if (typeof v === "bigint") return v;
31703
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
31704
+ } catch {
31705
+ }
31706
+ return 0n;
31707
+ };
31708
+ var tupleAt2 = (v, i) => Array.isArray(v) ? big9(v[i]) : 0n;
31709
+ var HOLD_PERIOD_SECONDS = 1200n;
31710
+ var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
31711
+ const cfg = curvanceConfigFor(lender, chainId);
31712
+ const discovery = getCachedCurvanceDiscovery(chainId, lender, account);
31713
+ const positions = discovery?.positions ?? [];
31714
+ const expected = cfg && positions.length > 0 ? positions.reduce(
31715
+ (acc, p) => acc + CURVANCE_MARKET_READS + p.activeTokens.length * CURVANCE_READS_PER_TOKEN,
31716
+ 0
31717
+ ) : 0;
31718
+ return [
31719
+ (data) => {
31720
+ if (!cfg || expected === 0) return void 0;
31721
+ if (!data || data.length < expected) return void 0;
31722
+ const out = {};
31723
+ const nowSeconds = BigInt(Math.floor(Date.now() / 1e3));
31724
+ let cursor = 0;
31725
+ for (const p of positions) {
31726
+ const base = cursor;
31727
+ cursor += CURVANCE_MARKET_READS + p.activeTokens.length * CURVANCE_READS_PER_TOKEN;
31728
+ const cooldownRaw = data[base];
31729
+ const status = data[base + 1];
31730
+ if (isFailedCall(status) || !Array.isArray(status)) continue;
31731
+ const cooldownTimestamp = isFailedCall(cooldownRaw) ? 0n : big9(cooldownRaw);
31732
+ const holdPeriodEndsAt = cooldownTimestamp > 0n ? cooldownTimestamp + HOLD_PERIOD_SECONDS : 0n;
31733
+ const holdPeriodActive = holdPeriodEndsAt > nowSeconds;
31734
+ const lenderKey = curvanceLenderKey(lender, chainId, p.marketManager);
31735
+ const metaMap = meta?.[lenderKey];
31736
+ if (!metaMap) continue;
31737
+ const info = {
31738
+ marketManager: p.marketManager,
31739
+ holdPeriodEndsAt: holdPeriodEndsAt.toString(),
31740
+ holdPeriodActive,
31741
+ collateralValueUsdWad: tupleAt2(status, 0).toString(),
31742
+ maxDebtUsdWad: tupleAt2(status, 1).toString(),
31743
+ debtValueUsdWad: tupleAt2(status, 2).toString(),
31744
+ tokens: {}
31745
+ };
31746
+ const lendingPositions = { "0": {} };
31747
+ const hist = {
31748
+ "0": { totalDeposits24h: 0, totalDebt24h: 0 }
31749
+ };
31750
+ let rows = 0;
31751
+ p.activeTokens.forEach(({ cToken, asset }, i) => {
31752
+ const tokenBase = base + CURVANCE_MARKET_READS + i * CURVANCE_READS_PER_TOKEN;
31753
+ const shares = isFailedCall(data[tokenBase]) ? 0n : big9(data[tokenBase]);
31754
+ const collateralShares = isFailedCall(data[tokenBase + 1]) ? 0n : big9(data[tokenBase + 1]);
31755
+ const debtRaw = isFailedCall(data[tokenBase + 2]) ? 0n : big9(data[tokenBase + 2]);
31756
+ const exchangeRate = isFailedCall(data[tokenBase + 3]) ? 0n : big9(data[tokenBase + 3]);
31757
+ info.tokens[cToken.toLowerCase()] = {
31758
+ shares: shares.toString(),
31759
+ collateralShares: collateralShares.toString(),
31760
+ debt: debtRaw.toString(),
31761
+ exchangeRate: exchangeRate.toString()
31762
+ };
31763
+ const uid = createMarketUid(chainId, lenderKey, asset);
31764
+ const rowMeta = metaMap[uid];
31765
+ if (!rowMeta) return;
31766
+ const assetDecimals = rowMeta.asset?.decimals ?? 18;
31767
+ const display = getDisplayPrice(rowMeta);
31768
+ const oracle = getOraclePrice(rowMeta);
31769
+ const histPrice = rowMeta.price?.priceUsd24h ?? display;
31770
+ const toUnderlying = (s) => exchangeRate > 0n ? s * exchangeRate / WAD12 : s;
31771
+ const depositsRaw = toUnderlying(collateralShares);
31772
+ const depositsStr = parseRawAmount(
31773
+ depositsRaw.toString(),
31774
+ assetDecimals
31775
+ );
31776
+ const depositsNum = Number(depositsStr);
31777
+ const debtStr = parseRawAmount(debtRaw.toString(), assetDecimals);
31778
+ const debtNum = Number(debtStr);
31779
+ lendingPositions["0"][uid] = {
31780
+ marketUid: uid,
31781
+ underlying: asset,
31782
+ deposits: depositsStr,
31783
+ debt: debtStr,
31784
+ debtStable: "0",
31785
+ depositsUSD: depositsNum * display,
31786
+ debtUSD: debtNum * display,
31787
+ debtStableUSD: 0,
31788
+ depositsUSDOracle: depositsNum * oracle,
31789
+ debtUSDOracle: debtNum * oracle,
31790
+ debtStableUSDOracle: 0,
31791
+ stableBorrowRate: "0",
31792
+ // In Curvance "collateral enabled" is not a per-market toggle: it
31793
+ // is whether shares are POSTED. Idle shares earn but back nothing.
31794
+ collateralEnabled: collateralShares > 0n,
31795
+ claimableRewards: 0,
31796
+ curvanceInfo: info
31797
+ };
31798
+ hist["0"].totalDeposits24h += depositsNum * histPrice;
31799
+ hist["0"].totalDebt24h += debtNum * histPrice;
31800
+ rows++;
31801
+ });
31802
+ if (rows === 0) continue;
31803
+ const userData = createMultiAccountTypeUserState(
31804
+ { chainId, account, lendingPositions, modes: { "0": 0 } },
31805
+ metaMap,
31806
+ hist
31807
+ );
31808
+ if (userData && userData.data.length > 0) out[lenderKey] = userData;
31809
+ }
31810
+ return Object.keys(out).length > 0 ? out : void 0;
31811
+ },
31812
+ expected
31813
+ ];
31814
+ };
31815
+ var RAY5 = 10n ** 27n;
31816
+ var big10 = (v) => {
30893
31817
  try {
30894
31818
  if (typeof v === "bigint") return v;
30895
31819
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -30897,7 +31821,7 @@ var big8 = (v) => {
30897
31821
  }
30898
31822
  return 0n;
30899
31823
  };
30900
- var field9 = (res, name, idx) => big8(res?.[name] ?? res?.[idx]);
31824
+ var field9 = (res, name, idx) => big10(res?.[name] ?? res?.[idx]);
30901
31825
  var getUsddUserDataConverter = (lender, chainId, account, meta) => {
30902
31826
  const cfg = usddConfigFor(lender, chainId);
30903
31827
  const markets = usddChainData(lender, chainId)?.markets ?? [];
@@ -30922,14 +31846,14 @@ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
30922
31846
  if (isFailedCall(res)) return;
30923
31847
  const ink = field9(res, "ink", 0);
30924
31848
  const art = field9(res, "art", 1);
30925
- const rate = rateByIlk.get(cdp.ilk) ?? RAY4;
30926
- const debt = art * rate / RAY4;
31849
+ const rate = rateByIlk.get(cdp.ilk) ?? RAY5;
31850
+ const debt = art * rate / RAY5;
30927
31851
  if (ink === 0n && debt === 0n) return;
30928
31852
  const market = markets.find((m) => m.ilk === cdp.ilk);
30929
31853
  if (!market) return;
30930
- const key = usddLenderKey(lender, chainId, cdp.ilk);
30931
- if (!perMarket.has(key)) perMarket.set(key, { market, positions: [] });
30932
- perMarket.get(key).positions.push({ cdp, ink, debt });
31854
+ const key2 = usddLenderKey(lender, chainId, cdp.ilk);
31855
+ if (!perMarket.has(key2)) perMarket.set(key2, { market, positions: [] });
31856
+ perMarket.get(key2).positions.push({ cdp, ink, debt });
30933
31857
  });
30934
31858
  const out = {};
30935
31859
  for (const [lenderKey, { market, positions }] of perMarket) {
@@ -31010,7 +31934,7 @@ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
31010
31934
  expected
31011
31935
  ];
31012
31936
  };
31013
- var big9 = (v) => {
31937
+ var big11 = (v) => {
31014
31938
  try {
31015
31939
  if (typeof v === "bigint") return v;
31016
31940
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -31040,17 +31964,17 @@ var getFrankencoinUserDataConverter = (lender, chainId, account, meta) => {
31040
31964
  const ownerRes = data[base];
31041
31965
  if (isFailedCall(ownerRes)) return;
31042
31966
  if (String(ownerRes).toLowerCase() !== lowerAccount) return;
31043
- const minted = big9(data[base + 1]);
31044
- const price2 = big9(data[base + 2]);
31045
- const expiration = big9(data[base + 3]);
31046
- const challenged = big9(data[base + 4]);
31047
- const coll = big9(data[base + 5]);
31967
+ const minted = big11(data[base + 1]);
31968
+ const price2 = big11(data[base + 2]);
31969
+ const expiration = big11(data[base + 3]);
31970
+ const challenged = big11(data[base + 4]);
31971
+ const coll = big11(data[base + 5]);
31048
31972
  if (minted === 0n && coll === 0n) return;
31049
31973
  const market = marketByOriginal.get(p.original);
31050
31974
  if (!market) return;
31051
- const key = frankencoinLenderKey(lender, chainId, market.position);
31052
- if (!perMarket.has(key)) perMarket.set(key, { market, rows: [] });
31053
- perMarket.get(key).rows.push({
31975
+ const key2 = frankencoinLenderKey(lender, chainId, market.position);
31976
+ if (!perMarket.has(key2)) perMarket.set(key2, { market, rows: [] });
31977
+ perMarket.get(key2).rows.push({
31054
31978
  info: {
31055
31979
  position: p.position,
31056
31980
  original: p.original,
@@ -31145,7 +32069,7 @@ var getFrankencoinUserDataConverter = (lender, chainId, account, meta) => {
31145
32069
 
31146
32070
  // src/lending/user-data/teller/userCallParse.ts
31147
32071
  var nowSec7 = () => Math.floor(Date.now() / 1e3);
31148
- var big10 = (v) => {
32072
+ var big12 = (v) => {
31149
32073
  try {
31150
32074
  if (typeof v === "bigint") return v;
31151
32075
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -31167,7 +32091,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
31167
32091
  const base = i * TELLER_CALLS_PER_BID;
31168
32092
  const bidRes = data[base];
31169
32093
  const owed = data[base + 1];
31170
- const collAmount = big10(data[base + 2]);
32094
+ const collAmount = big12(data[base + 2]);
31171
32095
  const defaulted = !!data[base + 3];
31172
32096
  if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
31173
32097
  const pool = b.pool;
@@ -31188,17 +32112,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
31188
32112
  const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
31189
32113
  const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
31190
32114
  const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
31191
- const owedPrincipal = big10(field10(owed, "principal", 0));
31192
- const owedInterest = big10(field10(owed, "interest", 1));
32115
+ const owedPrincipal = big12(field10(owed, "principal", 0));
32116
+ const owedInterest = big12(field10(owed, "interest", 1));
31193
32117
  const owedTotal = owedPrincipal + owedInterest;
31194
32118
  if (owedTotal === 0n && collAmount === 0n) return;
31195
32119
  const loanDetails = field10(bidRes, "loanDetails", 5);
31196
32120
  const terms = field10(bidRes, "terms", 6);
31197
32121
  const acceptedTs = Number(
31198
- big10(field10(loanDetails, "acceptedTimestamp", 4))
32122
+ big12(field10(loanDetails, "acceptedTimestamp", 4))
31199
32123
  );
31200
- const loanDuration = Number(big10(field10(loanDetails, "loanDuration", 6)));
31201
- const aprBps = Number(big10(field10(terms, "APR", 2)));
32124
+ const loanDuration = Number(big12(field10(loanDetails, "loanDuration", 6)));
32125
+ const aprBps = Number(big12(field10(terms, "APR", 2)));
31202
32126
  const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
31203
32127
  const isMatured = defaulted || maturity !== void 0 && maturity < now;
31204
32128
  const collStr = parseRawAmount(collAmount.toString(), collDecimals);
@@ -31579,6 +32503,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
31579
32503
  return getLlamaLendUserDataConverter(lender, chainId, account, meta);
31580
32504
  if (isResupply(lender))
31581
32505
  return getResupplyUserDataConverter(lender, chainId, account, meta);
32506
+ if (isCurvance(lender))
32507
+ return getCurvanceUserDataConverter(lender, chainId, account, meta);
31582
32508
  if (isUsdd(lender))
31583
32509
  return getUsddUserDataConverter(lender, chainId, account, meta);
31584
32510
  if (isFrankencoin(lender))
@@ -31687,12 +32613,12 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
31687
32613
  }
31688
32614
  if (!convertedData) continue;
31689
32615
  const incomplete = retryableFailedCalls > 0;
31690
- const publish = (key, entry) => {
32616
+ const publish = (key2, entry) => {
31691
32617
  if (!entry) return;
31692
32618
  const { kept, violations, dropped } = validateUserData(entry, incomplete);
31693
32619
  if (dropped.length > 0) {
31694
32620
  options?.onIncomplete?.({
31695
- lender: key,
32621
+ lender: key2,
31696
32622
  failedCalls,
31697
32623
  retryableFailedCalls,
31698
32624
  totalCalls: data.length,
@@ -31703,9 +32629,9 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
31703
32629
  }
31704
32630
  if (kept.length === 0) return;
31705
32631
  entry.data = kept;
31706
- entry.lender = key;
32632
+ entry.lender = key2;
31707
32633
  if (incomplete) entry.incomplete = true;
31708
- lenderData[key] = entry;
32634
+ lenderData[key2] = entry;
31709
32635
  };
31710
32636
  try {
31711
32637
  if (isMultiMarket(query3.lender)) {
@@ -36243,6 +37169,8 @@ var getAbi2 = (lender) => {
36243
37169
  return [...FrankencoinPositionAbi, ...erc20Abi];
36244
37170
  if (isResupply(lender))
36245
37171
  return [...ResupplyPairAbi, ...VAULT_CONVERT_ABI];
37172
+ if (isCurvance(lender))
37173
+ return [...CurvanceMarketManagerAbi, ...CurvanceCTokenAbi];
36246
37174
  if (isInit(lender)) return InitLensAbi;
36247
37175
  if (isEulerType(lender)) return accountLensAbi;
36248
37176
  if (isCompoundV2Type(lender))
@@ -36257,9 +37185,9 @@ var getAbi2 = (lender) => {
36257
37185
  };
36258
37186
 
36259
37187
  // src/lending-pools/computeLendingPools.ts
36260
- function resolvePrice(map, key, fallbackKey) {
37188
+ function resolvePrice(map, key2, fallbackKey) {
36261
37189
  if (!map) return void 0;
36262
- if (key != null && map[key] != null) return map[key];
37190
+ if (key2 != null && map[key2] != null) return map[key2];
36263
37191
  if (fallbackKey != null && map[fallbackKey] != null) return map[fallbackKey];
36264
37192
  return void 0;
36265
37193
  }
@@ -36281,9 +37209,9 @@ var generateLendingPools = (lenderData, prices, histPrices) => {
36281
37209
  }
36282
37210
  const byMarket = /* @__PURE__ */ new Map();
36283
37211
  for (const pool of flat) {
36284
- const key = `${pool.chainId}:${pool.lender}`;
36285
- if (!byMarket.has(key)) byMarket.set(key, []);
36286
- byMarket.get(key).push({
37212
+ const key2 = `${pool.chainId}:${pool.lender}`;
37213
+ if (!byMarket.has(key2)) byMarket.set(key2, []);
37214
+ byMarket.get(key2).push({
36287
37215
  ...pool,
36288
37216
  apr: pool.depositRate + (pool.intrinsicYield ?? 0),
36289
37217
  utilitzation: (Number(pool.totalDebt) + Number(pool.totalDebtStable ?? 0)) / Number(pool.totalDeposits),
@@ -36318,12 +37246,12 @@ var generateLendingPools = (lenderData, prices, histPrices) => {
36318
37246
  }
36319
37247
  for (const group of byMarket.values()) {
36320
37248
  for (const pool of group) {
36321
- const [assetGroup, key] = getPriceKey(pool.asset) ?? [
37249
+ const [assetGroup, key2] = getPriceKey(pool.asset) ?? [
36322
37250
  void 0,
36323
37251
  void 0
36324
37252
  ];
36325
- pool.price = resolvePrice(prices, key, assetGroup);
36326
- pool.histPrice = resolvePrice(histPrices, key, assetGroup);
37253
+ pool.price = resolvePrice(prices, key2, assetGroup);
37254
+ pool.histPrice = resolvePrice(histPrices, key2, assetGroup);
36327
37255
  }
36328
37256
  }
36329
37257
  return Array.from(byMarket.values()).flat();
@@ -36736,8 +37664,8 @@ function needsLenderApproval(params) {
36736
37664
  const { lender, lenderDebitData, tokenAddress, amount, chainId, cToken, isProtected } = params;
36737
37665
  if (!lenderDebitData) return true;
36738
37666
  if (isAaveV4Type(lender)) {
36739
- const key2 = (params.aaveV4Spoke ?? tokenAddress).toLowerCase();
36740
- const entry2 = lenderDebitData[key2];
37667
+ const key3 = (params.aaveV4Spoke ?? tokenAddress).toLowerCase();
37668
+ const entry2 = lenderDebitData[key3];
36741
37669
  if (!entry2 || entry2.amount === void 0) return true;
36742
37670
  return entry2.amount === 0n;
36743
37671
  }
@@ -36746,8 +37674,8 @@ function needsLenderApproval(params) {
36746
37674
  if (!entry2 || entry2.amount === void 0) return true;
36747
37675
  return entry2.amount === 0n;
36748
37676
  }
36749
- const key = resolveDebitDataKey(chainId, lender, tokenAddress, cToken, isProtected);
36750
- const entry = lenderDebitData[key];
37677
+ const key2 = resolveDebitDataKey(chainId, lender, tokenAddress, cToken, isProtected);
37678
+ const entry = lenderDebitData[key2];
36751
37679
  if (!entry || entry.amount === void 0) return true;
36752
37680
  if (isCompoundV2Type(lender) || isVenusType(lender)) {
36753
37681
  const requiredShares = toCompoundV2Shares(entry, amount);
@@ -36867,21 +37795,21 @@ function cacheKey6(chainId, account) {
36867
37795
  return `${chainId}:${account.toLowerCase()}`;
36868
37796
  }
36869
37797
  async function dedupedFetch(chainId, account, loader) {
36870
- const key = cacheKey6(chainId, account);
37798
+ const key2 = cacheKey6(chainId, account);
36871
37799
  const now = Date.now();
36872
- const cached = resolved.get(key);
37800
+ const cached = resolved.get(key2);
36873
37801
  if (cached && cached.expiresAt > now) {
36874
37802
  return cached.value;
36875
37803
  }
36876
- const existing = inflight.get(key);
37804
+ const existing = inflight.get(key2);
36877
37805
  if (existing) return existing;
36878
37806
  const promise = loader().then((value) => {
36879
- resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
37807
+ resolved.set(key2, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
36880
37808
  return value;
36881
37809
  }).finally(() => {
36882
- inflight.delete(key);
37810
+ inflight.delete(key2);
36883
37811
  });
36884
- inflight.set(key, promise);
37812
+ inflight.set(key2, promise);
36885
37813
  return promise;
36886
37814
  }
36887
37815
  function hasMorphoUserSubgraph(chainId) {
@@ -37710,14 +38638,14 @@ function getRewardYieldOpen(amountInUSD, amountOutUSD, irModeIn, cashFlowDeposit
37710
38638
  const mapOut = rewardsToMap(yieldOut?.rewards);
37711
38639
  if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
37712
38640
  const data = {};
37713
- for (const key of keysFromMaps(mapIn, mapOut)) {
37714
- const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key]?.stableBorrowRate : mapIn[key]?.variableBorrowRate) ?? 0);
37715
- const _flowOut = amountOutUSD * (mapOut[key]?.depositRate ?? 0);
38641
+ for (const key2 of keysFromMaps(mapIn, mapOut)) {
38642
+ const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key2]?.stableBorrowRate : mapIn[key2]?.variableBorrowRate) ?? 0);
38643
+ const _flowOut = amountOutUSD * (mapOut[key2]?.depositRate ?? 0);
37716
38644
  const totalCashFlowDebt = cashFlowDebt + _flowIn;
37717
38645
  const totalCashFlowDeposits = cashFlowDeposits + _flowOut;
37718
38646
  const newCollat = deposits + amountOutUSD;
37719
38647
  const newDebt = debt + amountInUSD;
37720
- data[key] = {
38648
+ data[key2] = {
37721
38649
  borrowApr: totalCashFlowDebt / newDebt,
37722
38650
  depositApr: totalCashFlowDeposits / newCollat,
37723
38651
  apr: (cashFlowDeposits + cashFlowDebt + _flowIn + _flowOut) / (newCollat - newDebt)
@@ -37730,14 +38658,14 @@ function getRewardYieldClose(amountInUSD, amountOutUSD, irModeOut, cashFlowDepos
37730
38658
  const mapOut = rewardsToMap(yieldOut?.rewards);
37731
38659
  if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
37732
38660
  const data = {};
37733
- for (const key of keysFromMaps(mapIn, mapOut)) {
37734
- const _flowIn = amountInUSD * (mapIn[key]?.depositRate ?? 0);
37735
- const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key]?.stableBorrowRate : mapOut[key]?.variableBorrowRate) ?? 0);
38661
+ for (const key2 of keysFromMaps(mapIn, mapOut)) {
38662
+ const _flowIn = amountInUSD * (mapIn[key2]?.depositRate ?? 0);
38663
+ const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key2]?.stableBorrowRate : mapOut[key2]?.variableBorrowRate) ?? 0);
37736
38664
  const totalCashFlowDebt = cashFlowDebt - _flowOut;
37737
38665
  const totalCashFlowDeposits = cashFlowDeposits - _flowIn;
37738
38666
  const newCollat = deposits - amountInUSD;
37739
38667
  const newDebt = debt - amountOutUSD;
37740
- data[key] = {
38668
+ data[key2] = {
37741
38669
  borrowApr: Math.abs(newDebt) < 0.01 ? 0 : totalCashFlowDebt / newDebt,
37742
38670
  depositApr: totalCashFlowDeposits / newCollat,
37743
38671
  apr: (cashFlowDeposits + cashFlowDebt - _flowIn - _flowOut) / (newCollat - newDebt)
@@ -37750,12 +38678,12 @@ function getRewardYieldDebtSwap(amountInUSD, amountOutUSD, irModeIn, irModeOut,
37750
38678
  const mapOut = rewardsToMap(yieldOut?.rewards);
37751
38679
  if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
37752
38680
  const data = {};
37753
- for (const key of keysFromMaps(mapIn, mapOut)) {
37754
- const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key]?.stableBorrowRate : mapIn[key]?.variableBorrowRate) ?? 0);
37755
- const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key]?.stableBorrowRate : mapOut[key]?.variableBorrowRate) ?? 0);
38681
+ for (const key2 of keysFromMaps(mapIn, mapOut)) {
38682
+ const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key2]?.stableBorrowRate : mapIn[key2]?.variableBorrowRate) ?? 0);
38683
+ const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key2]?.stableBorrowRate : mapOut[key2]?.variableBorrowRate) ?? 0);
37756
38684
  const totalCashFlowDebt = cashFlowDebt + _flowIn - _flowOut;
37757
38685
  const newDebt = debt - amountOutUSD + amountInUSD;
37758
- data[key] = {
38686
+ data[key2] = {
37759
38687
  borrowApr: Math.abs(newDebt) < 0.01 ? 0 : totalCashFlowDebt / newDebt,
37760
38688
  depositApr: cashFlowDeposits / deposits,
37761
38689
  apr: (cashFlowDeposits + totalCashFlowDebt) / (deposits - newDebt)
@@ -37768,12 +38696,12 @@ function getRewardYieldCollateralSwap(amountInUSD, amountOutUSD, cashFlowDeposit
37768
38696
  const mapOut = rewardsToMap(yieldOut?.rewards);
37769
38697
  if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
37770
38698
  const data = {};
37771
- for (const key of keysFromMaps(mapIn, mapOut)) {
37772
- const _flowIn = amountInUSD * (mapIn[key]?.depositRate ?? 0);
37773
- const _flowOut = amountOutUSD * (mapOut[key]?.depositRate ?? 0);
38699
+ for (const key2 of keysFromMaps(mapIn, mapOut)) {
38700
+ const _flowIn = amountInUSD * (mapIn[key2]?.depositRate ?? 0);
38701
+ const _flowOut = amountOutUSD * (mapOut[key2]?.depositRate ?? 0);
37774
38702
  const totalCashFlowDeposits = cashFlowDeposits + _flowOut - _flowIn;
37775
38703
  const newCollat = deposits + amountOutUSD - amountInUSD;
37776
- data[key] = {
38704
+ data[key2] = {
37777
38705
  borrowApr: Math.abs(debt) < 0.01 ? 0 : cashFlowDebt / debt,
37778
38706
  depositApr: totalCashFlowDeposits / newCollat,
37779
38707
  apr: (totalCashFlowDeposits + cashFlowDebt) / (newCollat - debt)
@@ -38570,9 +39498,9 @@ var yieldNestFetcher = {
38570
39498
  }).then((r) => r.json());
38571
39499
  const tokens = res?.data?.getLRTsData?.tokens ?? [];
38572
39500
  const result = {};
38573
- for (const { symbol, chainId, key } of YN_TOKENS) {
39501
+ for (const { symbol, chainId, key: key2 } of YN_TOKENS) {
38574
39502
  const apr = findApr(tokens, symbol, chainId);
38575
- if (apr > 0) result[key] = apr;
39503
+ if (apr > 0) result[key2] = apr;
38576
39504
  }
38577
39505
  return result;
38578
39506
  }
@@ -38992,10 +39920,10 @@ var ankrFetcher = {
38992
39920
  const services = res?.services ?? [];
38993
39921
  const result = {};
38994
39922
  for (const service of services) {
38995
- const key = ANKR_SERVICE_KEYS[service?.serviceName];
38996
- if (!key) continue;
39923
+ const key2 = ANKR_SERVICE_KEYS[service?.serviceName];
39924
+ if (!key2) continue;
38997
39925
  const apr = Number(service?.apy);
38998
- if (apr > 0) result[key] = apr;
39926
+ if (apr > 0) result[key2] = apr;
38999
39927
  }
39000
39928
  return result;
39001
39929
  }
@@ -39089,7 +40017,7 @@ var lombardLbtcFetcher = {
39089
40017
  }
39090
40018
  };
39091
40019
  var LOMBARD_VAULT_APY_URL = "https://mainnet.prod.lombard.finance/api/v1/analytics/vault/apy/history";
39092
- var createLombardVaultFetcher = (wrapper, key) => ({
40020
+ var createLombardVaultFetcher = (wrapper, key2) => ({
39093
40021
  label: `LOMBARD_VAULT:${wrapper}`,
39094
40022
  fetch: async () => {
39095
40023
  const url = `${LOMBARD_VAULT_APY_URL}?vault_wrapper=${wrapper}&interval=APY_INTERVAL_1M`;
@@ -39098,7 +40026,7 @@ var createLombardVaultFetcher = (wrapper, key) => ({
39098
40026
  }).then((r) => r.json());
39099
40027
  const latest = Array.isArray(res?.snapshots) ? res.snapshots[0] : void 0;
39100
40028
  const frac = Number(latest?.total_apy);
39101
- return { [key]: Number.isFinite(frac) ? frac * 100 : 0 };
40029
+ return { [key2]: Number.isFinite(frac) ? frac * 100 : 0 };
39102
40030
  }
39103
40031
  });
39104
40032
  var lombardLbtcvFetcher = createLombardVaultFetcher(
@@ -41002,7 +41930,7 @@ var hastraPrimeFetcher = {
41002
41930
  return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
41003
41931
  }
41004
41932
  };
41005
- var RAY5 = 10n ** 27n;
41933
+ var RAY6 = 10n ** 27n;
41006
41934
  var YEAR_SECONDS6 = 31536e3;
41007
41935
  var SPARK_VAULTS_V2 = [
41008
41936
  {
@@ -41079,8 +42007,8 @@ var SSR_ABI = [
41079
42007
  }
41080
42008
  ];
41081
42009
  var aprFromVsr = (vsr) => {
41082
- if (vsr <= RAY5) return 0;
41083
- const perSecond = Number(vsr - RAY5) / 1e27;
42010
+ if (vsr <= RAY6) return 0;
42011
+ const perSecond = Number(vsr - RAY6) / 1e27;
41084
42012
  return perSecond * YEAR_SECONDS6 * 100;
41085
42013
  };
41086
42014
  var chainsOf = (vaults) => [
@@ -41100,7 +42028,7 @@ var fetchChain = async (chainId, vaults) => {
41100
42028
  const out = {};
41101
42029
  vaults.forEach((v, i) => {
41102
42030
  const vsr = results[i];
41103
- if (typeof vsr !== "bigint" || vsr < RAY5) return;
42031
+ if (typeof vsr !== "bigint" || vsr < RAY6) return;
41104
42032
  const apr = aprFromVsr(vsr);
41105
42033
  out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
41106
42034
  if (v.assetGroup) out[v.assetGroup] = apr;
@@ -41114,7 +42042,7 @@ var fetchSusdcApr = async () => {
41114
42042
  calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
41115
42043
  allowFailure: false
41116
42044
  });
41117
- if (typeof ssr !== "bigint" || ssr < RAY5) {
42045
+ if (typeof ssr !== "bigint" || ssr < RAY6) {
41118
42046
  throw new Error("Spark sUSDC: unreadable ssr()");
41119
42047
  }
41120
42048
  const apr = aprFromVsr(ssr);
@@ -41276,7 +42204,7 @@ var rwaFundsFetcher = {
41276
42204
  Object.entries(RWA_FUNDS).map(async ([label, fund]) => {
41277
42205
  try {
41278
42206
  const apr = apyToAprPercent(await fetchDefiLlamaApy(fund.pool));
41279
- for (const key of fund.keys) out[key] = apr;
42207
+ for (const key2 of fund.keys) out[key2] = apr;
41280
42208
  } catch {
41281
42209
  }
41282
42210
  })
@@ -41650,7 +42578,7 @@ var strataFetcher = {
41650
42578
  return out;
41651
42579
  }
41652
42580
  };
41653
- var RAY6 = 10n ** 27n;
42581
+ var RAY7 = 10n ** 27n;
41654
42582
  var YEAR_SECONDS10 = 31536e3;
41655
42583
  var DSR_ABI = [
41656
42584
  {
@@ -41677,8 +42605,8 @@ var USDD_EARN_APY_URL = "https://openapi.usdd.io/api/v1/external/earn-apy";
41677
42605
  var susddKey = (chainId) => `USDD::${chainId}::sUSDD`;
41678
42606
  var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
41679
42607
  var aprFromDsr = (dsr) => {
41680
- if (dsr <= RAY6) return 0;
41681
- const perSecond = Number(dsr - RAY6) / 1e27;
42608
+ if (dsr <= RAY7) return 0;
42609
+ const perSecond = Number(dsr - RAY7) / 1e27;
41682
42610
  return perSecond * YEAR_SECONDS10 * 100;
41683
42611
  };
41684
42612
  var fetchChainDsr = async (chainId, pot) => {
@@ -41688,7 +42616,7 @@ var fetchChainDsr = async (chainId, pot) => {
41688
42616
  calls: [{ address: pot, name: "dsr", params: [] }],
41689
42617
  allowFailure: false
41690
42618
  });
41691
- if (typeof dsr !== "bigint" || dsr < RAY6) {
42619
+ if (typeof dsr !== "bigint" || dsr < RAY7) {
41692
42620
  throw new Error(`USDD: unreadable dsr() on chain ${chainId}`);
41693
42621
  }
41694
42622
  return aprFromDsr(dsr);
@@ -41700,9 +42628,9 @@ var fetchApiAprs = async () => {
41700
42628
  }).then((r) => r.json());
41701
42629
  if (res?.code !== 0 || !res?.data) return {};
41702
42630
  const out = {};
41703
- for (const key of ["ethApy", "bscApy"]) {
41704
- const apy = Number(res.data[key]);
41705
- if (Number.isFinite(apy) && apy > 0) out[key] = apyToApr(apy) * 100;
42631
+ for (const key2 of ["ethApy", "bscApy"]) {
42632
+ const apy = Number(res.data[key2]);
42633
+ if (Number.isFinite(apy) && apy > 0) out[key2] = apyToApr(apy) * 100;
41706
42634
  }
41707
42635
  return out;
41708
42636
  };
@@ -44375,9 +45303,9 @@ async function fetchPendlePricesForAllChain(lists = {}, assetType = ["YT", "PT"]
44375
45303
  try {
44376
45304
  const data = await fetchPendlePricesRaw(assetType);
44377
45305
  let prices = {};
44378
- Object.entries(data).forEach(([key, val]) => {
44379
- const [chainId, address] = key.split("-");
44380
- const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key;
45306
+ Object.entries(data).forEach(([key2, val]) => {
45307
+ const [chainId, address] = key2.split("-");
45308
+ const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key2;
44381
45309
  prices[assetKey] = val;
44382
45310
  });
44383
45311
  return prices;
@@ -44597,7 +45525,7 @@ var midasFetcher = {
44597
45525
  const apy = apys[apyKey];
44598
45526
  if (typeof apy === "number" && apy > 0 && apy <= MAX_DECIMAL_APY) {
44599
45527
  const apr = apyToAprPercent(apy * 100);
44600
- for (const key of keys) result[key] = apr;
45528
+ for (const key2 of keys) result[key2] = apr;
44601
45529
  }
44602
45530
  }
44603
45531
  return result;
@@ -44819,10 +45747,10 @@ var yearnKatanaFetcher = {
44819
45747
  ).then((r) => r.json());
44820
45748
  let map = {};
44821
45749
  Object.entries(res).forEach(([addr2, data]) => {
44822
- const key = addressToAssetYearn[addr2.toLowerCase()];
44823
- if (key) {
45750
+ const key2 = addressToAssetYearn[addr2.toLowerCase()];
45751
+ if (key2) {
44824
45752
  const apr = ((data.apr.netAPR ?? 0) + (data.apr.extra?.extrinsicYield ?? 0) + (data.apr.extra?.katanaNativeYield ?? 0)) * 100;
44825
- map[key] = apr;
45753
+ map[key2] = apr;
44826
45754
  }
44827
45755
  });
44828
45756
  return map;
@@ -45106,6 +46034,297 @@ var morphoCollateralMerklRewardFetcher = createMerklRewardFetcher({
45106
46034
  };
45107
46035
  }
45108
46036
  });
46037
+ var DLEND_POOLS = [
46038
+ {
46039
+ chainId: Chain.ETHEREUM_MAINNET,
46040
+ lender: Lender.DTRINITY,
46041
+ pool: "0x6598DaD18Bda89A0E58A1F427c8CeBc0dE90F153"
46042
+ }
46043
+ ];
46044
+ var ZERO_ADDRESS5 = "0x0000000000000000000000000000000000000000";
46045
+ var SECONDS_PER_YEAR11 = 31536e3;
46046
+ var ABI = [
46047
+ {
46048
+ name: "getReservesList",
46049
+ type: "function",
46050
+ stateMutability: "view",
46051
+ inputs: [],
46052
+ outputs: [{ type: "address[]" }]
46053
+ },
46054
+ {
46055
+ name: "ADDRESSES_PROVIDER",
46056
+ type: "function",
46057
+ stateMutability: "view",
46058
+ inputs: [],
46059
+ outputs: [{ type: "address" }]
46060
+ },
46061
+ {
46062
+ name: "getPriceOracle",
46063
+ type: "function",
46064
+ stateMutability: "view",
46065
+ inputs: [],
46066
+ outputs: [{ type: "address" }]
46067
+ },
46068
+ {
46069
+ name: "getAssetPrice",
46070
+ type: "function",
46071
+ stateMutability: "view",
46072
+ inputs: [{ type: "address" }],
46073
+ outputs: [{ type: "uint256" }]
46074
+ },
46075
+ {
46076
+ name: "getReserveData",
46077
+ type: "function",
46078
+ stateMutability: "view",
46079
+ inputs: [{ type: "address" }],
46080
+ outputs: [
46081
+ {
46082
+ type: "tuple",
46083
+ components: [
46084
+ {
46085
+ name: "configuration",
46086
+ type: "tuple",
46087
+ components: [{ name: "data", type: "uint256" }]
46088
+ },
46089
+ { name: "liquidityIndex", type: "uint128" },
46090
+ { name: "currentLiquidityRate", type: "uint128" },
46091
+ { name: "variableBorrowIndex", type: "uint128" },
46092
+ { name: "currentVariableBorrowRate", type: "uint128" },
46093
+ { name: "currentStableBorrowRate", type: "uint128" },
46094
+ { name: "lastUpdateTimestamp", type: "uint40" },
46095
+ { name: "id", type: "uint16" },
46096
+ { name: "aTokenAddress", type: "address" },
46097
+ { name: "stableDebtTokenAddress", type: "address" },
46098
+ { name: "variableDebtTokenAddress", type: "address" },
46099
+ { name: "interestRateStrategyAddress", type: "address" },
46100
+ { name: "accruedToTreasury", type: "uint128" },
46101
+ { name: "unbacked", type: "uint128" },
46102
+ { name: "isolationModeTotalDebt", type: "uint128" }
46103
+ ]
46104
+ }
46105
+ ]
46106
+ },
46107
+ {
46108
+ name: "getIncentivesController",
46109
+ type: "function",
46110
+ stateMutability: "view",
46111
+ inputs: [],
46112
+ outputs: [{ type: "address" }]
46113
+ },
46114
+ {
46115
+ name: "getRewardsByAsset",
46116
+ type: "function",
46117
+ stateMutability: "view",
46118
+ inputs: [{ type: "address" }],
46119
+ outputs: [{ type: "address[]" }]
46120
+ },
46121
+ {
46122
+ name: "getRewardsData",
46123
+ type: "function",
46124
+ stateMutability: "view",
46125
+ inputs: [{ type: "address" }, { type: "address" }],
46126
+ outputs: [
46127
+ { name: "index", type: "uint256" },
46128
+ { name: "emissionPerSecond", type: "uint256" },
46129
+ { name: "lastUpdateTimestamp", type: "uint256" },
46130
+ { name: "distributionEnd", type: "uint256" }
46131
+ ]
46132
+ },
46133
+ {
46134
+ name: "totalSupply",
46135
+ type: "function",
46136
+ stateMutability: "view",
46137
+ inputs: [],
46138
+ outputs: [{ type: "uint256" }]
46139
+ },
46140
+ {
46141
+ name: "decimals",
46142
+ type: "function",
46143
+ stateMutability: "view",
46144
+ inputs: [],
46145
+ outputs: [{ type: "uint8" }]
46146
+ }
46147
+ ];
46148
+ var isZero = (a) => !a || a.toLowerCase() === ZERO_ADDRESS5;
46149
+ var scale = (raw, decimals) => Number(raw) / 10 ** decimals;
46150
+ function emptyReward2() {
46151
+ return {
46152
+ distribution: "onchain-incentives",
46153
+ deposit: 0,
46154
+ borrow: 0,
46155
+ additionalDepositData: [],
46156
+ additionalBorrowData: []
46157
+ };
46158
+ }
46159
+ function rebateApr(params) {
46160
+ const {
46161
+ emissionPerSecond,
46162
+ distributionEnd,
46163
+ rewardDecimals,
46164
+ rewardPrice,
46165
+ balanceTotalSupply,
46166
+ balanceDecimals,
46167
+ assetPrice,
46168
+ nowSeconds
46169
+ } = params;
46170
+ if (nowSeconds >= Number(distributionEnd)) return 0;
46171
+ if (emissionPerSecond <= 0n || balanceTotalSupply <= 0n) return 0;
46172
+ if (!(rewardPrice > 0) || !(assetPrice > 0)) return 0;
46173
+ const rewardsPerYearUsd = scale(emissionPerSecond, rewardDecimals) * SECONDS_PER_YEAR11 * rewardPrice;
46174
+ const baseUsd = scale(balanceTotalSupply, balanceDecimals) * assetPrice;
46175
+ if (!(baseUsd > 0)) return 0;
46176
+ return rewardsPerYearUsd / baseUsd * 100;
46177
+ }
46178
+ async function fetchForPool(chainId, lender, pool, nowSeconds) {
46179
+ const call = (address, name, params = []) => ({
46180
+ address,
46181
+ name,
46182
+ params
46183
+ });
46184
+ const [reservesList, addressesProvider] = await multicallRetryUniversal({
46185
+ chain: chainId,
46186
+ abi: ABI,
46187
+ calls: [call(pool, "getReservesList"), call(pool, "ADDRESSES_PROVIDER")],
46188
+ allowFailure: false
46189
+ });
46190
+ if (!reservesList?.length) return {};
46191
+ const round2 = await multicallRetryUniversal({
46192
+ chain: chainId,
46193
+ abi: ABI,
46194
+ calls: [
46195
+ call(addressesProvider, "getPriceOracle"),
46196
+ ...reservesList.map((a) => call(pool, "getReserveData", [a]))
46197
+ ],
46198
+ allowFailure: false
46199
+ });
46200
+ const oracle = round2[0];
46201
+ const reserveData = round2.slice(1);
46202
+ const legs = [];
46203
+ reservesList.forEach((asset, i) => {
46204
+ const rd = reserveData[i];
46205
+ if (!rd) return;
46206
+ const a = asset.toLowerCase();
46207
+ if (!isZero(rd.aTokenAddress))
46208
+ legs.push({ asset: a, balanceToken: rd.aTokenAddress, bucket: "deposit" });
46209
+ if (!isZero(rd.variableDebtTokenAddress))
46210
+ legs.push({
46211
+ asset: a,
46212
+ balanceToken: rd.variableDebtTokenAddress,
46213
+ bucket: "borrow"
46214
+ });
46215
+ });
46216
+ if (!legs.length) return {};
46217
+ const round3 = await multicallRetryUniversal({
46218
+ chain: chainId,
46219
+ abi: ABI,
46220
+ calls: [
46221
+ ...legs.flatMap((l) => [
46222
+ call(l.balanceToken, "getIncentivesController"),
46223
+ call(l.balanceToken, "totalSupply"),
46224
+ call(l.balanceToken, "decimals")
46225
+ ]),
46226
+ ...reservesList.map((a) => call(oracle, "getAssetPrice", [a]))
46227
+ ],
46228
+ allowFailure: false
46229
+ });
46230
+ const legState = legs.map((l, i) => ({
46231
+ ...l,
46232
+ controller: round3[i * 3],
46233
+ totalSupply: round3[i * 3 + 1],
46234
+ decimals: Number(round3[i * 3 + 2])
46235
+ }));
46236
+ const priceOffset = legs.length * 3;
46237
+ const priceByAsset = {};
46238
+ reservesList.forEach((a, i) => {
46239
+ priceByAsset[a.toLowerCase()] = Number(round3[priceOffset + i] ?? 0n);
46240
+ });
46241
+ const incentivised = legState.filter((l) => !isZero(l.controller));
46242
+ if (!incentivised.length) return {};
46243
+ const rewardLists = await multicallRetryUniversal({
46244
+ chain: chainId,
46245
+ abi: ABI,
46246
+ calls: incentivised.map(
46247
+ (l) => call(l.controller, "getRewardsByAsset", [l.balanceToken])
46248
+ ),
46249
+ allowFailure: false
46250
+ });
46251
+ const pairs = incentivised.flatMap(
46252
+ (l, i) => (rewardLists[i] ?? []).map((reward) => ({ leg: l, reward }))
46253
+ );
46254
+ if (!pairs.length) return {};
46255
+ const round5 = await multicallRetryUniversal({
46256
+ chain: chainId,
46257
+ abi: ABI,
46258
+ calls: pairs.flatMap((p) => [
46259
+ call(p.leg.controller, "getRewardsData", [p.leg.balanceToken, p.reward]),
46260
+ call(p.reward, "decimals"),
46261
+ call(oracle, "getAssetPrice", [p.reward])
46262
+ ]),
46263
+ allowFailure: false
46264
+ });
46265
+ const result = {};
46266
+ pairs.forEach((p, i) => {
46267
+ const data = round5[i * 3];
46268
+ if (!data) return;
46269
+ const apr = rebateApr({
46270
+ emissionPerSecond: BigInt(data[1] ?? 0),
46271
+ distributionEnd: BigInt(data[3] ?? 0),
46272
+ rewardDecimals: Number(round5[i * 3 + 1] ?? 18),
46273
+ rewardPrice: Number(round5[i * 3 + 2] ?? 0n),
46274
+ balanceTotalSupply: BigInt(p.leg.totalSupply ?? 0),
46275
+ balanceDecimals: p.leg.decimals,
46276
+ assetPrice: priceByAsset[p.leg.asset] ?? 0,
46277
+ nowSeconds
46278
+ });
46279
+ if (!(apr > 0)) return;
46280
+ if (!result[chainId]) result[chainId] = {};
46281
+ if (!result[chainId][lender]) result[chainId][lender] = {};
46282
+ if (!result[chainId][lender][p.leg.asset])
46283
+ result[chainId][lender][p.leg.asset] = emptyReward2();
46284
+ const entry = result[chainId][lender][p.leg.asset];
46285
+ const breakdown = {
46286
+ tokenAddress: p.reward.toLowerCase(),
46287
+ emissionPerSecond: String(data[1]),
46288
+ distributionEnd: Number(data[3]),
46289
+ distributionType: "aave-incentives"
46290
+ };
46291
+ if (p.leg.bucket === "deposit") {
46292
+ entry.deposit += apr;
46293
+ entry.additionalDepositData.push(breakdown);
46294
+ } else {
46295
+ entry.borrow += apr;
46296
+ entry.additionalBorrowData.push(breakdown);
46297
+ }
46298
+ });
46299
+ return result;
46300
+ }
46301
+ var dtrinityRebateRewardFetcher = {
46302
+ label: "DTRINITY_REBATE",
46303
+ fetch: async () => {
46304
+ const nowSeconds = Math.floor(Date.now() / 1e3);
46305
+ const results = await Promise.all(
46306
+ DLEND_POOLS.map(async ({ chainId, lender, pool }) => {
46307
+ try {
46308
+ return await fetchForPool(chainId, lender, pool, nowSeconds);
46309
+ } catch (e) {
46310
+ console.error(`dTRINITY: rebate read failed on chain ${chainId}:`, e);
46311
+ return {};
46312
+ }
46313
+ })
46314
+ );
46315
+ const merged = {};
46316
+ for (const r of results) {
46317
+ for (const [chainId, lenders] of Object.entries(r)) {
46318
+ if (!merged[chainId]) merged[chainId] = {};
46319
+ for (const [lender, assets] of Object.entries(lenders)) {
46320
+ if (!merged[chainId][lender]) merged[chainId][lender] = {};
46321
+ Object.assign(merged[chainId][lender], assets);
46322
+ }
46323
+ }
46324
+ }
46325
+ return merged;
46326
+ }
46327
+ };
45109
46328
 
45110
46329
  // src/yields/rewards/fetchLenderRewards.ts
45111
46330
  function mergeRewardResults(target, source) {
@@ -45120,7 +46339,8 @@ function mergeRewardResults(target, source) {
45120
46339
  var rewardFetchers = [
45121
46340
  aaveMerklRewardFetcher,
45122
46341
  eulerMerklRewardFetcher,
45123
- morphoCollateralMerklRewardFetcher
46342
+ morphoCollateralMerklRewardFetcher,
46343
+ dtrinityRebateRewardFetcher
45124
46344
  ];
45125
46345
  async function fetchLenderRewards() {
45126
46346
  const results = await Promise.all(
@@ -45872,7 +47092,7 @@ function getLiquityCalls(chainId) {
45872
47092
  }
45873
47093
  function parseLiquityResults(data, meta, context) {
45874
47094
  const { chainId } = context;
45875
- const key = liquityLenderKey(meta.lender, chainId, meta.collIndex);
47095
+ const key2 = liquityLenderKey(meta.lender, chainId, meta.collIndex);
45876
47096
  const entries = [];
45877
47097
  const raw = data?.[0];
45878
47098
  const price2 = typeof raw === "bigint" ? raw : raw != null && raw !== "0x" ? BigInt(raw) : 0n;
@@ -45886,8 +47106,8 @@ function parseLiquityResults(data, meta, context) {
45886
47106
  asset: meta.collToken,
45887
47107
  price: collUSD,
45888
47108
  priceUSD: collUSD,
45889
- marketUid: createMarketUid(chainId, key, meta.collToken),
45890
- targetLender: key,
47109
+ marketUid: createMarketUid(chainId, key2, meta.collToken),
47110
+ targetLender: key2,
45891
47111
  description: "Liquity branch PriceFeed (USD)"
45892
47112
  });
45893
47113
  }
@@ -45896,8 +47116,8 @@ function parseLiquityResults(data, meta, context) {
45896
47116
  asset: meta.debtToken,
45897
47117
  price: 1,
45898
47118
  priceUSD: 1,
45899
- marketUid: createMarketUid(chainId, key, meta.debtToken),
45900
- targetLender: key,
47119
+ marketUid: createMarketUid(chainId, key2, meta.debtToken),
47120
+ targetLender: key2,
45901
47121
  description: "Liquity stablecoin (par)",
45902
47122
  staticBase: true,
45903
47123
  baseAsset: meta.debtToken
@@ -45941,7 +47161,7 @@ function getRiverCalls(chainId) {
45941
47161
  }
45942
47162
  function parseRiverResults(data, meta, context) {
45943
47163
  const { chainId } = context;
45944
- const key = riverLenderKey(meta.lender, chainId, meta.index);
47164
+ const key2 = riverLenderKey(meta.lender, chainId, meta.index);
45945
47165
  const entries = [];
45946
47166
  const raw = data?.[0];
45947
47167
  const price2 = typeof raw === "bigint" ? raw : raw != null && raw !== "0x" ? BigInt(raw) : 0n;
@@ -45951,8 +47171,8 @@ function parseRiverResults(data, meta, context) {
45951
47171
  asset: meta.collToken,
45952
47172
  price: collUSD,
45953
47173
  priceUSD: collUSD,
45954
- marketUid: createMarketUid(chainId, key, meta.collToken),
45955
- targetLender: key,
47174
+ marketUid: createMarketUid(chainId, key2, meta.collToken),
47175
+ targetLender: key2,
45956
47176
  description: "River TroveManager oracle (USD)"
45957
47177
  });
45958
47178
  }
@@ -45961,8 +47181,8 @@ function parseRiverResults(data, meta, context) {
45961
47181
  asset: meta.debtToken,
45962
47182
  price: 1,
45963
47183
  priceUSD: 1,
45964
- marketUid: createMarketUid(chainId, key, meta.debtToken),
45965
- targetLender: key,
47184
+ marketUid: createMarketUid(chainId, key2, meta.debtToken),
47185
+ targetLender: key2,
45966
47186
  description: "River satUSD (par)",
45967
47187
  staticBase: true,
45968
47188
  baseAsset: meta.debtToken
@@ -45978,6 +47198,82 @@ var riverFetcher = {
45978
47198
  parse: parseRiverResults,
45979
47199
  getAbi: getRiverAbi
45980
47200
  };
47201
+ var READS_PER_ASSET = 2;
47202
+ function getCurvanceCalls(chainId) {
47203
+ const results = [];
47204
+ for (const lender of curvanceLendersByChain(chainId)) {
47205
+ const cfg = curvanceConfigFor(lender, chainId);
47206
+ const oracleManager = cfg?.oracleManager;
47207
+ if (!oracleManager) continue;
47208
+ const roster = getCurvanceAssetRoster(chainId, lender);
47209
+ for (const market of roster) {
47210
+ if (market.assets.length === 0) continue;
47211
+ const calls = market.assets.flatMap((asset) => [
47212
+ {
47213
+ address: oracleManager,
47214
+ name: "getPrice",
47215
+ params: [asset, true, true]
47216
+ },
47217
+ {
47218
+ address: oracleManager,
47219
+ name: "getPrice",
47220
+ params: [asset, true, false]
47221
+ }
47222
+ ]);
47223
+ results.push({
47224
+ calls,
47225
+ meta: {
47226
+ lender,
47227
+ chainId,
47228
+ marketManager: market.marketManager,
47229
+ assets: market.assets
47230
+ },
47231
+ lender: curvanceLenderKey(lender, chainId, market.marketManager)
47232
+ });
47233
+ }
47234
+ }
47235
+ return results;
47236
+ }
47237
+ function parseCurvanceResults(data, meta, context) {
47238
+ const { chainId } = context;
47239
+ const key2 = curvanceLenderKey(meta.lender, chainId, meta.marketManager);
47240
+ const entries = [];
47241
+ meta.assets.forEach((asset, i) => {
47242
+ const lowerRes = data?.[i * READS_PER_ASSET];
47243
+ const upperRes = data?.[i * READS_PER_ASSET + 1];
47244
+ const lower3 = decode(lowerRes);
47245
+ const upper = decode(upperRes);
47246
+ if (!lower3 || lower3.errorCode !== 0n) return;
47247
+ const priceUSD = Number(lower3.price) / 1e18;
47248
+ if (!(priceUSD > 0 && priceUSD < 1e9)) return;
47249
+ const upperUSD = upper && upper.errorCode === 0n ? Number(upper.price) / 1e18 : void 0;
47250
+ entries.push({
47251
+ asset,
47252
+ price: priceUSD,
47253
+ priceUSD,
47254
+ marketUid: createMarketUid(chainId, key2, asset),
47255
+ targetLender: key2,
47256
+ description: upperUSD && upperUSD !== priceUSD ? "Curvance OracleManager (USD, pessimistic-low; dual feed)" : "Curvance OracleManager (USD)"
47257
+ });
47258
+ });
47259
+ return entries;
47260
+ }
47261
+ function decode(v) {
47262
+ if (!Array.isArray(v) || v.length < 2) return void 0;
47263
+ try {
47264
+ return { price: BigInt(v[0]), errorCode: BigInt(v[1]) };
47265
+ } catch {
47266
+ return void 0;
47267
+ }
47268
+ }
47269
+ function getCurvanceAbi() {
47270
+ return CurvanceOracleManagerAbi;
47271
+ }
47272
+ var curvanceFetcher = {
47273
+ getCalls: getCurvanceCalls,
47274
+ parse: parseCurvanceResults,
47275
+ getAbi: getCurvanceAbi
47276
+ };
45981
47277
  function getInverseCalls(chainId) {
45982
47278
  const results = [];
45983
47279
  for (const lender of inverseLendersByChain(chainId)) {
@@ -46011,7 +47307,7 @@ function getInverseCalls(chainId) {
46011
47307
  }
46012
47308
  function parseInverseResults(data, meta, context) {
46013
47309
  const { chainId } = context;
46014
- const key = inverseLenderKey(meta.lender, meta.market);
47310
+ const key2 = inverseLenderKey(meta.lender, meta.market);
46015
47311
  const entries = [];
46016
47312
  const raw = data?.[0];
46017
47313
  const price2 = typeof raw === "bigint" ? raw : raw != null && raw !== "0x" ? BigInt(raw) : 0n;
@@ -46021,8 +47317,8 @@ function parseInverseResults(data, meta, context) {
46021
47317
  asset: meta.collToken,
46022
47318
  price: collUSD,
46023
47319
  priceUSD: collUSD,
46024
- marketUid: createMarketUid(chainId, key, meta.collToken),
46025
- targetLender: key,
47320
+ marketUid: createMarketUid(chainId, key2, meta.collToken),
47321
+ targetLender: key2,
46026
47322
  description: "Inverse FiRM pessimistic oracle (USD, ~2-day low)"
46027
47323
  });
46028
47324
  }
@@ -46031,8 +47327,8 @@ function parseInverseResults(data, meta, context) {
46031
47327
  asset: meta.dola,
46032
47328
  price: 1,
46033
47329
  priceUSD: 1,
46034
- marketUid: createMarketUid(chainId, key, meta.dola),
46035
- targetLender: key,
47330
+ marketUid: createMarketUid(chainId, key2, meta.dola),
47331
+ targetLender: key2,
46036
47332
  description: "Inverse DOLA (par)",
46037
47333
  staticBase: true,
46038
47334
  baseAsset: meta.dola
@@ -46083,8 +47379,8 @@ function parseTellerResults(data, meta, context) {
46083
47379
  const collateral = meta.collateral;
46084
47380
  const lenderKey = tellerLenderKey(meta.pool);
46085
47381
  const usdOf = (addr2) => {
46086
- const key = tokenList?.[addr2]?.assetGroup ?? `${chainId}-${addr2}`;
46087
- return usdPrices[key] ?? usdPrices[addr2];
47382
+ const key2 = tokenList?.[addr2]?.assetGroup ?? `${chainId}-${addr2}`;
47383
+ return usdPrices[key2] ?? usdPrices[addr2];
46088
47384
  };
46089
47385
  const principalUSD = usdOf(principal);
46090
47386
  const collateralUSD = usdOf(collateral);
@@ -46709,11 +48005,11 @@ function getAaveV4OracleGroups(chainId) {
46709
48005
  for (const entry of oracleEntries) {
46710
48006
  if (!entry?.oracle || entry.oracle === "0x") continue;
46711
48007
  if (!entry.spoke) continue;
46712
- const key = entry.oracle.toLowerCase();
46713
- let group = byOracle.get(key);
48008
+ const key2 = entry.oracle.toLowerCase();
48009
+ let group = byOracle.get(key2);
46714
48010
  if (!group) {
46715
48011
  group = { decimals: entry.decimals ?? 8, entries: [] };
46716
- byOracle.set(key, group);
48012
+ byOracle.set(key2, group);
46717
48013
  }
46718
48014
  group.entries.push({
46719
48015
  underlying: entry.underlying.toLowerCase(),
@@ -46808,7 +48104,7 @@ var SiloOracleAbi = [
46808
48104
  type: "function"
46809
48105
  }
46810
48106
  ];
46811
- var ZERO_ADDRESS5 = "0x0000000000000000000000000000000000000000";
48107
+ var ZERO_ADDRESS6 = "0x0000000000000000000000000000000000000000";
46812
48108
  function lookupUSD(context, asset) {
46813
48109
  const lc = asset.toLowerCase();
46814
48110
  const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
@@ -46820,7 +48116,7 @@ function getSiloV2Calls(chainId) {
46820
48116
  const tokensWithRealOracle = /* @__PURE__ */ new Set();
46821
48117
  for (const market of allMarkets) {
46822
48118
  for (const half of [market.silo0, market.silo1]) {
46823
- if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS5) {
48119
+ if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS6) {
46824
48120
  tokensWithRealOracle.add(half.token.toLowerCase());
46825
48121
  }
46826
48122
  }
@@ -46833,7 +48129,7 @@ function getSiloV2Calls(chainId) {
46833
48129
  const lenderKey = siloV2LenderKey(market.siloConfig);
46834
48130
  const halves = [market.silo0, market.silo1];
46835
48131
  const isStatic = halves.map(
46836
- (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS5
48132
+ (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS6
46837
48133
  );
46838
48134
  if (isStatic[0] && isStatic[1]) {
46839
48135
  const t0 = halves[0].token.toLowerCase();
@@ -46853,7 +48149,7 @@ function getSiloV2Calls(chainId) {
46853
48149
  decimals: half.decimals,
46854
48150
  silo: half.silo.toLowerCase(),
46855
48151
  lenderKey,
46856
- oracle: ZERO_ADDRESS5,
48152
+ oracle: ZERO_ADDRESS6,
46857
48153
  partnerToken: partnerLc,
46858
48154
  isStatic: true
46859
48155
  });
@@ -46977,7 +48273,7 @@ var SiloOracleAbi2 = [
46977
48273
  type: "function"
46978
48274
  }
46979
48275
  ];
46980
- var ZERO_ADDRESS6 = "0x0000000000000000000000000000000000000000";
48276
+ var ZERO_ADDRESS7 = "0x0000000000000000000000000000000000000000";
46981
48277
  function lookupUSD2(context, asset) {
46982
48278
  const lc = asset.toLowerCase();
46983
48279
  const groupKey = context.tokenList?.[lc]?.assetGroup ?? `${context.chainId}-${lc}`;
@@ -46989,7 +48285,7 @@ function getSiloV3Calls(chainId) {
46989
48285
  const tokensWithRealOracle = /* @__PURE__ */ new Set();
46990
48286
  for (const market of allMarkets) {
46991
48287
  for (const half of [market.silo0, market.silo1]) {
46992
- if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS6) {
48288
+ if (half.solvencyOracle && half.solvencyOracle !== ZERO_ADDRESS7) {
46993
48289
  tokensWithRealOracle.add(half.token.toLowerCase());
46994
48290
  }
46995
48291
  }
@@ -47002,7 +48298,7 @@ function getSiloV3Calls(chainId) {
47002
48298
  const lenderKey = siloV3LenderKey(market.siloConfig);
47003
48299
  const halves = [market.silo0, market.silo1];
47004
48300
  const isStatic = halves.map(
47005
- (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS6
48301
+ (h) => !h.solvencyOracle || h.solvencyOracle === ZERO_ADDRESS7
47006
48302
  );
47007
48303
  if (isStatic[0] && isStatic[1]) {
47008
48304
  const t0 = halves[0].token.toLowerCase();
@@ -47022,7 +48318,7 @@ function getSiloV3Calls(chainId) {
47022
48318
  decimals: half.decimals,
47023
48319
  silo: half.silo.toLowerCase(),
47024
48320
  lenderKey,
47025
- oracle: ZERO_ADDRESS6,
48321
+ oracle: ZERO_ADDRESS7,
47026
48322
  partnerToken: partnerLc,
47027
48323
  isStatic: true
47028
48324
  });
@@ -47219,8 +48515,8 @@ function parseGearboxV3Results(data, _meta, context) {
47219
48515
  const markets = data[0];
47220
48516
  if (!Array.isArray(markets) || markets.length === 0) return entries;
47221
48517
  const resolvePriceUSD = (token) => {
47222
- const key = tokenList?.[token]?.assetGroup ?? `${chainId}-${token}`;
47223
- return usdPrices[key] ?? usdPrices[token];
48518
+ const key2 = tokenList?.[token]?.assetGroup ?? `${chainId}-${token}`;
48519
+ return usdPrices[key2] ?? usdPrices[token];
47224
48520
  };
47225
48521
  for (const m of markets) {
47226
48522
  try {
@@ -47401,7 +48697,7 @@ function lookupUSD3(context, asset) {
47401
48697
  return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
47402
48698
  }
47403
48699
  function parseSiloV2GraphQLResults(items, context) {
47404
- const ZERO_ADDRESS8 = "0x0000000000000000000000000000000000000000";
48700
+ const ZERO_ADDRESS9 = "0x0000000000000000000000000000000000000000";
47405
48701
  const out = [];
47406
48702
  const seen = /* @__PURE__ */ new Set();
47407
48703
  for (const item of items) {
@@ -47424,8 +48720,8 @@ function parseSiloV2GraphQLResults(items, context) {
47424
48720
  const partnerTokenLc = other.token.toLowerCase();
47425
48721
  const dedupKey = `${lenderKey}:${tokenLc}`;
47426
48722
  if (seen.has(dedupKey)) continue;
47427
- const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS8).toLowerCase();
47428
- const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS8;
48723
+ const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS9).toLowerCase();
48724
+ const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS9;
47429
48725
  const siloAddrLc = self.silo.toLowerCase();
47430
48726
  try {
47431
48727
  let priceUSD = 0;
@@ -47543,7 +48839,7 @@ function lookupUSD4(context, asset) {
47543
48839
  return context.usdPrices[groupKey] ?? context.usdPrices[lc] ?? 0;
47544
48840
  }
47545
48841
  function parseSiloV3GraphQLResults(items, context) {
47546
- const ZERO_ADDRESS8 = "0x0000000000000000000000000000000000000000";
48842
+ const ZERO_ADDRESS9 = "0x0000000000000000000000000000000000000000";
47547
48843
  const out = [];
47548
48844
  const seen = /* @__PURE__ */ new Set();
47549
48845
  for (const item of items) {
@@ -47566,8 +48862,8 @@ function parseSiloV3GraphQLResults(items, context) {
47566
48862
  const partnerTokenLc = other.token.toLowerCase();
47567
48863
  const dedupKey = `${lenderKey}:${tokenLc}`;
47568
48864
  if (seen.has(dedupKey)) continue;
47569
- const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS8).toLowerCase();
47570
- const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS8;
48865
+ const oracleAddr = (side.solvencyOracleAddress ?? side.solvencyOracle?.id ?? self.solvencyOracle ?? ZERO_ADDRESS9).toLowerCase();
48866
+ const isStatic = !oracleAddr || oracleAddr === ZERO_ADDRESS9;
47571
48867
  const siloAddrLc = self.silo.toLowerCase();
47572
48868
  try {
47573
48869
  let priceUSD = 0;
@@ -47689,7 +48985,7 @@ var AGGREGATOR_ABI = [...ChainlinkAggregatorAbi, ...DESCRIPTION_ABI];
47689
48985
  function isFailed(r) {
47690
48986
  return r === "0x" || r === void 0 || r === null;
47691
48987
  }
47692
- var ZERO_ADDRESS7 = "0x0000000000000000000000000000000000000000";
48988
+ var ZERO_ADDRESS8 = "0x0000000000000000000000000000000000000000";
47693
48989
  async function probeAaveFeedTimestamps(chainId, options = {}) {
47694
48990
  const { rpcOverrides, batchSize, retries = 2 } = options;
47695
48991
  const result = {};
@@ -47726,7 +49022,7 @@ async function probeAaveFeedTimestamps(chainId, options = {}) {
47726
49022
  const raw = sourceResults[i];
47727
49023
  if (isFailed(raw)) return;
47728
49024
  const source = String(raw).toLowerCase();
47729
- if (source === ZERO_ADDRESS7) return;
49025
+ if (source === ZERO_ADDRESS8) return;
47730
49026
  sourceOf.set(i, source);
47731
49027
  if (!sourceIndex.has(source)) {
47732
49028
  sourceIndex.set(source, uniqueSources.length);
@@ -47900,6 +49196,12 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
47900
49196
  if (isActive("termmax") && termMaxConfigByChain(chainId)) {
47901
49197
  await fetchTermMaxMarkets(chainId).catch(() => []);
47902
49198
  }
49199
+ if (isActive("curvance")) {
49200
+ for (const lender of curvanceLendersByChain(chainId)) {
49201
+ if (getCurvanceAssetRoster(chainId, lender).length > 0) continue;
49202
+ await fetchCurvanceMarkets(lender, chainId).catch(() => void 0);
49203
+ }
49204
+ }
47903
49205
  const aaveResults = isActive("aave") ? safeGetCalls(
47904
49206
  "aave",
47905
49207
  () => aaveFetcher.getCalls(chainId),
@@ -47969,6 +49271,11 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
47969
49271
  () => riverFetcher.getCalls(chainId),
47970
49272
  getCallsErrors
47971
49273
  ) : [];
49274
+ const curvanceResults = isActive("curvance") ? safeGetCalls(
49275
+ "curvance",
49276
+ () => curvanceFetcher.getCalls(chainId),
49277
+ getCallsErrors
49278
+ ) : [];
47972
49279
  const inverseResults = isActive("inverse") ? safeGetCalls(
47973
49280
  "inverse",
47974
49281
  () => inverseFetcher.getCalls(chainId),
@@ -48093,6 +49400,13 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
48093
49400
  getRiverAbi(),
48094
49401
  "direct"
48095
49402
  );
49403
+ const curvanceGroup = buildGroup(
49404
+ "curvance",
49405
+ curvanceResults,
49406
+ curvanceFetcher.parse,
49407
+ curvanceFetcher.getAbi(),
49408
+ "direct"
49409
+ );
48096
49410
  const inverseGroup = buildGroup(
48097
49411
  "inverse",
48098
49412
  inverseResults,
@@ -48164,6 +49478,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
48164
49478
  termGroup,
48165
49479
  liquityGroup,
48166
49480
  riverGroup,
49481
+ curvanceGroup,
48167
49482
  inverseGroup,
48168
49483
  tellerGroup,
48169
49484
  termMaxGroup,
@@ -48212,6 +49527,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
48212
49527
  termData,
48213
49528
  liquityData,
48214
49529
  riverData,
49530
+ curvanceData,
48215
49531
  inverseData,
48216
49532
  tellerData,
48217
49533
  termMaxData,
@@ -48331,6 +49647,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
48331
49647
  allowFailure,
48332
49648
  rpcOverrides
48333
49649
  ),
49650
+ executeGroup(
49651
+ curvanceGroup,
49652
+ chainId,
49653
+ chainBatchSize,
49654
+ retries,
49655
+ allowFailure,
49656
+ rpcOverrides
49657
+ ),
48334
49658
  executeGroup(
48335
49659
  inverseGroup,
48336
49660
  chainId,
@@ -48481,6 +49805,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
48481
49805
  parseTrackers(termGroup, termData.results);
48482
49806
  parseTrackers(liquityGroup, liquityData.results);
48483
49807
  parseTrackers(riverGroup, riverData.results);
49808
+ parseTrackers(curvanceGroup, curvanceData.results);
48484
49809
  parseTrackers(inverseGroup, inverseData.results);
48485
49810
  if (siloV2GqlEntries != null) {
48486
49811
  const diag2 = {
@@ -48541,8 +49866,8 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
48541
49866
  let gqlPushed = 0;
48542
49867
  for (const entry of morphoGqlEntries) {
48543
49868
  const lender = entry.targetLender ?? "MORPHO_BLUE";
48544
- const key = `${lender}|${entry.marketUid}|${entry.asset}`;
48545
- if (onChainKeys.has(key)) continue;
49869
+ const key2 = `${lender}|${entry.marketUid}|${entry.asset}`;
49870
+ if (onChainKeys.has(key2)) continue;
48546
49871
  if (!chainResult[lender]) chainResult[lender] = [];
48547
49872
  entry.derivation = resolveDerivation(entry, "derived");
48548
49873
  chainResult[lender].push(entry);
@@ -48611,9 +49936,9 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
48611
49936
  if (!entry.updatedAt || entry.updatedAt <= 0) continue;
48612
49937
  const staleSeconds = nowSeconds - entry.updatedAt;
48613
49938
  if (staleSeconds <= stalenessThresholdSeconds) continue;
48614
- const key = `${lender}|${entry.asset}|${entry.feedSource ?? ""}`;
48615
- if (reported.has(key)) continue;
48616
- reported.add(key);
49939
+ const key2 = `${lender}|${entry.asset}|${entry.feedSource ?? ""}`;
49940
+ if (reported.has(key2)) continue;
49941
+ reported.add(key2);
48617
49942
  staleFeeds.push({
48618
49943
  asset: entry.asset,
48619
49944
  lender,
@@ -48760,8 +50085,8 @@ function ewma(prev, sample) {
48760
50085
  function updateFeedStats(prev, observations, nowSeconds = Math.floor(Date.now() / 1e3)) {
48761
50086
  const next = { ...prev };
48762
50087
  for (const obs of observations) {
48763
- const key = feedStatKey(obs.chainId, obs.feedKey);
48764
- const existing = next[key];
50088
+ const key2 = feedStatKey(obs.chainId, obs.feedKey);
50089
+ const existing = next[key2];
48765
50090
  const stat = existing ? { ...existing } : {
48766
50091
  chainId: obs.chainId,
48767
50092
  feedKey: obs.feedKey,
@@ -48788,7 +50113,7 @@ function updateFeedStats(prev, observations, nowSeconds = Math.floor(Date.now()
48788
50113
  stat.deviationSamples += 1;
48789
50114
  }
48790
50115
  stat.lastObservedAt = nowSeconds;
48791
- next[key] = stat;
50116
+ next[key2] = stat;
48792
50117
  }
48793
50118
  return next;
48794
50119
  }
@@ -48881,8 +50206,8 @@ function collectFeedObservations(structuredPrices, lists = {}, guard = DEFAULT_O
48881
50206
  }
48882
50207
  function pruneFeedStats(stats, maxAgeSeconds = 30 * 24 * 3600, nowSeconds = Math.floor(Date.now() / 1e3)) {
48883
50208
  const out = {};
48884
- for (const [key, stat] of Object.entries(stats)) {
48885
- if (nowSeconds - stat.lastObservedAt <= maxAgeSeconds) out[key] = stat;
50209
+ for (const [key2, stat] of Object.entries(stats)) {
50210
+ if (nowSeconds - stat.lastObservedAt <= maxAgeSeconds) out[key2] = stat;
48886
50211
  }
48887
50212
  return out;
48888
50213
  }
@@ -51652,11 +52977,11 @@ var fetchEulerEarnVaults = async (chainId, prices = {}, tokenList = {}, multical
51652
52977
  };
51653
52978
  var warn6 = (...args) => {
51654
52979
  };
51655
- var num3 = (v) => {
52980
+ var num4 = (v) => {
51656
52981
  const n = Number(v);
51657
52982
  return Number.isFinite(n) ? n : 0;
51658
52983
  };
51659
- var big11 = (v) => {
52984
+ var big13 = (v) => {
51660
52985
  try {
51661
52986
  if (v === void 0 || v === null || v === "") return "0";
51662
52987
  const s = String(v);
@@ -51687,21 +53012,21 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
51687
53012
  const underlying = lower2(r?.asset?.contractAddress);
51688
53013
  if (!address || !underlying) continue;
51689
53014
  if (r.isEnabled === false) continue;
51690
- const assetDecimals = num3(r?.asset?.decimals) || 18;
51691
- const scale = 10 ** assetDecimals;
53015
+ const assetDecimals = num4(r?.asset?.decimals) || 18;
53016
+ const scale2 = 10 ** assetDecimals;
51692
53017
  const assetEntry = tokenList[underlying];
51693
53018
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
51694
53019
  const priceUsd = prices[priceKey];
51695
- const totalAssets = big11(r.totalAssets);
51696
- const totalSupply = big11(r.totalSupplyAmt);
51697
- const totalAssetsFormatted = Number(totalAssets) / scale;
51698
- const supplyRate = num3(r.apr) * 100;
51699
- const rewardsRate = num3(r?.incentiveData?.TMX_APR) * 100;
51700
- const rawLiquidity = BigInt(big11(r.redeemableAmt ?? r.idleFunds ?? "0"));
53020
+ const totalAssets = big13(r.totalAssets);
53021
+ const totalSupply = big13(r.totalSupplyAmt);
53022
+ const totalAssetsFormatted = Number(totalAssets) / scale2;
53023
+ const supplyRate = num4(r.apr) * 100;
53024
+ const rewardsRate = num4(r?.incentiveData?.TMX_APR) * 100;
53025
+ const rawLiquidity = BigInt(big13(r.redeemableAmt ?? r.idleFunds ?? "0"));
51701
53026
  const totalAssetsBig = BigInt(totalAssets);
51702
53027
  const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
51703
- const liquidityFormatted = Number(liquidity) / scale;
51704
- const totalSupplyValue = num3(r.totalSupplyValue);
53028
+ const liquidityFormatted = Number(liquidity) / scale2;
53029
+ const totalSupplyValue = num4(r.totalSupplyValue);
51705
53030
  out[address] = {
51706
53031
  address,
51707
53032
  underlying,
@@ -51718,8 +53043,8 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
51718
53043
  rewardsRate,
51719
53044
  depositRate: supplyRate + rewardsRate,
51720
53045
  // 1e8-scaled upstream (10000000 = 10%).
51721
- fee: num3(r.performanceFeeRate) / 1e6,
51722
- timelock: num3(r.timeLockSeconds) || void 0,
53046
+ fee: num4(r.performanceFeeRate) / 1e6,
53047
+ timelock: num4(r.timeLockSeconds) || void 0,
51723
53048
  curator: r?.curator?.curatorAddress ? lower2(r.curator.curatorAddress) : void 0,
51724
53049
  // The API is the ONLY source for this — do not derive it from `name`.
51725
53050
  curatorName: r?.curator?.name || void 0,
@@ -51733,7 +53058,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
51733
53058
  liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
51734
53059
  version: r.version,
51735
53060
  isPaused: r.isPaused === true || void 0,
51736
- supplyCap: r.capacity ? big11(r.capacity) : void 0,
53061
+ supplyCap: r.capacity ? big13(r.capacity) : void 0,
51737
53062
  basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
51738
53063
  };
51739
53064
  }
@@ -51789,7 +53114,7 @@ var Erc20DecimalsBalanceAbi = [
51789
53114
 
51790
53115
  // src/vaults/termmax/fetchFromChain.ts
51791
53116
  var DECIMAL_BASE2 = 100000000n;
51792
- var big12 = (v) => {
53117
+ var big14 = (v) => {
51793
53118
  if (v === void 0 || v === null || v === "0x") return 0n;
51794
53119
  try {
51795
53120
  return typeof v === "bigint" ? v : BigInt(v);
@@ -51797,11 +53122,11 @@ var big12 = (v) => {
51797
53122
  return 0n;
51798
53123
  }
51799
53124
  };
51800
- var num4 = (v) => {
53125
+ var num5 = (v) => {
51801
53126
  const n = Number(v);
51802
53127
  return Number.isFinite(n) ? n : void 0;
51803
53128
  };
51804
- var str = (v) => typeof v === "string" && v.length > 0 ? v : void 0;
53129
+ var str2 = (v) => typeof v === "string" && v.length > 0 ? v : void 0;
51805
53130
  var addr = (v) => typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v) && !/^0x0{40}$/.test(v) ? v.toLowerCase() : void 0;
51806
53131
  async function discoverVaultAddresses(chainId) {
51807
53132
  const markets = await fetchTermMaxMarkets(chainId).catch(() => []);
@@ -51853,24 +53178,24 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
51853
53178
  vaults.forEach((address, i) => {
51854
53179
  const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
51855
53180
  const asset = addr(at("asset"));
51856
- const totalAssets = big12(at("totalAssets"));
53181
+ const totalAssets = big14(at("totalAssets"));
51857
53182
  if (!asset || totalAssets === 0n) return;
51858
53183
  rows.push({
51859
53184
  address,
51860
- name: str(at("name")),
51861
- symbol: str(at("symbol")),
51862
- decimals: num4(at("decimals")) ?? 18,
53185
+ name: str2(at("name")),
53186
+ symbol: str2(at("symbol")),
53187
+ decimals: num5(at("decimals")) ?? 18,
51863
53188
  asset,
51864
53189
  totalAssets,
51865
- totalSupply: big12(at("totalSupply")),
51866
- annualizedInterest: big12(at("annualizedInterest")),
51867
- accretingPrincipal: big12(at("accretingPrincipal")),
51868
- performanceFeeRate: big12(at("performanceFeeRate")),
51869
- aprRaw: at("apr") != null ? big12(at("apr")) : void 0,
53190
+ totalSupply: big14(at("totalSupply")),
53191
+ annualizedInterest: big14(at("annualizedInterest")),
53192
+ accretingPrincipal: big14(at("accretingPrincipal")),
53193
+ performanceFeeRate: big14(at("performanceFeeRate")),
53194
+ aprRaw: at("apr") != null ? big14(at("apr")) : void 0,
51870
53195
  curator: addr(at("curator")),
51871
53196
  guardian: addr(at("guardian")),
51872
- timelock: num4(at("timelock")),
51873
- version: str(at("getVersion"))
53197
+ timelock: num5(at("timelock")),
53198
+ version: str2(at("getVersion"))
51874
53199
  });
51875
53200
  });
51876
53201
  if (rows.length === 0) return {};
@@ -51886,8 +53211,8 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
51886
53211
  });
51887
53212
  const out = {};
51888
53213
  rows.forEach((r, i) => {
51889
- const assetDecimals = num4(res2[i * 2]) ?? r.decimals;
51890
- const idle = big12(res2[i * 2 + 1]);
53214
+ const assetDecimals = num5(res2[i * 2]) ?? r.decimals;
53215
+ const idle = big14(res2[i * 2 + 1]);
51891
53216
  const assetEntry = tokenList[r.asset];
51892
53217
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
51893
53218
  const priceUsd = prices[priceKey];
@@ -51901,9 +53226,9 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
51901
53226
  if (r.aprRaw !== void 0 && r.aprRaw > 0n) {
51902
53227
  supplyRate = Number(r.aprRaw) / Number(DECIMAL_BASE2) * 100;
51903
53228
  }
51904
- const scale = 10 ** assetDecimals;
51905
- const totalAssetsFormatted = Number(r.totalAssets) / scale;
51906
- const liquidityFormatted = Number(idle) / scale;
53229
+ const scale2 = 10 ** assetDecimals;
53230
+ const totalAssetsFormatted = Number(r.totalAssets) / scale2;
53231
+ const liquidityFormatted = Number(idle) / scale2;
51907
53232
  const convertToAssets = r.totalSupply > 0n ? (r.totalAssets * 10n ** BigInt(r.decimals) / r.totalSupply).toString() : "0";
51908
53233
  const entry = {
51909
53234
  address: r.address,
@@ -53025,7 +54350,7 @@ var readerVedaAccountant = (entry) => {
53025
54350
  }
53026
54351
  };
53027
54352
  }
53028
- const scale = 10n ** BigInt(18 - underlyingDec);
54353
+ const scale2 = 10n ** BigInt(18 - underlyingDec);
53029
54354
  return {
53030
54355
  calls: [
53031
54356
  { address: entry.address, name: "totalSupply", params: [] },
@@ -53036,7 +54361,7 @@ var readerVedaAccountant = (entry) => {
53036
54361
  const totalSupply = toBigInt13(supply);
53037
54362
  const rawRate = toBigInt13(rate);
53038
54363
  if (totalSupply === void 0 || rawRate === void 0) return void 0;
53039
- const exchangeRate = rawRate * scale;
54364
+ const exchangeRate = rawRate * scale2;
53040
54365
  return {
53041
54366
  totalAssets: rescaleDecimals(
53042
54367
  totalSupply * exchangeRate / ONE_E189,
@@ -57640,7 +58965,7 @@ var pickApr = (apr) => {
57640
58965
  if (apr.inception != null) return { rate: apr.inception, window: "inception" };
57641
58966
  return { rate: 0, window: "none" };
57642
58967
  };
57643
- var num5 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
58968
+ var num6 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
57644
58969
  function parseVault7(v, chainId, prices, tokenList) {
57645
58970
  const address = (v?.address ?? "").toLowerCase();
57646
58971
  const assetAddr = (v?.asset?.address ?? "").toLowerCase();
@@ -57656,14 +58981,14 @@ function parseVault7(v, chainId, prices, tokenList) {
57656
58981
  parseRawAmount(totalAssetsRaw, assetDecimals)
57657
58982
  );
57658
58983
  const apr = {
57659
- weekly: num5(state.weeklyApr?.twrrNetApr),
57660
- monthly: num5(state.monthlyApr?.twrrNetApr),
57661
- yearly: num5(state.yearlyApr?.twrrNetApr),
57662
- inception: num5(state.inceptionApr?.twrrNetApr)
58984
+ weekly: num6(state.weeklyApr?.twrrNetApr),
58985
+ monthly: num6(state.monthlyApr?.twrrNetApr),
58986
+ yearly: num6(state.yearlyApr?.twrrNetApr),
58987
+ inception: num6(state.inceptionApr?.twrrNetApr)
57663
58988
  };
57664
58989
  const { rate: supplyRate, window: aprWindow } = pickApr(apr);
57665
58990
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
57666
- const apiTotalAssetsUsd = num5(state.totalAssetsUsd) ?? 0;
58991
+ const apiTotalAssetsUsd = num6(state.totalAssetsUsd) ?? 0;
57667
58992
  const impliedPriceUsd = totalAssetsFormatted > 0 ? apiTotalAssetsUsd / totalAssetsFormatted : 0;
57668
58993
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? impliedPriceUsd;
57669
58994
  const totalAssetsUsd = apiTotalAssetsUsd || totalAssetsFormatted * priceUsd;
@@ -57683,7 +59008,7 @@ function parseVault7(v, chainId, prices, tokenList) {
57683
59008
  totalAssets: totalAssetsRaw,
57684
59009
  totalSupply: totalSupplyRaw,
57685
59010
  pricePerShare: state.pricePerShare?.toString() ?? "0",
57686
- pricePerShareUsd: num5(state.pricePerShareUsd) ?? void 0,
59011
+ pricePerShareUsd: num6(state.pricePerShareUsd) ?? void 0,
57687
59012
  supplyRate,
57688
59013
  rewardsRate: 0,
57689
59014
  depositRate: supplyRate,
@@ -57880,7 +59205,7 @@ var toBigInt16 = (v) => {
57880
59205
  }
57881
59206
  return void 0;
57882
59207
  };
57883
- var num6 = (v) => {
59208
+ var num7 = (v) => {
57884
59209
  const n = Number(v);
57885
59210
  return Number.isFinite(n) ? n : 0;
57886
59211
  };
@@ -57937,12 +59262,12 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
57937
59262
  const totalAssets = toBigInt16(slice2[0]) ?? totalSupply * convertToAssets / shareUnit;
57938
59263
  const totalAssetsFormatted = Number(totalAssets) / 10 ** assetDecimals;
57939
59264
  const asset = tokenList[underlyingLc];
57940
- const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num6(v.balance.usdPerToken) : void 0);
59265
+ const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num7(v.balance.usdPerToken) : void 0);
57941
59266
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
57942
- const supplyRate = num6(v.vaultApr?.formatted);
59267
+ const supplyRate = num7(v.vaultApr?.formatted);
57943
59268
  const rewardsRate = 0;
57944
59269
  const depositRate = supplyRate + rewardsRate;
57945
- const fee = num6(v.fee?.value);
59270
+ const fee = num7(v.fee?.value);
57946
59271
  const symbol = (v.shareSymbol ?? "").trim();
57947
59272
  const shareName = (v.shareName ?? "").trim();
57948
59273
  const name = shareName || symbol;
@@ -57979,7 +59304,7 @@ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList
57979
59304
  };
57980
59305
 
57981
59306
  // src/vaults/upshift/fetchPublic.ts
57982
- var num7 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
59307
+ var num8 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
57983
59308
  var isEvmAddress = (a) => /^0x[0-9a-fA-F]{40}$/.test(a);
57984
59309
  var derivePricePerShare = (totalAssetsRaw, totalSupplyRaw, shareDecimals) => {
57985
59310
  try {
@@ -58006,12 +59331,12 @@ function parseVault8(v, chainId, prices, tokenList) {
58006
59331
  const totalAssetsFormatted = Number(
58007
59332
  parseRawAmount(totalAssetsRaw, assetDecimals)
58008
59333
  );
58009
- const base = num7(v.apy?.apy) ?? 0;
58010
- const campaign = num7(v.apy?.campaignApy);
59334
+ const base = num8(v.apy?.apy) ?? 0;
59335
+ const campaign = num8(v.apy?.campaignApy);
58011
59336
  const supplyRate = apyToAprPercent(base);
58012
59337
  const rewardsRate = campaign != null ? apyToAprPercent(campaign) : 0;
58013
59338
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
58014
- const apiTvlUsd = num7(v.latest_reported_tvl) ?? 0;
59339
+ const apiTvlUsd = num8(v.latest_reported_tvl) ?? 0;
58015
59340
  const impliedPriceUsd = totalAssetsFormatted > 0 ? apiTvlUsd / totalAssetsFormatted : 0;
58016
59341
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? impliedPriceUsd;
58017
59342
  const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
@@ -58036,10 +59361,10 @@ function parseVault8(v, chainId, prices, tokenList) {
58036
59361
  rewardsRate,
58037
59362
  depositRate: supplyRate + rewardsRate,
58038
59363
  apy: {
58039
- base: num7(v.apy?.apy),
59364
+ base: num8(v.apy?.apy),
58040
59365
  campaign,
58041
- points: num7(v.apy?.pointsApy),
58042
- underlying: num7(v.apy?.underlyingApy)
59366
+ points: num8(v.apy?.pointsApy),
59367
+ underlying: num8(v.apy?.underlyingApy)
58043
59368
  },
58044
59369
  isDepositPaused: v.isDepositPaused ?? false,
58045
59370
  isWithdrawalPaused: v.isWithdrawalPaused ?? false,
@@ -58148,9 +59473,9 @@ var asBig = (v) => {
58148
59473
  return null;
58149
59474
  }
58150
59475
  };
58151
- var num8 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
59476
+ var num9 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
58152
59477
  var toPct = (v) => {
58153
- const n = num8(v);
59478
+ const n = num9(v);
58154
59479
  return n == null ? 0 : n * 100;
58155
59480
  };
58156
59481
  var deriveTotalSupply = (totalAssetsRaw, pricePerShareRaw, decimals) => {
@@ -58159,8 +59484,8 @@ var deriveTotalSupply = (totalAssetsRaw, pricePerShareRaw, decimals) => {
58159
59484
  if (assets === 0n) return "0";
58160
59485
  const pps = BigInt(pricePerShareRaw || "0");
58161
59486
  if (pps <= 0n) return totalAssetsRaw;
58162
- const scale = 10n ** BigInt(decimals);
58163
- return (assets * scale / pps).toString();
59487
+ const scale2 = 10n ** BigInt(decimals);
59488
+ return (assets * scale2 / pps).toString();
58164
59489
  } catch {
58165
59490
  return totalAssetsRaw || "0";
58166
59491
  }
@@ -58182,16 +59507,16 @@ function parseVault9(v, chainId, prices, tokenList) {
58182
59507
  const totalAssetsFormatted = Number(
58183
59508
  parseRawAmount(totalAssetsRaw, assetDecimals)
58184
59509
  );
58185
- const realized = num8(v.apr?.netAPR);
58186
- const forward = num8(v.apr?.forwardAPR?.netAPR);
59510
+ const realized = num9(v.apr?.netAPR);
59511
+ const forward = num9(v.apr?.forwardAPR?.netAPR);
58187
59512
  const isForwardApr = realized == null && forward != null;
58188
59513
  const supplyRate = toPct(realized ?? forward);
58189
59514
  const rewardsRate = toPct(v.apr?.extra?.stakingRewardsAPR);
58190
59515
  const fee = toPct(v.apr?.fees?.performance);
58191
59516
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
58192
- const apiPrice = num8(v.tvl?.price) ?? 0;
59517
+ const apiPrice = num9(v.tvl?.price) ?? 0;
58193
59518
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? apiPrice;
58194
- const apiTvlUsd = num8(v.tvl?.tvl) ?? 0;
59519
+ const apiTvlUsd = num9(v.tvl?.tvl) ?? 0;
58195
59520
  const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
58196
59521
  const name = (v.name ?? "").trim();
58197
59522
  const symbol = (v.symbol ?? "").trim();
@@ -58579,8 +59904,8 @@ var isStablecoinSymbol = (symbol) => {
58579
59904
  return s.includes("USD");
58580
59905
  };
58581
59906
  var classifyVault = (input) => {
58582
- const key = `${input.chainId}-${input.address.toLowerCase()}`;
58583
- const yieldProfile = VOLATILE_VAULT_OVERRIDES.has(key) || VOLATILE_PROVIDERS.has(input.provider) ? "volatile" : "yield-bearing";
59907
+ const key2 = `${input.chainId}-${input.address.toLowerCase()}`;
59908
+ const yieldProfile = VOLATILE_VAULT_OVERRIDES.has(key2) || VOLATILE_PROVIDERS.has(input.provider) ? "volatile" : "yield-bearing";
58584
59909
  const denomination = isStablecoinSymbol(input.underlyingSymbol) ? "stable" : "volatile";
58585
59910
  return { yieldProfile, denomination };
58586
59911
  };
@@ -59128,10 +60453,10 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
59128
60453
  const market = m.marketToken;
59129
60454
  const long = m.longToken;
59130
60455
  const short = m.shortToken;
59131
- const get = (key) => ({
60456
+ const get = (key2) => ({
59132
60457
  address: c.dataStore,
59133
60458
  name: "getUint",
59134
- params: [key]
60459
+ params: [key2]
59135
60460
  });
59136
60461
  return [
59137
60462
  get(maxPoolAmountKey(market, long)),
@@ -59179,23 +60504,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
59179
60504
  const indexMax = price(prices, m.indexToken)?.max;
59180
60505
  if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
59181
60506
  const base = i * SLOTS;
59182
- const big13 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
60507
+ const big15 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
59183
60508
  const cap = computeDepositCapacityUsd(
59184
- [info?.longTokenAmount, longMax, big13(0), big13(2)],
59185
- [info?.shortTokenAmount, shortMax, big13(1), big13(3)]
60509
+ [info?.longTokenAmount, longMax, big15(0), big15(2)],
60510
+ [info?.shortTokenAmount, shortMax, big15(1), big15(3)]
59186
60511
  );
59187
60512
  if (cap != null) value.depositCapacityUsd = cap;
59188
60513
  if (indexMax != null) {
59189
60514
  const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
59190
- const reservedUsdLong = (big13(4) + big13(5)) / divisor * indexMax;
59191
- const reservedUsdShort = (big13(6) + big13(7)) / divisor;
60515
+ const reservedUsdLong = (big15(4) + big15(5)) / divisor * indexMax;
60516
+ const reservedUsdShort = (big15(6) + big15(7)) / divisor;
59192
60517
  const liq = computeLiquidityUsd(
59193
60518
  info?.longTokenUsd,
59194
60519
  info?.shortTokenUsd,
59195
60520
  reservedUsdLong,
59196
60521
  reservedUsdShort,
59197
- big13(8),
59198
- big13(9)
60522
+ big15(8),
60523
+ big15(9)
59199
60524
  );
59200
60525
  if (liq != null)
59201
60526
  value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
@@ -59382,10 +60707,10 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
59382
60707
  try {
59383
60708
  res = await multicallRetry({
59384
60709
  chain: chainId,
59385
- calls: keys.map((key) => ({
60710
+ calls: keys.map((key2) => ({
59386
60711
  address: c.dataStore,
59387
60712
  name: "getUint",
59388
- params: [key]
60713
+ params: [key2]
59389
60714
  })),
59390
60715
  abi: GmxDataStoreUintAbi,
59391
60716
  maxRetries: 3,
@@ -59394,27 +60719,27 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
59394
60719
  } catch {
59395
60720
  return void 0;
59396
60721
  }
59397
- const big13 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
59398
- const base = big13(0);
59399
- const mult = big13(1);
60722
+ const big15 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
60723
+ const base = big15(0);
60724
+ const mult = big15(1);
59400
60725
  if (base === 0n && mult === 0n) return void 0;
59401
60726
  const PRECISION = 10n ** 30n;
59402
60727
  const adjusted = (opGas) => base + opGas * mult / PRECISION;
59403
60728
  const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
59404
- const glvExtra = big13(6) * GLV_NOMINAL_MARKET_COUNT;
60729
+ const glvExtra = big15(6) * GLV_NOMINAL_MARKET_COUNT;
59405
60730
  return {
59406
60731
  chainId,
59407
60732
  gasPriceWei: gasPriceWei.toString(),
59408
- deposit: fee(big13(2)),
59409
- withdrawal: fee(big13(3)),
59410
- glvDeposit: fee(big13(4) + glvExtra),
59411
- glvWithdrawal: fee(big13(5) + glvExtra)
60733
+ deposit: fee(big15(2)),
60734
+ withdrawal: fee(big15(3)),
60735
+ glvDeposit: fee(big15(4) + glvExtra),
60736
+ glvWithdrawal: fee(big15(5) + glvExtra)
59412
60737
  };
59413
60738
  };
59414
60739
 
59415
60740
  // src/vaults/gmx/fetchPublic.ts
59416
60741
  var GMX_TOKEN_DECIMALS = 18;
59417
- var num9 = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
60742
+ var num10 = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
59418
60743
  var minDefined = (a, b) => a == null ? b : b == null ? a : Math.min(a, b);
59419
60744
  var glvMarketRoomUsd = (cap, priceUsd) => {
59420
60745
  const currentUsd = Number(cap.balanceAmount) / 1e18 * priceUsd;
@@ -59448,37 +60773,37 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
59448
60773
  indexToken: indexToken ? indexToken.toLowerCase() : void 0,
59449
60774
  longSymbol,
59450
60775
  shortSymbol,
59451
- apy: num9(entry?.apy),
59452
- baseApy: num9(entry?.baseApy),
59453
- bonusApr: num9(entry?.bonusApr),
60776
+ apy: num10(entry?.apy),
60777
+ baseApy: num10(entry?.baseApy),
60778
+ bonusApr: num10(entry?.bonusApr),
59454
60779
  yieldProfile: "volatile",
59455
60780
  denomination: denominationFor(longSymbol, shortSymbol)
59456
60781
  };
59457
60782
  };
59458
60783
  for (const m of markets) {
59459
60784
  if (!m.isListed) continue;
59460
- const key = m.marketToken.toLowerCase();
59461
- out[key] = build(
60785
+ const key2 = m.marketToken.toLowerCase();
60786
+ out[key2] = build(
59462
60787
  m.marketToken,
59463
60788
  m.name,
59464
60789
  "gm",
59465
60790
  m.longToken,
59466
60791
  m.shortToken,
59467
60792
  m.indexToken,
59468
- apy.markets?.[m.marketToken] ?? apy.markets?.[key]
60793
+ apy.markets?.[m.marketToken] ?? apy.markets?.[key2]
59469
60794
  );
59470
60795
  }
59471
60796
  for (const g of glvs) {
59472
60797
  if (!g.isListed) continue;
59473
- const key = g.glvToken.toLowerCase();
59474
- out[key] = build(
60798
+ const key2 = g.glvToken.toLowerCase();
60799
+ out[key2] = build(
59475
60800
  g.glvToken,
59476
60801
  g.name,
59477
60802
  "glv",
59478
60803
  g.longToken,
59479
60804
  g.shortToken,
59480
60805
  void 0,
59481
- apy.glvs?.[g.glvToken] ?? apy.glvs?.[key]
60806
+ apy.glvs?.[g.glvToken] ?? apy.glvs?.[key2]
59482
60807
  );
59483
60808
  }
59484
60809
  if (multicallRetry) {
@@ -59561,7 +60886,7 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
59561
60886
  // src/vaults/gmx/fetchUser.ts
59562
60887
  var DEFAULT_CAP = 50;
59563
60888
  var isBig = (v) => typeof v === "bigint";
59564
- var str2 = (v) => isBig(v) ? v.toString() : "0";
60889
+ var str3 = (v) => isBig(v) ? v.toString() : "0";
59565
60890
  var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
59566
60891
  const empty = {
59567
60892
  chainId,
@@ -59653,15 +60978,15 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
59653
60978
  const depositKeys = Array.isArray(keyRes[0]) ? keyRes[0] : [];
59654
60979
  const withdrawalKeys = Array.isArray(keyRes[1]) ? keyRes[1] : [];
59655
60980
  const readerCalls = [
59656
- ...depositKeys.map((key) => ({
60981
+ ...depositKeys.map((key2) => ({
59657
60982
  address: c.reader,
59658
60983
  name: "getDeposit",
59659
- params: [c.dataStore, key]
60984
+ params: [c.dataStore, key2]
59660
60985
  })),
59661
- ...withdrawalKeys.map((key) => ({
60986
+ ...withdrawalKeys.map((key2) => ({
59662
60987
  address: c.reader,
59663
60988
  name: "getWithdrawal",
59664
- params: [c.dataStore, key]
60989
+ params: [c.dataStore, key2]
59665
60990
  }))
59666
60991
  ];
59667
60992
  const readerRes = readerCalls.length ? await safe(
@@ -59676,42 +61001,42 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
59676
61001
  ) : [];
59677
61002
  const pendingDeposits = [];
59678
61003
  const pendingWithdrawals = [];
59679
- depositKeys.forEach((key, i) => {
61004
+ depositKeys.forEach((key2, i) => {
59680
61005
  const d = readerRes[i];
59681
61006
  const a = d?.addresses;
59682
61007
  if (!a?.market) return;
59683
61008
  const n = d.numbers;
59684
61009
  pendingDeposits.push({
59685
- key,
61010
+ key: key2,
59686
61011
  kind: "gm",
59687
61012
  account: a.account.toLowerCase(),
59688
61013
  receiver: a.receiver.toLowerCase(),
59689
61014
  market: a.market.toLowerCase(),
59690
61015
  initialLongToken: a.initialLongToken.toLowerCase(),
59691
61016
  initialShortToken: a.initialShortToken.toLowerCase(),
59692
- initialLongTokenAmount: str2(n.initialLongTokenAmount),
59693
- initialShortTokenAmount: str2(n.initialShortTokenAmount),
59694
- minOut: str2(n.minMarketTokens),
59695
- executionFee: str2(n.executionFee),
59696
- updatedAtTime: str2(n.updatedAtTime)
61017
+ initialLongTokenAmount: str3(n.initialLongTokenAmount),
61018
+ initialShortTokenAmount: str3(n.initialShortTokenAmount),
61019
+ minOut: str3(n.minMarketTokens),
61020
+ executionFee: str3(n.executionFee),
61021
+ updatedAtTime: str3(n.updatedAtTime)
59697
61022
  });
59698
61023
  });
59699
- withdrawalKeys.forEach((key, i) => {
61024
+ withdrawalKeys.forEach((key2, i) => {
59700
61025
  const w = readerRes[depositKeys.length + i];
59701
61026
  const a = w?.addresses;
59702
61027
  if (!a?.market) return;
59703
61028
  const n = w.numbers;
59704
61029
  pendingWithdrawals.push({
59705
- key,
61030
+ key: key2,
59706
61031
  kind: "gm",
59707
61032
  account: a.account.toLowerCase(),
59708
61033
  receiver: a.receiver.toLowerCase(),
59709
61034
  market: a.market.toLowerCase(),
59710
- tokenAmount: str2(n.marketTokenAmount),
59711
- minLongTokenAmount: str2(n.minLongTokenAmount),
59712
- minShortTokenAmount: str2(n.minShortTokenAmount),
59713
- executionFee: str2(n.executionFee),
59714
- updatedAtTime: str2(n.updatedAtTime)
61035
+ tokenAmount: str3(n.marketTokenAmount),
61036
+ minLongTokenAmount: str3(n.minLongTokenAmount),
61037
+ minShortTokenAmount: str3(n.minShortTokenAmount),
61038
+ executionFee: str3(n.executionFee),
61039
+ updatedAtTime: str3(n.updatedAtTime)
59715
61040
  });
59716
61041
  });
59717
61042
  const glvDeposits = Array.isArray(glvRes[0]) ? glvRes[0] : [];
@@ -59728,11 +61053,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
59728
61053
  glv: a.glv.toLowerCase(),
59729
61054
  initialLongToken: a.initialLongToken.toLowerCase(),
59730
61055
  initialShortToken: a.initialShortToken.toLowerCase(),
59731
- initialLongTokenAmount: str2(n.initialLongTokenAmount),
59732
- initialShortTokenAmount: str2(n.initialShortTokenAmount),
59733
- minOut: str2(n.minGlvTokens),
59734
- executionFee: str2(n.executionFee),
59735
- updatedAtTime: str2(n.updatedAtTime)
61056
+ initialLongTokenAmount: str3(n.initialLongTokenAmount),
61057
+ initialShortTokenAmount: str3(n.initialShortTokenAmount),
61058
+ minOut: str3(n.minGlvTokens),
61059
+ executionFee: str3(n.executionFee),
61060
+ updatedAtTime: str3(n.updatedAtTime)
59736
61061
  });
59737
61062
  }
59738
61063
  for (const w of glvWithdrawals) {
@@ -59745,11 +61070,11 @@ var getGmxUserPositions = async (chainId, account, multicallRetry, options) => {
59745
61070
  receiver: a.receiver.toLowerCase(),
59746
61071
  market: a.market.toLowerCase(),
59747
61072
  glv: a.glv.toLowerCase(),
59748
- tokenAmount: str2(n.glvTokenAmount),
59749
- minLongTokenAmount: str2(n.minLongTokenAmount),
59750
- minShortTokenAmount: str2(n.minShortTokenAmount),
59751
- executionFee: str2(n.executionFee),
59752
- updatedAtTime: str2(n.updatedAtTime)
61073
+ tokenAmount: str3(n.glvTokenAmount),
61074
+ minLongTokenAmount: str3(n.minLongTokenAmount),
61075
+ minShortTokenAmount: str3(n.minShortTokenAmount),
61076
+ executionFee: str3(n.executionFee),
61077
+ updatedAtTime: str3(n.updatedAtTime)
59753
61078
  });
59754
61079
  }
59755
61080
  return {
@@ -60633,7 +61958,7 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
60633
61958
  var TERM_SHEET_SCHEMA_VERSION = 1;
60634
61959
 
60635
61960
  // src/terms/input.ts
60636
- var num10 = (v) => {
61961
+ var num11 = (v) => {
60637
61962
  if (v == null) return void 0;
60638
61963
  const n = typeof v === "string" ? Number(v) : v;
60639
61964
  return Number.isFinite(n) ? n : void 0;
@@ -60664,12 +61989,12 @@ function toTermSheetInput(row, ctx = {}) {
60664
61989
  {
60665
61990
  category: v?.category ?? k,
60666
61991
  label: v?.label,
60667
- borrowCollateralFactor: num10(v?.borrowCollateralFactor),
60668
- collateralFactor: num10(v?.collateralFactor),
60669
- borrowFactor: num10(v?.borrowFactor),
60670
- liquidationPenalty: num10(v?.liquidationPenalty),
60671
- closeFactor: num10(v?.closeFactor),
60672
- targetHealthFactor: num10(v?.targetHealthFactor),
61992
+ borrowCollateralFactor: num11(v?.borrowCollateralFactor),
61993
+ collateralFactor: num11(v?.collateralFactor),
61994
+ borrowFactor: num11(v?.borrowFactor),
61995
+ liquidationPenalty: num11(v?.liquidationPenalty),
61996
+ closeFactor: num11(v?.closeFactor),
61997
+ targetHealthFactor: num11(v?.targetHealthFactor),
60673
61998
  collateralDisabled: v?.collateralDisabled === true,
60674
61999
  debtDisabled: v?.debtDisabled === true
60675
62000
  }
@@ -60677,11 +62002,11 @@ function toTermSheetInput(row, ctx = {}) {
60677
62002
  ) : void 0;
60678
62003
  const rewards = pick2(row, "rewards")?.map((r) => ({
60679
62004
  asset: r?.asset,
60680
- depositRate: num10(r?.depositRate),
60681
- variableBorrowRate: num10(r?.variableBorrowRate),
60682
- stableBorrowRate: num10(r?.stableBorrowRate),
62005
+ depositRate: num11(r?.depositRate),
62006
+ variableBorrowRate: num11(r?.variableBorrowRate),
62007
+ stableBorrowRate: num11(r?.stableBorrowRate),
60683
62008
  kind: r?.kind,
60684
- endsAt: num10(r?.endsAt),
62009
+ endsAt: num11(r?.endsAt),
60685
62010
  claim: r?.claim
60686
62011
  }));
60687
62012
  return {
@@ -60694,29 +62019,29 @@ function toTermSheetInput(row, ctx = {}) {
60694
62019
  "underlyingInfo.asset"
60695
62020
  ),
60696
62021
  underlying: pick2(row, "underlying"),
60697
- decimals: num10(pick2(row, "decimals")),
60698
- depositRate: num10(pick2(row, "depositRate")),
60699
- variableBorrowRate: num10(pick2(row, "variableBorrowRate")),
60700
- stableBorrowRate: num10(pick2(row, "stableBorrowRate")),
60701
- intrinsicYield: num10(pick2(row, "intrinsicYield")),
62022
+ decimals: num11(pick2(row, "decimals")),
62023
+ depositRate: num11(pick2(row, "depositRate")),
62024
+ variableBorrowRate: num11(pick2(row, "variableBorrowRate")),
62025
+ stableBorrowRate: num11(pick2(row, "stableBorrowRate")),
62026
+ intrinsicYield: num11(pick2(row, "intrinsicYield")),
60702
62027
  rewards,
60703
62028
  rateModel: pick2(row, "rateModel"),
60704
- originationFee: num10(pick2(row, "originationFee")),
60705
- totalDeposits: num10(pick2(row, "totalDeposits")),
60706
- totalDebt: num10(pick2(row, "totalDebt")),
60707
- totalDebtStable: num10(pick2(row, "totalDebtStable")),
60708
- totalLiquidity: num10(pick2(row, "totalLiquidity")),
60709
- borrowLiquidity: num10(pick2(row, "borrowLiquidity")),
60710
- totalDepositsUsd: num10(pick2(row, "totalDepositsUSD", "totalDepositsUsd")),
60711
- totalDebtUsd: num10(pick2(row, "totalDebtUSD", "totalDebtUsd")),
60712
- totalLiquidityUsd: num10(pick2(row, "totalLiquidityUSD", "totalLiquidityUsd")),
60713
- utilization: num10(pick2(row, "utilization")),
60714
- irmTotalDeposits: num10(pick2(row, "irmTotalDeposits")),
60715
- irmTotalDebt: num10(pick2(row, "irmTotalDebt")),
60716
- lockupRatio: num10(pick2(row, "lockupRatio")),
62029
+ originationFee: num11(pick2(row, "originationFee")),
62030
+ totalDeposits: num11(pick2(row, "totalDeposits")),
62031
+ totalDebt: num11(pick2(row, "totalDebt")),
62032
+ totalDebtStable: num11(pick2(row, "totalDebtStable")),
62033
+ totalLiquidity: num11(pick2(row, "totalLiquidity")),
62034
+ borrowLiquidity: num11(pick2(row, "borrowLiquidity")),
62035
+ totalDepositsUsd: num11(pick2(row, "totalDepositsUSD", "totalDepositsUsd")),
62036
+ totalDebtUsd: num11(pick2(row, "totalDebtUSD", "totalDebtUsd")),
62037
+ totalLiquidityUsd: num11(pick2(row, "totalLiquidityUSD", "totalLiquidityUsd")),
62038
+ utilization: num11(pick2(row, "utilization")),
62039
+ irmTotalDeposits: num11(pick2(row, "irmTotalDeposits")),
62040
+ irmTotalDebt: num11(pick2(row, "irmTotalDebt")),
62041
+ lockupRatio: num11(pick2(row, "lockupRatio")),
60717
62042
  minBorrow: pick2(row, "minBorrow", "caps.minBorrow") ?? void 0,
60718
- supplyCap: num10(pick2(row, "supplyCap", "caps.supplyCap")),
60719
- borrowCap: num10(pick2(row, "borrowCap", "caps.borrowCap")),
62043
+ supplyCap: num11(pick2(row, "supplyCap", "caps.supplyCap")),
62044
+ borrowCap: num11(pick2(row, "borrowCap", "caps.borrowCap")),
60720
62045
  debtCeiling: pick2(row, "debtCeiling", "caps.debtCeiling"),
60721
62046
  isActive: pick2(row, "isActive", "flags.isActive"),
60722
62047
  isFrozen: pick2(row, "isFrozen", "flags.isFrozen"),
@@ -60742,8 +62067,8 @@ function toTermSheetInput(row, ctx = {}) {
60742
62067
  "flags.variableBorrowDisabled"
60743
62068
  ),
60744
62069
  config,
60745
- closeFactor: num10(pick2(row, "closeFactor")),
60746
- targetHealthFactor: num10(pick2(row, "targetHealthFactor")),
62070
+ closeFactor: num11(pick2(row, "closeFactor")),
62071
+ targetHealthFactor: num11(pick2(row, "targetHealthFactor")),
60747
62072
  fixedTerm: pick2(row, "fixedTerm") ?? ctx.fixedTerm,
60748
62073
  terms: pick2(row, "terms"),
60749
62074
  market: resolveMarketDescriptors(row, ctx.market)
@@ -61655,10 +62980,10 @@ function resolveMinDebt(input) {
61655
62980
  ];
61656
62981
  for (const c of candidates) {
61657
62982
  if (c == null) continue;
61658
- const str3 = String(c);
61659
- if (str3 === "0" || str3 === "") continue;
61660
- if (!/^\d+$/.test(str3)) continue;
61661
- return str3;
62983
+ const str4 = String(c);
62984
+ if (str4 === "0" || str4 === "") continue;
62985
+ if (!/^\d+$/.test(str4)) continue;
62986
+ return str4;
61662
62987
  }
61663
62988
  return void 0;
61664
62989
  }
@@ -61666,9 +62991,9 @@ function resolveMinCollateral(input) {
61666
62991
  const m = input.market ?? {};
61667
62992
  const raw = m.frankencoin?.minimumCollateral;
61668
62993
  if (raw == null) return void 0;
61669
- const str3 = String(raw);
61670
- if (str3 === "0" || str3 === "" || !/^\d+$/.test(str3)) return void 0;
61671
- return str3;
62994
+ const str4 = String(raw);
62995
+ if (str4 === "0" || str4 === "" || !/^\d+$/.test(str4)) return void 0;
62996
+ return str4;
61672
62997
  }
61673
62998
  function capUtil(total, cap) {
61674
62999
  if (!isNum(cap) || cap <= 0 || !isNum(total)) return void 0;
@@ -61764,12 +63089,12 @@ function buildModes(input) {
61764
63089
  const keys = Object.keys(cfg);
61765
63090
  if (keys.length <= 1) return void 0;
61766
63091
  const out = [];
61767
- for (const key of keys) {
61768
- const c = cfg[key];
63092
+ for (const key2 of keys) {
63093
+ const c = cfg[key2];
61769
63094
  if (!c) continue;
61770
- const isDefault = key === "0";
63095
+ const isDefault = key2 === "0";
61771
63096
  out.push({
61772
- modeId: key,
63097
+ modeId: key2,
61773
63098
  label: c.label,
61774
63099
  isDefault,
61775
63100
  entry: isDefault ? void 0 : "user-selected",