@1delta/margin-fetcher 0.0.408 → 0.0.410

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, InvalidAddressError, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-SRWUFRRR.js';
1
+ import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, stringToHex, erc20Abi, 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, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isInverse, isTermMax, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isInverse, isTermMax, isUsdd, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
- import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
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, usddLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, usddConfigFor, usddChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
8
  import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
9
- import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
9
+ import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
10
10
  export { MorphoLensAbi } from '@1delta/abis';
11
11
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
12
12
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
@@ -7519,6 +7519,9 @@ var getLendersForChain = (c) => {
7519
7519
  for (const l of inverseLendersByChain(c)) {
7520
7520
  lenders.push(l);
7521
7521
  }
7522
+ for (const l of usddLendersByChain(c)) {
7523
+ lenders.push(l);
7524
+ }
7522
7525
  if (tellerConfigByChain(c)?.tellerV2 && tellerPoolsByChain(c).length > 0) {
7523
7526
  lenders.push(Lender.TELLER);
7524
7527
  }
@@ -7540,7 +7543,7 @@ var filterLendersByProtocol = (allLenders, protocolList) => {
7540
7543
  (b) => protocolList.includes(b)
7541
7544
  );
7542
7545
  return allLenders.filter(
7543
- (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER")
7546
+ (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER") || protocolList.includes(Lender.USDD) && lender?.startsWith("USDD")
7544
7547
  );
7545
7548
  };
7546
7549
  var getAavesForChain = () => {
@@ -11205,8 +11208,8 @@ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs =
11205
11208
  const brokers = await resolveListaBrokers(chainId, marketKeys, getClient);
11206
11209
  const ids = Object.keys(brokers);
11207
11210
  const out = {};
11208
- const cacheKey5 = `${chainId}:${account.toLowerCase()}`;
11209
- BROKER_USER_CACHE[cacheKey5] = out;
11211
+ const cacheKey6 = `${chainId}:${account.toLowerCase()}`;
11212
+ BROKER_USER_CACHE[cacheKey6] = out;
11210
11213
  if (ids.length === 0) return out;
11211
11214
  try {
11212
11215
  const client = getClient(chainId);
@@ -13035,7 +13038,7 @@ function normalizeToBytes(input) {
13035
13038
  return out;
13036
13039
  }
13037
13040
  function readAddress(bytes, offset, len) {
13038
- const hex = toHex(bytes.subarray(offset, offset + len));
13041
+ const hex = toHex2(bytes.subarray(offset, offset + len));
13039
13042
  return "0x" + hex;
13040
13043
  }
13041
13044
  function readUintBE(bytes, offset, len) {
@@ -13046,7 +13049,7 @@ function readUintBE(bytes, offset, len) {
13046
13049
  }
13047
13050
  return v;
13048
13051
  }
13049
- function toHex(arr) {
13052
+ function toHex2(arr) {
13050
13053
  let s = "";
13051
13054
  for (let i = 0; i < arr.length; i++) {
13052
13055
  const h = arr[i].toString(16).padStart(2, "0");
@@ -22915,7 +22918,7 @@ async function fetchTellerMarkets(chainId) {
22915
22918
  } catch {
22916
22919
  return { chainId, pools: [] };
22917
22920
  }
22918
- const big7 = (i) => {
22921
+ const big9 = (i) => {
22919
22922
  const r = results[i];
22920
22923
  if (typeof r === "bigint") return r;
22921
22924
  if (typeof r === "number") return BigInt(r);
@@ -22929,20 +22932,20 @@ async function fetchTellerMarkets(chainId) {
22929
22932
  return null;
22930
22933
  };
22931
22934
  const num9 = (i) => {
22932
- const b = big7(i);
22935
+ const b = big9(i);
22933
22936
  return b === null ? null : Number(b);
22934
22937
  };
22935
22938
  const pool0 = pools.map((config, i) => {
22936
22939
  const base = i * READS_PER_POOL;
22937
22940
  return {
22938
22941
  config,
22939
- available: big7(base),
22940
- committed: big7(base + 1),
22942
+ available: big9(base),
22943
+ committed: big9(base + 1),
22941
22944
  minRateBps: num9(base + 2),
22942
- collateralPerPrincipal: big7(base + 3),
22945
+ collateralPerPrincipal: big9(base + 3),
22943
22946
  maxLoanDuration: num9(base + 4),
22944
- marketId: big7(base + 5),
22945
- totalAssets: big7(base + 6)
22947
+ marketId: big9(base + 5),
22948
+ totalAssets: big9(base + 6)
22946
22949
  };
22947
22950
  });
22948
22951
  const attByMarket = /* @__PURE__ */ new Map();
@@ -23706,6 +23709,12 @@ function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalY
23706
23709
  // up as a term product.
23707
23710
  stableBorrowRate: borrowAprPct,
23708
23711
  intrinsicYield: 0,
23712
+ // One-off GT-mint fee as a PERCENT of the amount borrowed, charged once at
23713
+ // borrow time (`issueFee = debt · mintGtFeeRatio / 1e8`). The canonical
23714
+ // top-level field — `fixedTerm.fees.originationFeePercent` alone is not
23715
+ // read by the cost math, which is why this fee was never folded into
23716
+ // borrow cost downstream. NOT an APR: never add it to a rate.
23717
+ originationFee: originationFeePercent || void 0,
23709
23718
  rewards: void 0,
23710
23719
  decimals: config.debtDecimals,
23711
23720
  config: {
@@ -23725,9 +23734,18 @@ function convertTermMaxMarketsToResponse(raw, chainId, prices = {}, _additionalY
23725
23734
  borrowingEnabled: !matured && borrowLiquidity > 0,
23726
23735
  depositsEnabled: !matured,
23727
23736
  hasStable: false,
23728
- // Borrowing IS fixed-term (see `terms` + `fixedTerm`), but it is real
23729
- // borrowing do NOT set this, or borrowable-only filters hide the market.
23730
- variableBorrowDisabled: false,
23737
+ // TermMax has NO variable rate at all — `variableBorrowRate` above is only
23738
+ // ever a MIRROR of the best term APR. When no order quotes the borrow side
23739
+ // the mirror is 0, and a consumer that reads it as a floating rate sees a
23740
+ // FREE borrow and levers against it (observed: 9 of 15 chain-1 pairs
23741
+ // sorting to the top of the optimizer at 128% "net APR").
23742
+ //
23743
+ // Flag it, exactly as Term Finance and Teller do — a `variableBorrowRate`
23744
+ // of 0 is NOT a free borrow. Consumers read the `terms[]` card (and
23745
+ // `fixedTerm`) instead. Deliberately unconditional rather than
23746
+ // `borrowAprPct === 0`: the semantic is "this lender has no variable
23747
+ // product", which does not change with book depth.
23748
+ variableBorrowDisabled: true,
23731
23749
  isActive: true,
23732
23750
  isFrozen: false
23733
23751
  };
@@ -24160,6 +24178,264 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
24160
24178
  }
24161
24179
  return out;
24162
24180
  }
24181
+ var READS_PER_ILK = 4;
24182
+ var USDD_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi, erc20Abi];
24183
+ var usddIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
24184
+ async function fetchUsddMarkets(lender, chainId) {
24185
+ const config = usddConfigFor(lender, chainId);
24186
+ const chainData = usddChainData(lender, chainId);
24187
+ const markets = chainData?.markets ?? [];
24188
+ if (!config || markets.length === 0) {
24189
+ return { lender, config, chainData, markets: [] };
24190
+ }
24191
+ const calls = markets.flatMap((m) => {
24192
+ const ilk32 = usddIlkBytes32(m.ilk);
24193
+ return [
24194
+ { address: config.vat, name: "ilks", params: [ilk32] },
24195
+ { address: config.jug, name: "ilks", params: [ilk32] },
24196
+ { address: config.spot, name: "ilks", params: [ilk32] },
24197
+ { address: m.collToken, name: "balanceOf", params: [m.gemJoin] }
24198
+ ];
24199
+ });
24200
+ let results = [];
24201
+ try {
24202
+ results = await multicallRetryUniversal({
24203
+ chain: chainId,
24204
+ calls,
24205
+ abi: markets.flatMap(() => USDD_ABI_PER_READ),
24206
+ allowFailure: true
24207
+ });
24208
+ } catch {
24209
+ return { lender, config, chainData, markets: [] };
24210
+ }
24211
+ const big9 = (v) => {
24212
+ if (typeof v === "bigint") return v;
24213
+ if (typeof v === "number") return BigInt(v);
24214
+ return null;
24215
+ };
24216
+ const field12 = (res, name, idx) => big9(res?.[name] ?? res?.[idx]);
24217
+ const out = markets.map((market, i) => {
24218
+ const base = i * READS_PER_ILK;
24219
+ const vatIlk = results[base];
24220
+ const jugIlk = results[base + 1];
24221
+ const spotIlk = results[base + 2];
24222
+ return {
24223
+ market,
24224
+ Art: field12(vatIlk, "Art", 0),
24225
+ rate: field12(vatIlk, "rate", 1),
24226
+ spot: field12(vatIlk, "spot", 2),
24227
+ line: field12(vatIlk, "line", 3),
24228
+ dust: field12(vatIlk, "dust", 4),
24229
+ duty: field12(jugIlk, "duty", 0),
24230
+ mat: field12(spotIlk, "mat", 1),
24231
+ joinBalance: big9(results[base + 3])
24232
+ };
24233
+ });
24234
+ return { lender, config, chainData, markets: out };
24235
+ }
24236
+
24237
+ // src/lending/public-data/usdd/convertPublic.ts
24238
+ function usddLenderKey(lender, chainId, ilk) {
24239
+ return `${lender}_${chainId}_${ilk}`;
24240
+ }
24241
+ function usddKeyParts(key) {
24242
+ if (!key.startsWith("USDD_")) return void 0;
24243
+ const suffix = key.slice("USDD_".length);
24244
+ const m = suffix.match(/^(\d+)_([A-Z0-9][A-Z0-9-]*)$/);
24245
+ if (!m) return void 0;
24246
+ return { lender: "USDD", chainId: m[1], ilk: m[2] };
24247
+ }
24248
+ var WAD8 = 1e18;
24249
+ var RAY3 = 1e27;
24250
+ var RAD = 1e45;
24251
+ var YEAR_SECONDS2 = 31536e3;
24252
+ function toHuman4(raw, decimals) {
24253
+ return Number(raw) / 10 ** decimals;
24254
+ }
24255
+ function currencyFor9(address, decimals, symbol, tokens) {
24256
+ const lower3 = address.toLowerCase();
24257
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
24258
+ }
24259
+ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
24260
+ intrinsicYields: {},
24261
+ lenderRewards: {},
24262
+ loaded: true
24263
+ }, tokens = {}) {
24264
+ const out = {};
24265
+ const cfg = raw?.config;
24266
+ const chainData = raw?.chainData;
24267
+ if (!cfg || !chainData) return out;
24268
+ const debtAddr = cfg.usdd.toLowerCase();
24269
+ const debtDecimals = cfg.debtDecimals ?? 18;
24270
+ const debtToken = tokens[debtAddr];
24271
+ const debtSymbol = debtToken?.symbol ?? "USDD";
24272
+ const debtPriceKey = toOracleKey(debtToken?.assetGroup) || toGenericPriceKey(debtAddr, chainId);
24273
+ const debtPrice = prices[debtPriceKey] || 1;
24274
+ for (const m of raw.markets ?? []) {
24275
+ const market = m.market;
24276
+ const lenderKey = usddLenderKey(raw.lender, chainId, market.ilk);
24277
+ const collAddr = market.collToken.toLowerCase();
24278
+ const collDecimals = market.collDecimals;
24279
+ const collToken = tokens[collAddr];
24280
+ const collSymbol = collToken?.symbol ?? market.collSymbol ?? market.ilk.split("-")[0];
24281
+ const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
24282
+ const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
24283
+ const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) / RAY3 * (Number(m.mat) / RAY3) : 0;
24284
+ const collPrice = spotDerivedPrice || (prices[collPriceKey] ?? 0);
24285
+ const totalDebt = m.Art !== null && m.rate !== null ? Number(m.Art * m.rate / BigInt(1e27)) / 10 ** debtDecimals : 0;
24286
+ const totalColl = m.joinBalance !== null ? toHuman4(m.joinBalance, collDecimals) : 0;
24287
+ const mat = m.mat !== null ? Number(m.mat) / RAY3 : Number(market.mat) / RAY3 || 1.5;
24288
+ const ltv = mat > 0 ? 1 / mat : 0;
24289
+ const chop = market.chop ? Number(market.chop) / WAD8 : 0;
24290
+ const liqPenalty = chop > 1 ? chop - 1 : 0;
24291
+ const duty = m.duty !== null ? m.duty : BigInt(market.duty ?? 0);
24292
+ const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY3 * YEAR_SECONDS2 * 100 : 0;
24293
+ const line = m.line !== null ? Number(m.line) / RAD : 0;
24294
+ let borrowLiquidity = Math.max(0, line - totalDebt);
24295
+ const halted = line === 0;
24296
+ const entry = { data: {} };
24297
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
24298
+ entry.data[collUid] = {
24299
+ marketUid: collUid,
24300
+ name: "Collateral " + collSymbol,
24301
+ poolId: market.gemJoin.toLowerCase(),
24302
+ underlying: collAddr,
24303
+ asset: currencyFor9(collAddr, collDecimals, collSymbol, tokens),
24304
+ totalDeposits: totalColl,
24305
+ totalDebtStable: 0,
24306
+ totalDebt: 0,
24307
+ totalLiquidity: totalColl,
24308
+ borrowLiquidity: 0,
24309
+ totalLiquidityUSD: totalColl * collPrice,
24310
+ borrowLiquidityUSD: 0,
24311
+ totalDepositsUSD: totalColl * collPrice,
24312
+ totalDebtStableUSD: 0,
24313
+ totalDebtUSD: 0,
24314
+ utilization: 0,
24315
+ depositRate: 0,
24316
+ variableBorrowRate: 0,
24317
+ stableBorrowRate: 0,
24318
+ intrinsicYield: 0,
24319
+ rewards: void 0,
24320
+ decimals: collDecimals,
24321
+ config: {
24322
+ 0: {
24323
+ category: 0,
24324
+ borrowCollateralFactor: ltv,
24325
+ collateralFactor: ltv,
24326
+ borrowFactor: 1,
24327
+ liquidationPenalty: liqPenalty,
24328
+ closeFactor: 1,
24329
+ collateralDisabled: false,
24330
+ debtDisabled: true
24331
+ }
24332
+ },
24333
+ closeFactor: 1,
24334
+ collateralActive: true,
24335
+ borrowingEnabled: false,
24336
+ depositsEnabled: !halted,
24337
+ hasStable: false,
24338
+ isActive: !halted,
24339
+ isFrozen: halted
24340
+ };
24341
+ const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
24342
+ entry.data[loanUid] = {
24343
+ marketUid: loanUid,
24344
+ name: debtSymbol,
24345
+ poolId: cfg.vat.toLowerCase(),
24346
+ underlying: debtAddr,
24347
+ asset: currencyFor9(debtAddr, debtDecimals, debtSymbol, tokens),
24348
+ totalDeposits: 0,
24349
+ totalDebtStable: 0,
24350
+ totalDebt,
24351
+ totalLiquidity: borrowLiquidity,
24352
+ borrowLiquidity,
24353
+ totalLiquidityUSD: borrowLiquidity * debtPrice,
24354
+ borrowLiquidityUSD: borrowLiquidity * debtPrice,
24355
+ totalDepositsUSD: 0,
24356
+ totalDebtStableUSD: 0,
24357
+ totalDebtUSD: totalDebt * debtPrice,
24358
+ utilization: 0,
24359
+ // The earn side is sUSDD (savings provider), not a lending deposit.
24360
+ depositRate: 0,
24361
+ variableBorrowRate: borrowApr,
24362
+ stableBorrowRate: 0,
24363
+ // Governance-set per-ilk stability fee — no utilization curve.
24364
+ rateModel: "protocolSet",
24365
+ intrinsicYield: 0,
24366
+ rewards: void 0,
24367
+ decimals: debtDecimals,
24368
+ config: {
24369
+ 0: {
24370
+ category: 0,
24371
+ borrowCollateralFactor: 0,
24372
+ collateralFactor: 0,
24373
+ borrowFactor: 1,
24374
+ liquidationPenalty: liqPenalty,
24375
+ closeFactor: 1,
24376
+ collateralDisabled: true,
24377
+ debtDisabled: halted
24378
+ }
24379
+ },
24380
+ closeFactor: 1,
24381
+ collateralActive: false,
24382
+ borrowingEnabled: !halted,
24383
+ depositsEnabled: false,
24384
+ hasStable: false,
24385
+ variableBorrowDisabled: halted,
24386
+ isActive: !halted,
24387
+ isFrozen: halted
24388
+ };
24389
+ entry.params = {
24390
+ market: {
24391
+ lender: lenderKey,
24392
+ name: marketName,
24393
+ loanDecimals: debtDecimals,
24394
+ collateralDecimals: collDecimals,
24395
+ // The gem join doubles as the market id (marketUid address) — one
24396
+ // adapter per ilk, like River's TroveManager.
24397
+ id: market.gemJoin.toLowerCase(),
24398
+ lltv: m.mat !== null ? m.mat.toString() : market.mat,
24399
+ oracle: market.pip ?? zeroAddress,
24400
+ irm: zeroAddress,
24401
+ collateralAddress: collAddr,
24402
+ loanAddress: debtAddr,
24403
+ // --- USDD descriptor (metadata + live snapshot; consumed by the
24404
+ // calldata builders + worker-api resolvers) ---
24405
+ usdd: {
24406
+ ilk: market.ilk,
24407
+ /** Per-second stability fee (ray string) — live, metadata fallback. */
24408
+ duty: duty.toString(),
24409
+ /** Liquidation ratio (ray string). */
24410
+ mat: m.mat !== null ? m.mat.toString() : market.mat,
24411
+ /** Liquidation penalty multiplier (wad string, Dog.chop). */
24412
+ chop: market.chop,
24413
+ /** Ilk debt ceiling / per-CDP floor (rad strings). */
24414
+ line: m.line !== null ? m.line.toString() : market.line,
24415
+ dust: m.dust !== null ? m.dust.toString() : market.dust,
24416
+ /** Debt accumulator (ray string) — art × rate = debt. */
24417
+ rate: m.rate !== null ? m.rate.toString() : void 0,
24418
+ addresses: {
24419
+ vat: cfg.vat,
24420
+ jug: cfg.jug,
24421
+ spot: cfg.spot,
24422
+ dog: cfg.dog,
24423
+ cdpManager: cfg.cdpManager,
24424
+ proxyActions: cfg.proxyActions,
24425
+ proxyRegistry: cfg.proxyRegistry,
24426
+ usddJoin: cfg.usddJoin,
24427
+ gemJoin: market.gemJoin,
24428
+ clip: market.clip,
24429
+ pip: market.pip
24430
+ }
24431
+ }
24432
+ }
24433
+ };
24434
+ entry.chainId = chainId;
24435
+ out[lenderKey] = entry;
24436
+ }
24437
+ return out;
24438
+ }
24163
24439
 
24164
24440
  // src/lending/public-data/silo-v2/fetchPublic.ts
24165
24441
  var BASE_URL2 = "https://api-v3.silo.finance";
@@ -24770,6 +25046,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
24770
25046
  if (isTeller(lender)) return await fetchTellerMarkets(chainId);
24771
25047
  if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
24772
25048
  if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
25049
+ if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
24773
25050
  return {};
24774
25051
  }
24775
25052
  function convertLenderDataFromApi(lender, chainId, data, prices, additionalYields, list = {}) {
@@ -24831,6 +25108,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
24831
25108
  additionalYields,
24832
25109
  list
24833
25110
  );
25111
+ if (isUsdd(lender))
25112
+ return convertUsddMarketsToResponse(
25113
+ data,
25114
+ chainId,
25115
+ prices,
25116
+ additionalYields,
25117
+ list
25118
+ );
24834
25119
  if (isTermMax(lender))
24835
25120
  return convertTermMaxMarketsToResponse(
24836
25121
  data,
@@ -25040,6 +25325,7 @@ function lenderApiOnly(lender, chainId) {
25040
25325
  if (isTeller(lender)) return true;
25041
25326
  if (isInverse(lender)) return true;
25042
25327
  if (isTermMax(lender)) return true;
25328
+ if (isUsdd(lender)) return true;
25043
25329
  return false;
25044
25330
  }
25045
25331
  function lenderApiWithOnChainFallback(lender, chainId) {
@@ -26231,15 +26517,132 @@ var buildInverseUserCall = (chainId, lender, account) => {
26231
26517
  );
26232
26518
  return calls;
26233
26519
  };
26234
- var TELLER_CALLS_PER_BID = 4;
26520
+ var USDD_CALLS_PER_CDP = 1;
26521
+ var MAX_CDP_WALK = 64;
26235
26522
  var CACHE_TTL_MS2 = 5 * 6e4;
26236
26523
  var discoveryCache2 = /* @__PURE__ */ new Map();
26237
26524
  var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26238
- var getCachedTellerBids = (chainId, account) => {
26525
+ var getCachedUsddCdps = (chainId, account) => {
26239
26526
  const hit = discoveryCache2.get(cacheKey2(chainId, account));
26240
26527
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
26241
26528
  return hit;
26242
26529
  };
26530
+ var big = (v) => {
26531
+ try {
26532
+ if (typeof v === "bigint") return v;
26533
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
26534
+ } catch {
26535
+ }
26536
+ return 0n;
26537
+ };
26538
+ var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
26539
+ var buildUsddUserCall = async (chainId, lender, account) => {
26540
+ const cfg = usddConfigFor(lender, chainId);
26541
+ const markets = usddChainData(lender, chainId)?.markets ?? [];
26542
+ const stash = (d) => discoveryCache2.set(cacheKey2(chainId, account), d);
26543
+ if (!cfg || markets.length === 0) {
26544
+ stash({ cdps: [], ilks: [], at: Date.now() });
26545
+ return [];
26546
+ }
26547
+ const curated = new Set(markets.map((m) => m.ilk));
26548
+ const zero = "0x0000000000000000000000000000000000000000";
26549
+ const owners = [];
26550
+ try {
26551
+ const [rawCount, rawFirst, rawProxy] = await multicallRetryUniversal({
26552
+ chain: chainId,
26553
+ abi: [...UsddCdpManagerAbi, ...UsddProxyRegistryAbi],
26554
+ calls: [
26555
+ { address: cfg.cdpManager, name: "count", params: [account] },
26556
+ { address: cfg.cdpManager, name: "first", params: [account] },
26557
+ { address: cfg.proxyRegistry, name: "proxies", params: [account] }
26558
+ ],
26559
+ allowFailure: false
26560
+ });
26561
+ owners.push({ owner: account, count: big(rawCount), cursor: big(rawFirst) });
26562
+ const proxy = String(rawProxy ?? zero);
26563
+ if (proxy.toLowerCase() !== zero) {
26564
+ const [pCount, pFirst] = await multicallRetryUniversal({
26565
+ chain: chainId,
26566
+ abi: UsddCdpManagerAbi,
26567
+ calls: [
26568
+ { address: cfg.cdpManager, name: "count", params: [proxy] },
26569
+ { address: cfg.cdpManager, name: "first", params: [proxy] }
26570
+ ],
26571
+ allowFailure: false
26572
+ });
26573
+ owners.push({ owner: proxy, count: big(pCount), cursor: big(pFirst) });
26574
+ }
26575
+ } catch {
26576
+ return [];
26577
+ }
26578
+ const live = owners.filter((o) => o.count > 0n && o.cursor !== 0n);
26579
+ if (live.length === 0) {
26580
+ stash({ cdps: [], ilks: [], at: Date.now() });
26581
+ return [];
26582
+ }
26583
+ const cdps = [];
26584
+ try {
26585
+ for (const head of live) {
26586
+ let cursor = head.cursor;
26587
+ const steps = Number(
26588
+ head.count > BigInt(MAX_CDP_WALK) ? MAX_CDP_WALK : head.count
26589
+ );
26590
+ if (head.count > BigInt(MAX_CDP_WALK)) {
26591
+ console.warn(
26592
+ `USDD: owner ${head.owner} holds ${head.count} CDPs on chain ${chainId} \u2014 truncating discovery at ${MAX_CDP_WALK}`
26593
+ );
26594
+ }
26595
+ for (let i = 0; i < steps && cursor !== 0n; i++) {
26596
+ const [urn, ilk32, link] = await multicallRetryUniversal({
26597
+ chain: chainId,
26598
+ abi: UsddCdpManagerAbi,
26599
+ calls: [
26600
+ { address: cfg.cdpManager, name: "urns", params: [cursor] },
26601
+ { address: cfg.cdpManager, name: "ilks", params: [cursor] },
26602
+ { address: cfg.cdpManager, name: "list", params: [cursor] }
26603
+ ],
26604
+ allowFailure: false
26605
+ });
26606
+ let ilk = "";
26607
+ try {
26608
+ ilk = hexToString(ilk32, { size: 32 }).replace(/[\s\0]+$/g, "");
26609
+ } catch {
26610
+ }
26611
+ if (curated.has(ilk)) {
26612
+ cdps.push({ cdpId: cursor.toString(), urn: String(urn), ilk });
26613
+ }
26614
+ cursor = big(field6(link, "next", 1));
26615
+ }
26616
+ }
26617
+ } catch {
26618
+ return [];
26619
+ }
26620
+ const ilks = [...new Set(cdps.map((c) => c.ilk))];
26621
+ stash({ cdps, ilks, at: Date.now() });
26622
+ if (cdps.length === 0) return [];
26623
+ const calls = cdps.map((c) => ({
26624
+ address: cfg.vat,
26625
+ name: "urns",
26626
+ params: [usddIlkBytes32(c.ilk), c.urn]
26627
+ }));
26628
+ for (const ilk of ilks) {
26629
+ calls.push({
26630
+ address: cfg.vat,
26631
+ name: "ilks",
26632
+ params: [usddIlkBytes32(ilk)]
26633
+ });
26634
+ }
26635
+ return calls;
26636
+ };
26637
+ var TELLER_CALLS_PER_BID = 4;
26638
+ var CACHE_TTL_MS3 = 5 * 6e4;
26639
+ var discoveryCache3 = /* @__PURE__ */ new Map();
26640
+ var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26641
+ var getCachedTellerBids = (chainId, account) => {
26642
+ const hit = discoveryCache3.get(cacheKey3(chainId, account));
26643
+ if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
26644
+ return hit;
26645
+ };
26243
26646
  var nowSec5 = () => Math.floor(Date.now() / 1e3);
26244
26647
  var toBigints = (arr) => {
26245
26648
  if (!Array.isArray(arr)) return [];
@@ -26277,7 +26680,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26277
26680
  return [];
26278
26681
  }
26279
26682
  if (ids.length === 0) {
26280
- discoveryCache2.set(cacheKey2(chainId, account), { bids: [], at: Date.now() });
26683
+ discoveryCache3.set(cacheKey3(chainId, account), { bids: [], at: Date.now() });
26281
26684
  return [];
26282
26685
  }
26283
26686
  const poolByAddr = /* @__PURE__ */ new Map();
@@ -26304,7 +26707,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26304
26707
  const pool = poolByAddr.get(lenderAddr);
26305
26708
  if (pool) kept.push({ bidId: id, pool });
26306
26709
  });
26307
- discoveryCache2.set(cacheKey2(chainId, account), { bids: kept, at: Date.now() });
26710
+ discoveryCache3.set(cacheKey3(chainId, account), { bids: kept, at: Date.now() });
26308
26711
  if (kept.length === 0) return [];
26309
26712
  const ts = nowSec5();
26310
26713
  const calls = [];
@@ -26329,12 +26732,12 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26329
26732
  return calls;
26330
26733
  };
26331
26734
  var TERMMAX_CALLS_PER_ACCOUNT = 1;
26332
- var CACHE_TTL_MS3 = 5 * 6e4;
26333
- var discoveryCache3 = /* @__PURE__ */ new Map();
26334
- var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26735
+ var CACHE_TTL_MS4 = 5 * 6e4;
26736
+ var discoveryCache4 = /* @__PURE__ */ new Map();
26737
+ var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26335
26738
  var getCachedTermMaxDiscovery = (chainId, account) => {
26336
- const hit = discoveryCache3.get(cacheKey3(chainId, account));
26337
- if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
26739
+ const hit = discoveryCache4.get(cacheKey4(chainId, account));
26740
+ if (!hit || Date.now() - hit.at > CACHE_TTL_MS4) return void 0;
26338
26741
  return hit;
26339
26742
  };
26340
26743
  var buildTermMaxUserCall = async (chainId, _lender, account) => {
@@ -26349,11 +26752,11 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
26349
26752
  }
26350
26753
  }
26351
26754
  if (markets.length === 0) {
26352
- discoveryCache3.set(cacheKey3(chainId, account), { markets: [], at: Date.now() });
26755
+ discoveryCache4.set(cacheKey4(chainId, account), { markets: [], at: Date.now() });
26353
26756
  return [];
26354
26757
  }
26355
26758
  markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
26356
- discoveryCache3.set(cacheKey3(chainId, account), { markets, at: Date.now() });
26759
+ discoveryCache4.set(cacheKey4(chainId, account), { markets, at: Date.now() });
26357
26760
  return [
26358
26761
  {
26359
26762
  address: proto.viewer,
@@ -26386,22 +26789,30 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
26386
26789
  if (isTeller(lender)) return buildTellerUserCall(chainId, lender, account);
26387
26790
  if (isTermMax(lender)) return buildTermMaxUserCall(chainId, lender, account);
26388
26791
  if (isInverse(lender)) return buildInverseUserCall(chainId, lender, account);
26792
+ if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
26389
26793
  if (isCompoundV3Type(lender))
26390
26794
  return buildCompoundV3UserCall(chainId, lender, account);
26391
26795
  if (isEulerType(lender))
26392
- return buildEulerUserCall(chainId, lender, account, params?.subAccountIndexes);
26393
- if (isSiloV2Type(lender))
26394
- return buildSiloV2UserCall(chainId, lender, account);
26395
- if (isSiloV3Type(lender))
26396
- return buildSiloV3UserCall(chainId, lender, account);
26796
+ return buildEulerUserCall(
26797
+ chainId,
26798
+ lender,
26799
+ account,
26800
+ params?.subAccountIndexes
26801
+ );
26802
+ if (isSiloV2Type(lender)) return buildSiloV2UserCall(chainId, lender, account);
26803
+ if (isSiloV3Type(lender)) return buildSiloV3UserCall(chainId, lender, account);
26397
26804
  if (isCompoundV2Type(lender))
26398
26805
  return buildCompoundV2UserCall(chainId, lender, account);
26399
- if (isFluid(lender))
26400
- return buildFluidUserCall(chainId, lender, account);
26806
+ if (isFluid(lender)) return buildFluidUserCall(chainId, lender, account);
26401
26807
  if (isGearboxV3(lender))
26402
26808
  return buildGearboxV3UserCall(chainId, lender, account);
26403
26809
  if (isDolomite(lender))
26404
- return buildDolomiteUserCall(chainId, lender, account, params?.accountNumbers);
26810
+ return buildDolomiteUserCall(
26811
+ chainId,
26812
+ lender,
26813
+ account,
26814
+ params?.accountNumbers
26815
+ );
26405
26816
  return [];
26406
26817
  }
26407
26818
  function organizeUserQueries(queries) {
@@ -26414,10 +26825,11 @@ function organizeUserQueries(queries) {
26414
26825
  const river = queries.filter((q) => isRiver(q.lender));
26415
26826
  const teller = queries.filter((q) => isTeller(q.lender));
26416
26827
  const termMax = queries.filter((q) => isTermMax(q.lender));
26417
- if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0)
26828
+ const usdd = queries.filter((q) => isUsdd(q.lender));
26829
+ if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0)
26418
26830
  return queries;
26419
26831
  const others = queries.filter(
26420
- (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender)
26832
+ (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isUsdd(q.lender)
26421
26833
  );
26422
26834
  const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
26423
26835
  const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
@@ -26478,6 +26890,14 @@ function organizeUserQueries(queries) {
26478
26890
  assets: void 0
26479
26891
  });
26480
26892
  }
26893
+ if (usdd.length > 0) {
26894
+ result.push({
26895
+ lender: Lender.USDD,
26896
+ account: usdd[0].account,
26897
+ params: usdd.map((p) => p.lender),
26898
+ assets: void 0
26899
+ });
26900
+ }
26481
26901
  if (teller.length > 0) {
26482
26902
  result.push({
26483
26903
  lender: Lender.TELLER,
@@ -28841,7 +29261,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
28841
29261
  totalCalls
28842
29262
  ];
28843
29263
  };
28844
- var WAD8 = 1000000000000000000n;
29264
+ var WAD9 = 1000000000000000000n;
28845
29265
  function toBigInt11(v) {
28846
29266
  if (v === void 0 || v === null || v === "0x") return 0n;
28847
29267
  if (typeof v === "bigint") return v;
@@ -28883,8 +29303,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
28883
29303
  const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
28884
29304
  const debtNum = Number(debtStr);
28885
29305
  const repoBalance = toBigInt11(balanceResult);
28886
- const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD8;
28887
- const lentUnits = repoBalance * redemptionValue / WAD8;
29306
+ const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD9;
29307
+ const lentUnits = repoBalance * redemptionValue / WAD9;
28888
29308
  const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
28889
29309
  const depositsNum = Number(depositsStr);
28890
29310
  const posData = {};
@@ -28961,20 +29381,43 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
28961
29381
  ];
28962
29382
  };
28963
29383
  var nowSec6 = () => Math.floor(Date.now() / 1e3);
29384
+ var DAY_SECONDS = 86400n;
29385
+ var WAD10 = 10n ** 18n;
28964
29386
  function sumPreview(positions) {
28965
29387
  return positions.reduce((acc, p) => acc + p.previewValue, 0n);
28966
29388
  }
28967
- function toDetail(positions, kind, now) {
28968
- return positions.map((p) => ({
28969
- maturity: Number(p.maturity),
28970
- kind,
28971
- principal: p.position.principal.toString(),
28972
- fee: p.position.fee.toString(),
28973
- previewValue: p.previewValue.toString(),
28974
- overdue: Number(p.maturity) < now
28975
- }));
29389
+ var faceOf = (p) => p.position.principal + p.position.fee;
29390
+ function toDetail(positions, kind, now, penaltyRate, penaltyApr) {
29391
+ return positions.map((p) => {
29392
+ const maturity = Number(p.maturity);
29393
+ const overdue = maturity < now;
29394
+ const face = faceOf(p);
29395
+ const gap = face > p.previewValue ? face - p.previewValue : 0n;
29396
+ const excess = p.previewValue > face ? p.previewValue - face : 0n;
29397
+ return {
29398
+ maturity,
29399
+ kind,
29400
+ principal: p.position.principal.toString(),
29401
+ fee: p.position.fee.toString(),
29402
+ faceValue: face.toString(),
29403
+ previewValue: p.previewValue.toString(),
29404
+ overdue,
29405
+ secondsLate: overdue ? now - maturity : 0,
29406
+ ...kind === "borrow" ? {
29407
+ ...overdue ? { latePenalty: excess.toString() } : { earlyRepayDiscount: gap.toString() },
29408
+ // face × penaltyRate × 1 day — what another day of being late adds.
29409
+ latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD10).toString(),
29410
+ latePenaltyApr: penaltyApr
29411
+ } : {
29412
+ ...overdue ? {} : { earlyExitCost: gap.toString() },
29413
+ // Deposits carry no penalty: at/after maturity the payout is face.
29414
+ latePenaltyPerDay: "0",
29415
+ latePenaltyApr: 0
29416
+ }
29417
+ };
29418
+ });
28976
29419
  }
28977
- var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29420
+ var getExactlyUserDataConverter = (_lender, chainId, account, meta, requestedLenders) => {
28978
29421
  const expected = exactlyConfig()?.[chainId]?.previewer ? 1 : 0;
28979
29422
  return [
28980
29423
  (data) => {
@@ -28983,6 +29426,44 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
28983
29426
  if (!res || res === "0x" || !Array.isArray(res)) return void 0;
28984
29427
  const markets = res;
28985
29428
  const now = nowSec6();
29429
+ const enteredCollateral = markets.filter(
29430
+ (c) => c.isCollateral && c.floatingDepositAssets + sumPreview(c.fixedDepositPositions) > 0n
29431
+ );
29432
+ const collateralRow = (c, lenderKey, metaMap) => {
29433
+ const cDeposit = c.floatingDepositAssets + sumPreview(c.fixedDepositPositions);
29434
+ const collAddr = c.asset.toLowerCase();
29435
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
29436
+ const collMeta = metaMap[collUid];
29437
+ const collDec = collMeta?.asset?.decimals ?? c.decimals;
29438
+ const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
29439
+ const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
29440
+ const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
29441
+ const collStr = parseRawAmount(cDeposit.toString(), collDec);
29442
+ const collNum = Number(collStr);
29443
+ return {
29444
+ uid: collUid,
29445
+ usd24h: collNum * collPriceHist,
29446
+ row: {
29447
+ marketUid: collUid,
29448
+ underlying: collAddr,
29449
+ deposits: collStr,
29450
+ debt: "0",
29451
+ debtStable: "0",
29452
+ depositsUSD: collNum * collDisplayPrice,
29453
+ debtUSD: 0,
29454
+ debtStableUSD: 0,
29455
+ depositsUSDOracle: collNum * collOraclePrice,
29456
+ debtUSDOracle: 0,
29457
+ debtStableUSDOracle: 0,
29458
+ stableBorrowRate: "0",
29459
+ collateralEnabled: true,
29460
+ claimableRewards: 0,
29461
+ // The SAME deposit reports as the own-asset row under its own
29462
+ // market key — cross-key aggregation must skip flagged rows.
29463
+ crossCollateral: true
29464
+ }
29465
+ };
29466
+ };
28986
29467
  const out = {};
28987
29468
  for (const m of markets) {
28988
29469
  const lenderKey = exactlyLenderKey(m.market);
@@ -29008,9 +29489,22 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29008
29489
  decimals
29009
29490
  );
29010
29491
  const fixedDebtStr = parseRawAmount(fixedDebtUnits.toString(), decimals);
29492
+ const penaltyApr = exactlyPenaltyRateToAprPercent(m.penaltyRate);
29011
29493
  const fixedPositions = [
29012
- ...toDetail(m.fixedDepositPositions, "deposit", now),
29013
- ...toDetail(m.fixedBorrowPositions, "borrow", now)
29494
+ ...toDetail(
29495
+ m.fixedDepositPositions,
29496
+ "deposit",
29497
+ now,
29498
+ m.penaltyRate,
29499
+ penaltyApr
29500
+ ),
29501
+ ...toDetail(
29502
+ m.fixedBorrowPositions,
29503
+ "borrow",
29504
+ now,
29505
+ m.penaltyRate,
29506
+ penaltyApr
29507
+ )
29014
29508
  ];
29015
29509
  const posData = {};
29016
29510
  let depositsUSD24h = depositsNum * loanPriceHist;
@@ -29036,6 +29530,11 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29036
29530
  for (const p of m.fixedBorrowPositions) {
29037
29531
  const maturity = Number(p.maturity);
29038
29532
  const trancheStr = parseRawAmount(p.previewValue.toString(), decimals);
29533
+ const isMatured = maturity < now;
29534
+ const face = faceOf(p);
29535
+ const faceStr = parseRawAmount(face.toString(), decimals);
29536
+ const discount = isMatured ? "0" : parseRawAmount((face - p.previewValue).toString(), decimals);
29537
+ const penalty = isMatured ? parseRawAmount((p.previewValue - face).toString(), decimals) : "0";
29039
29538
  posData[`${loanUid}#${maturity}`] = {
29040
29539
  marketUid: loanUid,
29041
29540
  underlying: assetAddr,
@@ -29055,49 +29554,35 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29055
29554
  loanId: String(maturity),
29056
29555
  termId: maturity,
29057
29556
  isDynamic: false,
29557
+ // `debt` is the repay-NOW cost (discounted early, penalized when
29558
+ // overdue); `faceValue` is what settling AT maturity costs.
29058
29559
  debt: trancheStr,
29560
+ faceValue: faceStr,
29059
29561
  maturity,
29060
29562
  accruedInterest: parseRawAmount(
29061
29563
  p.position.fee.toString(),
29062
29564
  decimals
29063
29565
  ),
29064
- isMatured: maturity < now
29566
+ isMatured,
29567
+ /** rebate if repaid now, before maturity (never a fee) */
29568
+ earlyRepayDiscount: discount,
29569
+ /** penalty already accrued past maturity */
29570
+ latePenalty: penalty,
29571
+ /** further penalty per day overdue — linear on face */
29572
+ latePenaltyPerDay: parseRawAmount(
29573
+ (face * m.penaltyRate * DAY_SECONDS / WAD10).toString(),
29574
+ decimals
29575
+ ),
29576
+ latePenaltyApr: penaltyApr,
29577
+ secondsLate: isMatured ? now - maturity : 0
29065
29578
  }
29066
29579
  };
29067
29580
  }
29068
- if (debtUnits > 0n) {
29069
- for (const c of markets) {
29070
- if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
29071
- if (!c.isCollateral) continue;
29072
- const cDeposit = c.floatingDepositAssets + sumPreview(c.fixedDepositPositions);
29073
- if (cDeposit === 0n) continue;
29074
- const collAddr = c.asset.toLowerCase();
29075
- const collUid = createMarketUid(chainId, lenderKey, collAddr);
29076
- const collMeta = metaMap[collUid];
29077
- const collDec = collMeta?.asset?.decimals ?? c.decimals;
29078
- const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
29079
- const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
29080
- const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
29081
- const collStr = parseRawAmount(cDeposit.toString(), collDec);
29082
- const collNum = Number(collStr);
29083
- depositsUSD24h += collNum * collPriceHist;
29084
- posData[collUid] = {
29085
- marketUid: collUid,
29086
- underlying: collAddr,
29087
- deposits: collStr,
29088
- debt: "0",
29089
- debtStable: "0",
29090
- depositsUSD: collNum * collDisplayPrice,
29091
- debtUSD: 0,
29092
- debtStableUSD: 0,
29093
- depositsUSDOracle: collNum * collOraclePrice,
29094
- debtUSDOracle: 0,
29095
- debtStableUSDOracle: 0,
29096
- stableBorrowRate: "0",
29097
- collateralEnabled: true,
29098
- claimableRewards: 0
29099
- };
29100
- }
29581
+ for (const c of enteredCollateral) {
29582
+ if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
29583
+ const { uid, usd24h, row } = collateralRow(c, lenderKey, metaMap);
29584
+ posData[uid] = row;
29585
+ depositsUSD24h += usd24h;
29101
29586
  }
29102
29587
  const userData = createMultiAccountTypeUserState(
29103
29588
  {
@@ -29116,12 +29601,41 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29116
29601
  );
29117
29602
  if (userData && userData.data.length > 0) out[lenderKey] = userData;
29118
29603
  }
29604
+ if (enteredCollateral.length > 0 && requestedLenders?.length) {
29605
+ for (const req of new Set(
29606
+ requestedLenders.map((l) => l?.toUpperCase())
29607
+ )) {
29608
+ if (!req?.startsWith("EXACTLY_") || out[req]) continue;
29609
+ const metaMap = meta?.[req];
29610
+ if (!metaMap) continue;
29611
+ const posData = {};
29612
+ let depositsUSD24h = 0;
29613
+ for (const c of enteredCollateral) {
29614
+ if (exactlyLenderKey(c.market) === req) continue;
29615
+ const { uid, usd24h, row } = collateralRow(c, req, metaMap);
29616
+ posData[uid] = row;
29617
+ depositsUSD24h += usd24h;
29618
+ }
29619
+ if (Object.keys(posData).length === 0) continue;
29620
+ const userData = createMultiAccountTypeUserState(
29621
+ {
29622
+ chainId,
29623
+ account,
29624
+ lendingPositions: { "0": posData },
29625
+ modes: { "0": 0 }
29626
+ },
29627
+ metaMap,
29628
+ { "0": { totalDeposits24h: depositsUSD24h, totalDebt24h: 0 } }
29629
+ );
29630
+ if (userData && userData.data.length > 0) out[req] = userData;
29631
+ }
29632
+ }
29119
29633
  return Object.keys(out).length > 0 ? out : void 0;
29120
29634
  },
29121
29635
  expected
29122
29636
  ];
29123
29637
  };
29124
- var big = (v) => {
29638
+ var big2 = (v) => {
29125
29639
  try {
29126
29640
  if (typeof v === "bigint") return v;
29127
29641
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29129,7 +29643,7 @@ var big = (v) => {
29129
29643
  }
29130
29644
  return 0n;
29131
29645
  };
29132
- var field6 = (res, name, idx) => big(res?.[name] ?? res?.[idx]);
29646
+ var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
29133
29647
  var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29134
29648
  const cfg = liquityConfigFor(lender, chainId);
29135
29649
  const branches = liquityBranchesByChain(lender, chainId);
@@ -29176,29 +29690,29 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29176
29690
  const owner = typeof ownerRaw === "string" ? ownerRaw.toLowerCase() : void 0;
29177
29691
  if (owner !== accountLower) return;
29178
29692
  if (!troveData || troveData === "0x") return;
29179
- const entireDebt = field6(troveData, "entireDebt", 0);
29180
- const entireColl = field6(troveData, "entireColl", 1);
29693
+ const entireDebt = field7(troveData, "entireDebt", 0);
29694
+ const entireColl = field7(troveData, "entireColl", 1);
29181
29695
  if (entireDebt === 0n && entireColl === 0n) return;
29182
29696
  const troveInfo = {
29183
29697
  troveId: t.troveId,
29184
29698
  collIndex: branch.collIndex,
29185
- annualInterestRate: field6(
29699
+ annualInterestRate: field7(
29186
29700
  troveData,
29187
29701
  "annualInterestRate",
29188
29702
  6
29189
29703
  ).toString(),
29190
29704
  lastInterestRateAdjTime: Number(
29191
- field6(troveData, "lastInterestRateAdjTime", 9)
29705
+ field7(troveData, "lastInterestRateAdjTime", 9)
29192
29706
  ),
29193
29707
  zombie: t.zombie,
29194
- redistCollGain: field6(troveData, "redistCollGain", 3).toString(),
29195
- redistBoldDebtGain: field6(
29708
+ redistCollGain: field7(troveData, "redistCollGain", 3).toString(),
29709
+ redistBoldDebtGain: field7(
29196
29710
  troveData,
29197
29711
  "redistBoldDebtGain",
29198
29712
  2
29199
29713
  ).toString(),
29200
- accruedInterest: field6(troveData, "accruedInterest", 4).toString(),
29201
- accruedBatchManagementFee: field6(
29714
+ accruedInterest: field7(troveData, "accruedInterest", 4).toString(),
29715
+ accruedBatchManagementFee: field7(
29202
29716
  troveData,
29203
29717
  "accruedBatchManagementFee",
29204
29718
  8
@@ -29250,11 +29764,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29250
29764
  };
29251
29765
  });
29252
29766
  const spBase = troves.length * 2;
29253
- const spDeposit = big(slice2[spBase]);
29254
- const spYield = big(slice2[spBase + 1]);
29255
- const spCollGain = big(slice2[spBase + 2]);
29256
- const spStashed = big(slice2[spBase + 3]);
29257
- const collSurplus = branch.collSurplusPool ? big(slice2[spBase + 4]) : 0n;
29767
+ const spDeposit = big2(slice2[spBase]);
29768
+ const spYield = big2(slice2[spBase + 1]);
29769
+ const spCollGain = big2(slice2[spBase + 2]);
29770
+ const spStashed = big2(slice2[spBase + 3]);
29771
+ const collSurplus = branch.collSurplusPool ? big2(slice2[spBase + 4]) : 0n;
29258
29772
  const spStable = spDeposit + spYield;
29259
29773
  const spColl = spCollGain + spStashed + collSurplus;
29260
29774
  if (spStable > 0n || spColl > 0n) {
@@ -29333,7 +29847,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29333
29847
  expected
29334
29848
  ];
29335
29849
  };
29336
- var big2 = (v) => {
29850
+ var big3 = (v) => {
29337
29851
  try {
29338
29852
  if (typeof v === "bigint") return v;
29339
29853
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29341,7 +29855,7 @@ var big2 = (v) => {
29341
29855
  }
29342
29856
  return 0n;
29343
29857
  };
29344
- var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
29858
+ var field8 = (res, name, idx) => big3(res?.[name] ?? res?.[idx]);
29345
29859
  var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29346
29860
  const cfg = riverConfigFor(lender, chainId);
29347
29861
  const markets = riverChainData(lender, chainId)?.markets ?? [];
@@ -29353,13 +29867,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29353
29867
  const debtAddr = cfg.debtToken.toLowerCase();
29354
29868
  const debtDecimals = cfg.debtDecimals ?? 18;
29355
29869
  const out = {};
29356
- const spDeposit = big2(data[markets.length * RIVER_CALLS_PER_MARKET]);
29870
+ const spDeposit = big3(data[markets.length * RIVER_CALLS_PER_MARKET]);
29357
29871
  markets.forEach((market, i) => {
29358
29872
  const base = i * RIVER_CALLS_PER_MARKET;
29359
29873
  const entire = data[base];
29360
29874
  if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
29361
- const status = Number(big2(data[base + 1]));
29362
- const surplus = big2(data[base + 2]);
29875
+ const status = Number(big3(data[base + 1]));
29876
+ const surplus = big3(data[base + 2]);
29363
29877
  const lenderKey = riverLenderKey(lender, chainId, market.index);
29364
29878
  const metaMap = meta?.[lenderKey];
29365
29879
  if (!metaMap) return;
@@ -29378,8 +29892,8 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29378
29892
  const lendingPositions = {};
29379
29893
  const modes = {};
29380
29894
  const hist = {};
29381
- const debt = field7(entire, "debt", 0);
29382
- const coll = field7(entire, "coll", 1);
29895
+ const debt = field8(entire, "debt", 0);
29896
+ const coll = field8(entire, "coll", 1);
29383
29897
  if (status === 1 && (debt > 0n || coll > 0n)) {
29384
29898
  const riverInfo = {
29385
29899
  index: market.index,
@@ -29467,7 +29981,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29467
29981
  expected
29468
29982
  ];
29469
29983
  };
29470
- var big3 = (v) => {
29984
+ var big4 = (v) => {
29471
29985
  try {
29472
29986
  if (typeof v === "bigint") return v;
29473
29987
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29486,20 +30000,20 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
29486
30000
  const dolaAddr = cfg.dola.toLowerCase();
29487
30001
  const debtDecimals = cfg.debtDecimals ?? 18;
29488
30002
  const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
29489
- const dbrBalance = big3(data[tailBase]);
29490
- const dbrDeficit = big3(data[tailBase + 1]);
30003
+ const dbrBalance = big4(data[tailBase]);
30004
+ const dbrDeficit = big4(data[tailBase + 1]);
29491
30005
  const dbrSignedRaw = data[tailBase + 2];
29492
- const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big3(dbrSignedRaw);
30006
+ const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big4(dbrSignedRaw);
29493
30007
  const out = {};
29494
30008
  markets.forEach((market, i) => {
29495
30009
  const base = i * INVERSE_CALLS_PER_MARKET;
29496
- const escrowBal = isFailedCall(data[base]) ? 0n : big3(data[base]);
30010
+ const escrowBal = isFailedCall(data[base]) ? 0n : big4(data[base]);
29497
30011
  const debtRaw = data[base + 1];
29498
30012
  if (isFailedCall(debtRaw)) return;
29499
- const debt = big3(debtRaw);
30013
+ const debt = big4(debtRaw);
29500
30014
  if (escrowBal === 0n && debt === 0n) return;
29501
- const creditLimit = isFailedCall(data[base + 2]) ? 0n : big3(data[base + 2]);
29502
- const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big3(data[base + 3]);
30015
+ const creditLimit = isFailedCall(data[base + 2]) ? 0n : big4(data[base + 2]);
30016
+ const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big4(data[base + 3]);
29503
30017
  const lenderKey = inverseLenderKey(lender, market.address);
29504
30018
  const metaMap = meta?.[lenderKey];
29505
30019
  if (!metaMap) return;
@@ -29582,10 +30096,132 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
29582
30096
  expected
29583
30097
  ];
29584
30098
  };
30099
+ var RAY4 = 10n ** 27n;
30100
+ var big5 = (v) => {
30101
+ try {
30102
+ if (typeof v === "bigint") return v;
30103
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
30104
+ } catch {
30105
+ }
30106
+ return 0n;
30107
+ };
30108
+ var field9 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
30109
+ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
30110
+ const cfg = usddConfigFor(lender, chainId);
30111
+ const markets = usddChainData(lender, chainId)?.markets ?? [];
30112
+ const discovery = getCachedUsddCdps(chainId, account);
30113
+ const cdps = discovery?.cdps ?? [];
30114
+ const ilks = discovery?.ilks ?? [];
30115
+ const expected = cfg && markets.length > 0 && cdps.length > 0 ? cdps.length * USDD_CALLS_PER_CDP + ilks.length : 0;
30116
+ return [
30117
+ (data) => {
30118
+ if (!cfg || expected === 0) return void 0;
30119
+ if (!data || data.length < expected) return void 0;
30120
+ const debtAddr = cfg.usdd.toLowerCase();
30121
+ const debtDecimals = cfg.debtDecimals ?? 18;
30122
+ const rateByIlk = /* @__PURE__ */ new Map();
30123
+ ilks.forEach((ilk, i) => {
30124
+ const res = data[cdps.length * USDD_CALLS_PER_CDP + i];
30125
+ if (!isFailedCall(res)) rateByIlk.set(ilk, field9(res, "rate", 1));
30126
+ });
30127
+ const perMarket = /* @__PURE__ */ new Map();
30128
+ cdps.forEach((cdp, i) => {
30129
+ const res = data[i * USDD_CALLS_PER_CDP];
30130
+ if (isFailedCall(res)) return;
30131
+ const ink = field9(res, "ink", 0);
30132
+ const art = field9(res, "art", 1);
30133
+ const rate = rateByIlk.get(cdp.ilk) ?? RAY4;
30134
+ const debt = art * rate / RAY4;
30135
+ if (ink === 0n && debt === 0n) return;
30136
+ const market = markets.find((m) => m.ilk === cdp.ilk);
30137
+ if (!market) return;
30138
+ const key = usddLenderKey(lender, chainId, cdp.ilk);
30139
+ if (!perMarket.has(key)) perMarket.set(key, { market, positions: [] });
30140
+ perMarket.get(key).positions.push({ cdp, ink, debt });
30141
+ });
30142
+ const out = {};
30143
+ for (const [lenderKey, { market, positions }] of perMarket) {
30144
+ const metaMap = meta?.[lenderKey];
30145
+ if (!metaMap) continue;
30146
+ const collAddr = market.collToken.toLowerCase();
30147
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
30148
+ const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
30149
+ const collMeta = metaMap[collUid];
30150
+ const loanMeta = metaMap[loanUid];
30151
+ collMeta?.asset?.decimals ?? market.collDecimals;
30152
+ const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
30153
+ const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
30154
+ const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
30155
+ const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
30156
+ const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
30157
+ const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
30158
+ const lendingPositions = {};
30159
+ const modes = {};
30160
+ const hist = {};
30161
+ for (const { cdp, ink, debt } of positions) {
30162
+ const collStr = parseRawAmount(ink.toString(), 18);
30163
+ const collNum = Number(collStr);
30164
+ const debtStr = parseRawAmount(debt.toString(), debtDecimals);
30165
+ const debtNum = Number(debtStr);
30166
+ const usddInfo = { ...cdp };
30167
+ lendingPositions[cdp.cdpId] = {
30168
+ [collUid]: {
30169
+ marketUid: collUid,
30170
+ underlying: collAddr,
30171
+ deposits: collStr,
30172
+ debt: "0",
30173
+ debtStable: "0",
30174
+ depositsUSD: collNum * collDisplay,
30175
+ debtUSD: 0,
30176
+ debtStableUSD: 0,
30177
+ depositsUSDOracle: collNum * collOracle,
30178
+ debtUSDOracle: 0,
30179
+ debtStableUSDOracle: 0,
30180
+ stableBorrowRate: "0",
30181
+ collateralEnabled: true,
30182
+ claimableRewards: 0
30183
+ },
30184
+ [loanUid]: {
30185
+ marketUid: loanUid,
30186
+ underlying: debtAddr,
30187
+ deposits: "0",
30188
+ debt: debtStr,
30189
+ debtStable: "0",
30190
+ depositsUSD: 0,
30191
+ debtUSD: debtNum * loanDisplay,
30192
+ debtStableUSD: 0,
30193
+ depositsUSDOracle: 0,
30194
+ debtUSDOracle: debtNum * loanOracle,
30195
+ debtStableUSDOracle: 0,
30196
+ stableBorrowRate: "0",
30197
+ collateralEnabled: false,
30198
+ claimableRewards: 0,
30199
+ usddInfo
30200
+ }
30201
+ };
30202
+ modes[cdp.cdpId] = 0;
30203
+ hist[cdp.cdpId] = {
30204
+ totalDeposits24h: collNum * collHist,
30205
+ totalDebt24h: debtNum * loanHist
30206
+ };
30207
+ }
30208
+ if (Object.keys(lendingPositions).length === 0) continue;
30209
+ const userData = createMultiAccountTypeUserState(
30210
+ { chainId, account, lendingPositions, modes },
30211
+ metaMap,
30212
+ hist
30213
+ );
30214
+ if (userData && userData.data.length > 0) out[lenderKey] = userData;
30215
+ }
30216
+ return Object.keys(out).length > 0 ? out : void 0;
30217
+ },
30218
+ expected
30219
+ ];
30220
+ };
29585
30221
 
29586
30222
  // src/lending/user-data/teller/userCallParse.ts
29587
30223
  var nowSec7 = () => Math.floor(Date.now() / 1e3);
29588
- var big4 = (v) => {
30224
+ var big6 = (v) => {
29589
30225
  try {
29590
30226
  if (typeof v === "bigint") return v;
29591
30227
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29593,7 +30229,7 @@ var big4 = (v) => {
29593
30229
  }
29594
30230
  return 0n;
29595
30231
  };
29596
- var field8 = (res, name, idx) => res?.[name] ?? res?.[idx];
30232
+ var field10 = (res, name, idx) => res?.[name] ?? res?.[idx];
29597
30233
  var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29598
30234
  const discovery = getCachedTellerBids(chainId, account);
29599
30235
  const kept = discovery?.bids ?? [];
@@ -29607,7 +30243,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29607
30243
  const base = i * TELLER_CALLS_PER_BID;
29608
30244
  const bidRes = data[base];
29609
30245
  const owed = data[base + 1];
29610
- const collAmount = big4(data[base + 2]);
30246
+ const collAmount = big6(data[base + 2]);
29611
30247
  const defaulted = !!data[base + 3];
29612
30248
  if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
29613
30249
  const pool = b.pool;
@@ -29628,17 +30264,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29628
30264
  const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
29629
30265
  const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
29630
30266
  const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
29631
- const owedPrincipal = big4(field8(owed, "principal", 0));
29632
- const owedInterest = big4(field8(owed, "interest", 1));
30267
+ const owedPrincipal = big6(field10(owed, "principal", 0));
30268
+ const owedInterest = big6(field10(owed, "interest", 1));
29633
30269
  const owedTotal = owedPrincipal + owedInterest;
29634
30270
  if (owedTotal === 0n && collAmount === 0n) return;
29635
- const loanDetails = field8(bidRes, "loanDetails", 5);
29636
- const terms = field8(bidRes, "terms", 6);
30271
+ const loanDetails = field10(bidRes, "loanDetails", 5);
30272
+ const terms = field10(bidRes, "terms", 6);
29637
30273
  const acceptedTs = Number(
29638
- big4(field8(loanDetails, "acceptedTimestamp", 4))
30274
+ big6(field10(loanDetails, "acceptedTimestamp", 4))
29639
30275
  );
29640
- const loanDuration = Number(big4(field8(loanDetails, "loanDuration", 6)));
29641
- const aprBps = Number(big4(field8(terms, "APR", 2)));
30276
+ const loanDuration = Number(big6(field10(loanDetails, "loanDuration", 6)));
30277
+ const aprBps = Number(big6(field10(terms, "APR", 2)));
29642
30278
  const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
29643
30279
  const isMatured = defaulted || maturity !== void 0 && maturity < now;
29644
30280
  const collStr = parseRawAmount(collAmount.toString(), collDecimals);
@@ -29736,7 +30372,7 @@ function toBigInt12(v) {
29736
30372
  return 0n;
29737
30373
  }
29738
30374
  }
29739
- function field9(res, name, index) {
30375
+ function field11(res, name, index) {
29740
30376
  if (res && typeof res === "object" && !Array.isArray(res) && name in res) {
29741
30377
  return res[name];
29742
30378
  }
@@ -29744,18 +30380,18 @@ function field9(res, name, index) {
29744
30380
  return void 0;
29745
30381
  }
29746
30382
  function parsePosition(res) {
29747
- const ftBalance = toBigInt12(field9(res, "ftBalance", 2));
29748
- const xtBalance = toBigInt12(field9(res, "xtBalance", 3));
29749
- const rawGts = field9(res, "gtInfo", 4);
30383
+ const ftBalance = toBigInt12(field11(res, "ftBalance", 2));
30384
+ const xtBalance = toBigInt12(field11(res, "xtBalance", 3));
30385
+ const rawGts = field11(res, "gtInfo", 4);
29750
30386
  const gts = [];
29751
30387
  if (Array.isArray(rawGts)) {
29752
30388
  for (const g of rawGts) {
29753
- const loanId = toBigInt12(field9(g, "loanId", 0));
30389
+ const loanId = toBigInt12(field11(g, "loanId", 0));
29754
30390
  if (loanId === 0n) continue;
29755
30391
  gts.push({
29756
30392
  loanId: loanId.toString(),
29757
- collateralAmt: toBigInt12(field9(g, "collateralAmt", 1)),
29758
- debtAmt: toBigInt12(field9(g, "debtAmt", 2))
30393
+ collateralAmt: toBigInt12(field11(g, "collateralAmt", 1)),
30394
+ debtAmt: toBigInt12(field11(g, "debtAmt", 2))
29759
30395
  });
29760
30396
  }
29761
30397
  }
@@ -29925,7 +30561,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
29925
30561
  if (isTerm(lender))
29926
30562
  return getTermUserDataConverter(lender, chainId, account, meta);
29927
30563
  if (isExactly(lender))
29928
- return getExactlyUserDataConverter(lender, chainId, account, meta);
30564
+ return getExactlyUserDataConverter(lender, chainId, account, meta, params);
29929
30565
  if (isLiquityFamily(lender))
29930
30566
  return getLiquityUserDataConverter(lender, chainId, account, meta);
29931
30567
  if (isRiver(lender))
@@ -29936,6 +30572,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
29936
30572
  return getTermMaxUserDataConverter(lender, chainId, account, meta);
29937
30573
  if (isInverse(lender))
29938
30574
  return getInverseUserDataConverter(lender, chainId, account, meta);
30575
+ if (isUsdd(lender))
30576
+ return getUsddUserDataConverter(lender, chainId, account, meta);
29939
30577
  if (isCompoundV3Type(lender))
29940
30578
  return getCompoundV3UserDataConverter(
29941
30579
  lender,
@@ -30048,7 +30686,7 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
30048
30686
  };
30049
30687
 
30050
30688
  // src/utils/rpcCall.ts
30051
- var multicall3Abi = [
30689
+ var multicall3Abi2 = [
30052
30690
  {
30053
30691
  type: "function",
30054
30692
  name: "aggregate3",
@@ -30124,7 +30762,7 @@ function createMulticallRpcCall(preparedCalls, multicallAddress, batchSize = MUL
30124
30762
  };
30125
30763
  });
30126
30764
  const multicallData = encodeFunctionData({
30127
- abi: multicall3Abi,
30765
+ abi: multicall3Abi2,
30128
30766
  functionName: "aggregate3",
30129
30767
  args: [aggregate3Calls]
30130
30768
  });
@@ -34535,6 +35173,7 @@ var getAbi2 = (lender) => {
34535
35173
  return [...TellerV2Abi, ...TellerCollateralManagerAbi];
34536
35174
  if (isInverse(lender))
34537
35175
  return [...InverseMarketAbi, ...InverseEscrowAbi, ...InverseDbrAbi];
35176
+ if (isUsdd(lender)) return [...UsddVatAbi];
34538
35177
  if (isInit(lender)) return InitLensAbi;
34539
35178
  if (isEulerType(lender)) return accountLensAbi;
34540
35179
  if (isCompoundV2Type(lender))
@@ -35091,7 +35730,7 @@ var MORPHO_API_CHAIN_IDS = {
35091
35730
  [Chain.UNICHAIN]: 130
35092
35731
  };
35093
35732
  var FETCH_TIMEOUT_MS = 3e3;
35094
- var CACHE_TTL_MS4 = 2e3;
35733
+ var CACHE_TTL_MS5 = 2e3;
35095
35734
  var buildSubgraphQuery = (account) => `
35096
35735
  {
35097
35736
  account(id: "${account.toLowerCase()}") {
@@ -35146,11 +35785,11 @@ async function fetchJsonWithProxyFallback(url, body, proxyConfig) {
35146
35785
  }
35147
35786
  var inflight = /* @__PURE__ */ new Map();
35148
35787
  var resolved = /* @__PURE__ */ new Map();
35149
- function cacheKey4(chainId, account) {
35788
+ function cacheKey5(chainId, account) {
35150
35789
  return `${chainId}:${account.toLowerCase()}`;
35151
35790
  }
35152
35791
  async function dedupedFetch(chainId, account, loader) {
35153
- const key = cacheKey4(chainId, account);
35792
+ const key = cacheKey5(chainId, account);
35154
35793
  const now = Date.now();
35155
35794
  const cached = resolved.get(key);
35156
35795
  if (cached && cached.expiresAt > now) {
@@ -35159,7 +35798,7 @@ async function dedupedFetch(chainId, account, loader) {
35159
35798
  const existing = inflight.get(key);
35160
35799
  if (existing) return existing;
35161
35800
  const promise = loader().then((value) => {
35162
- resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS4 });
35801
+ resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
35163
35802
  return value;
35164
35803
  }).finally(() => {
35165
35804
  inflight.delete(key);
@@ -35291,8 +35930,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
35291
35930
  return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
35292
35931
  }
35293
35932
  function calculateWeightedAprs(items) {
35294
- const wa = (field10, weightField) => calculateWeightedAverage(
35295
- items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field10], weight: Math.abs(i[weightField]) }))
35933
+ const wa = (field12, weightField) => calculateWeightedAverage(
35934
+ items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field12], weight: Math.abs(i[weightField]) }))
35296
35935
  );
35297
35936
  return {
35298
35937
  apr: wa("apr", "nav"),
@@ -36562,8 +37201,8 @@ var rswethFetcher = {
36562
37201
  };
36563
37202
 
36564
37203
  // src/yields/intrinsic/annualizeRate.ts
36565
- var YEAR_SECONDS2 = 365 * 24 * 60 * 60;
36566
- var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS2 / elapsedSeconds) * 100;
37204
+ var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
37205
+ var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS3 / elapsedSeconds) * 100;
36567
37206
  var annualizeRateDeltaPercent = (rateNow, rateThen, elapsedSeconds) => {
36568
37207
  const growth = typeof rateNow === "bigint" && typeof rateThen === "bigint" ? Number(rateNow - rateThen) / Number(rateThen) : Number(rateNow) / Number(rateThen) - 1;
36569
37208
  return annualizeGrowthPercent(growth, elapsedSeconds);
@@ -37030,8 +37669,8 @@ var stKaiaFetcher = {
37030
37669
  // src/yields/intrinsic/fetchers/lista.ts
37031
37670
  var HISTORY_URL = "https://api.lista.org/api/datachart/history";
37032
37671
  var SLISBNB = "Lista Staked BNB::slisBNB";
37033
- var DAY_SECONDS = 86400;
37034
- var LOOKBACK_SECONDS = 14 * DAY_SECONDS;
37672
+ var DAY_SECONDS2 = 86400;
37673
+ var LOOKBACK_SECONDS = 14 * DAY_SECONDS2;
37035
37674
  var TIMEOUT_MS = 8e3;
37036
37675
  var slisBnbFetcher = {
37037
37676
  label: "SLISBNB",
@@ -37605,7 +38244,7 @@ var FRXETH_SUMMARY_URL = "https://api.frax.finance/v2/frxeth/summary/latest";
37605
38244
  var SFRXETH = "0xac3e018457b222d93114458476f3e3416abbe38f";
37606
38245
  var SFRXUSD = "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6";
37607
38246
  var SFRAX = "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32";
37608
- var YEAR_SECONDS3 = 31536000n;
38247
+ var YEAR_SECONDS4 = 31536000n;
37609
38248
  var ONE_E186 = 10n ** 18n;
37610
38249
  var SFRXETH_KEY = "SFRXETH";
37611
38250
  var SFRXUSD_KEY = "SFRXUSD";
@@ -37705,7 +38344,7 @@ var fetchSfrxEthAprOnChain = async () => {
37705
38344
  const window = BigInt(cycleEnd) - BigInt(lastSync);
37706
38345
  if (window <= 0n || totalAssets === 0n) return 0;
37707
38346
  const perSecond = lastRewardAmount / window;
37708
- return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / totalAssets) / 1e16;
38347
+ return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / totalAssets) / 1e16;
37709
38348
  };
37710
38349
  var fetchSfrxEthApr = async () => {
37711
38350
  try {
@@ -37737,7 +38376,7 @@ var fetchFraxSavingsAprs = async () => {
37737
38376
  const uncapped = window > 0n ? rewardCycleAmount / window : 0n;
37738
38377
  const cap = maxPerSecondPerAsset * storedTotalAssets / ONE_E186;
37739
38378
  const perSecond = uncapped < cap ? uncapped : cap;
37740
- return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / storedTotalAssets) / 1e16;
38379
+ return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / storedTotalAssets) / 1e16;
37741
38380
  };
37742
38381
  return { sfrxUsd: aprAt(0), sfrax: aprAt(3) };
37743
38382
  };
@@ -39365,8 +40004,8 @@ var hastraPrimeFetcher = {
39365
40004
  return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
39366
40005
  }
39367
40006
  };
39368
- var RAY3 = 10n ** 27n;
39369
- var YEAR_SECONDS4 = 31536e3;
40007
+ var RAY5 = 10n ** 27n;
40008
+ var YEAR_SECONDS5 = 31536e3;
39370
40009
  var SPARK_VAULTS_V2 = [
39371
40010
  {
39372
40011
  chainId: Chain.ETHEREUM_MAINNET,
@@ -39442,9 +40081,9 @@ var SSR_ABI = [
39442
40081
  }
39443
40082
  ];
39444
40083
  var aprFromVsr = (vsr) => {
39445
- if (vsr <= RAY3) return 0;
39446
- const perSecond = Number(vsr - RAY3) / 1e27;
39447
- return perSecond * YEAR_SECONDS4 * 100;
40084
+ if (vsr <= RAY5) return 0;
40085
+ const perSecond = Number(vsr - RAY5) / 1e27;
40086
+ return perSecond * YEAR_SECONDS5 * 100;
39448
40087
  };
39449
40088
  var chainsOf = (vaults) => [
39450
40089
  ...new Set(vaults.map((v) => v.chainId))
@@ -39463,7 +40102,7 @@ var fetchChain = async (chainId, vaults) => {
39463
40102
  const out = {};
39464
40103
  vaults.forEach((v, i) => {
39465
40104
  const vsr = results[i];
39466
- if (typeof vsr !== "bigint" || vsr < RAY3) return;
40105
+ if (typeof vsr !== "bigint" || vsr < RAY5) return;
39467
40106
  const apr = aprFromVsr(vsr);
39468
40107
  out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
39469
40108
  if (v.assetGroup) out[v.assetGroup] = apr;
@@ -39477,7 +40116,7 @@ var fetchSusdcApr = async () => {
39477
40116
  calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
39478
40117
  allowFailure: false
39479
40118
  });
39480
- if (typeof ssr !== "bigint" || ssr < RAY3) {
40119
+ if (typeof ssr !== "bigint" || ssr < RAY5) {
39481
40120
  throw new Error("Spark sUSDC: unreadable ssr()");
39482
40121
  }
39483
40122
  const apr = aprFromVsr(ssr);
@@ -39536,9 +40175,9 @@ var SUSDP_VAULTS = [
39536
40175
  address: "0x472ed57b376fe400259fb28e5c46eb53f0e3e7e7"
39537
40176
  }
39538
40177
  ];
39539
- var YEAR_SECONDS5 = 31536e3;
40178
+ var YEAR_SECONDS6 = 31536e3;
39540
40179
  var BASE_27 = 1e27;
39541
- var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS5 * 100;
40180
+ var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS6 * 100;
39542
40181
  var SUSDP_KEY = "SUSDP";
39543
40182
  var SUSDP_GROUP_KEY = "Staked USDp::sUSDp";
39544
40183
  var parallelFetcher = {
@@ -39701,7 +40340,9 @@ var reProtocolFetcher = {
39701
40340
  var USD3_KEY = "3JANE::USD3";
39702
40341
  var SUSD3_KEY = "3JANE::sUSD3";
39703
40342
  var USD3_GROUP_KEY = "3Jane USD3::USD3";
39704
- var SUSD3_GROUP_KEY = "3Jane Staked USD3::SUSD3";
40343
+ var SUSD3_GROUP_KEY = "3Jane Staked USD3::sUSD3";
40344
+ var USD3_LEGACY_GROUP_KEY = "USD3::USD3";
40345
+ var SUSD3_LEGACY_GROUP_KEY = "sUSD3::sUSD3";
39705
40346
  var USD3_POOL = "f8cd444e-d99f-4132-b234-fd3482bf8806";
39706
40347
  var SUSD3_POOL = "a99bb965-ebaa-4d98-9ed2-fa18de52c605";
39707
40348
  var threeJaneFetcher = {
@@ -39716,11 +40357,13 @@ var threeJaneFetcher = {
39716
40357
  const apr = apyToAprPercent(usd3.value);
39717
40358
  out[USD3_KEY] = apr;
39718
40359
  out[USD3_GROUP_KEY] = apr;
40360
+ out[USD3_LEGACY_GROUP_KEY] = apr;
39719
40361
  }
39720
40362
  if (susd3.status === "fulfilled") {
39721
40363
  const apr = apyToAprPercent(susd3.value);
39722
40364
  out[SUSD3_KEY] = apr;
39723
40365
  out[SUSD3_GROUP_KEY] = apr;
40366
+ out[SUSD3_LEGACY_GROUP_KEY] = apr;
39724
40367
  }
39725
40368
  if (Object.keys(out).length === 0) {
39726
40369
  throw new Error("3Jane: DefiLlama returned no apy for either pool");
@@ -39756,7 +40399,7 @@ var toriFetcher = {
39756
40399
  };
39757
40400
  var CHAIN_ID8 = Chain.ETHEREUM_MAINNET;
39758
40401
  var SNUSD = "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313";
39759
- var YEAR_SECONDS6 = 31536000n;
40402
+ var YEAR_SECONDS7 = 31536000n;
39760
40403
  var ONE_E187 = 10n ** 18n;
39761
40404
  var SNUSD_KEY = "SNUSD";
39762
40405
  var SNUSD_GROUP_KEY = "Staked NUSD::sNUSD";
@@ -39808,7 +40451,7 @@ var fetchSnusdAprOnChain = async () => {
39808
40451
  const window = elapsed > vestingPeriod ? elapsed : vestingPeriod;
39809
40452
  if (window <= 0n) return 0;
39810
40453
  const perSecond = vestingAmount / window;
39811
- return Number(perSecond * YEAR_SECONDS6 * ONE_E187 / totalAssets) / 1e16;
40454
+ return Number(perSecond * YEAR_SECONDS7 * ONE_E187 / totalAssets) / 1e16;
39812
40455
  };
39813
40456
  var snusdFetcher = {
39814
40457
  label: "SNUSD",
@@ -39821,8 +40464,179 @@ var snusdFetcher = {
39821
40464
  };
39822
40465
  }
39823
40466
  };
39824
- var RAY4 = 10n ** 27n;
39825
- var YEAR_SECONDS7 = 31536e3;
40467
+ var CHAIN_ID9 = Chain.ETHEREUM_MAINNET;
40468
+ var APYUSD = "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a";
40469
+ var APYX_LINEAR_VEST = "0x0d62b4cc02b4b51ed19ddf41d7a7979cf394c99f";
40470
+ var APYX_DISCOVER_URL = "https://api.apyx.fi/v1/rewards/seasons/2/discover";
40471
+ var APYX_DEFILLAMA_POOL = "cb6139f9-4a68-4efd-8245-0312a92aee55";
40472
+ var YEAR_SECONDS8 = 31536000n;
40473
+ var ONE_E188 = 10n ** 18n;
40474
+ var APYUSD_KEY = "APYUSD";
40475
+ var APYUSD_GROUP_KEY = "apyUSD::APYUSD";
40476
+ var APYUSD_LEGACY_GROUP_KEY = "apyUSD::apyUSD";
40477
+ var APYX_READ_ABI = [
40478
+ {
40479
+ name: "totalAssets",
40480
+ type: "function",
40481
+ stateMutability: "view",
40482
+ inputs: [],
40483
+ outputs: [{ type: "uint256" }]
40484
+ },
40485
+ {
40486
+ name: "unvestedAmount",
40487
+ type: "function",
40488
+ stateMutability: "view",
40489
+ inputs: [],
40490
+ outputs: [{ type: "uint256" }]
40491
+ },
40492
+ {
40493
+ name: "vestingPeriodRemaining",
40494
+ type: "function",
40495
+ stateMutability: "view",
40496
+ inputs: [],
40497
+ outputs: [{ type: "uint256" }]
40498
+ }
40499
+ ];
40500
+ var fetchApyusdAprOnChain = async () => {
40501
+ const [totalAssets, unvested, periodRemaining] = await multicallRetryUniversal({
40502
+ chain: CHAIN_ID9,
40503
+ abi: APYX_READ_ABI,
40504
+ calls: [
40505
+ { address: APYUSD, name: "totalAssets", params: [] },
40506
+ { address: APYX_LINEAR_VEST, name: "unvestedAmount", params: [] },
40507
+ {
40508
+ address: APYX_LINEAR_VEST,
40509
+ name: "vestingPeriodRemaining",
40510
+ params: []
40511
+ }
40512
+ ],
40513
+ allowFailure: false
40514
+ });
40515
+ if (totalAssets === 0n || periodRemaining === 0n || unvested === 0n) {
40516
+ throw new Error("apyx vesting state empty");
40517
+ }
40518
+ const perSecond = unvested / periodRemaining;
40519
+ return Number(perSecond * YEAR_SECONDS8 * ONE_E188 / totalAssets) / 1e16;
40520
+ };
40521
+ var fetchApyusdApyFromApi = async () => {
40522
+ const res = await fetch(APYX_DISCOVER_URL, {
40523
+ headers: { accept: "application/json" },
40524
+ signal: AbortSignal.timeout(8e3)
40525
+ });
40526
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
40527
+ const items = (await res.json())?.data?.items ?? [];
40528
+ const row = items.find(
40529
+ (it) => it?.protocol === "Apyx" && it?.network === "ethereum" && Array.isArray(it?.assetSymbols) && it.assetSymbols.includes("apyUSD") && it?.apy != null
40530
+ );
40531
+ const apy = Number(row?.apy);
40532
+ if (Number.isFinite(apy) && apy > 0) return apy;
40533
+ throw new Error("apyUSD apy missing");
40534
+ };
40535
+ var apyxFetcher = {
40536
+ label: "APYUSD",
40537
+ fetch: async () => {
40538
+ const apr = await fetchApyusdAprOnChain().catch(async () => apyToAprPercent(await fetchApyusdApyFromApi())).catch(() => fetchDefiLlamaApy(APYX_DEFILLAMA_POOL)).catch(() => 0);
40539
+ return {
40540
+ [APYUSD_KEY]: apr,
40541
+ [APYUSD_GROUP_KEY]: apr,
40542
+ [APYUSD_LEGACY_GROUP_KEY]: apr
40543
+ };
40544
+ }
40545
+ };
40546
+
40547
+ // src/yields/intrinsic/fetchers/strata.ts
40548
+ var STRATA_ANALYTICS_URL = "https://s3.strata.money/tranches/analytics-v18.json";
40549
+ var SRUSDE_KEY = "Strata Senior USDe::SRUSDE";
40550
+ var JRUSDE_KEY = "Strata Junior USDe::jrUSDe";
40551
+ var SRNUSD_KEY = "Strata Senior NUSD::srNUSD";
40552
+ var JRNUSD_KEY = "Strata Junior NUSD::JRNUSD";
40553
+ var SRMHYPER_KEY = "Strata Senior mHYPER::srmHYPER";
40554
+ var JRMHYPER_KEY = "Strata Junior mHYPER::JRMHYPER";
40555
+ var SRMM1USD_KEY = "Strata Senior mM1-USD::SRMM1-USD";
40556
+ var JRMM1USD_KEY = "Strata Junior mM1-USD::JRMM1-USD";
40557
+ var SRUSDAT_KEY = "Strata Senior USDat::SRUSDAT";
40558
+ var JRUSDAT_KEY = "Strata Junior USDat::JRUSDAT";
40559
+ var SRPRIME_KEY = "Strata Senior PRIME::srPRIME";
40560
+ var JRPRIME_KEY = "Strata Junior PRIME::jrPRIME";
40561
+ var STRATA_MARKETS = [
40562
+ {
40563
+ cdo: "ethenaCdo",
40564
+ sr: { key: SRUSDE_KEY, llamaPool: "843be062-d836-43ef-9670-c78d6ecb60bf" },
40565
+ jr: { key: JRUSDE_KEY, llamaPool: "8352355c-5ad7-45c5-aca2-628de224f8d8" }
40566
+ },
40567
+ {
40568
+ cdo: "neutrlCdo",
40569
+ sr: { key: SRNUSD_KEY, llamaPool: "979711ce-d0c0-4aae-a5fc-d7b76e868649" },
40570
+ jr: { key: JRNUSD_KEY, llamaPool: "947928b7-c446-49d7-a378-392df37660f7" }
40571
+ },
40572
+ {
40573
+ cdo: "mhyperCdo",
40574
+ sr: {
40575
+ key: SRMHYPER_KEY,
40576
+ llamaPool: "a0560647-eb43-45d9-880d-3155db6d357e"
40577
+ },
40578
+ jr: {
40579
+ key: JRMHYPER_KEY,
40580
+ llamaPool: "908664de-79ee-4f4f-9347-40da76a43552"
40581
+ }
40582
+ },
40583
+ {
40584
+ cdo: "mm1usdCdo",
40585
+ sr: {
40586
+ key: SRMM1USD_KEY,
40587
+ llamaPool: "8139ac7b-c983-4800-bb98-60abe3d68157"
40588
+ },
40589
+ jr: {
40590
+ key: JRMM1USD_KEY,
40591
+ llamaPool: "2172d4b0-9a76-4452-af46-2ce833d2c612"
40592
+ }
40593
+ },
40594
+ {
40595
+ cdo: "saturnCdo",
40596
+ sr: { key: SRUSDAT_KEY, llamaPool: "d0f93146-6936-4fac-841e-68178b5a59b2" },
40597
+ jr: { key: JRUSDAT_KEY, llamaPool: "1f42963b-ff24-4563-acb7-0fd35e6ec45b" }
40598
+ },
40599
+ {
40600
+ cdo: "figureCdo",
40601
+ sr: { key: SRPRIME_KEY, llamaPool: "c590eff9-9de2-462c-b629-7e9c89f0b8e9" },
40602
+ jr: { key: JRPRIME_KEY, llamaPool: "f88ff950-9096-46c0-bb9e-93f4d8266c41" }
40603
+ }
40604
+ ];
40605
+ var fetchStrataAnalytics = async () => {
40606
+ const res = await fetch(STRATA_ANALYTICS_URL, {
40607
+ headers: { accept: "application/json" },
40608
+ signal: AbortSignal.timeout(8e3)
40609
+ });
40610
+ if (!res.ok) throw new Error(`Strata analytics HTTP ${res.status}`);
40611
+ return await res.json();
40612
+ };
40613
+ var strataFetcher = {
40614
+ label: "STRATA",
40615
+ fetch: async () => {
40616
+ const analytics = await fetchStrataAnalytics().catch(() => null);
40617
+ const out = {};
40618
+ await Promise.all(
40619
+ STRATA_MARKETS.flatMap(
40620
+ ({ cdo, sr, jr }) => [
40621
+ [sr, analytics?.[cdo]?.week?.srt?.apr],
40622
+ [jr, analytics?.[cdo]?.week?.jrt?.apr]
40623
+ ].map(async ([tranche, apr]) => {
40624
+ if (typeof apr === "number" && Number.isFinite(apr)) {
40625
+ out[tranche.key] = apr;
40626
+ return;
40627
+ }
40628
+ const llamaApy = await fetchDefiLlamaApy(tranche.llamaPool).catch(
40629
+ () => null
40630
+ );
40631
+ if (llamaApy !== null) out[tranche.key] = apyToAprPercent(llamaApy);
40632
+ })
40633
+ )
40634
+ );
40635
+ return out;
40636
+ }
40637
+ };
40638
+ var RAY6 = 10n ** 27n;
40639
+ var YEAR_SECONDS9 = 31536e3;
39826
40640
  var DSR_ABI = [
39827
40641
  {
39828
40642
  name: "dsr",
@@ -39848,9 +40662,9 @@ var USDD_EARN_APY_URL = "https://openapi.usdd.io/api/v1/external/earn-apy";
39848
40662
  var susddKey = (chainId) => `USDD::${chainId}::sUSDD`;
39849
40663
  var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
39850
40664
  var aprFromDsr = (dsr) => {
39851
- if (dsr <= RAY4) return 0;
39852
- const perSecond = Number(dsr - RAY4) / 1e27;
39853
- return perSecond * YEAR_SECONDS7 * 100;
40665
+ if (dsr <= RAY6) return 0;
40666
+ const perSecond = Number(dsr - RAY6) / 1e27;
40667
+ return perSecond * YEAR_SECONDS9 * 100;
39854
40668
  };
39855
40669
  var fetchChainDsr = async (chainId, pot) => {
39856
40670
  const [dsr] = await multicallRetryUniversal({
@@ -39859,7 +40673,7 @@ var fetchChainDsr = async (chainId, pot) => {
39859
40673
  calls: [{ address: pot, name: "dsr", params: [] }],
39860
40674
  allowFailure: false
39861
40675
  });
39862
- if (typeof dsr !== "bigint" || dsr < RAY4) {
40676
+ if (typeof dsr !== "bigint" || dsr < RAY6) {
39863
40677
  throw new Error(`USDD: unreadable dsr() on chain ${chainId}`);
39864
40678
  }
39865
40679
  return aprFromDsr(dsr);
@@ -41395,6 +42209,270 @@ var SINGLE_CHAIN_ENTRIES = {
41395
42209
  yieldFetcher: snusdFetcher,
41396
42210
  yieldKey: SNUSD_KEY
41397
42211
  },
42212
+ {
42213
+ // Apyx apyUSD — ERC-4626 over apxUSD, the "Dividend-Backed
42214
+ // Dollar" (variable-rate perpetual preferred stock of DAT
42215
+ // companies, STRC/Strategy). Yield = off-chain dividends minted
42216
+ // as apxUSD and dripped in through a 14-day LinearVestV0
42217
+ // (0x0d62b4cc…, `pullVestedYield`). No on-chain solvency
42218
+ // invariant — RWA/NAV trust class. apxUSD minting is
42219
+ // EIP-712/m-of-n gated (institutional) but the 4626 stake side is
42220
+ // permissionless (`maxDeposit` = uint.max), with deep secondary
42221
+ // apxUSD liquidity (Curve / Uni v4).
42222
+ //
42223
+ // EXIT (fork-verified 2026-08-04, and NOT what the docs site
42224
+ // describes): a 4626 redeem pays the caller nothing. It takes the
42225
+ // vault's flat `unlockingFee()` (0.1%), escrows the apxUSD in the
42226
+ // unlock-RECEIPT contract (`receipt()` = 0x9bf51f33…) and mints a
42227
+ // soulbound ERC-721 keyed by tokenId. Claims are blocked for
42228
+ // `feeCurve.minDuration` (3 days — hence the cooldown below) and
42229
+ // then carry a fee decaying to zero at `maxDuration` (20 days):
42230
+ // measured 3.40% at 3d, 2.60% at 7d, 0% at 20d. The curve is
42231
+ // GLOBAL and admin-settable (capped 5%), so it re-prices receipts
42232
+ // already in flight — quote `previewClaim(tokenId)` live rather
42233
+ // than trusting a stored figure. The vault's legacy
42234
+ // `unlockToken()` (0x93775e2d…) is still deployed but off the
42235
+ // redemption path. Base/BNB carry bridged mirrors whose 4626
42236
+ // surface reverts (plus Solana) — Ethereum-only row.
42237
+ address: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
42238
+ underlying: "0x98a878b1cd98131b271883b390f68d2c90674665",
42239
+ // apxUSD
42240
+ symbol: "apyUSD",
42241
+ brand: "Apyx",
42242
+ description: "apxUSD is Apyx's dividend-backed dollar \u2014 collateralized by variable-rate perpetual preferred stock issued by Digital Asset Treasury companies (e.g. Strategy's STRC). apyUSD stakes it and accrues the preferred-share dividends via an appreciating share price. Exiting mints a transfer-locked receipt NFT: it cannot be claimed for 3 days, then costs a fee that decays from ~3.4% to zero at 20 days (plus a flat 0.1% on the way out). The backing lives off-chain (NAV trust).",
42243
+ decimals: 18,
42244
+ isRebasing: false,
42245
+ isMintable: true,
42246
+ withdrawalMode: "request-based",
42247
+ // Earliest claim = the receipt's `claimableAt` (`feeCurve.minDuration`,
42248
+ // 3 days). Waiting the full 20 days is what makes the exit free —
42249
+ // see the note above; both bounds are admin-mutable.
42250
+ withdrawalCooldownSeconds: 3 * 86400,
42251
+ withdrawQueue: "0x9bf51f33955ec70f87c4b5c49441815589043237",
42252
+ yieldFetcher: apyxFetcher,
42253
+ yieldKey: APYUSD_KEY
42254
+ },
42255
+ // ---- Strata (docs.strata.markets) — senior/junior risk tranches ----
42256
+ //
42257
+ // Six CDO markets, twelve ERC-4626 tranche tokens, all Ethereum.
42258
+ // Each market pools a yield-bearing collateral (sUSDe, sNUSD,
42259
+ // mHYPER, mM1-USD, sUSDat, PRIME) and splits its realized yield:
42260
+ // the senior earns a benchmark-floored rate (its `maxDeposit` is
42261
+ // coverage-cap-gated), the junior takes the residual — levered
42262
+ // upside AND first-loss capital (jrUSDat marked down to ~0.36
42263
+ // absorbing the 2026-07 USDat depeg; junior redemptions pause when
42264
+ // senior coverage drops below the market's minimum). Exits are
42265
+ // two-legged and both escrow through the market's cooldown
42266
+ // contracts, claimed via `finalize`: redeeming into the collateral
42267
+ // token runs a governance cooldown (0 seconds = effectively instant
42268
+ // on every market at integration), while the plain-4626 base-asset
42269
+ // redeem unstakes the collateral first (7d Ethena, 10d Neutrl, ≲3d
42270
+ // Midas) — hence `request-based`, with `withdrawQueue` pointing at
42271
+ // the market's UnstakeCooldown. `previewRedeem` (but NOT
42272
+ // `convertToAssets`) already nets the coverage-dependent exit fee
42273
+ // (0–20 bps). Rates are Strata's own trailing-7d realized figures —
42274
+ // see the fetcher for the junior-tranche caveats. Verified on-chain
42275
+ // 2026-08-04.
42276
+ {
42277
+ address: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
42278
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
42279
+ // USDe
42280
+ symbol: "srUSDe",
42281
+ brand: "Strata",
42282
+ description: "Strata's senior tranche over Ethena USDe: pooled deposits sit in sUSDe and the senior earns a benchmark-floored share of its yield, with the junior tranche absorbing losses first. Exits claim through cooldown contracts \u2014 the sUSDe leg is effectively instant, the USDe leg waits Ethena's 7-day unstake \u2014 minus a small coverage-dependent exit fee.",
42283
+ decimals: 18,
42284
+ isRebasing: false,
42285
+ isMintable: true,
42286
+ withdrawalMode: "request-based",
42287
+ withdrawalCooldownSeconds: 7 * 86400,
42288
+ withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
42289
+ yieldFetcher: strataFetcher,
42290
+ yieldKey: SRUSDE_KEY
42291
+ },
42292
+ {
42293
+ address: "0xc58d044404d8b14e953c115e67823784dea53d8f",
42294
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
42295
+ // USDe
42296
+ symbol: "jrUSDe",
42297
+ brand: "Strata",
42298
+ description: "Strata's junior tranche over Ethena USDe: earns the residual sUSDe yield after the senior's benchmark payment \u2014 levered upside when rates run hot, first-loss capital when they don't (the trailing APR can go negative). Exits mirror srUSDe (instant-ish sUSDe leg, 7-day USDe leg) but pause while senior coverage is below 105%.",
42299
+ decimals: 18,
42300
+ isRebasing: false,
42301
+ isMintable: true,
42302
+ withdrawalMode: "request-based",
42303
+ withdrawalCooldownSeconds: 7 * 86400,
42304
+ withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
42305
+ yieldFetcher: strataFetcher,
42306
+ yieldKey: JRUSDE_KEY
42307
+ },
42308
+ {
42309
+ address: "0x65a44528e8868166401ea08b549e19552af589db",
42310
+ underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
42311
+ // NUSD
42312
+ symbol: "srNUSD",
42313
+ brand: "Strata",
42314
+ description: "Strata's senior tranche over Neutrl NUSD: pooled deposits sit in sNUSD and the senior earns a benchmark-floored share of its yield, junior-protected. Exits claim through cooldown contracts \u2014 the sNUSD leg is effectively instant, the NUSD leg waits Neutrl's 10-day unstake \u2014 minus a 0\u20135 bps coverage-dependent exit fee.",
42315
+ decimals: 18,
42316
+ isRebasing: false,
42317
+ isMintable: true,
42318
+ withdrawalMode: "request-based",
42319
+ withdrawalCooldownSeconds: 10 * 86400,
42320
+ withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
42321
+ yieldFetcher: strataFetcher,
42322
+ yieldKey: SRNUSD_KEY
42323
+ },
42324
+ {
42325
+ address: "0xfc807058a352b61aeef6a38e2d0fc3990225e772",
42326
+ underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
42327
+ // NUSD
42328
+ symbol: "jrNUSD",
42329
+ brand: "Strata",
42330
+ description: "Strata's junior tranche over Neutrl NUSD: residual yield after the senior's benchmark payment, first-loss against sNUSD underperformance. Exits run the same cooldown claims as srNUSD (NUSD leg = 10-day unstake) with a 0\u201320 bps coverage-dependent fee, and pause while senior coverage is below the market minimum.",
42331
+ decimals: 18,
42332
+ isRebasing: false,
42333
+ isMintable: true,
42334
+ withdrawalMode: "request-based",
42335
+ withdrawalCooldownSeconds: 10 * 86400,
42336
+ withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
42337
+ yieldFetcher: strataFetcher,
42338
+ yieldKey: JRNUSD_KEY
42339
+ },
42340
+ {
42341
+ // 18-dec shares over 6-dec USDC (the yUSD case) — the collateral
42342
+ // is 18-dec mHYPER, but the vault accounts in USDC.
42343
+ address: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
42344
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42345
+ // USDC
42346
+ symbol: "srmHYPER",
42347
+ brand: "Strata",
42348
+ description: "Strata's senior tranche over Midas mHYPER (Hyperithm's multi-chain stablecoin yield strategy), accounted in USDC: benchmark-floored yield (Aave USDC/USDT supply rate + 3% premium), junior-protected. Exits claim through cooldown contracts \u2014 the mHYPER leg is effectively instant, the USDC leg follows Midas's \u22723-day redemption schedule \u2014 minus a 0\u20135 bps fee.",
42349
+ decimals: 18,
42350
+ underlyingDecimals: 6,
42351
+ isRebasing: false,
42352
+ isMintable: true,
42353
+ withdrawalMode: "request-based",
42354
+ withdrawalCooldownSeconds: 3 * 86400,
42355
+ withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
42356
+ yieldFetcher: strataFetcher,
42357
+ yieldKey: SRMHYPER_KEY
42358
+ },
42359
+ {
42360
+ address: "0xeb205d26e9e605ec82d1c0d652e00037c278714b",
42361
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42362
+ // USDC
42363
+ symbol: "jrmHYPER",
42364
+ brand: "Strata",
42365
+ description: "Strata's junior tranche over Midas mHYPER, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the mHYPER strategy. Exits mirror srmHYPER (USDC leg \u22723 days via Midas) and pause while senior coverage is below the market minimum.",
42366
+ decimals: 18,
42367
+ underlyingDecimals: 6,
42368
+ isRebasing: false,
42369
+ isMintable: true,
42370
+ withdrawalMode: "request-based",
42371
+ withdrawalCooldownSeconds: 3 * 86400,
42372
+ withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
42373
+ yieldFetcher: strataFetcher,
42374
+ yieldKey: JRMHYPER_KEY
42375
+ },
42376
+ {
42377
+ address: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
42378
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42379
+ // USDC
42380
+ symbol: "srmM1-USD",
42381
+ brand: "Strata",
42382
+ description: "Strata's senior tranche over Midas mM1-USD, accounted in USDC: benchmark-floored share of the mM1-USD yield, junior-protected. Exits claim through cooldown contracts \u2014 the mM1-USD leg is effectively instant, the USDC leg follows Midas's redemption schedule.",
42383
+ decimals: 18,
42384
+ underlyingDecimals: 6,
42385
+ isRebasing: false,
42386
+ isMintable: true,
42387
+ withdrawalMode: "request-based",
42388
+ withdrawalCooldownSeconds: 3 * 86400,
42389
+ withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
42390
+ yieldFetcher: strataFetcher,
42391
+ yieldKey: SRMM1USD_KEY
42392
+ },
42393
+ {
42394
+ address: "0xf7eb8dfec75c42d2d2247fe76ccaedc59f821688",
42395
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42396
+ // USDC
42397
+ symbol: "jrmM1-USD",
42398
+ brand: "Strata",
42399
+ description: "Strata's junior tranche over Midas mM1-USD, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the mM1-USD strategy. Exits mirror srmM1-USD and pause while senior coverage is below the market minimum.",
42400
+ decimals: 18,
42401
+ underlyingDecimals: 6,
42402
+ isRebasing: false,
42403
+ isMintable: true,
42404
+ withdrawalMode: "request-based",
42405
+ withdrawalCooldownSeconds: 3 * 86400,
42406
+ withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
42407
+ yieldFetcher: strataFetcher,
42408
+ yieldKey: JRMM1USD_KEY
42409
+ },
42410
+ {
42411
+ // Accounted in 6-dec USDat (Saturn Dollar); collateral is staked
42412
+ // 18-dec sUSDat.
42413
+ address: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
42414
+ underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
42415
+ // USDat
42416
+ symbol: "srUSDat",
42417
+ brand: "Strata",
42418
+ description: "Strata's senior tranche over Saturn USDat (a Strategy-preferred-stock-backed dollar): fixed yield at 65% of the STRC dividend rate, junior-protected \u2014 the senior held its rate straight through the 2026-07 USDat depeg that the junior absorbed. Exits claim through cooldown contracts (the sUSDat leg effectively instant) minus a 0\u20135 bps fee.",
42419
+ decimals: 18,
42420
+ underlyingDecimals: 6,
42421
+ isRebasing: false,
42422
+ isMintable: true,
42423
+ withdrawalMode: "request-based",
42424
+ withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
42425
+ yieldFetcher: strataFetcher,
42426
+ yieldKey: SRUSDAT_KEY
42427
+ },
42428
+ {
42429
+ address: "0x011e55d2b28306458e37ca7e997c879bb25a455d",
42430
+ underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
42431
+ // USDat
42432
+ symbol: "jrUSDat",
42433
+ brand: "Strata",
42434
+ description: "Strata's junior tranche over Saturn USDat \u2014 first-loss capital that proved it: the 2026-07 USDat collateral depeg marked jrUSDat down to ~0.36 while the senior stayed whole, and its trailing APR is depeg-recovery-inflated. Exits claim through cooldown contracts and pause while senior coverage is below the market minimum.",
42435
+ decimals: 18,
42436
+ underlyingDecimals: 6,
42437
+ isRebasing: false,
42438
+ isMintable: true,
42439
+ withdrawalMode: "request-based",
42440
+ withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
42441
+ yieldFetcher: strataFetcher,
42442
+ yieldKey: JRUSDAT_KEY
42443
+ },
42444
+ {
42445
+ address: "0x35bff778d3fc53a561486bf28e761428499232eb",
42446
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42447
+ // USDC
42448
+ symbol: "srPRIME",
42449
+ brand: "Strata",
42450
+ description: "Strata's senior tranche over Hastra PRIME (yield sourced from Figure's YLDS-based lending), accounted in USDC: benchmark-floored share of the PRIME yield, junior-protected. Exits claim through cooldown contracts \u2014 the PRIME leg is effectively instant, the USDC leg follows the strategy's redemption schedule.",
42451
+ decimals: 18,
42452
+ underlyingDecimals: 6,
42453
+ isRebasing: false,
42454
+ isMintable: true,
42455
+ withdrawalMode: "request-based",
42456
+ withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
42457
+ yieldFetcher: strataFetcher,
42458
+ yieldKey: SRPRIME_KEY
42459
+ },
42460
+ {
42461
+ address: "0xf4c91f24e20ee8ed5eda905e501a1136334c2f27",
42462
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42463
+ // USDC
42464
+ symbol: "jrPRIME",
42465
+ brand: "Strata",
42466
+ description: "Strata's junior tranche over Hastra PRIME, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the PRIME strategy. Exits mirror srPRIME and pause while senior coverage is below the market minimum.",
42467
+ decimals: 18,
42468
+ underlyingDecimals: 6,
42469
+ isRebasing: false,
42470
+ isMintable: true,
42471
+ withdrawalMode: "request-based",
42472
+ withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
42473
+ yieldFetcher: strataFetcher,
42474
+ yieldKey: JRPRIME_KEY
42475
+ },
41398
42476
  {
41399
42477
  // Avant savETH — staked avETH (Ethereum, where avETH is native);
41400
42478
  // StakedUSDeV2-style 24h cooldown.
@@ -42624,25 +43702,14 @@ var tethFetcher = {
42624
43702
  }
42625
43703
  };
42626
43704
 
42627
- // src/yields/intrinsic/fetchers/strata.ts
42628
- var SRNUSD_POOL_ID = "979711ce-d0c0-4aae-a5fc-d7b76e868649";
42629
- var KEYS3 = ["Strata Senior NUSD::srNUSD"];
42630
- var srnusdFetcher = {
42631
- label: "SRNUSD",
42632
- fetch: async () => {
42633
- const apr = apyToAprPercent(await fetchDefiLlamaApy(SRNUSD_POOL_ID));
42634
- return Object.fromEntries(KEYS3.map((k) => [k, apr]));
42635
- }
42636
- };
42637
-
42638
43705
  // src/yields/intrinsic/fetchers/anzen.ts
42639
43706
  var SUSDZ_POOL_ID = "46518e93-8197-4539-9861-2340c2ac965a";
42640
- var KEYS4 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
43707
+ var KEYS3 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
42641
43708
  var susdzFetcher = {
42642
43709
  label: "SUSDZ",
42643
43710
  fetch: async () => {
42644
43711
  const apr = apyToAprPercent(await fetchDefiLlamaApy(SUSDZ_POOL_ID));
42645
- return Object.fromEntries(KEYS4.map((k) => [k, apr]));
43712
+ return Object.fromEntries(KEYS3.map((k) => [k, apr]));
42646
43713
  }
42647
43714
  };
42648
43715
 
@@ -42677,7 +43744,8 @@ var LENDING_ONLY_FETCHERS = [
42677
43744
  // DefiLlama-mapped intrinsic yields for classifier assets lacking a bespoke source
42678
43745
  lsethFetcher,
42679
43746
  tethFetcher,
42680
- srnusdFetcher,
43747
+ // strataFetcher is NOT here: the Strata tranche savings rows vault-wire
43748
+ // it, so it reaches the global map via `collectVaultFetchers`.
42681
43749
  susdzFetcher
42682
43750
  ];
42683
43751
  var collectVaultFetchers = () => {
@@ -46861,10 +47929,10 @@ function createAssetArrayPerChain() {
46861
47929
  return assetsPerChain;
46862
47930
  }
46863
47931
  var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
46864
- function createSimpleArrayPerChain(fork, field10 = void 0) {
47932
+ function createSimpleArrayPerChain(fork, field12 = void 0) {
46865
47933
  let pools = {};
46866
47934
  Object.entries(fork ?? {}).forEach(([b2, data]) => {
46867
- Object.entries(field10 ? data[field10] : data).forEach(
47935
+ Object.entries(field12 ? data[field12] : data).forEach(
46868
47936
  ([chainId, address]) => {
46869
47937
  if (!pools[chainId]) pools[chainId] = [];
46870
47938
  pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
@@ -49073,9 +50141,9 @@ query EvkByAssets($assets: [Bytes!]!) {
49073
50141
  `;
49074
50142
  var ZERO = 0n;
49075
50143
  var RAY_TO_PERCENT3 = 1e25;
49076
- function readAddress2(field10) {
49077
- if (!field10) return void 0;
49078
- return field10.toLowerCase();
50144
+ function readAddress2(field12) {
50145
+ if (!field12) return void 0;
50146
+ return field12.toLowerCase();
49079
50147
  }
49080
50148
  function parseVaultFee(v) {
49081
50149
  if (v.performanceFee == null) return 0;
@@ -49440,7 +50508,7 @@ var num2 = (v) => {
49440
50508
  const n = Number(v);
49441
50509
  return Number.isFinite(n) ? n : 0;
49442
50510
  };
49443
- var big5 = (v) => {
50511
+ var big7 = (v) => {
49444
50512
  try {
49445
50513
  if (v === void 0 || v === null || v === "") return "0";
49446
50514
  const s = String(v);
@@ -49476,12 +50544,12 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
49476
50544
  const assetEntry = tokenList[underlying];
49477
50545
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
49478
50546
  const priceUsd = prices[priceKey];
49479
- const totalAssets = big5(r.totalAssets);
49480
- const totalSupply = big5(r.totalSupplyAmt);
50547
+ const totalAssets = big7(r.totalAssets);
50548
+ const totalSupply = big7(r.totalSupplyAmt);
49481
50549
  const totalAssetsFormatted = Number(totalAssets) / scale;
49482
50550
  const supplyRate = num2(r.apr) * 100;
49483
50551
  const rewardsRate = num2(r?.incentiveData?.TMX_APR) * 100;
49484
- const rawLiquidity = BigInt(big5(r.redeemableAmt ?? r.idleFunds ?? "0"));
50552
+ const rawLiquidity = BigInt(big7(r.redeemableAmt ?? r.idleFunds ?? "0"));
49485
50553
  const totalAssetsBig = BigInt(totalAssets);
49486
50554
  const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
49487
50555
  const liquidityFormatted = Number(liquidity) / scale;
@@ -49517,7 +50585,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
49517
50585
  liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
49518
50586
  version: r.version,
49519
50587
  isPaused: r.isPaused === true || void 0,
49520
- supplyCap: r.capacity ? big5(r.capacity) : void 0,
50588
+ supplyCap: r.capacity ? big7(r.capacity) : void 0,
49521
50589
  basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
49522
50590
  };
49523
50591
  }
@@ -49573,7 +50641,7 @@ var Erc20DecimalsBalanceAbi = [
49573
50641
 
49574
50642
  // src/vaults/termmax/fetchFromChain.ts
49575
50643
  var DECIMAL_BASE2 = 100000000n;
49576
- var big6 = (v) => {
50644
+ var big8 = (v) => {
49577
50645
  if (v === void 0 || v === null || v === "0x") return 0n;
49578
50646
  try {
49579
50647
  return typeof v === "bigint" ? v : BigInt(v);
@@ -49637,7 +50705,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49637
50705
  vaults.forEach((address, i) => {
49638
50706
  const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
49639
50707
  const asset = addr(at("asset"));
49640
- const totalAssets = big6(at("totalAssets"));
50708
+ const totalAssets = big8(at("totalAssets"));
49641
50709
  if (!asset || totalAssets === 0n) return;
49642
50710
  rows.push({
49643
50711
  address,
@@ -49646,11 +50714,11 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49646
50714
  decimals: num3(at("decimals")) ?? 18,
49647
50715
  asset,
49648
50716
  totalAssets,
49649
- totalSupply: big6(at("totalSupply")),
49650
- annualizedInterest: big6(at("annualizedInterest")),
49651
- accretingPrincipal: big6(at("accretingPrincipal")),
49652
- performanceFeeRate: big6(at("performanceFeeRate")),
49653
- aprRaw: at("apr") != null ? big6(at("apr")) : void 0,
50717
+ totalSupply: big8(at("totalSupply")),
50718
+ annualizedInterest: big8(at("annualizedInterest")),
50719
+ accretingPrincipal: big8(at("accretingPrincipal")),
50720
+ performanceFeeRate: big8(at("performanceFeeRate")),
50721
+ aprRaw: at("apr") != null ? big8(at("apr")) : void 0,
49654
50722
  curator: addr(at("curator")),
49655
50723
  guardian: addr(at("guardian")),
49656
50724
  timelock: num3(at("timelock")),
@@ -49671,7 +50739,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49671
50739
  const out = {};
49672
50740
  rows.forEach((r, i) => {
49673
50741
  const assetDecimals = num3(res2[i * 2]) ?? r.decimals;
49674
- const idle = big6(res2[i * 2 + 1]);
50742
+ const idle = big8(res2[i * 2 + 1]);
49675
50743
  const assetEntry = tokenList[r.asset];
49676
50744
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
49677
50745
  const priceUsd = prices[priceKey];
@@ -49791,7 +50859,7 @@ var Erc4626PreviewRedeemAbi = [
49791
50859
  ];
49792
50860
 
49793
50861
  // src/vaults/lst/readers/shared.ts
49794
- var ONE_E188 = 10n ** 18n;
50862
+ var ONE_E189 = 10n ** 18n;
49795
50863
  var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
49796
50864
  var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
49797
50865
  var Multicall3BalanceAbi = [
@@ -49834,7 +50902,7 @@ var readerBeetsStS = (entry) => ({
49834
50902
  }
49835
50903
  const liquidity = toBigInt13(pool);
49836
50904
  return {
49837
- totalAssets: totalSupply * exchangeRate / ONE_E188,
50905
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
49838
50906
  totalSupply,
49839
50907
  exchangeRate,
49840
50908
  liquidity
@@ -49867,7 +50935,7 @@ var readerBenqiSavax = (entry) => ({
49867
50935
  {
49868
50936
  address: entry.address,
49869
50937
  name: "getPooledAvaxByShares",
49870
- params: [ONE_E188]
50938
+ params: [ONE_E189]
49871
50939
  },
49872
50940
  { address: entry.address, name: "totalPooledAvax", params: [] }
49873
50941
  ],
@@ -49878,7 +50946,7 @@ var readerBenqiSavax = (entry) => ({
49878
50946
  if (totalSupply === void 0 || exchangeRate === void 0) {
49879
50947
  return void 0;
49880
50948
  }
49881
- const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E188;
50949
+ const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E189;
49882
50950
  return {
49883
50951
  totalAssets,
49884
50952
  totalSupply,
@@ -49897,7 +50965,7 @@ var readerBgtWrapper1to1 = (entry) => ({
49897
50965
  return {
49898
50966
  totalAssets: totalSupply,
49899
50967
  totalSupply,
49900
- exchangeRate: ONE_E188
50968
+ exchangeRate: ONE_E189
49901
50969
  };
49902
50970
  }
49903
50971
  });
@@ -49927,7 +50995,7 @@ var readerDineroBeraEth = (entry) => ({
49927
50995
  return void 0;
49928
50996
  }
49929
50997
  return {
49930
- totalAssets: totalSupply * exchangeRate / ONE_E188,
50998
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
49931
50999
  totalSupply,
49932
51000
  exchangeRate
49933
51001
  };
@@ -49939,7 +51007,7 @@ var readerErc4626 = (entry) => ({
49939
51007
  calls: [
49940
51008
  { address: entry.address, name: "totalAssets", params: [] },
49941
51009
  { address: entry.address, name: "totalSupply", params: [] },
49942
- { address: entry.address, name: "convertToAssets", params: [ONE_E188] }
51010
+ { address: entry.address, name: "convertToAssets", params: [ONE_E189] }
49943
51011
  ],
49944
51012
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
49945
51013
  parse: ([assets, supply, rate]) => {
@@ -49956,7 +51024,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
49956
51024
  calls: [
49957
51025
  { address: entry.address, name: "totalAssets", params: [] },
49958
51026
  { address: entry.address, name: "totalSupply", params: [] },
49959
- { address: entry.address, name: "previewRedeem", params: [ONE_E188] }
51027
+ { address: entry.address, name: "previewRedeem", params: [ONE_E189] }
49960
51028
  ],
49961
51029
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
49962
51030
  parse: ([assets, supply, rate]) => {
@@ -50036,7 +51104,7 @@ var readerEtherFiWeEth = (entry) => {
50036
51104
  }
50037
51105
  }
50038
51106
  return {
50039
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51107
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50040
51108
  totalSupply,
50041
51109
  exchangeRate,
50042
51110
  liquidity
@@ -50069,7 +51137,7 @@ var readerHyperbeatBeHype = (entry) => {
50069
51137
  return {
50070
51138
  totalAssets: totalSupply,
50071
51139
  totalSupply,
50072
- exchangeRate: ONE_E188
51140
+ exchangeRate: ONE_E189
50073
51141
  };
50074
51142
  }
50075
51143
  };
@@ -50077,7 +51145,7 @@ var readerHyperbeatBeHype = (entry) => {
50077
51145
  return {
50078
51146
  calls: [
50079
51147
  { address: entry.address, name: "totalSupply", params: [] },
50080
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E188] }
51148
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E189] }
50081
51149
  ],
50082
51150
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
50083
51151
  parse: ([supply, rate]) => {
@@ -50087,7 +51155,7 @@ var readerHyperbeatBeHype = (entry) => {
50087
51155
  return void 0;
50088
51156
  }
50089
51157
  return {
50090
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51158
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50091
51159
  totalSupply,
50092
51160
  exchangeRate
50093
51161
  };
@@ -50119,7 +51187,7 @@ var readerKelpRsEth = (entry) => {
50119
51187
  return {
50120
51188
  totalAssets: totalSupply,
50121
51189
  totalSupply,
50122
- exchangeRate: ONE_E188
51190
+ exchangeRate: ONE_E189
50123
51191
  };
50124
51192
  }
50125
51193
  };
@@ -50137,7 +51205,7 @@ var readerKelpRsEth = (entry) => {
50137
51205
  return void 0;
50138
51206
  }
50139
51207
  return {
50140
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51208
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50141
51209
  totalSupply,
50142
51210
  exchangeRate
50143
51211
  };
@@ -50169,7 +51237,7 @@ var readerKinetiqKHype = (entry) => {
50169
51237
  return {
50170
51238
  totalAssets: totalSupply,
50171
51239
  totalSupply,
50172
- exchangeRate: ONE_E188
51240
+ exchangeRate: ONE_E189
50173
51241
  };
50174
51242
  }
50175
51243
  };
@@ -50177,7 +51245,7 @@ var readerKinetiqKHype = (entry) => {
50177
51245
  return {
50178
51246
  calls: [
50179
51247
  { address: entry.address, name: "totalSupply", params: [] },
50180
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E188] }
51248
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E189] }
50181
51249
  ],
50182
51250
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
50183
51251
  parse: ([supply, rate]) => {
@@ -50187,7 +51255,7 @@ var readerKinetiqKHype = (entry) => {
50187
51255
  return void 0;
50188
51256
  }
50189
51257
  return {
50190
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51258
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50191
51259
  totalSupply,
50192
51260
  exchangeRate
50193
51261
  };
@@ -50227,7 +51295,7 @@ var readerLairStKaia = (entry) => ({
50227
51295
  if (totalSupply === void 0 || exchangeRate === void 0) {
50228
51296
  return void 0;
50229
51297
  }
50230
- const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E188;
51298
+ const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E189;
50231
51299
  return {
50232
51300
  totalAssets,
50233
51301
  totalSupply,
@@ -50261,7 +51329,7 @@ var readerLidoWstEth = (entry) => ({
50261
51329
  return void 0;
50262
51330
  }
50263
51331
  return {
50264
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51332
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50265
51333
  totalSupply,
50266
51334
  exchangeRate
50267
51335
  };
@@ -50299,7 +51367,7 @@ var readerListaSlisBnb = (entry) => {
50299
51367
  return {
50300
51368
  totalAssets: totalSupply,
50301
51369
  totalSupply,
50302
- exchangeRate: ONE_E188
51370
+ exchangeRate: ONE_E189
50303
51371
  };
50304
51372
  }
50305
51373
  };
@@ -50307,7 +51375,7 @@ var readerListaSlisBnb = (entry) => {
50307
51375
  return {
50308
51376
  calls: [
50309
51377
  { address: entry.address, name: "totalSupply", params: [] },
50310
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E188] },
51378
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E189] },
50311
51379
  { address: manager, name: "getTotalPooledBnb", params: [] }
50312
51380
  ],
50313
51381
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -50318,7 +51386,7 @@ var readerListaSlisBnb = (entry) => {
50318
51386
  return void 0;
50319
51387
  }
50320
51388
  const pooledBnb = toBigInt13(pooled);
50321
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E188;
51389
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E189;
50322
51390
  return { totalAssets, totalSupply, exchangeRate };
50323
51391
  }
50324
51392
  };
@@ -50348,7 +51416,7 @@ var readerMantleMEth = (entry) => {
50348
51416
  return {
50349
51417
  totalAssets: totalSupply,
50350
51418
  totalSupply,
50351
- exchangeRate: ONE_E188
51419
+ exchangeRate: ONE_E189
50352
51420
  };
50353
51421
  }
50354
51422
  };
@@ -50356,7 +51424,7 @@ var readerMantleMEth = (entry) => {
50356
51424
  return {
50357
51425
  calls: [
50358
51426
  { address: entry.address, name: "totalSupply", params: [] },
50359
- { address: staking, name: "mETHToETH", params: [ONE_E188] }
51427
+ { address: staking, name: "mETHToETH", params: [ONE_E189] }
50360
51428
  ],
50361
51429
  abis: [TotalSupplyAbi, MantleStakingAbi],
50362
51430
  parse: ([supply, rate]) => {
@@ -50366,7 +51434,7 @@ var readerMantleMEth = (entry) => {
50366
51434
  return void 0;
50367
51435
  }
50368
51436
  return {
50369
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51437
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50370
51438
  totalSupply,
50371
51439
  exchangeRate
50372
51440
  };
@@ -50387,7 +51455,7 @@ var readerOffChain = (entry) => {
50387
51455
  return {
50388
51456
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
50389
51457
  totalSupply,
50390
- exchangeRate: ONE_E188
51458
+ exchangeRate: ONE_E189
50391
51459
  };
50392
51460
  }
50393
51461
  };
@@ -50421,7 +51489,7 @@ var readerRenzoEzEth = (entry) => {
50421
51489
  return {
50422
51490
  totalAssets: totalSupply,
50423
51491
  totalSupply,
50424
- exchangeRate: ONE_E188
51492
+ exchangeRate: ONE_E189
50425
51493
  };
50426
51494
  }
50427
51495
  };
@@ -50440,7 +51508,7 @@ var readerRenzoEzEth = (entry) => {
50440
51508
  return {
50441
51509
  totalAssets: totalTvl,
50442
51510
  totalSupply,
50443
- exchangeRate: totalTvl * ONE_E188 / totalSupply
51511
+ exchangeRate: totalTvl * ONE_E189 / totalSupply
50444
51512
  };
50445
51513
  }
50446
51514
  };
@@ -50496,7 +51564,7 @@ var readerRocketReth = (entry) => {
50496
51564
  }
50497
51565
  const liquidity = depositPool ? toBigInt13(slice2[2]) : void 0;
50498
51566
  return {
50499
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51567
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50500
51568
  totalSupply,
50501
51569
  exchangeRate,
50502
51570
  liquidity
@@ -50538,7 +51606,7 @@ var readerStaderEthx = (entry) => {
50538
51606
  return {
50539
51607
  totalAssets: totalSupply,
50540
51608
  totalSupply,
50541
- exchangeRate: ONE_E188
51609
+ exchangeRate: ONE_E189
50542
51610
  };
50543
51611
  }
50544
51612
  };
@@ -50556,7 +51624,7 @@ var readerStaderEthx = (entry) => {
50556
51624
  return void 0;
50557
51625
  }
50558
51626
  return {
50559
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51627
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50560
51628
  totalSupply,
50561
51629
  exchangeRate
50562
51630
  };
@@ -50573,7 +51641,7 @@ var readerStaderMaticX = (entry) => {
50573
51641
  {
50574
51642
  address: rateAddress,
50575
51643
  name: "convertMaticXToMatic",
50576
- params: [ONE_E188],
51644
+ params: [ONE_E189],
50577
51645
  chainId: homeChainId
50578
51646
  }
50579
51647
  ],
@@ -50588,7 +51656,7 @@ var readerStaderMaticX = (entry) => {
50588
51656
  }
50589
51657
  const isCrossChain = homeContract !== void 0;
50590
51658
  return {
50591
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E188 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E188,
51659
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E189 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E189,
50592
51660
  totalSupply,
50593
51661
  exchangeRate: amountInMatic
50594
51662
  };
@@ -50620,7 +51688,7 @@ var readerStakeWiseOsEth = (entry) => {
50620
51688
  return {
50621
51689
  totalAssets: totalSupply,
50622
51690
  totalSupply,
50623
- exchangeRate: ONE_E188
51691
+ exchangeRate: ONE_E189
50624
51692
  };
50625
51693
  }
50626
51694
  };
@@ -50628,7 +51696,7 @@ var readerStakeWiseOsEth = (entry) => {
50628
51696
  return {
50629
51697
  calls: [
50630
51698
  { address: entry.address, name: "totalSupply", params: [] },
50631
- { address: controller, name: "convertToAssets", params: [ONE_E188] }
51699
+ { address: controller, name: "convertToAssets", params: [ONE_E189] }
50632
51700
  ],
50633
51701
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
50634
51702
  parse: ([supply, rate]) => {
@@ -50638,7 +51706,7 @@ var readerStakeWiseOsEth = (entry) => {
50638
51706
  return void 0;
50639
51707
  }
50640
51708
  return {
50641
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51709
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50642
51710
  totalSupply,
50643
51711
  exchangeRate
50644
51712
  };
@@ -50670,7 +51738,7 @@ var readerStCelo = (entry) => {
50670
51738
  return {
50671
51739
  totalAssets: totalSupply,
50672
51740
  totalSupply,
50673
- exchangeRate: ONE_E188
51741
+ exchangeRate: ONE_E189
50674
51742
  };
50675
51743
  }
50676
51744
  };
@@ -50678,7 +51746,7 @@ var readerStCelo = (entry) => {
50678
51746
  return {
50679
51747
  calls: [
50680
51748
  { address: entry.address, name: "totalSupply", params: [] },
50681
- { address: manager, name: "toCelo", params: [ONE_E188] }
51749
+ { address: manager, name: "toCelo", params: [ONE_E189] }
50682
51750
  ],
50683
51751
  abis: [TotalSupplyAbi, StCeloManagerAbi],
50684
51752
  parse: ([supply, rate]) => {
@@ -50688,7 +51756,7 @@ var readerStCelo = (entry) => {
50688
51756
  return void 0;
50689
51757
  }
50690
51758
  return {
50691
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51759
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50692
51760
  totalSupply,
50693
51761
  exchangeRate
50694
51762
  };
@@ -50721,7 +51789,7 @@ var readerSwellGetRate = (entry) => ({
50721
51789
  return void 0;
50722
51790
  }
50723
51791
  return {
50724
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51792
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50725
51793
  totalSupply,
50726
51794
  exchangeRate
50727
51795
  };
@@ -50752,7 +51820,7 @@ var readerValantisWstHype = (entry) => {
50752
51820
  return {
50753
51821
  totalAssets: totalSupply,
50754
51822
  totalSupply,
50755
- exchangeRate: ONE_E188
51823
+ exchangeRate: ONE_E189
50756
51824
  };
50757
51825
  }
50758
51826
  };
@@ -50770,7 +51838,7 @@ var readerValantisWstHype = (entry) => {
50770
51838
  return void 0;
50771
51839
  }
50772
51840
  return {
50773
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51841
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50774
51842
  totalSupply,
50775
51843
  exchangeRate
50776
51844
  };
@@ -50804,7 +51872,7 @@ var readerVedaAccountant = (entry) => {
50804
51872
  return {
50805
51873
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
50806
51874
  totalSupply,
50807
- exchangeRate: ONE_E188
51875
+ exchangeRate: ONE_E189
50808
51876
  };
50809
51877
  }
50810
51878
  };
@@ -50823,7 +51891,7 @@ var readerVedaAccountant = (entry) => {
50823
51891
  const exchangeRate = rawRate * scale;
50824
51892
  return {
50825
51893
  totalAssets: rescaleDecimals(
50826
- totalSupply * exchangeRate / ONE_E188,
51894
+ totalSupply * exchangeRate / ONE_E189,
50827
51895
  shareDec,
50828
51896
  underlyingDec
50829
51897
  ),
@@ -50859,9 +51927,9 @@ var readerAnkrRatio = (entry) => ({
50859
51927
  return void 0;
50860
51928
  }
50861
51929
  return {
50862
- totalAssets: totalSupply * ONE_E188 / r,
51930
+ totalAssets: totalSupply * ONE_E189 / r,
50863
51931
  totalSupply,
50864
- exchangeRate: ONE_E188 * ONE_E188 / r
51932
+ exchangeRate: ONE_E189 * ONE_E189 / r
50865
51933
  };
50866
51934
  }
50867
51935
  });
@@ -50905,7 +51973,7 @@ var readerCoreEarnRate = (entry) => {
50905
51973
  return {
50906
51974
  totalAssets: totalSupply * r / CORE_RATE_DENOM,
50907
51975
  totalSupply,
50908
- exchangeRate: r * ONE_E188 / CORE_RATE_DENOM
51976
+ exchangeRate: r * ONE_E189 / CORE_RATE_DENOM
50909
51977
  };
50910
51978
  }
50911
51979
  };
@@ -50927,7 +51995,7 @@ var readerCoreStakedRatio = (entry) => {
50927
51995
  return {
50928
51996
  totalAssets: totalStaked,
50929
51997
  totalSupply,
50930
- exchangeRate: totalStaked * ONE_E188 / totalSupply
51998
+ exchangeRate: totalStaked * ONE_E189 / totalSupply
50931
51999
  };
50932
52000
  }
50933
52001
  };
@@ -50958,7 +52026,7 @@ var readerStellaStDot = (entry) => ({
50958
52026
  {
50959
52027
  address: entry.address,
50960
52028
  name: "getPooledTokenByShares",
50961
- params: [ONE_E188]
52029
+ params: [ONE_E189]
50962
52030
  },
50963
52031
  { address: entry.address, name: "getTotalPooledToken", params: [] }
50964
52032
  ],
@@ -50969,7 +52037,7 @@ var readerStellaStDot = (entry) => ({
50969
52037
  if (totalSupply === void 0 || exchangeRate === void 0) {
50970
52038
  return void 0;
50971
52039
  }
50972
- const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E188;
52040
+ const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E189;
50973
52041
  return {
50974
52042
  totalAssets,
50975
52043
  totalSupply,
@@ -51007,7 +52075,7 @@ var readerKintsuSMon = (entry) => ({
51007
52075
  const totalAssets = toBigInt13(pooled);
51008
52076
  const totalSupply = toBigInt13(shares);
51009
52077
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
51010
- const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E188 / totalSupply : ONE_E188;
52078
+ const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E189 / totalSupply : ONE_E189;
51011
52079
  return { totalAssets, totalSupply, exchangeRate };
51012
52080
  }
51013
52081
  });
@@ -51443,7 +52511,7 @@ var getLstValidators = async (chainId, shareToken) => {
51443
52511
  };
51444
52512
 
51445
52513
  // src/vaults/lst/fetchPublic.ts
51446
- var ONE_E189 = 10n ** 18n;
52514
+ var ONE_E1810 = 10n ** 18n;
51447
52515
  var ERC20_BALANCE_ABI = parseAbi([
51448
52516
  "function balanceOf(address) view returns (uint256)"
51449
52517
  ]);
@@ -51558,8 +52626,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
51558
52626
  const underlyingUnit = 10n ** BigInt(underlyingDec);
51559
52627
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
51560
52628
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
51561
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E189;
51562
- const convertToShares = state.exchangeRate > 0n ? ONE_E189 * shareUnit / state.exchangeRate : 0n;
52629
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
52630
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
51563
52631
  let liquidityRaw;
51564
52632
  if (state.liquidity !== void 0) {
51565
52633
  liquidityRaw = state.liquidity;
@@ -52230,16 +53298,17 @@ var Erc7540Abi = [
52230
53298
  // src/vaults/lst/withdrawals/readers/erc7540.ts
52231
53299
  var readerErc7540 = {
52232
53300
  fetch: async (user, multicallRetry, chainId, entry) => {
53301
+ const requestContract = entry.lst;
52233
53302
  const stage1 = await multicallRetry({
52234
53303
  chain: chainId,
52235
53304
  calls: [
52236
53305
  {
52237
- address: entry.lst,
53306
+ address: requestContract,
52238
53307
  name: "pendingRedeemRequest",
52239
53308
  params: [0n, user]
52240
53309
  },
52241
53310
  {
52242
- address: entry.lst,
53311
+ address: requestContract,
52243
53312
  name: "claimableRedeemRequest",
52244
53313
  params: [0n, user]
52245
53314
  }
@@ -52254,7 +53323,7 @@ var readerErc7540 = {
52254
53323
  chain: chainId,
52255
53324
  calls: [
52256
53325
  {
52257
- address: entry.lst,
53326
+ address: requestContract,
52258
53327
  name: "convertToAssets",
52259
53328
  params: [claimable]
52260
53329
  }
@@ -52268,6 +53337,8 @@ var readerErc7540 = {
52268
53337
  symbol: entry.symbol,
52269
53338
  requestId: "0",
52270
53339
  amountUnderlying: amount.toString(),
53340
+ // The 7540 claim (`redeem`) takes the share amount.
53341
+ shares: claimable.toString(),
52271
53342
  status: "claimable"
52272
53343
  });
52273
53344
  }
@@ -52280,6 +53351,7 @@ var readerErc7540 = {
52280
53351
  // Approximate to the share value at current price; UI can
52281
53352
  // re-convert if it has the share exchangeRate.
52282
53353
  amountUnderlying: pending.toString(),
53354
+ shares: pending.toString(),
52283
53355
  status: "pending"
52284
53356
  });
52285
53357
  }
@@ -52338,6 +53410,172 @@ var readerEthenaCooldown = {
52338
53410
  }
52339
53411
  };
52340
53412
 
53413
+ // src/vaults/lst/withdrawals/abis/susd3.ts
53414
+ var Susd3CooldownStatusAbi = [
53415
+ {
53416
+ name: "getCooldownStatus",
53417
+ type: "function",
53418
+ stateMutability: "view",
53419
+ inputs: [{ type: "address", name: "user" }],
53420
+ outputs: [
53421
+ { type: "uint256", name: "cooldownEnd" },
53422
+ { type: "uint256", name: "windowEnd" },
53423
+ { type: "uint256", name: "shares" }
53424
+ ]
53425
+ },
53426
+ {
53427
+ name: "convertToAssets",
53428
+ type: "function",
53429
+ stateMutability: "view",
53430
+ inputs: [{ type: "uint256", name: "shares" }],
53431
+ outputs: [{ type: "uint256", name: "assets" }]
53432
+ }
53433
+ ];
53434
+
53435
+ // src/vaults/lst/withdrawals/readers/susd3.ts
53436
+ var readerSusd3Cooldown = {
53437
+ fetch: async (user, multicallRetry, chainId, entry) => {
53438
+ const res = await multicallRetry({
53439
+ chain: chainId,
53440
+ calls: [
53441
+ { address: entry.lst, name: "getCooldownStatus", params: [user] }
53442
+ ],
53443
+ abi: [Susd3CooldownStatusAbi]
53444
+ });
53445
+ const cell = res[0];
53446
+ let cooldownEnd;
53447
+ let windowEnd;
53448
+ let shares;
53449
+ if (Array.isArray(cell)) {
53450
+ cooldownEnd = toBigInt14(cell[0]);
53451
+ windowEnd = toBigInt14(cell[1]);
53452
+ shares = toBigInt14(cell[2]);
53453
+ } else if (cell && typeof cell === "object") {
53454
+ cooldownEnd = toBigInt14(cell.cooldownEnd);
53455
+ windowEnd = toBigInt14(cell.windowEnd);
53456
+ shares = toBigInt14(cell.shares);
53457
+ }
53458
+ if (!shares || shares === 0n) return [];
53459
+ let amount = shares;
53460
+ try {
53461
+ const stage2 = await multicallRetry({
53462
+ chain: chainId,
53463
+ calls: [
53464
+ { address: entry.lst, name: "convertToAssets", params: [shares] }
53465
+ ],
53466
+ abi: [Susd3CooldownStatusAbi]
53467
+ });
53468
+ amount = toBigInt14(stage2[0]) ?? shares;
53469
+ } catch {
53470
+ }
53471
+ const readyAt = Number(cooldownEnd ?? 0n);
53472
+ const expiresAt = windowEnd && windowEnd > 0n && windowEnd < 10n ** 12n ? Number(windowEnd) : void 0;
53473
+ const out = [
53474
+ {
53475
+ lst: entry.lst,
53476
+ brand: entry.brand,
53477
+ symbol: entry.symbol,
53478
+ requestId: "0",
53479
+ amountUnderlying: amount.toString(),
53480
+ shares: shares.toString(),
53481
+ status: computeStatus(readyAt, expiresAt),
53482
+ readyAt,
53483
+ ...expiresAt !== void 0 ? { expiresAt } : {}
53484
+ }
53485
+ ];
53486
+ return out;
53487
+ }
53488
+ };
53489
+
53490
+ // src/vaults/lst/withdrawals/abis/strataCooldown.ts
53491
+ var StrataCooldownBalanceAbi = [
53492
+ {
53493
+ name: "balanceOf",
53494
+ type: "function",
53495
+ stateMutability: "view",
53496
+ inputs: [
53497
+ { type: "address", name: "token" },
53498
+ { type: "address", name: "user" }
53499
+ ],
53500
+ outputs: [
53501
+ {
53502
+ type: "tuple",
53503
+ name: "state",
53504
+ components: [
53505
+ { type: "uint256", name: "pending" },
53506
+ { type: "uint256", name: "claimable" },
53507
+ { type: "uint256", name: "nextUnlockAt" },
53508
+ { type: "uint256", name: "nextUnlockAmount" },
53509
+ { type: "uint256", name: "totalRequests" }
53510
+ ]
53511
+ }
53512
+ ]
53513
+ }
53514
+ ];
53515
+
53516
+ // src/vaults/lst/withdrawals/readers/strataCooldown.ts
53517
+ var readerStrataCooldown = {
53518
+ fetch: async (user, multicallRetry, chainId, entry) => {
53519
+ const escrowToken = entry.escrowToken;
53520
+ if (!escrowToken) return [];
53521
+ const contracts = [
53522
+ entry.withdrawalContract,
53523
+ entry.secondaryWithdrawalContract
53524
+ ].filter((c) => !!c);
53525
+ if (contracts.length === 0) return [];
53526
+ const res = await multicallRetry({
53527
+ chain: chainId,
53528
+ calls: contracts.map((address) => ({
53529
+ address,
53530
+ name: "balanceOf",
53531
+ params: [escrowToken, user]
53532
+ })),
53533
+ abi: contracts.map(() => StrataCooldownBalanceAbi)
53534
+ });
53535
+ const out = [];
53536
+ for (let i = 0; i < contracts.length; i++) {
53537
+ const cell = res[i];
53538
+ let pending;
53539
+ let claimable;
53540
+ let nextUnlockAt;
53541
+ if (Array.isArray(cell)) {
53542
+ pending = toBigInt14(cell[0]);
53543
+ claimable = toBigInt14(cell[1]);
53544
+ nextUnlockAt = toNumber(cell[2]);
53545
+ } else if (cell && typeof cell === "object") {
53546
+ pending = toBigInt14(cell.pending);
53547
+ claimable = toBigInt14(cell.claimable);
53548
+ nextUnlockAt = toNumber(cell.nextUnlockAt);
53549
+ }
53550
+ const escrow = { withdrawQueue: contracts[i], claimToken: escrowToken };
53551
+ if (claimable && claimable > 0n) {
53552
+ out.push({
53553
+ lst: entry.lst,
53554
+ brand: entry.brand,
53555
+ symbol: entry.symbol,
53556
+ requestId: `${i * 2}`,
53557
+ amountUnderlying: claimable.toString(),
53558
+ status: "claimable",
53559
+ ...escrow
53560
+ });
53561
+ }
53562
+ if (pending && pending > 0n) {
53563
+ out.push({
53564
+ lst: entry.lst,
53565
+ brand: entry.brand,
53566
+ symbol: entry.symbol,
53567
+ requestId: `${i * 2 + 1}`,
53568
+ amountUnderlying: pending.toString(),
53569
+ status: "pending",
53570
+ ...nextUnlockAt ? { readyAt: nextUnlockAt } : {},
53571
+ ...escrow
53572
+ });
53573
+ }
53574
+ }
53575
+ return out;
53576
+ }
53577
+ };
53578
+
52341
53579
  // src/vaults/lst/withdrawals/abis/etherfi.ts
52342
53580
  var EtherFiWithdrawRequestAbi = [
52343
53581
  {
@@ -52552,7 +53790,9 @@ var readerKelp = {
52552
53790
  }
52553
53791
  const stage2 = await multicallRetry({
52554
53792
  chain: chainId,
52555
- calls: detailCalls.map(({ _asset: _3, ...rest }) => rest),
53793
+ calls: detailCalls.map(
53794
+ ({ _asset: _3, ...rest }) => rest
53795
+ ),
52556
53796
  abi: detailCalls.map(() => KelpWithdrawalManagerAbi)
52557
53797
  });
52558
53798
  const out = [];
@@ -53106,9 +54346,7 @@ var readerMantle = {
53106
54346
  const results = await multicallRetry({
53107
54347
  chain: chainId,
53108
54348
  calls,
53109
- abi: calls.map(
53110
- () => MantleUnstakeRequestsManagerAbi
53111
- )
54349
+ abi: calls.map(() => MantleUnstakeRequestsManagerAbi)
53112
54350
  });
53113
54351
  const out = [];
53114
54352
  const lcUser = user.toLowerCase();
@@ -53985,6 +55223,10 @@ var buildWithdrawalReader = (entry) => {
53985
55223
  return readerErc7540;
53986
55224
  case "ethenaCooldown":
53987
55225
  return readerEthenaCooldown;
55226
+ case "susd3Cooldown":
55227
+ return readerSusd3Cooldown;
55228
+ case "strataCooldown":
55229
+ return readerStrataCooldown;
53988
55230
  case "swellNft":
53989
55231
  return readerSwell;
53990
55232
  case "stakeWiseSubgraph":
@@ -54048,6 +55290,14 @@ var LST_WITHDRAWAL_REGISTRY = {
54048
55290
  symbol: "LBTC",
54049
55291
  reader: "unverified"
54050
55292
  },
55293
+ {
55294
+ // Lombard LBTCv (Veda BoringVault) — queue mechanics not yet
55295
+ // implemented; placeholder so the orchestrator surfaces the asset.
55296
+ lst: "0x5401b8620e5fb570064ca9114fd1e135fd77d57c",
55297
+ brand: "Lombard",
55298
+ symbol: "LBTCv",
55299
+ reader: "unverified"
55300
+ },
54051
55301
  {
54052
55302
  lst: "0x657e8c867d8b37dcc18fa4caead9c45eb088c642",
54053
55303
  brand: "ether.fi",
@@ -54114,6 +55364,134 @@ var LST_WITHDRAWAL_REGISTRY = {
54114
55364
  symbol: "savETH",
54115
55365
  reader: "ethenaCooldown"
54116
55366
  },
55367
+ {
55368
+ // Tori strUSD — StakedUSDeV2 clone over trUSD; same cooldowns(address)
55369
+ // escrow surface (7d, owner-mutable), claim via `unstake`.
55370
+ lst: "0x280839980a7ed0d7717f64125fe241012e5f5815",
55371
+ brand: "Tori",
55372
+ symbol: "strUSD",
55373
+ reader: "ethenaCooldown"
55374
+ },
55375
+ {
55376
+ // Neutrl sNUSD — StakedUSDeV2 clone over NUSD; cooldowns(address)
55377
+ // escrow (10d), claim via `unstake`.
55378
+ lst: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313",
55379
+ brand: "Neutrl",
55380
+ symbol: "sNUSD",
55381
+ reader: "ethenaCooldown"
55382
+ },
55383
+ {
55384
+ // 3Jane sUSD3 — startCooldown(shares) → 30d → plain 4626 redeem
55385
+ // inside the withdrawal window; getCooldownStatus(address) getter.
55386
+ lst: "0xf689555121e529ff0463e191f9bd9d1e496164a7",
55387
+ brand: "3Jane",
55388
+ symbol: "sUSD3",
55389
+ reader: "susd3Cooldown"
55390
+ },
55391
+ {
55392
+ // Apyx apyUSD — NOT enumerable today. The 4626 redeem escrows the
55393
+ // apxUSD and mints a **soulbound ERC-721** on the receipt contract
55394
+ // `apyUSD.receipt()` = 0x9bf51f33…, which is the only handle on the
55395
+ // pending exit and exposes no per-owner enumeration. The vault also
55396
+ // has an `unlockToken()` (0x93775e2d…) carrying 7540-shaped getters,
55397
+ // but they are the wrong surface: verified 2026-08-04 that
55398
+ // `pendingRedeemRequest(0, user)` / `claimableRedeemRequest(0, user)`
55399
+ // both return 0 for addresses genuinely holding open receipt NFTs.
55400
+ // The claim needs the `tokenId` (read from the redeem's `Transfer`
55401
+ // log), so the real fix is a caller-supplied-ids reader in the
55402
+ // Mantle/Puffer/TruFin mould — see INDEXING_STRATEGIES.md.
55403
+ lst: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
55404
+ brand: "Apyx",
55405
+ symbol: "apyUSD",
55406
+ reader: "unverified"
55407
+ },
55408
+ // Strata tranche markets — ONE entry per market (not per tranche):
55409
+ // both tranches escrow into the same two per-market ICooldown
55410
+ // contracts keyed by (escrowToken, user) with no tranche
55411
+ // attribution, so per-tranche rows would double-report. `lst` is the
55412
+ // SENIOR tranche address — the catalog resolves it to the savings
55413
+ // provider, and the calldata-sdk `strata` claim built against it
55414
+ // finalizes the whole market's unlocked requests (senior AND
55415
+ // junior). The escrow is KEYED by the collateral token but its
55416
+ // recorded amounts are per-leg — see the reader for the trap.
55417
+ {
55418
+ lst: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
55419
+ // srUSDe
55420
+ brand: "Strata",
55421
+ symbol: "srUSDe/jrUSDe",
55422
+ reader: "strataCooldown",
55423
+ withdrawalContract: "0x735eddf50ca2371aa48466469c742e684c610f74",
55424
+ // UnstakeCooldown
55425
+ secondaryWithdrawalContract: "0xd6dad17d025cddded27305aebab8b277996a6faf",
55426
+ // ERC20Cooldown
55427
+ escrowToken: "0x9d39a5de30e57443bff2a8307a4256c8797a3497"
55428
+ // sUSDe
55429
+ },
55430
+ {
55431
+ lst: "0x65a44528e8868166401ea08b549e19552af589db",
55432
+ // srNUSD
55433
+ brand: "Strata",
55434
+ symbol: "srNUSD/jrNUSD",
55435
+ reader: "strataCooldown",
55436
+ withdrawalContract: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
55437
+ // NeutrlUnstakeCooldown
55438
+ secondaryWithdrawalContract: "0x1abc3c3c15a862276d057b2acbcfeab358907990",
55439
+ // NeutrlERC20Cooldown
55440
+ escrowToken: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313"
55441
+ // sNUSD
55442
+ },
55443
+ {
55444
+ lst: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
55445
+ // srmHYPER
55446
+ brand: "Strata",
55447
+ symbol: "srmHYPER/jrmHYPER",
55448
+ reader: "strataCooldown",
55449
+ withdrawalContract: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
55450
+ // MHyperUnstakeCooldown
55451
+ secondaryWithdrawalContract: "0x71ec07bba60e854c4b2466068be1c8d5b5788fda",
55452
+ // MHyperERC20Cooldown
55453
+ escrowToken: "0x9b5528528656dbc094765e2abb79f293c21191b9"
55454
+ // mHYPER
55455
+ },
55456
+ {
55457
+ lst: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
55458
+ // srmM1-USD
55459
+ brand: "Strata",
55460
+ symbol: "srmM1-USD/jrmM1-USD",
55461
+ reader: "strataCooldown",
55462
+ withdrawalContract: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
55463
+ // MM1USDUnstakeCooldown
55464
+ secondaryWithdrawalContract: "0x4c2680ae06a0bb0b091e5ccca13cb03f4f72296e",
55465
+ // MM1USDERC20Cooldown
55466
+ escrowToken: "0xcc5c22c7a6bcc25e66726aef011dde74289ed203"
55467
+ // mM1-USD
55468
+ },
55469
+ {
55470
+ lst: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
55471
+ // srUSDat
55472
+ brand: "Strata",
55473
+ symbol: "srUSDat/jrUSDat",
55474
+ reader: "strataCooldown",
55475
+ withdrawalContract: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
55476
+ // SaturnUnstakeCooldown
55477
+ secondaryWithdrawalContract: "0x25138d10837ab0278eb860454e1045f2b92929ab",
55478
+ // SaturnERC20Cooldown
55479
+ escrowToken: "0xd166337499e176bbc38a1fbd113ab144e5bd2df7"
55480
+ // sUSDat
55481
+ },
55482
+ {
55483
+ lst: "0x35bff778d3fc53a561486bf28e761428499232eb",
55484
+ // srPRIME
55485
+ brand: "Strata",
55486
+ symbol: "srPRIME/jrPRIME",
55487
+ reader: "strataCooldown",
55488
+ withdrawalContract: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
55489
+ // FigureUnstakeCooldown
55490
+ secondaryWithdrawalContract: "0xbe71d21addba5c9aac5b4e006db1715ef1e324be",
55491
+ // FigureERC20Cooldown
55492
+ escrowToken: "0x19ebb35279a16207ec4ba82799cc64715065f7f6"
55493
+ // PRIME
55494
+ },
54117
55495
  {
54118
55496
  lst: "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee",
54119
55497
  brand: "EtherFi",
@@ -54213,6 +55591,14 @@ var LST_WITHDRAWAL_REGISTRY = {
54213
55591
  symbol: "rETH",
54214
55592
  reader: "noQueue"
54215
55593
  },
55594
+ {
55595
+ // Frax sfrxETH — vanilla ERC-4626 instant redeem to frxETH (the
55596
+ // frxETH → ETH leg is DEX-only, not a protocol queue).
55597
+ lst: "0xac3e018457b222d93114458476f3e3416abbe38f",
55598
+ brand: "Frax",
55599
+ symbol: "sfrxETH",
55600
+ reader: "noQueue"
55601
+ },
54216
55602
  {
54217
55603
  lst: "0xbe9895146f7af43049ca1c1ae358b0541ea49704",
54218
55604
  brand: "Coinbase",
@@ -54335,6 +55721,36 @@ var LST_WITHDRAWAL_REGISTRY = {
54335
55721
  reader: "ethenaCooldown"
54336
55722
  }
54337
55723
  ],
55724
+ // Monad LSTs — all four are `queued` in the main registry but their
55725
+ // per-protocol request enumeration is not implemented yet; listed as
55726
+ // `unverified` placeholders so the orchestrator surfaces the asset
55727
+ // (returning []) instead of silently omitting it.
55728
+ "143": [
55729
+ {
55730
+ lst: "0x1b68626dca36c7fe922fd2d55e4f631d962de19c",
55731
+ brand: "Shmonad",
55732
+ symbol: "shMON",
55733
+ reader: "unverified"
55734
+ },
55735
+ {
55736
+ lst: "0x0c65a0bc65a5d819235b71f554d210d3f80e0852",
55737
+ brand: "aPriori",
55738
+ symbol: "aprMON",
55739
+ reader: "unverified"
55740
+ },
55741
+ {
55742
+ lst: "0xa3227c5969757783154c60bf0bc1944180ed81b9",
55743
+ brand: "Kintsu",
55744
+ symbol: "sMON",
55745
+ reader: "unverified"
55746
+ },
55747
+ {
55748
+ lst: "0x8498312a6b3cbd158bf0c93abdcf29e6e4f55081",
55749
+ brand: "Magma",
55750
+ symbol: "gMON",
55751
+ reader: "unverified"
55752
+ }
55753
+ ],
54338
55754
  "146": [
54339
55755
  {
54340
55756
  lst: "0xe5da20f15420ad15de0fa650600afc998bbe3955",
@@ -54616,7 +56032,7 @@ var NavOracleReadAbi = [
54616
56032
  ];
54617
56033
 
54618
56034
  // src/vaults/savings/readers/shared.ts
54619
- var ONE_E1810 = 10n ** 18n;
56035
+ var ONE_E1811 = 10n ** 18n;
54620
56036
  var toBigInt15 = (v) => {
54621
56037
  if (v === void 0 || v === null) return void 0;
54622
56038
  if (typeof v === "bigint") return v;
@@ -54657,7 +56073,7 @@ var readerErc46262 = (entry) => {
54657
56073
  return {
54658
56074
  totalAssets,
54659
56075
  totalSupply,
54660
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit
56076
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit
54661
56077
  };
54662
56078
  }
54663
56079
  };
@@ -54765,7 +56181,7 @@ var readerErc4626Idle = (entry) => {
54765
56181
  return {
54766
56182
  totalAssets,
54767
56183
  totalSupply,
54768
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit,
56184
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
54769
56185
  ...capacity !== void 0 ? {
54770
56186
  instantRedeemCapacity: capacity,
54771
56187
  instantRedeemEnabled: true,
@@ -54814,7 +56230,7 @@ var readerErc4626WithdrawLimit = (entry) => {
54814
56230
  return {
54815
56231
  totalAssets,
54816
56232
  totalSupply,
54817
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit,
56233
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
54818
56234
  ...capacity !== void 0 ? {
54819
56235
  instantRedeemCapacity: capacity,
54820
56236
  instantRedeemEnabled: true,
@@ -54846,7 +56262,7 @@ var readerNavOracle = (entry) => {
54846
56262
  const exchangeRate = toBigInt15(raw);
54847
56263
  if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
54848
56264
  return {
54849
- totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1810 * shareUnit),
56265
+ totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1811 * shareUnit),
54850
56266
  totalSupply,
54851
56267
  exchangeRate
54852
56268
  };
@@ -54860,7 +56276,7 @@ var readerNativeWnlp = (entry) => {
54860
56276
  return {
54861
56277
  calls: [
54862
56278
  { address, name: "totalSupply", params: [] },
54863
- { address, name: "getNlpByWnlp", params: [ONE_E1810] },
56279
+ { address, name: "getNlpByWnlp", params: [ONE_E1811] },
54864
56280
  { address, name: "instantRedeemFeeBips", params: [] },
54865
56281
  { address, name: "instantRedeemEnabled", params: [] },
54866
56282
  // Falls back to the vault itself when no CreditVault is pinned —
@@ -54894,7 +56310,7 @@ var readerNativeWnlp = (entry) => {
54894
56310
  const windowSeconds = toBigInt15(window);
54895
56311
  const bips = toBigInt15(feeBips);
54896
56312
  return {
54897
- totalAssets: totalSupply * exchangeRate / ONE_E1810,
56313
+ totalAssets: totalSupply * exchangeRate / ONE_E1811,
54898
56314
  totalSupply,
54899
56315
  exchangeRate,
54900
56316
  // `instantRedeemFeeBips` on-chain is already basis points, so it
@@ -54932,7 +56348,7 @@ var buildReader2 = (entry) => {
54932
56348
  var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
54933
56349
 
54934
56350
  // src/vaults/savings/fetchPublic.ts
54935
- var ONE_E1811 = 10n ** 18n;
56351
+ var ONE_E1812 = 10n ** 18n;
54936
56352
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
54937
56353
  const entries = getSavingsRegistry(chainId);
54938
56354
  if (entries.length === 0) return {};
@@ -54981,8 +56397,8 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
54981
56397
  1,
54982
56398
  Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
54983
56399
  ) : 1;
54984
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1811;
54985
- const convertToShares = state.exchangeRate > 0n ? ONE_E1811 * shareUnit / state.exchangeRate : 0n;
56400
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1812;
56401
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1812 * shareUnit / state.exchangeRate : 0n;
54986
56402
  const displayName = composeVaultDisplayName(
54987
56403
  entry.brand,
54988
56404
  entry.brand,
@@ -56699,23 +58115,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
56699
58115
  const indexMax = price(prices, m.indexToken)?.max;
56700
58116
  if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
56701
58117
  const base = i * SLOTS;
56702
- const big7 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
58118
+ const big9 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
56703
58119
  const cap = computeDepositCapacityUsd(
56704
- [info?.longTokenAmount, longMax, big7(0), big7(2)],
56705
- [info?.shortTokenAmount, shortMax, big7(1), big7(3)]
58120
+ [info?.longTokenAmount, longMax, big9(0), big9(2)],
58121
+ [info?.shortTokenAmount, shortMax, big9(1), big9(3)]
56706
58122
  );
56707
58123
  if (cap != null) value.depositCapacityUsd = cap;
56708
58124
  if (indexMax != null) {
56709
58125
  const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
56710
- const reservedUsdLong = (big7(4) + big7(5)) / divisor * indexMax;
56711
- const reservedUsdShort = (big7(6) + big7(7)) / divisor;
58126
+ const reservedUsdLong = (big9(4) + big9(5)) / divisor * indexMax;
58127
+ const reservedUsdShort = (big9(6) + big9(7)) / divisor;
56712
58128
  const liq = computeLiquidityUsd(
56713
58129
  info?.longTokenUsd,
56714
58130
  info?.shortTokenUsd,
56715
58131
  reservedUsdLong,
56716
58132
  reservedUsdShort,
56717
- big7(8),
56718
- big7(9)
58133
+ big9(8),
58134
+ big9(9)
56719
58135
  );
56720
58136
  if (liq != null)
56721
58137
  value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
@@ -56914,21 +58330,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
56914
58330
  } catch {
56915
58331
  return void 0;
56916
58332
  }
56917
- const big7 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
56918
- const base = big7(0);
56919
- const mult = big7(1);
58333
+ const big9 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
58334
+ const base = big9(0);
58335
+ const mult = big9(1);
56920
58336
  if (base === 0n && mult === 0n) return void 0;
56921
58337
  const PRECISION = 10n ** 30n;
56922
58338
  const adjusted = (opGas) => base + opGas * mult / PRECISION;
56923
58339
  const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
56924
- const glvExtra = big7(6) * GLV_NOMINAL_MARKET_COUNT;
58340
+ const glvExtra = big9(6) * GLV_NOMINAL_MARKET_COUNT;
56925
58341
  return {
56926
58342
  chainId,
56927
58343
  gasPriceWei: gasPriceWei.toString(),
56928
- deposit: fee(big7(2)),
56929
- withdrawal: fee(big7(3)),
56930
- glvDeposit: fee(big7(4) + glvExtra),
56931
- glvWithdrawal: fee(big7(5) + glvExtra)
58344
+ deposit: fee(big9(2)),
58345
+ withdrawal: fee(big9(3)),
58346
+ glvDeposit: fee(big9(4) + glvExtra),
58347
+ glvWithdrawal: fee(big9(5) + glvExtra)
56932
58348
  };
56933
58349
  };
56934
58350
 
@@ -57315,7 +58731,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
57315
58731
  };
57316
58732
 
57317
58733
  // src/vaults/yield/annualize.ts
57318
- var YEAR_SECONDS8 = 365 * 24 * 60 * 60;
58734
+ var YEAR_SECONDS10 = 365 * 24 * 60 * 60;
57319
58735
  var SCALE = 10n ** 18n;
57320
58736
  var appendSnapshot = (points, snap, options) => {
57321
58737
  const maxPoints = options?.maxPoints ?? 90;
@@ -57344,7 +58760,7 @@ var computeVaultApr = (points, options) => {
57344
58760
  if (pThen === 0n) return void 0;
57345
58761
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
57346
58762
  const ratio = Number(ratioScaled) / 1e18;
57347
- const apr = (ratio - 1) * (YEAR_SECONDS8 / windowSeconds);
58763
+ const apr = (ratio - 1) * (YEAR_SECONDS10 / windowSeconds);
57348
58764
  return {
57349
58765
  apr,
57350
58766
  sharePriceNow: now.p,
@@ -58147,6 +59563,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
58147
59563
  return parseTokenBalanceResult(rawResult, prepared.query);
58148
59564
  }
58149
59565
 
58150
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats };
59566
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey };
58151
59567
  //# sourceMappingURL=index.js.map
58152
59568
  //# sourceMappingURL=index.js.map