@1delta/margin-fetcher 0.0.409 → 0.0.411

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, TermMaxViewerAbi, 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");
@@ -22124,15 +22127,7 @@ function exactlyPairLtv(collateralAdjustFactor, borrowAdjustFactor) {
22124
22127
 
22125
22128
  // src/lending/public-data/exactly/convertPublic.ts
22126
22129
  var nowSec3 = () => Math.floor(Date.now() / 1e3);
22127
- function exactlyLenderKey(market) {
22128
- const body = market.startsWith("0x") ? market.slice(2) : market;
22129
- return "EXACTLY_" + body.toUpperCase();
22130
- }
22131
- function exactlyMarketFromLenderKey(lender) {
22132
- if (!lender.startsWith("EXACTLY_")) return void 0;
22133
- const body = lender.slice("EXACTLY_".length);
22134
- return body.length === 40 ? "0x" + body.toLowerCase() : void 0;
22135
- }
22130
+ var EXACTLY_LENDER_KEY = "EXACTLY";
22136
22131
  function toHuman(raw, decimals) {
22137
22132
  return Number(raw) / 10 ** decimals;
22138
22133
  }
@@ -22148,9 +22143,12 @@ function convertExactlyMarketsToResponse(raw, chainId, prices = {}, _additionalY
22148
22143
  const out = {};
22149
22144
  const now = nowSec3();
22150
22145
  const markets = raw?.markets ?? [];
22146
+ if (markets.length === 0) return out;
22151
22147
  const liqBonus = raw?.liquidationIncentive ? Number(raw.liquidationIncentive.liquidator) / 1e18 : 0;
22148
+ const lenderKey = EXACTLY_LENDER_KEY;
22149
+ const entry = { data: {} };
22150
+ const penaltyAprs = [];
22152
22151
  for (const m of markets) {
22153
- const lenderKey = exactlyLenderKey(m.market);
22154
22152
  const assetAddr = m.asset.toLowerCase();
22155
22153
  const decimals = m.decimals;
22156
22154
  const asset = tokens[assetAddr];
@@ -22182,9 +22180,10 @@ function convertExactlyMarketsToResponse(raw, chainId, prices = {}, _additionalY
22182
22180
  const totalDebt = toHuman(m.totalFloatingBorrowAssets, decimals) + fixedBorrowed;
22183
22181
  const borrowLiquidity = toHuman(m.floatingAvailableAssets, decimals);
22184
22182
  const utilization = totalDeposits > 0 ? totalDebt / totalDeposits : 0;
22185
- const selfLtv = exactlyPairLtv(m.adjustFactor, m.adjustFactor);
22183
+ const adjustFactor = Number(m.adjustFactor) / 1e18;
22184
+ const borrowFactor = adjustFactor > 0 ? 1 / adjustFactor : 1;
22186
22185
  const penaltyApr = exactlyPenaltyRateToAprPercent(m.penaltyRate);
22187
- const entry = { data: {} };
22186
+ penaltyAprs.push(penaltyApr);
22188
22187
  const loanUid = createMarketUid(chainId, lenderKey, assetAddr);
22189
22188
  entry.data[loanUid] = {
22190
22189
  marketUid: loanUid,
@@ -22212,17 +22211,28 @@ function convertExactlyMarketsToResponse(raw, chainId, prices = {}, _additionalY
22212
22211
  variableBorrowRate: exactlyWadRateToPercent(m.floatingBorrowRate),
22213
22212
  rateModel: "fixedTerm",
22214
22213
  // Fixed-rate lender convention (Term/Lista): best fixed borrow APR on the
22215
- // stable slot; the full per-maturity menu is params.market.terms.
22214
+ // stable slot; the full per-maturity menu is this entry's `terms`.
22216
22215
  stableBorrowRate: bestFixedBorrowApr,
22216
+ // PER-ASSET fixed-term menu + descriptor. Cross-margin means one lender
22217
+ // key spans every asset, and each asset has its OWN fixed pools — so
22218
+ // these cannot live on `params.market` (which assumes one borrowable
22219
+ // asset per key, true for every isolated fixed-term lender but not here).
22220
+ terms: terms.length > 0 ? terms : void 0,
22221
+ fixedTerm: {
22222
+ model: "exactly",
22223
+ fees: { latePenaltyApr: penaltyApr },
22224
+ earlyRepay: { kind: "discount" },
22225
+ provider: { kind: "pool", address: m.market.toLowerCase() }
22226
+ },
22217
22227
  intrinsicYield: 0,
22218
22228
  rewards: void 0,
22219
22229
  decimals,
22220
22230
  config: {
22221
22231
  0: {
22222
22232
  category: 0,
22223
- borrowCollateralFactor: selfLtv,
22224
- collateralFactor: selfLtv,
22225
- borrowFactor: 1,
22233
+ borrowCollateralFactor: adjustFactor,
22234
+ collateralFactor: adjustFactor,
22235
+ borrowFactor,
22226
22236
  liquidationPenalty: liqBonus,
22227
22237
  closeFactor: 1,
22228
22238
  collateralDisabled: false,
@@ -22237,93 +22247,50 @@ function convertExactlyMarketsToResponse(raw, chainId, prices = {}, _additionalY
22237
22247
  // Exactly DOES have a variable (floating) borrow side.
22238
22248
  variableBorrowDisabled: false,
22239
22249
  isActive: true,
22240
- isFrozen: false
22241
- };
22242
- for (const c of markets) {
22243
- if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
22244
- const collAddr = c.asset.toLowerCase();
22245
- const ltv = exactlyPairLtv(c.adjustFactor, m.adjustFactor);
22246
- const collUid = createMarketUid(chainId, lenderKey, collAddr);
22247
- entry.data[collUid] = {
22248
- marketUid: collUid,
22249
- name: "Collateral " + c.assetSymbol,
22250
- poolId: c.market.toLowerCase(),
22251
- underlying: collAddr,
22252
- asset: currencyFor3(collAddr, c.decimals, c.assetSymbol, tokens),
22253
- totalDeposits: 0,
22254
- totalDebtStable: 0,
22255
- totalDebt: 0,
22256
- totalLiquidity: 0,
22257
- borrowLiquidity: 0,
22258
- totalLiquidityUSD: 0,
22259
- borrowLiquidityUSD: 0,
22260
- totalDepositsUSD: 0,
22261
- totalDebtStableUSD: 0,
22262
- totalDebtUSD: 0,
22263
- utilization: 0,
22264
- depositRate: 0,
22265
- variableBorrowRate: 0,
22266
- stableBorrowRate: 0,
22267
- intrinsicYield: 0,
22268
- rewards: void 0,
22269
- decimals: c.decimals,
22270
- config: {
22271
- 0: {
22272
- category: 0,
22273
- borrowCollateralFactor: ltv,
22274
- collateralFactor: ltv,
22275
- borrowFactor: 1,
22276
- liquidationPenalty: liqBonus,
22277
- closeFactor: 1,
22278
- collateralDisabled: false,
22279
- debtDisabled: true
22280
- }
22281
- },
22282
- closeFactor: 1,
22283
- collateralActive: true,
22284
- borrowingEnabled: false,
22285
- depositsEnabled: true,
22286
- hasStable: false,
22287
- isActive: true,
22288
- isFrozen: false
22289
- };
22290
- }
22291
- entry.params = {
22292
- market: {
22293
- lender: lenderKey,
22294
- name: "Exactly " + m.assetSymbol,
22295
- loanDecimals: decimals,
22296
- collateralDecimals: decimals,
22297
- // Market address doubles as the market id (it IS the lender-key body).
22298
- id: m.market.toLowerCase(),
22299
- // Self-pair adjust factor (WAD string); pairwise LTVs live on the
22300
- // per-collateral entries above.
22301
- lltv: m.adjustFactor.toString(),
22302
- oracle: zeroAddress,
22303
- irm: zeroAddress,
22304
- collateralAddress: assetAddr,
22305
- loanAddress: assetAddr,
22306
- terms: terms.length > 0 ? terms : void 0,
22307
- // Canonical cross-protocol fixed-term descriptor. Exactly: MENU of
22308
- // calendar maturities (terms[], termId = maturity), pool-fronted
22309
- // utilization-curve rates, early repay = DISCOUNT (unassigned-earnings
22310
- // rebate via previewRepayAtMaturity), late repay = per-second penalty.
22311
- fixedTerm: {
22312
- model: "exactly",
22313
- fees: { latePenaltyApr: penaltyApr },
22314
- earlyRepay: { kind: "discount" },
22315
- provider: { kind: "pool", address: m.market.toLowerCase() }
22316
- },
22317
- // Exactly-specific extras (consumed by calldata / worker-api resolvers)
22250
+ isFrozen: false,
22251
+ // Per-asset Exactly extras. `poolId` above already carries the Market
22252
+ // address (the write target resolve it from the ASSET now, via
22253
+ // `exactlyMarketByAsset`, never from the lender key).
22254
+ exactly: {
22255
+ market: m.market.toLowerCase(),
22318
22256
  penaltyRate: m.penaltyRate.toString(),
22319
22257
  adjustFactor: m.adjustFactor.toString(),
22320
22258
  maxFuturePools: m.maxFuturePools,
22321
22259
  usdPrice: m.usdPrice.toString()
22322
22260
  }
22323
22261
  };
22324
- entry.chainId = chainId;
22325
- out[lenderKey] = entry;
22326
22262
  }
22263
+ const uniformPenaltyApr = penaltyAprs.length > 0 && penaltyAprs.every((p) => p === penaltyAprs[0]) ? penaltyAprs[0] : void 0;
22264
+ entry.params = {
22265
+ market: {
22266
+ lender: lenderKey,
22267
+ name: "Exactly",
22268
+ // The per-chain Auditor — the shared cross-margin risk module every
22269
+ // Market reports to (Compound V2's Comptroller seam).
22270
+ id: (exactlyConfig()?.[chainId]?.auditor ?? zeroAddress).toLowerCase(),
22271
+ // No market-level LLTV: risk is per-asset (collateralFactor/borrowFactor
22272
+ // on each entry) and effective pair LTV is their product.
22273
+ lltv: "0",
22274
+ oracle: zeroAddress,
22275
+ irm: zeroAddress,
22276
+ collateralAddress: zeroAddress,
22277
+ loanAddress: zeroAddress,
22278
+ // `terms` is deliberately ABSENT at market level — each asset has its own
22279
+ // fixed pools, so the menu is on `data[*].terms`. A market-level
22280
+ // descriptor is still emitted so consumers that only probe
22281
+ // `params.market.fixedTerm` still recognise Exactly as fixed-term; its
22282
+ // `provider.address` is omitted (no single Market) and the late-penalty
22283
+ // rate is carried only when every asset agrees (it does today).
22284
+ fixedTerm: {
22285
+ model: "exactly",
22286
+ fees: uniformPenaltyApr !== void 0 ? { latePenaltyApr: uniformPenaltyApr } : {},
22287
+ earlyRepay: { kind: "discount" },
22288
+ provider: { kind: "pool" }
22289
+ }
22290
+ }
22291
+ };
22292
+ entry.chainId = chainId;
22293
+ out[lenderKey] = entry;
22327
22294
  return out;
22328
22295
  }
22329
22296
  var READS_PER_BRANCH = 8;
@@ -22915,7 +22882,7 @@ async function fetchTellerMarkets(chainId) {
22915
22882
  } catch {
22916
22883
  return { chainId, pools: [] };
22917
22884
  }
22918
- const big7 = (i) => {
22885
+ const big9 = (i) => {
22919
22886
  const r = results[i];
22920
22887
  if (typeof r === "bigint") return r;
22921
22888
  if (typeof r === "number") return BigInt(r);
@@ -22929,20 +22896,20 @@ async function fetchTellerMarkets(chainId) {
22929
22896
  return null;
22930
22897
  };
22931
22898
  const num9 = (i) => {
22932
- const b = big7(i);
22899
+ const b = big9(i);
22933
22900
  return b === null ? null : Number(b);
22934
22901
  };
22935
22902
  const pool0 = pools.map((config, i) => {
22936
22903
  const base = i * READS_PER_POOL;
22937
22904
  return {
22938
22905
  config,
22939
- available: big7(base),
22940
- committed: big7(base + 1),
22906
+ available: big9(base),
22907
+ committed: big9(base + 1),
22941
22908
  minRateBps: num9(base + 2),
22942
- collateralPerPrincipal: big7(base + 3),
22909
+ collateralPerPrincipal: big9(base + 3),
22943
22910
  maxLoanDuration: num9(base + 4),
22944
- marketId: big7(base + 5),
22945
- totalAssets: big7(base + 6)
22911
+ marketId: big9(base + 5),
22912
+ totalAssets: big9(base + 6)
22946
22913
  };
22947
22914
  });
22948
22915
  const attByMarket = /* @__PURE__ */ new Map();
@@ -24175,6 +24142,264 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
24175
24142
  }
24176
24143
  return out;
24177
24144
  }
24145
+ var READS_PER_ILK = 4;
24146
+ var USDD_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi, erc20Abi];
24147
+ var usddIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
24148
+ async function fetchUsddMarkets(lender, chainId) {
24149
+ const config = usddConfigFor(lender, chainId);
24150
+ const chainData = usddChainData(lender, chainId);
24151
+ const markets = chainData?.markets ?? [];
24152
+ if (!config || markets.length === 0) {
24153
+ return { lender, config, chainData, markets: [] };
24154
+ }
24155
+ const calls = markets.flatMap((m) => {
24156
+ const ilk32 = usddIlkBytes32(m.ilk);
24157
+ return [
24158
+ { address: config.vat, name: "ilks", params: [ilk32] },
24159
+ { address: config.jug, name: "ilks", params: [ilk32] },
24160
+ { address: config.spot, name: "ilks", params: [ilk32] },
24161
+ { address: m.collToken, name: "balanceOf", params: [m.gemJoin] }
24162
+ ];
24163
+ });
24164
+ let results = [];
24165
+ try {
24166
+ results = await multicallRetryUniversal({
24167
+ chain: chainId,
24168
+ calls,
24169
+ abi: markets.flatMap(() => USDD_ABI_PER_READ),
24170
+ allowFailure: true
24171
+ });
24172
+ } catch {
24173
+ return { lender, config, chainData, markets: [] };
24174
+ }
24175
+ const big9 = (v) => {
24176
+ if (typeof v === "bigint") return v;
24177
+ if (typeof v === "number") return BigInt(v);
24178
+ return null;
24179
+ };
24180
+ const field12 = (res, name, idx) => big9(res?.[name] ?? res?.[idx]);
24181
+ const out = markets.map((market, i) => {
24182
+ const base = i * READS_PER_ILK;
24183
+ const vatIlk = results[base];
24184
+ const jugIlk = results[base + 1];
24185
+ const spotIlk = results[base + 2];
24186
+ return {
24187
+ market,
24188
+ Art: field12(vatIlk, "Art", 0),
24189
+ rate: field12(vatIlk, "rate", 1),
24190
+ spot: field12(vatIlk, "spot", 2),
24191
+ line: field12(vatIlk, "line", 3),
24192
+ dust: field12(vatIlk, "dust", 4),
24193
+ duty: field12(jugIlk, "duty", 0),
24194
+ mat: field12(spotIlk, "mat", 1),
24195
+ joinBalance: big9(results[base + 3])
24196
+ };
24197
+ });
24198
+ return { lender, config, chainData, markets: out };
24199
+ }
24200
+
24201
+ // src/lending/public-data/usdd/convertPublic.ts
24202
+ function usddLenderKey(lender, chainId, ilk) {
24203
+ return `${lender}_${chainId}_${ilk}`;
24204
+ }
24205
+ function usddKeyParts(key) {
24206
+ if (!key.startsWith("USDD_")) return void 0;
24207
+ const suffix = key.slice("USDD_".length);
24208
+ const m = suffix.match(/^(\d+)_([A-Z0-9][A-Z0-9-]*)$/);
24209
+ if (!m) return void 0;
24210
+ return { lender: "USDD", chainId: m[1], ilk: m[2] };
24211
+ }
24212
+ var WAD8 = 1e18;
24213
+ var RAY3 = 1e27;
24214
+ var RAD = 1e45;
24215
+ var YEAR_SECONDS2 = 31536e3;
24216
+ function toHuman4(raw, decimals) {
24217
+ return Number(raw) / 10 ** decimals;
24218
+ }
24219
+ function currencyFor9(address, decimals, symbol, tokens) {
24220
+ const lower3 = address.toLowerCase();
24221
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
24222
+ }
24223
+ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
24224
+ intrinsicYields: {},
24225
+ lenderRewards: {},
24226
+ loaded: true
24227
+ }, tokens = {}) {
24228
+ const out = {};
24229
+ const cfg = raw?.config;
24230
+ const chainData = raw?.chainData;
24231
+ if (!cfg || !chainData) return out;
24232
+ const debtAddr = cfg.usdd.toLowerCase();
24233
+ const debtDecimals = cfg.debtDecimals ?? 18;
24234
+ const debtToken = tokens[debtAddr];
24235
+ const debtSymbol = debtToken?.symbol ?? "USDD";
24236
+ const debtPriceKey = toOracleKey(debtToken?.assetGroup) || toGenericPriceKey(debtAddr, chainId);
24237
+ const debtPrice = prices[debtPriceKey] || 1;
24238
+ for (const m of raw.markets ?? []) {
24239
+ const market = m.market;
24240
+ const lenderKey = usddLenderKey(raw.lender, chainId, market.ilk);
24241
+ const collAddr = market.collToken.toLowerCase();
24242
+ const collDecimals = market.collDecimals;
24243
+ const collToken = tokens[collAddr];
24244
+ const collSymbol = collToken?.symbol ?? market.collSymbol ?? market.ilk.split("-")[0];
24245
+ const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
24246
+ const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
24247
+ const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) / RAY3 * (Number(m.mat) / RAY3) : 0;
24248
+ const collPrice = spotDerivedPrice || (prices[collPriceKey] ?? 0);
24249
+ const totalDebt = m.Art !== null && m.rate !== null ? Number(m.Art * m.rate / BigInt(1e27)) / 10 ** debtDecimals : 0;
24250
+ const totalColl = m.joinBalance !== null ? toHuman4(m.joinBalance, collDecimals) : 0;
24251
+ const mat = m.mat !== null ? Number(m.mat) / RAY3 : Number(market.mat) / RAY3 || 1.5;
24252
+ const ltv = mat > 0 ? 1 / mat : 0;
24253
+ const chop = market.chop ? Number(market.chop) / WAD8 : 0;
24254
+ const liqPenalty = chop > 1 ? chop - 1 : 0;
24255
+ const duty = m.duty !== null ? m.duty : BigInt(market.duty ?? 0);
24256
+ const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY3 * YEAR_SECONDS2 * 100 : 0;
24257
+ const line = m.line !== null ? Number(m.line) / RAD : 0;
24258
+ let borrowLiquidity = Math.max(0, line - totalDebt);
24259
+ const halted = line === 0;
24260
+ const entry = { data: {} };
24261
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
24262
+ entry.data[collUid] = {
24263
+ marketUid: collUid,
24264
+ name: "Collateral " + collSymbol,
24265
+ poolId: market.gemJoin.toLowerCase(),
24266
+ underlying: collAddr,
24267
+ asset: currencyFor9(collAddr, collDecimals, collSymbol, tokens),
24268
+ totalDeposits: totalColl,
24269
+ totalDebtStable: 0,
24270
+ totalDebt: 0,
24271
+ totalLiquidity: totalColl,
24272
+ borrowLiquidity: 0,
24273
+ totalLiquidityUSD: totalColl * collPrice,
24274
+ borrowLiquidityUSD: 0,
24275
+ totalDepositsUSD: totalColl * collPrice,
24276
+ totalDebtStableUSD: 0,
24277
+ totalDebtUSD: 0,
24278
+ utilization: 0,
24279
+ depositRate: 0,
24280
+ variableBorrowRate: 0,
24281
+ stableBorrowRate: 0,
24282
+ intrinsicYield: 0,
24283
+ rewards: void 0,
24284
+ decimals: collDecimals,
24285
+ config: {
24286
+ 0: {
24287
+ category: 0,
24288
+ borrowCollateralFactor: ltv,
24289
+ collateralFactor: ltv,
24290
+ borrowFactor: 1,
24291
+ liquidationPenalty: liqPenalty,
24292
+ closeFactor: 1,
24293
+ collateralDisabled: false,
24294
+ debtDisabled: true
24295
+ }
24296
+ },
24297
+ closeFactor: 1,
24298
+ collateralActive: true,
24299
+ borrowingEnabled: false,
24300
+ depositsEnabled: !halted,
24301
+ hasStable: false,
24302
+ isActive: !halted,
24303
+ isFrozen: halted
24304
+ };
24305
+ const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
24306
+ entry.data[loanUid] = {
24307
+ marketUid: loanUid,
24308
+ name: debtSymbol,
24309
+ poolId: cfg.vat.toLowerCase(),
24310
+ underlying: debtAddr,
24311
+ asset: currencyFor9(debtAddr, debtDecimals, debtSymbol, tokens),
24312
+ totalDeposits: 0,
24313
+ totalDebtStable: 0,
24314
+ totalDebt,
24315
+ totalLiquidity: borrowLiquidity,
24316
+ borrowLiquidity,
24317
+ totalLiquidityUSD: borrowLiquidity * debtPrice,
24318
+ borrowLiquidityUSD: borrowLiquidity * debtPrice,
24319
+ totalDepositsUSD: 0,
24320
+ totalDebtStableUSD: 0,
24321
+ totalDebtUSD: totalDebt * debtPrice,
24322
+ utilization: 0,
24323
+ // The earn side is sUSDD (savings provider), not a lending deposit.
24324
+ depositRate: 0,
24325
+ variableBorrowRate: borrowApr,
24326
+ stableBorrowRate: 0,
24327
+ // Governance-set per-ilk stability fee — no utilization curve.
24328
+ rateModel: "protocolSet",
24329
+ intrinsicYield: 0,
24330
+ rewards: void 0,
24331
+ decimals: debtDecimals,
24332
+ config: {
24333
+ 0: {
24334
+ category: 0,
24335
+ borrowCollateralFactor: 0,
24336
+ collateralFactor: 0,
24337
+ borrowFactor: 1,
24338
+ liquidationPenalty: liqPenalty,
24339
+ closeFactor: 1,
24340
+ collateralDisabled: true,
24341
+ debtDisabled: halted
24342
+ }
24343
+ },
24344
+ closeFactor: 1,
24345
+ collateralActive: false,
24346
+ borrowingEnabled: !halted,
24347
+ depositsEnabled: false,
24348
+ hasStable: false,
24349
+ variableBorrowDisabled: halted,
24350
+ isActive: !halted,
24351
+ isFrozen: halted
24352
+ };
24353
+ entry.params = {
24354
+ market: {
24355
+ lender: lenderKey,
24356
+ name: marketName,
24357
+ loanDecimals: debtDecimals,
24358
+ collateralDecimals: collDecimals,
24359
+ // The gem join doubles as the market id (marketUid address) — one
24360
+ // adapter per ilk, like River's TroveManager.
24361
+ id: market.gemJoin.toLowerCase(),
24362
+ lltv: m.mat !== null ? m.mat.toString() : market.mat,
24363
+ oracle: market.pip ?? zeroAddress,
24364
+ irm: zeroAddress,
24365
+ collateralAddress: collAddr,
24366
+ loanAddress: debtAddr,
24367
+ // --- USDD descriptor (metadata + live snapshot; consumed by the
24368
+ // calldata builders + worker-api resolvers) ---
24369
+ usdd: {
24370
+ ilk: market.ilk,
24371
+ /** Per-second stability fee (ray string) — live, metadata fallback. */
24372
+ duty: duty.toString(),
24373
+ /** Liquidation ratio (ray string). */
24374
+ mat: m.mat !== null ? m.mat.toString() : market.mat,
24375
+ /** Liquidation penalty multiplier (wad string, Dog.chop). */
24376
+ chop: market.chop,
24377
+ /** Ilk debt ceiling / per-CDP floor (rad strings). */
24378
+ line: m.line !== null ? m.line.toString() : market.line,
24379
+ dust: m.dust !== null ? m.dust.toString() : market.dust,
24380
+ /** Debt accumulator (ray string) — art × rate = debt. */
24381
+ rate: m.rate !== null ? m.rate.toString() : void 0,
24382
+ addresses: {
24383
+ vat: cfg.vat,
24384
+ jug: cfg.jug,
24385
+ spot: cfg.spot,
24386
+ dog: cfg.dog,
24387
+ cdpManager: cfg.cdpManager,
24388
+ proxyActions: cfg.proxyActions,
24389
+ proxyRegistry: cfg.proxyRegistry,
24390
+ usddJoin: cfg.usddJoin,
24391
+ gemJoin: market.gemJoin,
24392
+ clip: market.clip,
24393
+ pip: market.pip
24394
+ }
24395
+ }
24396
+ }
24397
+ };
24398
+ entry.chainId = chainId;
24399
+ out[lenderKey] = entry;
24400
+ }
24401
+ return out;
24402
+ }
24178
24403
 
24179
24404
  // src/lending/public-data/silo-v2/fetchPublic.ts
24180
24405
  var BASE_URL2 = "https://api-v3.silo.finance";
@@ -24785,6 +25010,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
24785
25010
  if (isTeller(lender)) return await fetchTellerMarkets(chainId);
24786
25011
  if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
24787
25012
  if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
25013
+ if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
24788
25014
  return {};
24789
25015
  }
24790
25016
  function convertLenderDataFromApi(lender, chainId, data, prices, additionalYields, list = {}) {
@@ -24846,6 +25072,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
24846
25072
  additionalYields,
24847
25073
  list
24848
25074
  );
25075
+ if (isUsdd(lender))
25076
+ return convertUsddMarketsToResponse(
25077
+ data,
25078
+ chainId,
25079
+ prices,
25080
+ additionalYields,
25081
+ list
25082
+ );
24849
25083
  if (isTermMax(lender))
24850
25084
  return convertTermMaxMarketsToResponse(
24851
25085
  data,
@@ -25055,6 +25289,7 @@ function lenderApiOnly(lender, chainId) {
25055
25289
  if (isTeller(lender)) return true;
25056
25290
  if (isInverse(lender)) return true;
25057
25291
  if (isTermMax(lender)) return true;
25292
+ if (isUsdd(lender)) return true;
25058
25293
  return false;
25059
25294
  }
25060
25295
  function lenderApiWithOnChainFallback(lender, chainId) {
@@ -26246,15 +26481,132 @@ var buildInverseUserCall = (chainId, lender, account) => {
26246
26481
  );
26247
26482
  return calls;
26248
26483
  };
26249
- var TELLER_CALLS_PER_BID = 4;
26484
+ var USDD_CALLS_PER_CDP = 1;
26485
+ var MAX_CDP_WALK = 64;
26250
26486
  var CACHE_TTL_MS2 = 5 * 6e4;
26251
26487
  var discoveryCache2 = /* @__PURE__ */ new Map();
26252
26488
  var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26253
- var getCachedTellerBids = (chainId, account) => {
26489
+ var getCachedUsddCdps = (chainId, account) => {
26254
26490
  const hit = discoveryCache2.get(cacheKey2(chainId, account));
26255
26491
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
26256
26492
  return hit;
26257
26493
  };
26494
+ var big = (v) => {
26495
+ try {
26496
+ if (typeof v === "bigint") return v;
26497
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
26498
+ } catch {
26499
+ }
26500
+ return 0n;
26501
+ };
26502
+ var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
26503
+ var buildUsddUserCall = async (chainId, lender, account) => {
26504
+ const cfg = usddConfigFor(lender, chainId);
26505
+ const markets = usddChainData(lender, chainId)?.markets ?? [];
26506
+ const stash = (d) => discoveryCache2.set(cacheKey2(chainId, account), d);
26507
+ if (!cfg || markets.length === 0) {
26508
+ stash({ cdps: [], ilks: [], at: Date.now() });
26509
+ return [];
26510
+ }
26511
+ const curated = new Set(markets.map((m) => m.ilk));
26512
+ const zero = "0x0000000000000000000000000000000000000000";
26513
+ const owners = [];
26514
+ try {
26515
+ const [rawCount, rawFirst, rawProxy] = await multicallRetryUniversal({
26516
+ chain: chainId,
26517
+ abi: [...UsddCdpManagerAbi, ...UsddProxyRegistryAbi],
26518
+ calls: [
26519
+ { address: cfg.cdpManager, name: "count", params: [account] },
26520
+ { address: cfg.cdpManager, name: "first", params: [account] },
26521
+ { address: cfg.proxyRegistry, name: "proxies", params: [account] }
26522
+ ],
26523
+ allowFailure: false
26524
+ });
26525
+ owners.push({ owner: account, count: big(rawCount), cursor: big(rawFirst) });
26526
+ const proxy = String(rawProxy ?? zero);
26527
+ if (proxy.toLowerCase() !== zero) {
26528
+ const [pCount, pFirst] = await multicallRetryUniversal({
26529
+ chain: chainId,
26530
+ abi: UsddCdpManagerAbi,
26531
+ calls: [
26532
+ { address: cfg.cdpManager, name: "count", params: [proxy] },
26533
+ { address: cfg.cdpManager, name: "first", params: [proxy] }
26534
+ ],
26535
+ allowFailure: false
26536
+ });
26537
+ owners.push({ owner: proxy, count: big(pCount), cursor: big(pFirst) });
26538
+ }
26539
+ } catch {
26540
+ return [];
26541
+ }
26542
+ const live = owners.filter((o) => o.count > 0n && o.cursor !== 0n);
26543
+ if (live.length === 0) {
26544
+ stash({ cdps: [], ilks: [], at: Date.now() });
26545
+ return [];
26546
+ }
26547
+ const cdps = [];
26548
+ try {
26549
+ for (const head of live) {
26550
+ let cursor = head.cursor;
26551
+ const steps = Number(
26552
+ head.count > BigInt(MAX_CDP_WALK) ? MAX_CDP_WALK : head.count
26553
+ );
26554
+ if (head.count > BigInt(MAX_CDP_WALK)) {
26555
+ console.warn(
26556
+ `USDD: owner ${head.owner} holds ${head.count} CDPs on chain ${chainId} \u2014 truncating discovery at ${MAX_CDP_WALK}`
26557
+ );
26558
+ }
26559
+ for (let i = 0; i < steps && cursor !== 0n; i++) {
26560
+ const [urn, ilk32, link] = await multicallRetryUniversal({
26561
+ chain: chainId,
26562
+ abi: UsddCdpManagerAbi,
26563
+ calls: [
26564
+ { address: cfg.cdpManager, name: "urns", params: [cursor] },
26565
+ { address: cfg.cdpManager, name: "ilks", params: [cursor] },
26566
+ { address: cfg.cdpManager, name: "list", params: [cursor] }
26567
+ ],
26568
+ allowFailure: false
26569
+ });
26570
+ let ilk = "";
26571
+ try {
26572
+ ilk = hexToString(ilk32, { size: 32 }).replace(/[\s\0]+$/g, "");
26573
+ } catch {
26574
+ }
26575
+ if (curated.has(ilk)) {
26576
+ cdps.push({ cdpId: cursor.toString(), urn: String(urn), ilk });
26577
+ }
26578
+ cursor = big(field6(link, "next", 1));
26579
+ }
26580
+ }
26581
+ } catch {
26582
+ return [];
26583
+ }
26584
+ const ilks = [...new Set(cdps.map((c) => c.ilk))];
26585
+ stash({ cdps, ilks, at: Date.now() });
26586
+ if (cdps.length === 0) return [];
26587
+ const calls = cdps.map((c) => ({
26588
+ address: cfg.vat,
26589
+ name: "urns",
26590
+ params: [usddIlkBytes32(c.ilk), c.urn]
26591
+ }));
26592
+ for (const ilk of ilks) {
26593
+ calls.push({
26594
+ address: cfg.vat,
26595
+ name: "ilks",
26596
+ params: [usddIlkBytes32(ilk)]
26597
+ });
26598
+ }
26599
+ return calls;
26600
+ };
26601
+ var TELLER_CALLS_PER_BID = 4;
26602
+ var CACHE_TTL_MS3 = 5 * 6e4;
26603
+ var discoveryCache3 = /* @__PURE__ */ new Map();
26604
+ var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26605
+ var getCachedTellerBids = (chainId, account) => {
26606
+ const hit = discoveryCache3.get(cacheKey3(chainId, account));
26607
+ if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
26608
+ return hit;
26609
+ };
26258
26610
  var nowSec5 = () => Math.floor(Date.now() / 1e3);
26259
26611
  var toBigints = (arr) => {
26260
26612
  if (!Array.isArray(arr)) return [];
@@ -26292,7 +26644,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26292
26644
  return [];
26293
26645
  }
26294
26646
  if (ids.length === 0) {
26295
- discoveryCache2.set(cacheKey2(chainId, account), { bids: [], at: Date.now() });
26647
+ discoveryCache3.set(cacheKey3(chainId, account), { bids: [], at: Date.now() });
26296
26648
  return [];
26297
26649
  }
26298
26650
  const poolByAddr = /* @__PURE__ */ new Map();
@@ -26319,7 +26671,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26319
26671
  const pool = poolByAddr.get(lenderAddr);
26320
26672
  if (pool) kept.push({ bidId: id, pool });
26321
26673
  });
26322
- discoveryCache2.set(cacheKey2(chainId, account), { bids: kept, at: Date.now() });
26674
+ discoveryCache3.set(cacheKey3(chainId, account), { bids: kept, at: Date.now() });
26323
26675
  if (kept.length === 0) return [];
26324
26676
  const ts = nowSec5();
26325
26677
  const calls = [];
@@ -26344,12 +26696,12 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26344
26696
  return calls;
26345
26697
  };
26346
26698
  var TERMMAX_CALLS_PER_ACCOUNT = 1;
26347
- var CACHE_TTL_MS3 = 5 * 6e4;
26348
- var discoveryCache3 = /* @__PURE__ */ new Map();
26349
- var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26699
+ var CACHE_TTL_MS4 = 5 * 6e4;
26700
+ var discoveryCache4 = /* @__PURE__ */ new Map();
26701
+ var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26350
26702
  var getCachedTermMaxDiscovery = (chainId, account) => {
26351
- const hit = discoveryCache3.get(cacheKey3(chainId, account));
26352
- if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
26703
+ const hit = discoveryCache4.get(cacheKey4(chainId, account));
26704
+ if (!hit || Date.now() - hit.at > CACHE_TTL_MS4) return void 0;
26353
26705
  return hit;
26354
26706
  };
26355
26707
  var buildTermMaxUserCall = async (chainId, _lender, account) => {
@@ -26364,11 +26716,11 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
26364
26716
  }
26365
26717
  }
26366
26718
  if (markets.length === 0) {
26367
- discoveryCache3.set(cacheKey3(chainId, account), { markets: [], at: Date.now() });
26719
+ discoveryCache4.set(cacheKey4(chainId, account), { markets: [], at: Date.now() });
26368
26720
  return [];
26369
26721
  }
26370
26722
  markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
26371
- discoveryCache3.set(cacheKey3(chainId, account), { markets, at: Date.now() });
26723
+ discoveryCache4.set(cacheKey4(chainId, account), { markets, at: Date.now() });
26372
26724
  return [
26373
26725
  {
26374
26726
  address: proto.viewer,
@@ -26401,22 +26753,30 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
26401
26753
  if (isTeller(lender)) return buildTellerUserCall(chainId, lender, account);
26402
26754
  if (isTermMax(lender)) return buildTermMaxUserCall(chainId, lender, account);
26403
26755
  if (isInverse(lender)) return buildInverseUserCall(chainId, lender, account);
26756
+ if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
26404
26757
  if (isCompoundV3Type(lender))
26405
26758
  return buildCompoundV3UserCall(chainId, lender, account);
26406
26759
  if (isEulerType(lender))
26407
- return buildEulerUserCall(chainId, lender, account, params?.subAccountIndexes);
26408
- if (isSiloV2Type(lender))
26409
- return buildSiloV2UserCall(chainId, lender, account);
26410
- if (isSiloV3Type(lender))
26411
- return buildSiloV3UserCall(chainId, lender, account);
26760
+ return buildEulerUserCall(
26761
+ chainId,
26762
+ lender,
26763
+ account,
26764
+ params?.subAccountIndexes
26765
+ );
26766
+ if (isSiloV2Type(lender)) return buildSiloV2UserCall(chainId, lender, account);
26767
+ if (isSiloV3Type(lender)) return buildSiloV3UserCall(chainId, lender, account);
26412
26768
  if (isCompoundV2Type(lender))
26413
26769
  return buildCompoundV2UserCall(chainId, lender, account);
26414
- if (isFluid(lender))
26415
- return buildFluidUserCall(chainId, lender, account);
26770
+ if (isFluid(lender)) return buildFluidUserCall(chainId, lender, account);
26416
26771
  if (isGearboxV3(lender))
26417
26772
  return buildGearboxV3UserCall(chainId, lender, account);
26418
26773
  if (isDolomite(lender))
26419
- return buildDolomiteUserCall(chainId, lender, account, params?.accountNumbers);
26774
+ return buildDolomiteUserCall(
26775
+ chainId,
26776
+ lender,
26777
+ account,
26778
+ params?.accountNumbers
26779
+ );
26420
26780
  return [];
26421
26781
  }
26422
26782
  function organizeUserQueries(queries) {
@@ -26429,10 +26789,11 @@ function organizeUserQueries(queries) {
26429
26789
  const river = queries.filter((q) => isRiver(q.lender));
26430
26790
  const teller = queries.filter((q) => isTeller(q.lender));
26431
26791
  const termMax = queries.filter((q) => isTermMax(q.lender));
26432
- 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)
26792
+ const usdd = queries.filter((q) => isUsdd(q.lender));
26793
+ 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)
26433
26794
  return queries;
26434
26795
  const others = queries.filter(
26435
- (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)
26796
+ (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)
26436
26797
  );
26437
26798
  const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
26438
26799
  const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
@@ -26493,6 +26854,14 @@ function organizeUserQueries(queries) {
26493
26854
  assets: void 0
26494
26855
  });
26495
26856
  }
26857
+ if (usdd.length > 0) {
26858
+ result.push({
26859
+ lender: Lender.USDD,
26860
+ account: usdd[0].account,
26861
+ params: usdd.map((p) => p.lender),
26862
+ assets: void 0
26863
+ });
26864
+ }
26496
26865
  if (teller.length > 0) {
26497
26866
  result.push({
26498
26867
  lender: Lender.TELLER,
@@ -28856,7 +29225,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
28856
29225
  totalCalls
28857
29226
  ];
28858
29227
  };
28859
- var WAD8 = 1000000000000000000n;
29228
+ var WAD9 = 1000000000000000000n;
28860
29229
  function toBigInt11(v) {
28861
29230
  if (v === void 0 || v === null || v === "0x") return 0n;
28862
29231
  if (typeof v === "bigint") return v;
@@ -28898,8 +29267,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
28898
29267
  const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
28899
29268
  const debtNum = Number(debtStr);
28900
29269
  const repoBalance = toBigInt11(balanceResult);
28901
- const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD8;
28902
- const lentUnits = repoBalance * redemptionValue / WAD8;
29270
+ const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD9;
29271
+ const lentUnits = repoBalance * redemptionValue / WAD9;
28903
29272
  const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
28904
29273
  const depositsNum = Number(depositsStr);
28905
29274
  const posData = {};
@@ -28976,18 +29345,41 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
28976
29345
  ];
28977
29346
  };
28978
29347
  var nowSec6 = () => Math.floor(Date.now() / 1e3);
29348
+ var DAY_SECONDS = 86400n;
29349
+ var WAD10 = 10n ** 18n;
28979
29350
  function sumPreview(positions) {
28980
29351
  return positions.reduce((acc, p) => acc + p.previewValue, 0n);
28981
29352
  }
28982
- function toDetail(positions, kind, now) {
28983
- return positions.map((p) => ({
28984
- maturity: Number(p.maturity),
28985
- kind,
28986
- principal: p.position.principal.toString(),
28987
- fee: p.position.fee.toString(),
28988
- previewValue: p.previewValue.toString(),
28989
- overdue: Number(p.maturity) < now
28990
- }));
29353
+ var faceOf = (p) => p.position.principal + p.position.fee;
29354
+ function toDetail(positions, kind, now, penaltyRate, penaltyApr) {
29355
+ return positions.map((p) => {
29356
+ const maturity = Number(p.maturity);
29357
+ const overdue = maturity < now;
29358
+ const face = faceOf(p);
29359
+ const gap = face > p.previewValue ? face - p.previewValue : 0n;
29360
+ const excess = p.previewValue > face ? p.previewValue - face : 0n;
29361
+ return {
29362
+ maturity,
29363
+ kind,
29364
+ principal: p.position.principal.toString(),
29365
+ fee: p.position.fee.toString(),
29366
+ faceValue: face.toString(),
29367
+ previewValue: p.previewValue.toString(),
29368
+ overdue,
29369
+ secondsLate: overdue ? now - maturity : 0,
29370
+ ...kind === "borrow" ? {
29371
+ ...overdue ? { latePenalty: excess.toString() } : { earlyRepayDiscount: gap.toString() },
29372
+ // face × penaltyRate × 1 day — what another day of being late adds.
29373
+ latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD10).toString(),
29374
+ latePenaltyApr: penaltyApr
29375
+ } : {
29376
+ ...overdue ? {} : { earlyExitCost: gap.toString() },
29377
+ // Deposits carry no penalty: at/after maturity the payout is face.
29378
+ latePenaltyPerDay: "0",
29379
+ latePenaltyApr: 0
29380
+ }
29381
+ };
29382
+ });
28991
29383
  }
28992
29384
  var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
28993
29385
  const expected = exactlyConfig()?.[chainId]?.previewer ? 1 : 0;
@@ -28998,50 +29390,66 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
28998
29390
  if (!res || res === "0x" || !Array.isArray(res)) return void 0;
28999
29391
  const markets = res;
29000
29392
  const now = nowSec6();
29001
- const out = {};
29393
+ const lenderKey = EXACTLY_LENDER_KEY;
29394
+ const metaMap = meta?.[lenderKey];
29395
+ if (!metaMap) return void 0;
29396
+ const posData = {};
29397
+ let depositsUSD24h = 0;
29398
+ let debtUSD24h = 0;
29002
29399
  for (const m of markets) {
29003
- const lenderKey = exactlyLenderKey(m.market);
29004
- const metaMap = meta?.[lenderKey];
29005
- if (!metaMap) continue;
29006
29400
  const assetAddr = m.asset.toLowerCase();
29007
29401
  const loanUid = createMarketUid(chainId, lenderKey, assetAddr);
29008
29402
  const loanMeta = metaMap[loanUid];
29009
29403
  const decimals = loanMeta?.asset?.decimals ?? m.decimals;
29010
- const loanDisplayPrice = loanMeta ? getDisplayPrice(loanMeta) : 0;
29011
- const loanOraclePrice = loanMeta ? getOraclePrice(loanMeta) : 0;
29012
- const loanPriceHist = loanMeta?.price?.priceUsd24h ?? loanDisplayPrice;
29404
+ const displayPrice = loanMeta ? getDisplayPrice(loanMeta) : 0;
29405
+ const oraclePrice = loanMeta ? getOraclePrice(loanMeta) : 0;
29406
+ const priceHist = loanMeta?.price?.priceUsd24h ?? displayPrice;
29013
29407
  const fixedDebtUnits = sumPreview(m.fixedBorrowPositions);
29014
29408
  const depositUnits = m.floatingDepositAssets + sumPreview(m.fixedDepositPositions);
29015
29409
  const debtUnits = m.floatingBorrowAssets + fixedDebtUnits;
29016
29410
  if (depositUnits === 0n && debtUnits === 0n) continue;
29017
29411
  const depositsStr = parseRawAmount(depositUnits.toString(), decimals);
29018
29412
  const depositsNum = Number(depositsStr);
29019
- const debtStr = parseRawAmount(debtUnits.toString(), decimals);
29020
- const debtNum = Number(debtStr);
29021
29413
  const floatingDebtStr = parseRawAmount(
29022
29414
  m.floatingBorrowAssets.toString(),
29023
29415
  decimals
29024
29416
  );
29025
29417
  const fixedDebtStr = parseRawAmount(fixedDebtUnits.toString(), decimals);
29418
+ const debtNum = Number(floatingDebtStr) + Number(fixedDebtStr);
29419
+ const penaltyApr = exactlyPenaltyRateToAprPercent(m.penaltyRate);
29026
29420
  const fixedPositions = [
29027
- ...toDetail(m.fixedDepositPositions, "deposit", now),
29028
- ...toDetail(m.fixedBorrowPositions, "borrow", now)
29421
+ ...toDetail(
29422
+ m.fixedDepositPositions,
29423
+ "deposit",
29424
+ now,
29425
+ m.penaltyRate,
29426
+ penaltyApr
29427
+ ),
29428
+ ...toDetail(
29429
+ m.fixedBorrowPositions,
29430
+ "borrow",
29431
+ now,
29432
+ m.penaltyRate,
29433
+ penaltyApr
29434
+ )
29029
29435
  ];
29030
- const posData = {};
29031
- let depositsUSD24h = depositsNum * loanPriceHist;
29436
+ depositsUSD24h += depositsNum * priceHist;
29437
+ debtUSD24h += debtNum * priceHist;
29032
29438
  posData[loanUid] = {
29033
29439
  marketUid: loanUid,
29034
29440
  underlying: assetAddr,
29035
29441
  deposits: depositsStr,
29036
29442
  debt: floatingDebtStr,
29037
29443
  debtStable: fixedDebtStr,
29038
- depositsUSD: depositsNum * loanDisplayPrice,
29039
- debtUSD: Number(floatingDebtStr) * loanDisplayPrice,
29040
- debtStableUSD: Number(fixedDebtStr) * loanDisplayPrice,
29041
- depositsUSDOracle: depositsNum * loanOraclePrice,
29042
- debtUSDOracle: Number(floatingDebtStr) * loanOraclePrice,
29043
- debtStableUSDOracle: Number(fixedDebtStr) * loanOraclePrice,
29444
+ depositsUSD: depositsNum * displayPrice,
29445
+ debtUSD: Number(floatingDebtStr) * displayPrice,
29446
+ debtStableUSD: Number(fixedDebtStr) * displayPrice,
29447
+ depositsUSDOracle: depositsNum * oraclePrice,
29448
+ debtUSDOracle: Number(floatingDebtStr) * oraclePrice,
29449
+ debtStableUSDOracle: Number(fixedDebtStr) * oraclePrice,
29044
29450
  stableBorrowRate: "0",
29451
+ // The Auditor's per-asset `enterMarket` flag: only entered deposits
29452
+ // back debt. A deposit with this false is inert collateral-wise.
29045
29453
  collateralEnabled: m.isCollateral,
29046
29454
  claimableRewards: 0,
29047
29455
  // Per-maturity fixed-position detail (survives to the output — the
@@ -29051,6 +29459,11 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29051
29459
  for (const p of m.fixedBorrowPositions) {
29052
29460
  const maturity = Number(p.maturity);
29053
29461
  const trancheStr = parseRawAmount(p.previewValue.toString(), decimals);
29462
+ const isMatured = maturity < now;
29463
+ const face = faceOf(p);
29464
+ const faceStr = parseRawAmount(face.toString(), decimals);
29465
+ const discount = isMatured ? "0" : parseRawAmount((face - p.previewValue).toString(), decimals);
29466
+ const penalty = isMatured ? parseRawAmount((p.previewValue - face).toString(), decimals) : "0";
29054
29467
  posData[`${loanUid}#${maturity}`] = {
29055
29468
  marketUid: loanUid,
29056
29469
  underlying: assetAddr,
@@ -29060,83 +29473,64 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29060
29473
  debtStable: trancheStr,
29061
29474
  depositsUSD: 0,
29062
29475
  debtUSD: 0,
29063
- debtStableUSD: Number(trancheStr) * loanDisplayPrice,
29476
+ debtStableUSD: Number(trancheStr) * displayPrice,
29064
29477
  depositsUSDOracle: 0,
29065
29478
  debtUSDOracle: 0,
29066
- debtStableUSDOracle: Number(trancheStr) * loanOraclePrice,
29479
+ debtStableUSDOracle: Number(trancheStr) * oraclePrice,
29067
29480
  collateralEnabled: false,
29068
29481
  claimableRewards: 0,
29069
29482
  term: {
29070
29483
  loanId: String(maturity),
29071
29484
  termId: maturity,
29072
29485
  isDynamic: false,
29486
+ // `debt` is the repay-NOW cost (discounted early, penalized when
29487
+ // overdue); `faceValue` is what settling AT maturity costs.
29073
29488
  debt: trancheStr,
29489
+ faceValue: faceStr,
29074
29490
  maturity,
29075
29491
  accruedInterest: parseRawAmount(
29076
29492
  p.position.fee.toString(),
29077
29493
  decimals
29078
29494
  ),
29079
- isMatured: maturity < now
29495
+ isMatured,
29496
+ /** rebate if repaid now, before maturity (never a fee) */
29497
+ earlyRepayDiscount: discount,
29498
+ /** penalty already accrued past maturity */
29499
+ latePenalty: penalty,
29500
+ /** further penalty per day overdue — linear on face */
29501
+ latePenaltyPerDay: parseRawAmount(
29502
+ (face * m.penaltyRate * DAY_SECONDS / WAD10).toString(),
29503
+ decimals
29504
+ ),
29505
+ latePenaltyApr: penaltyApr,
29506
+ secondsLate: isMatured ? now - maturity : 0
29080
29507
  }
29081
29508
  };
29082
29509
  }
29083
- if (debtUnits > 0n) {
29084
- for (const c of markets) {
29085
- if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
29086
- if (!c.isCollateral) continue;
29087
- const cDeposit = c.floatingDepositAssets + sumPreview(c.fixedDepositPositions);
29088
- if (cDeposit === 0n) continue;
29089
- const collAddr = c.asset.toLowerCase();
29090
- const collUid = createMarketUid(chainId, lenderKey, collAddr);
29091
- const collMeta = metaMap[collUid];
29092
- const collDec = collMeta?.asset?.decimals ?? c.decimals;
29093
- const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
29094
- const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
29095
- const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
29096
- const collStr = parseRawAmount(cDeposit.toString(), collDec);
29097
- const collNum = Number(collStr);
29098
- depositsUSD24h += collNum * collPriceHist;
29099
- posData[collUid] = {
29100
- marketUid: collUid,
29101
- underlying: collAddr,
29102
- deposits: collStr,
29103
- debt: "0",
29104
- debtStable: "0",
29105
- depositsUSD: collNum * collDisplayPrice,
29106
- debtUSD: 0,
29107
- debtStableUSD: 0,
29108
- depositsUSDOracle: collNum * collOraclePrice,
29109
- debtUSDOracle: 0,
29110
- debtStableUSDOracle: 0,
29111
- stableBorrowRate: "0",
29112
- collateralEnabled: true,
29113
- claimableRewards: 0
29114
- };
29510
+ }
29511
+ if (Object.keys(posData).length === 0) return void 0;
29512
+ const userData = createMultiAccountTypeUserState(
29513
+ {
29514
+ chainId,
29515
+ account,
29516
+ lendingPositions: { "0": posData },
29517
+ modes: { "0": 0 }
29518
+ },
29519
+ metaMap,
29520
+ {
29521
+ "0": {
29522
+ totalDeposits24h: depositsUSD24h,
29523
+ totalDebt24h: debtUSD24h
29115
29524
  }
29116
29525
  }
29117
- const userData = createMultiAccountTypeUserState(
29118
- {
29119
- chainId,
29120
- account,
29121
- lendingPositions: { "0": posData },
29122
- modes: { "0": 0 }
29123
- },
29124
- metaMap,
29125
- {
29126
- "0": {
29127
- totalDeposits24h: depositsUSD24h,
29128
- totalDebt24h: debtNum * loanPriceHist
29129
- }
29130
- }
29131
- );
29132
- if (userData && userData.data.length > 0) out[lenderKey] = userData;
29133
- }
29134
- return Object.keys(out).length > 0 ? out : void 0;
29526
+ );
29527
+ if (!userData || userData.data.length === 0) return void 0;
29528
+ return { [lenderKey]: userData };
29135
29529
  },
29136
29530
  expected
29137
29531
  ];
29138
29532
  };
29139
- var big = (v) => {
29533
+ var big2 = (v) => {
29140
29534
  try {
29141
29535
  if (typeof v === "bigint") return v;
29142
29536
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29144,7 +29538,7 @@ var big = (v) => {
29144
29538
  }
29145
29539
  return 0n;
29146
29540
  };
29147
- var field6 = (res, name, idx) => big(res?.[name] ?? res?.[idx]);
29541
+ var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
29148
29542
  var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29149
29543
  const cfg = liquityConfigFor(lender, chainId);
29150
29544
  const branches = liquityBranchesByChain(lender, chainId);
@@ -29191,29 +29585,29 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29191
29585
  const owner = typeof ownerRaw === "string" ? ownerRaw.toLowerCase() : void 0;
29192
29586
  if (owner !== accountLower) return;
29193
29587
  if (!troveData || troveData === "0x") return;
29194
- const entireDebt = field6(troveData, "entireDebt", 0);
29195
- const entireColl = field6(troveData, "entireColl", 1);
29588
+ const entireDebt = field7(troveData, "entireDebt", 0);
29589
+ const entireColl = field7(troveData, "entireColl", 1);
29196
29590
  if (entireDebt === 0n && entireColl === 0n) return;
29197
29591
  const troveInfo = {
29198
29592
  troveId: t.troveId,
29199
29593
  collIndex: branch.collIndex,
29200
- annualInterestRate: field6(
29594
+ annualInterestRate: field7(
29201
29595
  troveData,
29202
29596
  "annualInterestRate",
29203
29597
  6
29204
29598
  ).toString(),
29205
29599
  lastInterestRateAdjTime: Number(
29206
- field6(troveData, "lastInterestRateAdjTime", 9)
29600
+ field7(troveData, "lastInterestRateAdjTime", 9)
29207
29601
  ),
29208
29602
  zombie: t.zombie,
29209
- redistCollGain: field6(troveData, "redistCollGain", 3).toString(),
29210
- redistBoldDebtGain: field6(
29603
+ redistCollGain: field7(troveData, "redistCollGain", 3).toString(),
29604
+ redistBoldDebtGain: field7(
29211
29605
  troveData,
29212
29606
  "redistBoldDebtGain",
29213
29607
  2
29214
29608
  ).toString(),
29215
- accruedInterest: field6(troveData, "accruedInterest", 4).toString(),
29216
- accruedBatchManagementFee: field6(
29609
+ accruedInterest: field7(troveData, "accruedInterest", 4).toString(),
29610
+ accruedBatchManagementFee: field7(
29217
29611
  troveData,
29218
29612
  "accruedBatchManagementFee",
29219
29613
  8
@@ -29265,11 +29659,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29265
29659
  };
29266
29660
  });
29267
29661
  const spBase = troves.length * 2;
29268
- const spDeposit = big(slice2[spBase]);
29269
- const spYield = big(slice2[spBase + 1]);
29270
- const spCollGain = big(slice2[spBase + 2]);
29271
- const spStashed = big(slice2[spBase + 3]);
29272
- const collSurplus = branch.collSurplusPool ? big(slice2[spBase + 4]) : 0n;
29662
+ const spDeposit = big2(slice2[spBase]);
29663
+ const spYield = big2(slice2[spBase + 1]);
29664
+ const spCollGain = big2(slice2[spBase + 2]);
29665
+ const spStashed = big2(slice2[spBase + 3]);
29666
+ const collSurplus = branch.collSurplusPool ? big2(slice2[spBase + 4]) : 0n;
29273
29667
  const spStable = spDeposit + spYield;
29274
29668
  const spColl = spCollGain + spStashed + collSurplus;
29275
29669
  if (spStable > 0n || spColl > 0n) {
@@ -29348,7 +29742,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29348
29742
  expected
29349
29743
  ];
29350
29744
  };
29351
- var big2 = (v) => {
29745
+ var big3 = (v) => {
29352
29746
  try {
29353
29747
  if (typeof v === "bigint") return v;
29354
29748
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29356,7 +29750,7 @@ var big2 = (v) => {
29356
29750
  }
29357
29751
  return 0n;
29358
29752
  };
29359
- var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
29753
+ var field8 = (res, name, idx) => big3(res?.[name] ?? res?.[idx]);
29360
29754
  var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29361
29755
  const cfg = riverConfigFor(lender, chainId);
29362
29756
  const markets = riverChainData(lender, chainId)?.markets ?? [];
@@ -29368,13 +29762,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29368
29762
  const debtAddr = cfg.debtToken.toLowerCase();
29369
29763
  const debtDecimals = cfg.debtDecimals ?? 18;
29370
29764
  const out = {};
29371
- const spDeposit = big2(data[markets.length * RIVER_CALLS_PER_MARKET]);
29765
+ const spDeposit = big3(data[markets.length * RIVER_CALLS_PER_MARKET]);
29372
29766
  markets.forEach((market, i) => {
29373
29767
  const base = i * RIVER_CALLS_PER_MARKET;
29374
29768
  const entire = data[base];
29375
29769
  if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
29376
- const status = Number(big2(data[base + 1]));
29377
- const surplus = big2(data[base + 2]);
29770
+ const status = Number(big3(data[base + 1]));
29771
+ const surplus = big3(data[base + 2]);
29378
29772
  const lenderKey = riverLenderKey(lender, chainId, market.index);
29379
29773
  const metaMap = meta?.[lenderKey];
29380
29774
  if (!metaMap) return;
@@ -29393,8 +29787,8 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29393
29787
  const lendingPositions = {};
29394
29788
  const modes = {};
29395
29789
  const hist = {};
29396
- const debt = field7(entire, "debt", 0);
29397
- const coll = field7(entire, "coll", 1);
29790
+ const debt = field8(entire, "debt", 0);
29791
+ const coll = field8(entire, "coll", 1);
29398
29792
  if (status === 1 && (debt > 0n || coll > 0n)) {
29399
29793
  const riverInfo = {
29400
29794
  index: market.index,
@@ -29482,7 +29876,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29482
29876
  expected
29483
29877
  ];
29484
29878
  };
29485
- var big3 = (v) => {
29879
+ var big4 = (v) => {
29486
29880
  try {
29487
29881
  if (typeof v === "bigint") return v;
29488
29882
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29501,20 +29895,20 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
29501
29895
  const dolaAddr = cfg.dola.toLowerCase();
29502
29896
  const debtDecimals = cfg.debtDecimals ?? 18;
29503
29897
  const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
29504
- const dbrBalance = big3(data[tailBase]);
29505
- const dbrDeficit = big3(data[tailBase + 1]);
29898
+ const dbrBalance = big4(data[tailBase]);
29899
+ const dbrDeficit = big4(data[tailBase + 1]);
29506
29900
  const dbrSignedRaw = data[tailBase + 2];
29507
- const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big3(dbrSignedRaw);
29901
+ const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big4(dbrSignedRaw);
29508
29902
  const out = {};
29509
29903
  markets.forEach((market, i) => {
29510
29904
  const base = i * INVERSE_CALLS_PER_MARKET;
29511
- const escrowBal = isFailedCall(data[base]) ? 0n : big3(data[base]);
29905
+ const escrowBal = isFailedCall(data[base]) ? 0n : big4(data[base]);
29512
29906
  const debtRaw = data[base + 1];
29513
29907
  if (isFailedCall(debtRaw)) return;
29514
- const debt = big3(debtRaw);
29908
+ const debt = big4(debtRaw);
29515
29909
  if (escrowBal === 0n && debt === 0n) return;
29516
- const creditLimit = isFailedCall(data[base + 2]) ? 0n : big3(data[base + 2]);
29517
- const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big3(data[base + 3]);
29910
+ const creditLimit = isFailedCall(data[base + 2]) ? 0n : big4(data[base + 2]);
29911
+ const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big4(data[base + 3]);
29518
29912
  const lenderKey = inverseLenderKey(lender, market.address);
29519
29913
  const metaMap = meta?.[lenderKey];
29520
29914
  if (!metaMap) return;
@@ -29597,10 +29991,132 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
29597
29991
  expected
29598
29992
  ];
29599
29993
  };
29994
+ var RAY4 = 10n ** 27n;
29995
+ var big5 = (v) => {
29996
+ try {
29997
+ if (typeof v === "bigint") return v;
29998
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
29999
+ } catch {
30000
+ }
30001
+ return 0n;
30002
+ };
30003
+ var field9 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
30004
+ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
30005
+ const cfg = usddConfigFor(lender, chainId);
30006
+ const markets = usddChainData(lender, chainId)?.markets ?? [];
30007
+ const discovery = getCachedUsddCdps(chainId, account);
30008
+ const cdps = discovery?.cdps ?? [];
30009
+ const ilks = discovery?.ilks ?? [];
30010
+ const expected = cfg && markets.length > 0 && cdps.length > 0 ? cdps.length * USDD_CALLS_PER_CDP + ilks.length : 0;
30011
+ return [
30012
+ (data) => {
30013
+ if (!cfg || expected === 0) return void 0;
30014
+ if (!data || data.length < expected) return void 0;
30015
+ const debtAddr = cfg.usdd.toLowerCase();
30016
+ const debtDecimals = cfg.debtDecimals ?? 18;
30017
+ const rateByIlk = /* @__PURE__ */ new Map();
30018
+ ilks.forEach((ilk, i) => {
30019
+ const res = data[cdps.length * USDD_CALLS_PER_CDP + i];
30020
+ if (!isFailedCall(res)) rateByIlk.set(ilk, field9(res, "rate", 1));
30021
+ });
30022
+ const perMarket = /* @__PURE__ */ new Map();
30023
+ cdps.forEach((cdp, i) => {
30024
+ const res = data[i * USDD_CALLS_PER_CDP];
30025
+ if (isFailedCall(res)) return;
30026
+ const ink = field9(res, "ink", 0);
30027
+ const art = field9(res, "art", 1);
30028
+ const rate = rateByIlk.get(cdp.ilk) ?? RAY4;
30029
+ const debt = art * rate / RAY4;
30030
+ if (ink === 0n && debt === 0n) return;
30031
+ const market = markets.find((m) => m.ilk === cdp.ilk);
30032
+ if (!market) return;
30033
+ const key = usddLenderKey(lender, chainId, cdp.ilk);
30034
+ if (!perMarket.has(key)) perMarket.set(key, { market, positions: [] });
30035
+ perMarket.get(key).positions.push({ cdp, ink, debt });
30036
+ });
30037
+ const out = {};
30038
+ for (const [lenderKey, { market, positions }] of perMarket) {
30039
+ const metaMap = meta?.[lenderKey];
30040
+ if (!metaMap) continue;
30041
+ const collAddr = market.collToken.toLowerCase();
30042
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
30043
+ const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
30044
+ const collMeta = metaMap[collUid];
30045
+ const loanMeta = metaMap[loanUid];
30046
+ collMeta?.asset?.decimals ?? market.collDecimals;
30047
+ const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
30048
+ const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
30049
+ const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
30050
+ const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
30051
+ const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
30052
+ const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
30053
+ const lendingPositions = {};
30054
+ const modes = {};
30055
+ const hist = {};
30056
+ for (const { cdp, ink, debt } of positions) {
30057
+ const collStr = parseRawAmount(ink.toString(), 18);
30058
+ const collNum = Number(collStr);
30059
+ const debtStr = parseRawAmount(debt.toString(), debtDecimals);
30060
+ const debtNum = Number(debtStr);
30061
+ const usddInfo = { ...cdp };
30062
+ lendingPositions[cdp.cdpId] = {
30063
+ [collUid]: {
30064
+ marketUid: collUid,
30065
+ underlying: collAddr,
30066
+ deposits: collStr,
30067
+ debt: "0",
30068
+ debtStable: "0",
30069
+ depositsUSD: collNum * collDisplay,
30070
+ debtUSD: 0,
30071
+ debtStableUSD: 0,
30072
+ depositsUSDOracle: collNum * collOracle,
30073
+ debtUSDOracle: 0,
30074
+ debtStableUSDOracle: 0,
30075
+ stableBorrowRate: "0",
30076
+ collateralEnabled: true,
30077
+ claimableRewards: 0
30078
+ },
30079
+ [loanUid]: {
30080
+ marketUid: loanUid,
30081
+ underlying: debtAddr,
30082
+ deposits: "0",
30083
+ debt: debtStr,
30084
+ debtStable: "0",
30085
+ depositsUSD: 0,
30086
+ debtUSD: debtNum * loanDisplay,
30087
+ debtStableUSD: 0,
30088
+ depositsUSDOracle: 0,
30089
+ debtUSDOracle: debtNum * loanOracle,
30090
+ debtStableUSDOracle: 0,
30091
+ stableBorrowRate: "0",
30092
+ collateralEnabled: false,
30093
+ claimableRewards: 0,
30094
+ usddInfo
30095
+ }
30096
+ };
30097
+ modes[cdp.cdpId] = 0;
30098
+ hist[cdp.cdpId] = {
30099
+ totalDeposits24h: collNum * collHist,
30100
+ totalDebt24h: debtNum * loanHist
30101
+ };
30102
+ }
30103
+ if (Object.keys(lendingPositions).length === 0) continue;
30104
+ const userData = createMultiAccountTypeUserState(
30105
+ { chainId, account, lendingPositions, modes },
30106
+ metaMap,
30107
+ hist
30108
+ );
30109
+ if (userData && userData.data.length > 0) out[lenderKey] = userData;
30110
+ }
30111
+ return Object.keys(out).length > 0 ? out : void 0;
30112
+ },
30113
+ expected
30114
+ ];
30115
+ };
29600
30116
 
29601
30117
  // src/lending/user-data/teller/userCallParse.ts
29602
30118
  var nowSec7 = () => Math.floor(Date.now() / 1e3);
29603
- var big4 = (v) => {
30119
+ var big6 = (v) => {
29604
30120
  try {
29605
30121
  if (typeof v === "bigint") return v;
29606
30122
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29608,7 +30124,7 @@ var big4 = (v) => {
29608
30124
  }
29609
30125
  return 0n;
29610
30126
  };
29611
- var field8 = (res, name, idx) => res?.[name] ?? res?.[idx];
30127
+ var field10 = (res, name, idx) => res?.[name] ?? res?.[idx];
29612
30128
  var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29613
30129
  const discovery = getCachedTellerBids(chainId, account);
29614
30130
  const kept = discovery?.bids ?? [];
@@ -29622,7 +30138,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29622
30138
  const base = i * TELLER_CALLS_PER_BID;
29623
30139
  const bidRes = data[base];
29624
30140
  const owed = data[base + 1];
29625
- const collAmount = big4(data[base + 2]);
30141
+ const collAmount = big6(data[base + 2]);
29626
30142
  const defaulted = !!data[base + 3];
29627
30143
  if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
29628
30144
  const pool = b.pool;
@@ -29643,17 +30159,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29643
30159
  const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
29644
30160
  const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
29645
30161
  const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
29646
- const owedPrincipal = big4(field8(owed, "principal", 0));
29647
- const owedInterest = big4(field8(owed, "interest", 1));
30162
+ const owedPrincipal = big6(field10(owed, "principal", 0));
30163
+ const owedInterest = big6(field10(owed, "interest", 1));
29648
30164
  const owedTotal = owedPrincipal + owedInterest;
29649
30165
  if (owedTotal === 0n && collAmount === 0n) return;
29650
- const loanDetails = field8(bidRes, "loanDetails", 5);
29651
- const terms = field8(bidRes, "terms", 6);
30166
+ const loanDetails = field10(bidRes, "loanDetails", 5);
30167
+ const terms = field10(bidRes, "terms", 6);
29652
30168
  const acceptedTs = Number(
29653
- big4(field8(loanDetails, "acceptedTimestamp", 4))
30169
+ big6(field10(loanDetails, "acceptedTimestamp", 4))
29654
30170
  );
29655
- const loanDuration = Number(big4(field8(loanDetails, "loanDuration", 6)));
29656
- const aprBps = Number(big4(field8(terms, "APR", 2)));
30171
+ const loanDuration = Number(big6(field10(loanDetails, "loanDuration", 6)));
30172
+ const aprBps = Number(big6(field10(terms, "APR", 2)));
29657
30173
  const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
29658
30174
  const isMatured = defaulted || maturity !== void 0 && maturity < now;
29659
30175
  const collStr = parseRawAmount(collAmount.toString(), collDecimals);
@@ -29751,7 +30267,7 @@ function toBigInt12(v) {
29751
30267
  return 0n;
29752
30268
  }
29753
30269
  }
29754
- function field9(res, name, index) {
30270
+ function field11(res, name, index) {
29755
30271
  if (res && typeof res === "object" && !Array.isArray(res) && name in res) {
29756
30272
  return res[name];
29757
30273
  }
@@ -29759,18 +30275,18 @@ function field9(res, name, index) {
29759
30275
  return void 0;
29760
30276
  }
29761
30277
  function parsePosition(res) {
29762
- const ftBalance = toBigInt12(field9(res, "ftBalance", 2));
29763
- const xtBalance = toBigInt12(field9(res, "xtBalance", 3));
29764
- const rawGts = field9(res, "gtInfo", 4);
30278
+ const ftBalance = toBigInt12(field11(res, "ftBalance", 2));
30279
+ const xtBalance = toBigInt12(field11(res, "xtBalance", 3));
30280
+ const rawGts = field11(res, "gtInfo", 4);
29765
30281
  const gts = [];
29766
30282
  if (Array.isArray(rawGts)) {
29767
30283
  for (const g of rawGts) {
29768
- const loanId = toBigInt12(field9(g, "loanId", 0));
30284
+ const loanId = toBigInt12(field11(g, "loanId", 0));
29769
30285
  if (loanId === 0n) continue;
29770
30286
  gts.push({
29771
30287
  loanId: loanId.toString(),
29772
- collateralAmt: toBigInt12(field9(g, "collateralAmt", 1)),
29773
- debtAmt: toBigInt12(field9(g, "debtAmt", 2))
30288
+ collateralAmt: toBigInt12(field11(g, "collateralAmt", 1)),
30289
+ debtAmt: toBigInt12(field11(g, "debtAmt", 2))
29774
30290
  });
29775
30291
  }
29776
30292
  }
@@ -29951,6 +30467,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
29951
30467
  return getTermMaxUserDataConverter(lender, chainId, account, meta);
29952
30468
  if (isInverse(lender))
29953
30469
  return getInverseUserDataConverter(lender, chainId, account, meta);
30470
+ if (isUsdd(lender))
30471
+ return getUsddUserDataConverter(lender, chainId, account, meta);
29954
30472
  if (isCompoundV3Type(lender))
29955
30473
  return getCompoundV3UserDataConverter(
29956
30474
  lender,
@@ -30063,7 +30581,7 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
30063
30581
  };
30064
30582
 
30065
30583
  // src/utils/rpcCall.ts
30066
- var multicall3Abi = [
30584
+ var multicall3Abi2 = [
30067
30585
  {
30068
30586
  type: "function",
30069
30587
  name: "aggregate3",
@@ -30139,7 +30657,7 @@ function createMulticallRpcCall(preparedCalls, multicallAddress, batchSize = MUL
30139
30657
  };
30140
30658
  });
30141
30659
  const multicallData = encodeFunctionData({
30142
- abi: multicall3Abi,
30660
+ abi: multicall3Abi2,
30143
30661
  functionName: "aggregate3",
30144
30662
  args: [aggregate3Calls]
30145
30663
  });
@@ -34548,8 +35066,10 @@ var getAbi2 = (lender) => {
34548
35066
  return [...RiverTroveManagerAbi, ...RiverStabilityPoolAbi];
34549
35067
  if (isTeller(lender))
34550
35068
  return [...TellerV2Abi, ...TellerCollateralManagerAbi];
35069
+ if (isTermMax(lender)) return [...TermMaxViewerAbi];
34551
35070
  if (isInverse(lender))
34552
35071
  return [...InverseMarketAbi, ...InverseEscrowAbi, ...InverseDbrAbi];
35072
+ if (isUsdd(lender)) return [...UsddVatAbi];
34553
35073
  if (isInit(lender)) return InitLensAbi;
34554
35074
  if (isEulerType(lender)) return accountLensAbi;
34555
35075
  if (isCompoundV2Type(lender))
@@ -35106,7 +35626,7 @@ var MORPHO_API_CHAIN_IDS = {
35106
35626
  [Chain.UNICHAIN]: 130
35107
35627
  };
35108
35628
  var FETCH_TIMEOUT_MS = 3e3;
35109
- var CACHE_TTL_MS4 = 2e3;
35629
+ var CACHE_TTL_MS5 = 2e3;
35110
35630
  var buildSubgraphQuery = (account) => `
35111
35631
  {
35112
35632
  account(id: "${account.toLowerCase()}") {
@@ -35161,11 +35681,11 @@ async function fetchJsonWithProxyFallback(url, body, proxyConfig) {
35161
35681
  }
35162
35682
  var inflight = /* @__PURE__ */ new Map();
35163
35683
  var resolved = /* @__PURE__ */ new Map();
35164
- function cacheKey4(chainId, account) {
35684
+ function cacheKey5(chainId, account) {
35165
35685
  return `${chainId}:${account.toLowerCase()}`;
35166
35686
  }
35167
35687
  async function dedupedFetch(chainId, account, loader) {
35168
- const key = cacheKey4(chainId, account);
35688
+ const key = cacheKey5(chainId, account);
35169
35689
  const now = Date.now();
35170
35690
  const cached = resolved.get(key);
35171
35691
  if (cached && cached.expiresAt > now) {
@@ -35174,7 +35694,7 @@ async function dedupedFetch(chainId, account, loader) {
35174
35694
  const existing = inflight.get(key);
35175
35695
  if (existing) return existing;
35176
35696
  const promise = loader().then((value) => {
35177
- resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS4 });
35697
+ resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
35178
35698
  return value;
35179
35699
  }).finally(() => {
35180
35700
  inflight.delete(key);
@@ -35306,8 +35826,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
35306
35826
  return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
35307
35827
  }
35308
35828
  function calculateWeightedAprs(items) {
35309
- const wa = (field10, weightField) => calculateWeightedAverage(
35310
- items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field10], weight: Math.abs(i[weightField]) }))
35829
+ const wa = (field12, weightField) => calculateWeightedAverage(
35830
+ items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field12], weight: Math.abs(i[weightField]) }))
35311
35831
  );
35312
35832
  return {
35313
35833
  apr: wa("apr", "nav"),
@@ -36577,8 +37097,8 @@ var rswethFetcher = {
36577
37097
  };
36578
37098
 
36579
37099
  // src/yields/intrinsic/annualizeRate.ts
36580
- var YEAR_SECONDS2 = 365 * 24 * 60 * 60;
36581
- var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS2 / elapsedSeconds) * 100;
37100
+ var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
37101
+ var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS3 / elapsedSeconds) * 100;
36582
37102
  var annualizeRateDeltaPercent = (rateNow, rateThen, elapsedSeconds) => {
36583
37103
  const growth = typeof rateNow === "bigint" && typeof rateThen === "bigint" ? Number(rateNow - rateThen) / Number(rateThen) : Number(rateNow) / Number(rateThen) - 1;
36584
37104
  return annualizeGrowthPercent(growth, elapsedSeconds);
@@ -37045,8 +37565,8 @@ var stKaiaFetcher = {
37045
37565
  // src/yields/intrinsic/fetchers/lista.ts
37046
37566
  var HISTORY_URL = "https://api.lista.org/api/datachart/history";
37047
37567
  var SLISBNB = "Lista Staked BNB::slisBNB";
37048
- var DAY_SECONDS = 86400;
37049
- var LOOKBACK_SECONDS = 14 * DAY_SECONDS;
37568
+ var DAY_SECONDS2 = 86400;
37569
+ var LOOKBACK_SECONDS = 14 * DAY_SECONDS2;
37050
37570
  var TIMEOUT_MS = 8e3;
37051
37571
  var slisBnbFetcher = {
37052
37572
  label: "SLISBNB",
@@ -37620,7 +38140,7 @@ var FRXETH_SUMMARY_URL = "https://api.frax.finance/v2/frxeth/summary/latest";
37620
38140
  var SFRXETH = "0xac3e018457b222d93114458476f3e3416abbe38f";
37621
38141
  var SFRXUSD = "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6";
37622
38142
  var SFRAX = "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32";
37623
- var YEAR_SECONDS3 = 31536000n;
38143
+ var YEAR_SECONDS4 = 31536000n;
37624
38144
  var ONE_E186 = 10n ** 18n;
37625
38145
  var SFRXETH_KEY = "SFRXETH";
37626
38146
  var SFRXUSD_KEY = "SFRXUSD";
@@ -37720,7 +38240,7 @@ var fetchSfrxEthAprOnChain = async () => {
37720
38240
  const window = BigInt(cycleEnd) - BigInt(lastSync);
37721
38241
  if (window <= 0n || totalAssets === 0n) return 0;
37722
38242
  const perSecond = lastRewardAmount / window;
37723
- return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / totalAssets) / 1e16;
38243
+ return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / totalAssets) / 1e16;
37724
38244
  };
37725
38245
  var fetchSfrxEthApr = async () => {
37726
38246
  try {
@@ -37752,7 +38272,7 @@ var fetchFraxSavingsAprs = async () => {
37752
38272
  const uncapped = window > 0n ? rewardCycleAmount / window : 0n;
37753
38273
  const cap = maxPerSecondPerAsset * storedTotalAssets / ONE_E186;
37754
38274
  const perSecond = uncapped < cap ? uncapped : cap;
37755
- return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / storedTotalAssets) / 1e16;
38275
+ return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / storedTotalAssets) / 1e16;
37756
38276
  };
37757
38277
  return { sfrxUsd: aprAt(0), sfrax: aprAt(3) };
37758
38278
  };
@@ -39380,8 +39900,8 @@ var hastraPrimeFetcher = {
39380
39900
  return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
39381
39901
  }
39382
39902
  };
39383
- var RAY3 = 10n ** 27n;
39384
- var YEAR_SECONDS4 = 31536e3;
39903
+ var RAY5 = 10n ** 27n;
39904
+ var YEAR_SECONDS5 = 31536e3;
39385
39905
  var SPARK_VAULTS_V2 = [
39386
39906
  {
39387
39907
  chainId: Chain.ETHEREUM_MAINNET,
@@ -39457,9 +39977,9 @@ var SSR_ABI = [
39457
39977
  }
39458
39978
  ];
39459
39979
  var aprFromVsr = (vsr) => {
39460
- if (vsr <= RAY3) return 0;
39461
- const perSecond = Number(vsr - RAY3) / 1e27;
39462
- return perSecond * YEAR_SECONDS4 * 100;
39980
+ if (vsr <= RAY5) return 0;
39981
+ const perSecond = Number(vsr - RAY5) / 1e27;
39982
+ return perSecond * YEAR_SECONDS5 * 100;
39463
39983
  };
39464
39984
  var chainsOf = (vaults) => [
39465
39985
  ...new Set(vaults.map((v) => v.chainId))
@@ -39478,7 +39998,7 @@ var fetchChain = async (chainId, vaults) => {
39478
39998
  const out = {};
39479
39999
  vaults.forEach((v, i) => {
39480
40000
  const vsr = results[i];
39481
- if (typeof vsr !== "bigint" || vsr < RAY3) return;
40001
+ if (typeof vsr !== "bigint" || vsr < RAY5) return;
39482
40002
  const apr = aprFromVsr(vsr);
39483
40003
  out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
39484
40004
  if (v.assetGroup) out[v.assetGroup] = apr;
@@ -39492,7 +40012,7 @@ var fetchSusdcApr = async () => {
39492
40012
  calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
39493
40013
  allowFailure: false
39494
40014
  });
39495
- if (typeof ssr !== "bigint" || ssr < RAY3) {
40015
+ if (typeof ssr !== "bigint" || ssr < RAY5) {
39496
40016
  throw new Error("Spark sUSDC: unreadable ssr()");
39497
40017
  }
39498
40018
  const apr = aprFromVsr(ssr);
@@ -39551,9 +40071,9 @@ var SUSDP_VAULTS = [
39551
40071
  address: "0x472ed57b376fe400259fb28e5c46eb53f0e3e7e7"
39552
40072
  }
39553
40073
  ];
39554
- var YEAR_SECONDS5 = 31536e3;
40074
+ var YEAR_SECONDS6 = 31536e3;
39555
40075
  var BASE_27 = 1e27;
39556
- var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS5 * 100;
40076
+ var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS6 * 100;
39557
40077
  var SUSDP_KEY = "SUSDP";
39558
40078
  var SUSDP_GROUP_KEY = "Staked USDp::sUSDp";
39559
40079
  var parallelFetcher = {
@@ -39716,7 +40236,9 @@ var reProtocolFetcher = {
39716
40236
  var USD3_KEY = "3JANE::USD3";
39717
40237
  var SUSD3_KEY = "3JANE::sUSD3";
39718
40238
  var USD3_GROUP_KEY = "3Jane USD3::USD3";
39719
- var SUSD3_GROUP_KEY = "3Jane Staked USD3::SUSD3";
40239
+ var SUSD3_GROUP_KEY = "3Jane Staked USD3::sUSD3";
40240
+ var USD3_LEGACY_GROUP_KEY = "USD3::USD3";
40241
+ var SUSD3_LEGACY_GROUP_KEY = "sUSD3::sUSD3";
39720
40242
  var USD3_POOL = "f8cd444e-d99f-4132-b234-fd3482bf8806";
39721
40243
  var SUSD3_POOL = "a99bb965-ebaa-4d98-9ed2-fa18de52c605";
39722
40244
  var threeJaneFetcher = {
@@ -39731,11 +40253,13 @@ var threeJaneFetcher = {
39731
40253
  const apr = apyToAprPercent(usd3.value);
39732
40254
  out[USD3_KEY] = apr;
39733
40255
  out[USD3_GROUP_KEY] = apr;
40256
+ out[USD3_LEGACY_GROUP_KEY] = apr;
39734
40257
  }
39735
40258
  if (susd3.status === "fulfilled") {
39736
40259
  const apr = apyToAprPercent(susd3.value);
39737
40260
  out[SUSD3_KEY] = apr;
39738
40261
  out[SUSD3_GROUP_KEY] = apr;
40262
+ out[SUSD3_LEGACY_GROUP_KEY] = apr;
39739
40263
  }
39740
40264
  if (Object.keys(out).length === 0) {
39741
40265
  throw new Error("3Jane: DefiLlama returned no apy for either pool");
@@ -39771,7 +40295,7 @@ var toriFetcher = {
39771
40295
  };
39772
40296
  var CHAIN_ID8 = Chain.ETHEREUM_MAINNET;
39773
40297
  var SNUSD = "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313";
39774
- var YEAR_SECONDS6 = 31536000n;
40298
+ var YEAR_SECONDS7 = 31536000n;
39775
40299
  var ONE_E187 = 10n ** 18n;
39776
40300
  var SNUSD_KEY = "SNUSD";
39777
40301
  var SNUSD_GROUP_KEY = "Staked NUSD::sNUSD";
@@ -39823,7 +40347,7 @@ var fetchSnusdAprOnChain = async () => {
39823
40347
  const window = elapsed > vestingPeriod ? elapsed : vestingPeriod;
39824
40348
  if (window <= 0n) return 0;
39825
40349
  const perSecond = vestingAmount / window;
39826
- return Number(perSecond * YEAR_SECONDS6 * ONE_E187 / totalAssets) / 1e16;
40350
+ return Number(perSecond * YEAR_SECONDS7 * ONE_E187 / totalAssets) / 1e16;
39827
40351
  };
39828
40352
  var snusdFetcher = {
39829
40353
  label: "SNUSD",
@@ -39836,8 +40360,179 @@ var snusdFetcher = {
39836
40360
  };
39837
40361
  }
39838
40362
  };
39839
- var RAY4 = 10n ** 27n;
39840
- var YEAR_SECONDS7 = 31536e3;
40363
+ var CHAIN_ID9 = Chain.ETHEREUM_MAINNET;
40364
+ var APYUSD = "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a";
40365
+ var APYX_LINEAR_VEST = "0x0d62b4cc02b4b51ed19ddf41d7a7979cf394c99f";
40366
+ var APYX_DISCOVER_URL = "https://api.apyx.fi/v1/rewards/seasons/2/discover";
40367
+ var APYX_DEFILLAMA_POOL = "cb6139f9-4a68-4efd-8245-0312a92aee55";
40368
+ var YEAR_SECONDS8 = 31536000n;
40369
+ var ONE_E188 = 10n ** 18n;
40370
+ var APYUSD_KEY = "APYUSD";
40371
+ var APYUSD_GROUP_KEY = "apyUSD::APYUSD";
40372
+ var APYUSD_LEGACY_GROUP_KEY = "apyUSD::apyUSD";
40373
+ var APYX_READ_ABI = [
40374
+ {
40375
+ name: "totalAssets",
40376
+ type: "function",
40377
+ stateMutability: "view",
40378
+ inputs: [],
40379
+ outputs: [{ type: "uint256" }]
40380
+ },
40381
+ {
40382
+ name: "unvestedAmount",
40383
+ type: "function",
40384
+ stateMutability: "view",
40385
+ inputs: [],
40386
+ outputs: [{ type: "uint256" }]
40387
+ },
40388
+ {
40389
+ name: "vestingPeriodRemaining",
40390
+ type: "function",
40391
+ stateMutability: "view",
40392
+ inputs: [],
40393
+ outputs: [{ type: "uint256" }]
40394
+ }
40395
+ ];
40396
+ var fetchApyusdAprOnChain = async () => {
40397
+ const [totalAssets, unvested, periodRemaining] = await multicallRetryUniversal({
40398
+ chain: CHAIN_ID9,
40399
+ abi: APYX_READ_ABI,
40400
+ calls: [
40401
+ { address: APYUSD, name: "totalAssets", params: [] },
40402
+ { address: APYX_LINEAR_VEST, name: "unvestedAmount", params: [] },
40403
+ {
40404
+ address: APYX_LINEAR_VEST,
40405
+ name: "vestingPeriodRemaining",
40406
+ params: []
40407
+ }
40408
+ ],
40409
+ allowFailure: false
40410
+ });
40411
+ if (totalAssets === 0n || periodRemaining === 0n || unvested === 0n) {
40412
+ throw new Error("apyx vesting state empty");
40413
+ }
40414
+ const perSecond = unvested / periodRemaining;
40415
+ return Number(perSecond * YEAR_SECONDS8 * ONE_E188 / totalAssets) / 1e16;
40416
+ };
40417
+ var fetchApyusdApyFromApi = async () => {
40418
+ const res = await fetch(APYX_DISCOVER_URL, {
40419
+ headers: { accept: "application/json" },
40420
+ signal: AbortSignal.timeout(8e3)
40421
+ });
40422
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
40423
+ const items = (await res.json())?.data?.items ?? [];
40424
+ const row = items.find(
40425
+ (it) => it?.protocol === "Apyx" && it?.network === "ethereum" && Array.isArray(it?.assetSymbols) && it.assetSymbols.includes("apyUSD") && it?.apy != null
40426
+ );
40427
+ const apy = Number(row?.apy);
40428
+ if (Number.isFinite(apy) && apy > 0) return apy;
40429
+ throw new Error("apyUSD apy missing");
40430
+ };
40431
+ var apyxFetcher = {
40432
+ label: "APYUSD",
40433
+ fetch: async () => {
40434
+ const apr = await fetchApyusdAprOnChain().catch(async () => apyToAprPercent(await fetchApyusdApyFromApi())).catch(() => fetchDefiLlamaApy(APYX_DEFILLAMA_POOL)).catch(() => 0);
40435
+ return {
40436
+ [APYUSD_KEY]: apr,
40437
+ [APYUSD_GROUP_KEY]: apr,
40438
+ [APYUSD_LEGACY_GROUP_KEY]: apr
40439
+ };
40440
+ }
40441
+ };
40442
+
40443
+ // src/yields/intrinsic/fetchers/strata.ts
40444
+ var STRATA_ANALYTICS_URL = "https://s3.strata.money/tranches/analytics-v18.json";
40445
+ var SRUSDE_KEY = "Strata Senior USDe::SRUSDE";
40446
+ var JRUSDE_KEY = "Strata Junior USDe::jrUSDe";
40447
+ var SRNUSD_KEY = "Strata Senior NUSD::srNUSD";
40448
+ var JRNUSD_KEY = "Strata Junior NUSD::JRNUSD";
40449
+ var SRMHYPER_KEY = "Strata Senior mHYPER::srmHYPER";
40450
+ var JRMHYPER_KEY = "Strata Junior mHYPER::JRMHYPER";
40451
+ var SRMM1USD_KEY = "Strata Senior mM1-USD::SRMM1-USD";
40452
+ var JRMM1USD_KEY = "Strata Junior mM1-USD::JRMM1-USD";
40453
+ var SRUSDAT_KEY = "Strata Senior USDat::SRUSDAT";
40454
+ var JRUSDAT_KEY = "Strata Junior USDat::JRUSDAT";
40455
+ var SRPRIME_KEY = "Strata Senior PRIME::srPRIME";
40456
+ var JRPRIME_KEY = "Strata Junior PRIME::jrPRIME";
40457
+ var STRATA_MARKETS = [
40458
+ {
40459
+ cdo: "ethenaCdo",
40460
+ sr: { key: SRUSDE_KEY, llamaPool: "843be062-d836-43ef-9670-c78d6ecb60bf" },
40461
+ jr: { key: JRUSDE_KEY, llamaPool: "8352355c-5ad7-45c5-aca2-628de224f8d8" }
40462
+ },
40463
+ {
40464
+ cdo: "neutrlCdo",
40465
+ sr: { key: SRNUSD_KEY, llamaPool: "979711ce-d0c0-4aae-a5fc-d7b76e868649" },
40466
+ jr: { key: JRNUSD_KEY, llamaPool: "947928b7-c446-49d7-a378-392df37660f7" }
40467
+ },
40468
+ {
40469
+ cdo: "mhyperCdo",
40470
+ sr: {
40471
+ key: SRMHYPER_KEY,
40472
+ llamaPool: "a0560647-eb43-45d9-880d-3155db6d357e"
40473
+ },
40474
+ jr: {
40475
+ key: JRMHYPER_KEY,
40476
+ llamaPool: "908664de-79ee-4f4f-9347-40da76a43552"
40477
+ }
40478
+ },
40479
+ {
40480
+ cdo: "mm1usdCdo",
40481
+ sr: {
40482
+ key: SRMM1USD_KEY,
40483
+ llamaPool: "8139ac7b-c983-4800-bb98-60abe3d68157"
40484
+ },
40485
+ jr: {
40486
+ key: JRMM1USD_KEY,
40487
+ llamaPool: "2172d4b0-9a76-4452-af46-2ce833d2c612"
40488
+ }
40489
+ },
40490
+ {
40491
+ cdo: "saturnCdo",
40492
+ sr: { key: SRUSDAT_KEY, llamaPool: "d0f93146-6936-4fac-841e-68178b5a59b2" },
40493
+ jr: { key: JRUSDAT_KEY, llamaPool: "1f42963b-ff24-4563-acb7-0fd35e6ec45b" }
40494
+ },
40495
+ {
40496
+ cdo: "figureCdo",
40497
+ sr: { key: SRPRIME_KEY, llamaPool: "c590eff9-9de2-462c-b629-7e9c89f0b8e9" },
40498
+ jr: { key: JRPRIME_KEY, llamaPool: "f88ff950-9096-46c0-bb9e-93f4d8266c41" }
40499
+ }
40500
+ ];
40501
+ var fetchStrataAnalytics = async () => {
40502
+ const res = await fetch(STRATA_ANALYTICS_URL, {
40503
+ headers: { accept: "application/json" },
40504
+ signal: AbortSignal.timeout(8e3)
40505
+ });
40506
+ if (!res.ok) throw new Error(`Strata analytics HTTP ${res.status}`);
40507
+ return await res.json();
40508
+ };
40509
+ var strataFetcher = {
40510
+ label: "STRATA",
40511
+ fetch: async () => {
40512
+ const analytics = await fetchStrataAnalytics().catch(() => null);
40513
+ const out = {};
40514
+ await Promise.all(
40515
+ STRATA_MARKETS.flatMap(
40516
+ ({ cdo, sr, jr }) => [
40517
+ [sr, analytics?.[cdo]?.week?.srt?.apr],
40518
+ [jr, analytics?.[cdo]?.week?.jrt?.apr]
40519
+ ].map(async ([tranche, apr]) => {
40520
+ if (typeof apr === "number" && Number.isFinite(apr)) {
40521
+ out[tranche.key] = apr;
40522
+ return;
40523
+ }
40524
+ const llamaApy = await fetchDefiLlamaApy(tranche.llamaPool).catch(
40525
+ () => null
40526
+ );
40527
+ if (llamaApy !== null) out[tranche.key] = apyToAprPercent(llamaApy);
40528
+ })
40529
+ )
40530
+ );
40531
+ return out;
40532
+ }
40533
+ };
40534
+ var RAY6 = 10n ** 27n;
40535
+ var YEAR_SECONDS9 = 31536e3;
39841
40536
  var DSR_ABI = [
39842
40537
  {
39843
40538
  name: "dsr",
@@ -39863,9 +40558,9 @@ var USDD_EARN_APY_URL = "https://openapi.usdd.io/api/v1/external/earn-apy";
39863
40558
  var susddKey = (chainId) => `USDD::${chainId}::sUSDD`;
39864
40559
  var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
39865
40560
  var aprFromDsr = (dsr) => {
39866
- if (dsr <= RAY4) return 0;
39867
- const perSecond = Number(dsr - RAY4) / 1e27;
39868
- return perSecond * YEAR_SECONDS7 * 100;
40561
+ if (dsr <= RAY6) return 0;
40562
+ const perSecond = Number(dsr - RAY6) / 1e27;
40563
+ return perSecond * YEAR_SECONDS9 * 100;
39869
40564
  };
39870
40565
  var fetchChainDsr = async (chainId, pot) => {
39871
40566
  const [dsr] = await multicallRetryUniversal({
@@ -39874,7 +40569,7 @@ var fetchChainDsr = async (chainId, pot) => {
39874
40569
  calls: [{ address: pot, name: "dsr", params: [] }],
39875
40570
  allowFailure: false
39876
40571
  });
39877
- if (typeof dsr !== "bigint" || dsr < RAY4) {
40572
+ if (typeof dsr !== "bigint" || dsr < RAY6) {
39878
40573
  throw new Error(`USDD: unreadable dsr() on chain ${chainId}`);
39879
40574
  }
39880
40575
  return aprFromDsr(dsr);
@@ -41410,6 +42105,270 @@ var SINGLE_CHAIN_ENTRIES = {
41410
42105
  yieldFetcher: snusdFetcher,
41411
42106
  yieldKey: SNUSD_KEY
41412
42107
  },
42108
+ {
42109
+ // Apyx apyUSD — ERC-4626 over apxUSD, the "Dividend-Backed
42110
+ // Dollar" (variable-rate perpetual preferred stock of DAT
42111
+ // companies, STRC/Strategy). Yield = off-chain dividends minted
42112
+ // as apxUSD and dripped in through a 14-day LinearVestV0
42113
+ // (0x0d62b4cc…, `pullVestedYield`). No on-chain solvency
42114
+ // invariant — RWA/NAV trust class. apxUSD minting is
42115
+ // EIP-712/m-of-n gated (institutional) but the 4626 stake side is
42116
+ // permissionless (`maxDeposit` = uint.max), with deep secondary
42117
+ // apxUSD liquidity (Curve / Uni v4).
42118
+ //
42119
+ // EXIT (fork-verified 2026-08-04, and NOT what the docs site
42120
+ // describes): a 4626 redeem pays the caller nothing. It takes the
42121
+ // vault's flat `unlockingFee()` (0.1%), escrows the apxUSD in the
42122
+ // unlock-RECEIPT contract (`receipt()` = 0x9bf51f33…) and mints a
42123
+ // soulbound ERC-721 keyed by tokenId. Claims are blocked for
42124
+ // `feeCurve.minDuration` (3 days — hence the cooldown below) and
42125
+ // then carry a fee decaying to zero at `maxDuration` (20 days):
42126
+ // measured 3.40% at 3d, 2.60% at 7d, 0% at 20d. The curve is
42127
+ // GLOBAL and admin-settable (capped 5%), so it re-prices receipts
42128
+ // already in flight — quote `previewClaim(tokenId)` live rather
42129
+ // than trusting a stored figure. The vault's legacy
42130
+ // `unlockToken()` (0x93775e2d…) is still deployed but off the
42131
+ // redemption path. Base/BNB carry bridged mirrors whose 4626
42132
+ // surface reverts (plus Solana) — Ethereum-only row.
42133
+ address: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
42134
+ underlying: "0x98a878b1cd98131b271883b390f68d2c90674665",
42135
+ // apxUSD
42136
+ symbol: "apyUSD",
42137
+ brand: "Apyx",
42138
+ 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).",
42139
+ decimals: 18,
42140
+ isRebasing: false,
42141
+ isMintable: true,
42142
+ withdrawalMode: "request-based",
42143
+ // Earliest claim = the receipt's `claimableAt` (`feeCurve.minDuration`,
42144
+ // 3 days). Waiting the full 20 days is what makes the exit free —
42145
+ // see the note above; both bounds are admin-mutable.
42146
+ withdrawalCooldownSeconds: 3 * 86400,
42147
+ withdrawQueue: "0x9bf51f33955ec70f87c4b5c49441815589043237",
42148
+ yieldFetcher: apyxFetcher,
42149
+ yieldKey: APYUSD_KEY
42150
+ },
42151
+ // ---- Strata (docs.strata.markets) — senior/junior risk tranches ----
42152
+ //
42153
+ // Six CDO markets, twelve ERC-4626 tranche tokens, all Ethereum.
42154
+ // Each market pools a yield-bearing collateral (sUSDe, sNUSD,
42155
+ // mHYPER, mM1-USD, sUSDat, PRIME) and splits its realized yield:
42156
+ // the senior earns a benchmark-floored rate (its `maxDeposit` is
42157
+ // coverage-cap-gated), the junior takes the residual — levered
42158
+ // upside AND first-loss capital (jrUSDat marked down to ~0.36
42159
+ // absorbing the 2026-07 USDat depeg; junior redemptions pause when
42160
+ // senior coverage drops below the market's minimum). Exits are
42161
+ // two-legged and both escrow through the market's cooldown
42162
+ // contracts, claimed via `finalize`: redeeming into the collateral
42163
+ // token runs a governance cooldown (0 seconds = effectively instant
42164
+ // on every market at integration), while the plain-4626 base-asset
42165
+ // redeem unstakes the collateral first (7d Ethena, 10d Neutrl, ≲3d
42166
+ // Midas) — hence `request-based`, with `withdrawQueue` pointing at
42167
+ // the market's UnstakeCooldown. `previewRedeem` (but NOT
42168
+ // `convertToAssets`) already nets the coverage-dependent exit fee
42169
+ // (0–20 bps). Rates are Strata's own trailing-7d realized figures —
42170
+ // see the fetcher for the junior-tranche caveats. Verified on-chain
42171
+ // 2026-08-04.
42172
+ {
42173
+ address: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
42174
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
42175
+ // USDe
42176
+ symbol: "srUSDe",
42177
+ brand: "Strata",
42178
+ 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.",
42179
+ decimals: 18,
42180
+ isRebasing: false,
42181
+ isMintable: true,
42182
+ withdrawalMode: "request-based",
42183
+ withdrawalCooldownSeconds: 7 * 86400,
42184
+ withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
42185
+ yieldFetcher: strataFetcher,
42186
+ yieldKey: SRUSDE_KEY
42187
+ },
42188
+ {
42189
+ address: "0xc58d044404d8b14e953c115e67823784dea53d8f",
42190
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
42191
+ // USDe
42192
+ symbol: "jrUSDe",
42193
+ brand: "Strata",
42194
+ 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%.",
42195
+ decimals: 18,
42196
+ isRebasing: false,
42197
+ isMintable: true,
42198
+ withdrawalMode: "request-based",
42199
+ withdrawalCooldownSeconds: 7 * 86400,
42200
+ withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
42201
+ yieldFetcher: strataFetcher,
42202
+ yieldKey: JRUSDE_KEY
42203
+ },
42204
+ {
42205
+ address: "0x65a44528e8868166401ea08b549e19552af589db",
42206
+ underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
42207
+ // NUSD
42208
+ symbol: "srNUSD",
42209
+ brand: "Strata",
42210
+ 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.",
42211
+ decimals: 18,
42212
+ isRebasing: false,
42213
+ isMintable: true,
42214
+ withdrawalMode: "request-based",
42215
+ withdrawalCooldownSeconds: 10 * 86400,
42216
+ withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
42217
+ yieldFetcher: strataFetcher,
42218
+ yieldKey: SRNUSD_KEY
42219
+ },
42220
+ {
42221
+ address: "0xfc807058a352b61aeef6a38e2d0fc3990225e772",
42222
+ underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
42223
+ // NUSD
42224
+ symbol: "jrNUSD",
42225
+ brand: "Strata",
42226
+ 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.",
42227
+ decimals: 18,
42228
+ isRebasing: false,
42229
+ isMintable: true,
42230
+ withdrawalMode: "request-based",
42231
+ withdrawalCooldownSeconds: 10 * 86400,
42232
+ withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
42233
+ yieldFetcher: strataFetcher,
42234
+ yieldKey: JRNUSD_KEY
42235
+ },
42236
+ {
42237
+ // 18-dec shares over 6-dec USDC (the yUSD case) — the collateral
42238
+ // is 18-dec mHYPER, but the vault accounts in USDC.
42239
+ address: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
42240
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42241
+ // USDC
42242
+ symbol: "srmHYPER",
42243
+ brand: "Strata",
42244
+ 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.",
42245
+ decimals: 18,
42246
+ underlyingDecimals: 6,
42247
+ isRebasing: false,
42248
+ isMintable: true,
42249
+ withdrawalMode: "request-based",
42250
+ withdrawalCooldownSeconds: 3 * 86400,
42251
+ withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
42252
+ yieldFetcher: strataFetcher,
42253
+ yieldKey: SRMHYPER_KEY
42254
+ },
42255
+ {
42256
+ address: "0xeb205d26e9e605ec82d1c0d652e00037c278714b",
42257
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42258
+ // USDC
42259
+ symbol: "jrmHYPER",
42260
+ brand: "Strata",
42261
+ 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.",
42262
+ decimals: 18,
42263
+ underlyingDecimals: 6,
42264
+ isRebasing: false,
42265
+ isMintable: true,
42266
+ withdrawalMode: "request-based",
42267
+ withdrawalCooldownSeconds: 3 * 86400,
42268
+ withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
42269
+ yieldFetcher: strataFetcher,
42270
+ yieldKey: JRMHYPER_KEY
42271
+ },
42272
+ {
42273
+ address: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
42274
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42275
+ // USDC
42276
+ symbol: "srmM1-USD",
42277
+ brand: "Strata",
42278
+ 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.",
42279
+ decimals: 18,
42280
+ underlyingDecimals: 6,
42281
+ isRebasing: false,
42282
+ isMintable: true,
42283
+ withdrawalMode: "request-based",
42284
+ withdrawalCooldownSeconds: 3 * 86400,
42285
+ withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
42286
+ yieldFetcher: strataFetcher,
42287
+ yieldKey: SRMM1USD_KEY
42288
+ },
42289
+ {
42290
+ address: "0xf7eb8dfec75c42d2d2247fe76ccaedc59f821688",
42291
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42292
+ // USDC
42293
+ symbol: "jrmM1-USD",
42294
+ brand: "Strata",
42295
+ 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.",
42296
+ decimals: 18,
42297
+ underlyingDecimals: 6,
42298
+ isRebasing: false,
42299
+ isMintable: true,
42300
+ withdrawalMode: "request-based",
42301
+ withdrawalCooldownSeconds: 3 * 86400,
42302
+ withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
42303
+ yieldFetcher: strataFetcher,
42304
+ yieldKey: JRMM1USD_KEY
42305
+ },
42306
+ {
42307
+ // Accounted in 6-dec USDat (Saturn Dollar); collateral is staked
42308
+ // 18-dec sUSDat.
42309
+ address: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
42310
+ underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
42311
+ // USDat
42312
+ symbol: "srUSDat",
42313
+ brand: "Strata",
42314
+ 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.",
42315
+ decimals: 18,
42316
+ underlyingDecimals: 6,
42317
+ isRebasing: false,
42318
+ isMintable: true,
42319
+ withdrawalMode: "request-based",
42320
+ withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
42321
+ yieldFetcher: strataFetcher,
42322
+ yieldKey: SRUSDAT_KEY
42323
+ },
42324
+ {
42325
+ address: "0x011e55d2b28306458e37ca7e997c879bb25a455d",
42326
+ underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
42327
+ // USDat
42328
+ symbol: "jrUSDat",
42329
+ brand: "Strata",
42330
+ 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.",
42331
+ decimals: 18,
42332
+ underlyingDecimals: 6,
42333
+ isRebasing: false,
42334
+ isMintable: true,
42335
+ withdrawalMode: "request-based",
42336
+ withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
42337
+ yieldFetcher: strataFetcher,
42338
+ yieldKey: JRUSDAT_KEY
42339
+ },
42340
+ {
42341
+ address: "0x35bff778d3fc53a561486bf28e761428499232eb",
42342
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42343
+ // USDC
42344
+ symbol: "srPRIME",
42345
+ brand: "Strata",
42346
+ 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.",
42347
+ decimals: 18,
42348
+ underlyingDecimals: 6,
42349
+ isRebasing: false,
42350
+ isMintable: true,
42351
+ withdrawalMode: "request-based",
42352
+ withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
42353
+ yieldFetcher: strataFetcher,
42354
+ yieldKey: SRPRIME_KEY
42355
+ },
42356
+ {
42357
+ address: "0xf4c91f24e20ee8ed5eda905e501a1136334c2f27",
42358
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42359
+ // USDC
42360
+ symbol: "jrPRIME",
42361
+ brand: "Strata",
42362
+ 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.",
42363
+ decimals: 18,
42364
+ underlyingDecimals: 6,
42365
+ isRebasing: false,
42366
+ isMintable: true,
42367
+ withdrawalMode: "request-based",
42368
+ withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
42369
+ yieldFetcher: strataFetcher,
42370
+ yieldKey: JRPRIME_KEY
42371
+ },
41413
42372
  {
41414
42373
  // Avant savETH — staked avETH (Ethereum, where avETH is native);
41415
42374
  // StakedUSDeV2-style 24h cooldown.
@@ -42639,25 +43598,14 @@ var tethFetcher = {
42639
43598
  }
42640
43599
  };
42641
43600
 
42642
- // src/yields/intrinsic/fetchers/strata.ts
42643
- var SRNUSD_POOL_ID = "979711ce-d0c0-4aae-a5fc-d7b76e868649";
42644
- var KEYS3 = ["Strata Senior NUSD::srNUSD"];
42645
- var srnusdFetcher = {
42646
- label: "SRNUSD",
42647
- fetch: async () => {
42648
- const apr = apyToAprPercent(await fetchDefiLlamaApy(SRNUSD_POOL_ID));
42649
- return Object.fromEntries(KEYS3.map((k) => [k, apr]));
42650
- }
42651
- };
42652
-
42653
43601
  // src/yields/intrinsic/fetchers/anzen.ts
42654
43602
  var SUSDZ_POOL_ID = "46518e93-8197-4539-9861-2340c2ac965a";
42655
- var KEYS4 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
43603
+ var KEYS3 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
42656
43604
  var susdzFetcher = {
42657
43605
  label: "SUSDZ",
42658
43606
  fetch: async () => {
42659
43607
  const apr = apyToAprPercent(await fetchDefiLlamaApy(SUSDZ_POOL_ID));
42660
- return Object.fromEntries(KEYS4.map((k) => [k, apr]));
43608
+ return Object.fromEntries(KEYS3.map((k) => [k, apr]));
42661
43609
  }
42662
43610
  };
42663
43611
 
@@ -42692,7 +43640,8 @@ var LENDING_ONLY_FETCHERS = [
42692
43640
  // DefiLlama-mapped intrinsic yields for classifier assets lacking a bespoke source
42693
43641
  lsethFetcher,
42694
43642
  tethFetcher,
42695
- srnusdFetcher,
43643
+ // strataFetcher is NOT here: the Strata tranche savings rows vault-wire
43644
+ // it, so it reaches the global map via `collectVaultFetchers`.
42696
43645
  susdzFetcher
42697
43646
  ];
42698
43647
  var collectVaultFetchers = () => {
@@ -43555,14 +44504,15 @@ function parseExactlyResults(data, _meta, context) {
43555
44504
  if (tracked.size > 0 && !tracked.has(market.toLowerCase())) continue;
43556
44505
  const priceUSD = Number(usdPrice) / 1e18;
43557
44506
  if (!(priceUSD > 0)) continue;
43558
- const lenderKey = exactlyLenderKey(market);
43559
44507
  entries.push({
43560
44508
  asset,
43561
44509
  // Direct USD price — no oracle-unit denomination, so raw == USD.
43562
44510
  price: priceUSD,
43563
44511
  priceUSD,
43564
- marketUid: createMarketUid(chainId, lenderKey, asset),
43565
- targetLender: lenderKey,
44512
+ // ONE Exactly key per chain (cross-margin); the asset segment of the
44513
+ // marketUid is what distinguishes the per-asset rows.
44514
+ marketUid: createMarketUid(chainId, EXACTLY_LENDER_KEY, asset),
44515
+ targetLender: EXACTLY_LENDER_KEY,
43566
44516
  description: "Exactly market oracle (USD)"
43567
44517
  });
43568
44518
  }
@@ -46876,10 +47826,10 @@ function createAssetArrayPerChain() {
46876
47826
  return assetsPerChain;
46877
47827
  }
46878
47828
  var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
46879
- function createSimpleArrayPerChain(fork, field10 = void 0) {
47829
+ function createSimpleArrayPerChain(fork, field12 = void 0) {
46880
47830
  let pools = {};
46881
47831
  Object.entries(fork ?? {}).forEach(([b2, data]) => {
46882
- Object.entries(field10 ? data[field10] : data).forEach(
47832
+ Object.entries(field12 ? data[field12] : data).forEach(
46883
47833
  ([chainId, address]) => {
46884
47834
  if (!pools[chainId]) pools[chainId] = [];
46885
47835
  pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
@@ -49088,9 +50038,9 @@ query EvkByAssets($assets: [Bytes!]!) {
49088
50038
  `;
49089
50039
  var ZERO = 0n;
49090
50040
  var RAY_TO_PERCENT3 = 1e25;
49091
- function readAddress2(field10) {
49092
- if (!field10) return void 0;
49093
- return field10.toLowerCase();
50041
+ function readAddress2(field12) {
50042
+ if (!field12) return void 0;
50043
+ return field12.toLowerCase();
49094
50044
  }
49095
50045
  function parseVaultFee(v) {
49096
50046
  if (v.performanceFee == null) return 0;
@@ -49455,7 +50405,7 @@ var num2 = (v) => {
49455
50405
  const n = Number(v);
49456
50406
  return Number.isFinite(n) ? n : 0;
49457
50407
  };
49458
- var big5 = (v) => {
50408
+ var big7 = (v) => {
49459
50409
  try {
49460
50410
  if (v === void 0 || v === null || v === "") return "0";
49461
50411
  const s = String(v);
@@ -49491,12 +50441,12 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
49491
50441
  const assetEntry = tokenList[underlying];
49492
50442
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
49493
50443
  const priceUsd = prices[priceKey];
49494
- const totalAssets = big5(r.totalAssets);
49495
- const totalSupply = big5(r.totalSupplyAmt);
50444
+ const totalAssets = big7(r.totalAssets);
50445
+ const totalSupply = big7(r.totalSupplyAmt);
49496
50446
  const totalAssetsFormatted = Number(totalAssets) / scale;
49497
50447
  const supplyRate = num2(r.apr) * 100;
49498
50448
  const rewardsRate = num2(r?.incentiveData?.TMX_APR) * 100;
49499
- const rawLiquidity = BigInt(big5(r.redeemableAmt ?? r.idleFunds ?? "0"));
50449
+ const rawLiquidity = BigInt(big7(r.redeemableAmt ?? r.idleFunds ?? "0"));
49500
50450
  const totalAssetsBig = BigInt(totalAssets);
49501
50451
  const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
49502
50452
  const liquidityFormatted = Number(liquidity) / scale;
@@ -49532,7 +50482,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
49532
50482
  liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
49533
50483
  version: r.version,
49534
50484
  isPaused: r.isPaused === true || void 0,
49535
- supplyCap: r.capacity ? big5(r.capacity) : void 0,
50485
+ supplyCap: r.capacity ? big7(r.capacity) : void 0,
49536
50486
  basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
49537
50487
  };
49538
50488
  }
@@ -49588,7 +50538,7 @@ var Erc20DecimalsBalanceAbi = [
49588
50538
 
49589
50539
  // src/vaults/termmax/fetchFromChain.ts
49590
50540
  var DECIMAL_BASE2 = 100000000n;
49591
- var big6 = (v) => {
50541
+ var big8 = (v) => {
49592
50542
  if (v === void 0 || v === null || v === "0x") return 0n;
49593
50543
  try {
49594
50544
  return typeof v === "bigint" ? v : BigInt(v);
@@ -49652,7 +50602,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49652
50602
  vaults.forEach((address, i) => {
49653
50603
  const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
49654
50604
  const asset = addr(at("asset"));
49655
- const totalAssets = big6(at("totalAssets"));
50605
+ const totalAssets = big8(at("totalAssets"));
49656
50606
  if (!asset || totalAssets === 0n) return;
49657
50607
  rows.push({
49658
50608
  address,
@@ -49661,11 +50611,11 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49661
50611
  decimals: num3(at("decimals")) ?? 18,
49662
50612
  asset,
49663
50613
  totalAssets,
49664
- totalSupply: big6(at("totalSupply")),
49665
- annualizedInterest: big6(at("annualizedInterest")),
49666
- accretingPrincipal: big6(at("accretingPrincipal")),
49667
- performanceFeeRate: big6(at("performanceFeeRate")),
49668
- aprRaw: at("apr") != null ? big6(at("apr")) : void 0,
50614
+ totalSupply: big8(at("totalSupply")),
50615
+ annualizedInterest: big8(at("annualizedInterest")),
50616
+ accretingPrincipal: big8(at("accretingPrincipal")),
50617
+ performanceFeeRate: big8(at("performanceFeeRate")),
50618
+ aprRaw: at("apr") != null ? big8(at("apr")) : void 0,
49669
50619
  curator: addr(at("curator")),
49670
50620
  guardian: addr(at("guardian")),
49671
50621
  timelock: num3(at("timelock")),
@@ -49686,7 +50636,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49686
50636
  const out = {};
49687
50637
  rows.forEach((r, i) => {
49688
50638
  const assetDecimals = num3(res2[i * 2]) ?? r.decimals;
49689
- const idle = big6(res2[i * 2 + 1]);
50639
+ const idle = big8(res2[i * 2 + 1]);
49690
50640
  const assetEntry = tokenList[r.asset];
49691
50641
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
49692
50642
  const priceUsd = prices[priceKey];
@@ -49806,7 +50756,7 @@ var Erc4626PreviewRedeemAbi = [
49806
50756
  ];
49807
50757
 
49808
50758
  // src/vaults/lst/readers/shared.ts
49809
- var ONE_E188 = 10n ** 18n;
50759
+ var ONE_E189 = 10n ** 18n;
49810
50760
  var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
49811
50761
  var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
49812
50762
  var Multicall3BalanceAbi = [
@@ -49849,7 +50799,7 @@ var readerBeetsStS = (entry) => ({
49849
50799
  }
49850
50800
  const liquidity = toBigInt13(pool);
49851
50801
  return {
49852
- totalAssets: totalSupply * exchangeRate / ONE_E188,
50802
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
49853
50803
  totalSupply,
49854
50804
  exchangeRate,
49855
50805
  liquidity
@@ -49882,7 +50832,7 @@ var readerBenqiSavax = (entry) => ({
49882
50832
  {
49883
50833
  address: entry.address,
49884
50834
  name: "getPooledAvaxByShares",
49885
- params: [ONE_E188]
50835
+ params: [ONE_E189]
49886
50836
  },
49887
50837
  { address: entry.address, name: "totalPooledAvax", params: [] }
49888
50838
  ],
@@ -49893,7 +50843,7 @@ var readerBenqiSavax = (entry) => ({
49893
50843
  if (totalSupply === void 0 || exchangeRate === void 0) {
49894
50844
  return void 0;
49895
50845
  }
49896
- const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E188;
50846
+ const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E189;
49897
50847
  return {
49898
50848
  totalAssets,
49899
50849
  totalSupply,
@@ -49912,7 +50862,7 @@ var readerBgtWrapper1to1 = (entry) => ({
49912
50862
  return {
49913
50863
  totalAssets: totalSupply,
49914
50864
  totalSupply,
49915
- exchangeRate: ONE_E188
50865
+ exchangeRate: ONE_E189
49916
50866
  };
49917
50867
  }
49918
50868
  });
@@ -49942,7 +50892,7 @@ var readerDineroBeraEth = (entry) => ({
49942
50892
  return void 0;
49943
50893
  }
49944
50894
  return {
49945
- totalAssets: totalSupply * exchangeRate / ONE_E188,
50895
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
49946
50896
  totalSupply,
49947
50897
  exchangeRate
49948
50898
  };
@@ -49954,7 +50904,7 @@ var readerErc4626 = (entry) => ({
49954
50904
  calls: [
49955
50905
  { address: entry.address, name: "totalAssets", params: [] },
49956
50906
  { address: entry.address, name: "totalSupply", params: [] },
49957
- { address: entry.address, name: "convertToAssets", params: [ONE_E188] }
50907
+ { address: entry.address, name: "convertToAssets", params: [ONE_E189] }
49958
50908
  ],
49959
50909
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
49960
50910
  parse: ([assets, supply, rate]) => {
@@ -49971,7 +50921,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
49971
50921
  calls: [
49972
50922
  { address: entry.address, name: "totalAssets", params: [] },
49973
50923
  { address: entry.address, name: "totalSupply", params: [] },
49974
- { address: entry.address, name: "previewRedeem", params: [ONE_E188] }
50924
+ { address: entry.address, name: "previewRedeem", params: [ONE_E189] }
49975
50925
  ],
49976
50926
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
49977
50927
  parse: ([assets, supply, rate]) => {
@@ -50051,7 +51001,7 @@ var readerEtherFiWeEth = (entry) => {
50051
51001
  }
50052
51002
  }
50053
51003
  return {
50054
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51004
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50055
51005
  totalSupply,
50056
51006
  exchangeRate,
50057
51007
  liquidity
@@ -50084,7 +51034,7 @@ var readerHyperbeatBeHype = (entry) => {
50084
51034
  return {
50085
51035
  totalAssets: totalSupply,
50086
51036
  totalSupply,
50087
- exchangeRate: ONE_E188
51037
+ exchangeRate: ONE_E189
50088
51038
  };
50089
51039
  }
50090
51040
  };
@@ -50092,7 +51042,7 @@ var readerHyperbeatBeHype = (entry) => {
50092
51042
  return {
50093
51043
  calls: [
50094
51044
  { address: entry.address, name: "totalSupply", params: [] },
50095
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E188] }
51045
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E189] }
50096
51046
  ],
50097
51047
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
50098
51048
  parse: ([supply, rate]) => {
@@ -50102,7 +51052,7 @@ var readerHyperbeatBeHype = (entry) => {
50102
51052
  return void 0;
50103
51053
  }
50104
51054
  return {
50105
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51055
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50106
51056
  totalSupply,
50107
51057
  exchangeRate
50108
51058
  };
@@ -50134,7 +51084,7 @@ var readerKelpRsEth = (entry) => {
50134
51084
  return {
50135
51085
  totalAssets: totalSupply,
50136
51086
  totalSupply,
50137
- exchangeRate: ONE_E188
51087
+ exchangeRate: ONE_E189
50138
51088
  };
50139
51089
  }
50140
51090
  };
@@ -50152,7 +51102,7 @@ var readerKelpRsEth = (entry) => {
50152
51102
  return void 0;
50153
51103
  }
50154
51104
  return {
50155
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51105
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50156
51106
  totalSupply,
50157
51107
  exchangeRate
50158
51108
  };
@@ -50184,7 +51134,7 @@ var readerKinetiqKHype = (entry) => {
50184
51134
  return {
50185
51135
  totalAssets: totalSupply,
50186
51136
  totalSupply,
50187
- exchangeRate: ONE_E188
51137
+ exchangeRate: ONE_E189
50188
51138
  };
50189
51139
  }
50190
51140
  };
@@ -50192,7 +51142,7 @@ var readerKinetiqKHype = (entry) => {
50192
51142
  return {
50193
51143
  calls: [
50194
51144
  { address: entry.address, name: "totalSupply", params: [] },
50195
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E188] }
51145
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E189] }
50196
51146
  ],
50197
51147
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
50198
51148
  parse: ([supply, rate]) => {
@@ -50202,7 +51152,7 @@ var readerKinetiqKHype = (entry) => {
50202
51152
  return void 0;
50203
51153
  }
50204
51154
  return {
50205
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51155
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50206
51156
  totalSupply,
50207
51157
  exchangeRate
50208
51158
  };
@@ -50242,7 +51192,7 @@ var readerLairStKaia = (entry) => ({
50242
51192
  if (totalSupply === void 0 || exchangeRate === void 0) {
50243
51193
  return void 0;
50244
51194
  }
50245
- const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E188;
51195
+ const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E189;
50246
51196
  return {
50247
51197
  totalAssets,
50248
51198
  totalSupply,
@@ -50276,7 +51226,7 @@ var readerLidoWstEth = (entry) => ({
50276
51226
  return void 0;
50277
51227
  }
50278
51228
  return {
50279
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51229
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50280
51230
  totalSupply,
50281
51231
  exchangeRate
50282
51232
  };
@@ -50314,7 +51264,7 @@ var readerListaSlisBnb = (entry) => {
50314
51264
  return {
50315
51265
  totalAssets: totalSupply,
50316
51266
  totalSupply,
50317
- exchangeRate: ONE_E188
51267
+ exchangeRate: ONE_E189
50318
51268
  };
50319
51269
  }
50320
51270
  };
@@ -50322,7 +51272,7 @@ var readerListaSlisBnb = (entry) => {
50322
51272
  return {
50323
51273
  calls: [
50324
51274
  { address: entry.address, name: "totalSupply", params: [] },
50325
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E188] },
51275
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E189] },
50326
51276
  { address: manager, name: "getTotalPooledBnb", params: [] }
50327
51277
  ],
50328
51278
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -50333,7 +51283,7 @@ var readerListaSlisBnb = (entry) => {
50333
51283
  return void 0;
50334
51284
  }
50335
51285
  const pooledBnb = toBigInt13(pooled);
50336
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E188;
51286
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E189;
50337
51287
  return { totalAssets, totalSupply, exchangeRate };
50338
51288
  }
50339
51289
  };
@@ -50363,7 +51313,7 @@ var readerMantleMEth = (entry) => {
50363
51313
  return {
50364
51314
  totalAssets: totalSupply,
50365
51315
  totalSupply,
50366
- exchangeRate: ONE_E188
51316
+ exchangeRate: ONE_E189
50367
51317
  };
50368
51318
  }
50369
51319
  };
@@ -50371,7 +51321,7 @@ var readerMantleMEth = (entry) => {
50371
51321
  return {
50372
51322
  calls: [
50373
51323
  { address: entry.address, name: "totalSupply", params: [] },
50374
- { address: staking, name: "mETHToETH", params: [ONE_E188] }
51324
+ { address: staking, name: "mETHToETH", params: [ONE_E189] }
50375
51325
  ],
50376
51326
  abis: [TotalSupplyAbi, MantleStakingAbi],
50377
51327
  parse: ([supply, rate]) => {
@@ -50381,7 +51331,7 @@ var readerMantleMEth = (entry) => {
50381
51331
  return void 0;
50382
51332
  }
50383
51333
  return {
50384
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51334
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50385
51335
  totalSupply,
50386
51336
  exchangeRate
50387
51337
  };
@@ -50402,7 +51352,7 @@ var readerOffChain = (entry) => {
50402
51352
  return {
50403
51353
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
50404
51354
  totalSupply,
50405
- exchangeRate: ONE_E188
51355
+ exchangeRate: ONE_E189
50406
51356
  };
50407
51357
  }
50408
51358
  };
@@ -50436,7 +51386,7 @@ var readerRenzoEzEth = (entry) => {
50436
51386
  return {
50437
51387
  totalAssets: totalSupply,
50438
51388
  totalSupply,
50439
- exchangeRate: ONE_E188
51389
+ exchangeRate: ONE_E189
50440
51390
  };
50441
51391
  }
50442
51392
  };
@@ -50455,7 +51405,7 @@ var readerRenzoEzEth = (entry) => {
50455
51405
  return {
50456
51406
  totalAssets: totalTvl,
50457
51407
  totalSupply,
50458
- exchangeRate: totalTvl * ONE_E188 / totalSupply
51408
+ exchangeRate: totalTvl * ONE_E189 / totalSupply
50459
51409
  };
50460
51410
  }
50461
51411
  };
@@ -50511,7 +51461,7 @@ var readerRocketReth = (entry) => {
50511
51461
  }
50512
51462
  const liquidity = depositPool ? toBigInt13(slice2[2]) : void 0;
50513
51463
  return {
50514
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51464
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50515
51465
  totalSupply,
50516
51466
  exchangeRate,
50517
51467
  liquidity
@@ -50553,7 +51503,7 @@ var readerStaderEthx = (entry) => {
50553
51503
  return {
50554
51504
  totalAssets: totalSupply,
50555
51505
  totalSupply,
50556
- exchangeRate: ONE_E188
51506
+ exchangeRate: ONE_E189
50557
51507
  };
50558
51508
  }
50559
51509
  };
@@ -50571,7 +51521,7 @@ var readerStaderEthx = (entry) => {
50571
51521
  return void 0;
50572
51522
  }
50573
51523
  return {
50574
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51524
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50575
51525
  totalSupply,
50576
51526
  exchangeRate
50577
51527
  };
@@ -50588,7 +51538,7 @@ var readerStaderMaticX = (entry) => {
50588
51538
  {
50589
51539
  address: rateAddress,
50590
51540
  name: "convertMaticXToMatic",
50591
- params: [ONE_E188],
51541
+ params: [ONE_E189],
50592
51542
  chainId: homeChainId
50593
51543
  }
50594
51544
  ],
@@ -50603,7 +51553,7 @@ var readerStaderMaticX = (entry) => {
50603
51553
  }
50604
51554
  const isCrossChain = homeContract !== void 0;
50605
51555
  return {
50606
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E188 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E188,
51556
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E189 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E189,
50607
51557
  totalSupply,
50608
51558
  exchangeRate: amountInMatic
50609
51559
  };
@@ -50635,7 +51585,7 @@ var readerStakeWiseOsEth = (entry) => {
50635
51585
  return {
50636
51586
  totalAssets: totalSupply,
50637
51587
  totalSupply,
50638
- exchangeRate: ONE_E188
51588
+ exchangeRate: ONE_E189
50639
51589
  };
50640
51590
  }
50641
51591
  };
@@ -50643,7 +51593,7 @@ var readerStakeWiseOsEth = (entry) => {
50643
51593
  return {
50644
51594
  calls: [
50645
51595
  { address: entry.address, name: "totalSupply", params: [] },
50646
- { address: controller, name: "convertToAssets", params: [ONE_E188] }
51596
+ { address: controller, name: "convertToAssets", params: [ONE_E189] }
50647
51597
  ],
50648
51598
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
50649
51599
  parse: ([supply, rate]) => {
@@ -50653,7 +51603,7 @@ var readerStakeWiseOsEth = (entry) => {
50653
51603
  return void 0;
50654
51604
  }
50655
51605
  return {
50656
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51606
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50657
51607
  totalSupply,
50658
51608
  exchangeRate
50659
51609
  };
@@ -50685,7 +51635,7 @@ var readerStCelo = (entry) => {
50685
51635
  return {
50686
51636
  totalAssets: totalSupply,
50687
51637
  totalSupply,
50688
- exchangeRate: ONE_E188
51638
+ exchangeRate: ONE_E189
50689
51639
  };
50690
51640
  }
50691
51641
  };
@@ -50693,7 +51643,7 @@ var readerStCelo = (entry) => {
50693
51643
  return {
50694
51644
  calls: [
50695
51645
  { address: entry.address, name: "totalSupply", params: [] },
50696
- { address: manager, name: "toCelo", params: [ONE_E188] }
51646
+ { address: manager, name: "toCelo", params: [ONE_E189] }
50697
51647
  ],
50698
51648
  abis: [TotalSupplyAbi, StCeloManagerAbi],
50699
51649
  parse: ([supply, rate]) => {
@@ -50703,7 +51653,7 @@ var readerStCelo = (entry) => {
50703
51653
  return void 0;
50704
51654
  }
50705
51655
  return {
50706
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51656
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50707
51657
  totalSupply,
50708
51658
  exchangeRate
50709
51659
  };
@@ -50736,7 +51686,7 @@ var readerSwellGetRate = (entry) => ({
50736
51686
  return void 0;
50737
51687
  }
50738
51688
  return {
50739
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51689
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50740
51690
  totalSupply,
50741
51691
  exchangeRate
50742
51692
  };
@@ -50767,7 +51717,7 @@ var readerValantisWstHype = (entry) => {
50767
51717
  return {
50768
51718
  totalAssets: totalSupply,
50769
51719
  totalSupply,
50770
- exchangeRate: ONE_E188
51720
+ exchangeRate: ONE_E189
50771
51721
  };
50772
51722
  }
50773
51723
  };
@@ -50785,7 +51735,7 @@ var readerValantisWstHype = (entry) => {
50785
51735
  return void 0;
50786
51736
  }
50787
51737
  return {
50788
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51738
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50789
51739
  totalSupply,
50790
51740
  exchangeRate
50791
51741
  };
@@ -50819,7 +51769,7 @@ var readerVedaAccountant = (entry) => {
50819
51769
  return {
50820
51770
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
50821
51771
  totalSupply,
50822
- exchangeRate: ONE_E188
51772
+ exchangeRate: ONE_E189
50823
51773
  };
50824
51774
  }
50825
51775
  };
@@ -50838,7 +51788,7 @@ var readerVedaAccountant = (entry) => {
50838
51788
  const exchangeRate = rawRate * scale;
50839
51789
  return {
50840
51790
  totalAssets: rescaleDecimals(
50841
- totalSupply * exchangeRate / ONE_E188,
51791
+ totalSupply * exchangeRate / ONE_E189,
50842
51792
  shareDec,
50843
51793
  underlyingDec
50844
51794
  ),
@@ -50874,9 +51824,9 @@ var readerAnkrRatio = (entry) => ({
50874
51824
  return void 0;
50875
51825
  }
50876
51826
  return {
50877
- totalAssets: totalSupply * ONE_E188 / r,
51827
+ totalAssets: totalSupply * ONE_E189 / r,
50878
51828
  totalSupply,
50879
- exchangeRate: ONE_E188 * ONE_E188 / r
51829
+ exchangeRate: ONE_E189 * ONE_E189 / r
50880
51830
  };
50881
51831
  }
50882
51832
  });
@@ -50920,7 +51870,7 @@ var readerCoreEarnRate = (entry) => {
50920
51870
  return {
50921
51871
  totalAssets: totalSupply * r / CORE_RATE_DENOM,
50922
51872
  totalSupply,
50923
- exchangeRate: r * ONE_E188 / CORE_RATE_DENOM
51873
+ exchangeRate: r * ONE_E189 / CORE_RATE_DENOM
50924
51874
  };
50925
51875
  }
50926
51876
  };
@@ -50942,7 +51892,7 @@ var readerCoreStakedRatio = (entry) => {
50942
51892
  return {
50943
51893
  totalAssets: totalStaked,
50944
51894
  totalSupply,
50945
- exchangeRate: totalStaked * ONE_E188 / totalSupply
51895
+ exchangeRate: totalStaked * ONE_E189 / totalSupply
50946
51896
  };
50947
51897
  }
50948
51898
  };
@@ -50973,7 +51923,7 @@ var readerStellaStDot = (entry) => ({
50973
51923
  {
50974
51924
  address: entry.address,
50975
51925
  name: "getPooledTokenByShares",
50976
- params: [ONE_E188]
51926
+ params: [ONE_E189]
50977
51927
  },
50978
51928
  { address: entry.address, name: "getTotalPooledToken", params: [] }
50979
51929
  ],
@@ -50984,7 +51934,7 @@ var readerStellaStDot = (entry) => ({
50984
51934
  if (totalSupply === void 0 || exchangeRate === void 0) {
50985
51935
  return void 0;
50986
51936
  }
50987
- const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E188;
51937
+ const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E189;
50988
51938
  return {
50989
51939
  totalAssets,
50990
51940
  totalSupply,
@@ -51022,7 +51972,7 @@ var readerKintsuSMon = (entry) => ({
51022
51972
  const totalAssets = toBigInt13(pooled);
51023
51973
  const totalSupply = toBigInt13(shares);
51024
51974
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
51025
- const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E188 / totalSupply : ONE_E188;
51975
+ const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E189 / totalSupply : ONE_E189;
51026
51976
  return { totalAssets, totalSupply, exchangeRate };
51027
51977
  }
51028
51978
  });
@@ -51458,7 +52408,7 @@ var getLstValidators = async (chainId, shareToken) => {
51458
52408
  };
51459
52409
 
51460
52410
  // src/vaults/lst/fetchPublic.ts
51461
- var ONE_E189 = 10n ** 18n;
52411
+ var ONE_E1810 = 10n ** 18n;
51462
52412
  var ERC20_BALANCE_ABI = parseAbi([
51463
52413
  "function balanceOf(address) view returns (uint256)"
51464
52414
  ]);
@@ -51573,8 +52523,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
51573
52523
  const underlyingUnit = 10n ** BigInt(underlyingDec);
51574
52524
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
51575
52525
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
51576
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E189;
51577
- const convertToShares = state.exchangeRate > 0n ? ONE_E189 * shareUnit / state.exchangeRate : 0n;
52526
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
52527
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
51578
52528
  let liquidityRaw;
51579
52529
  if (state.liquidity !== void 0) {
51580
52530
  liquidityRaw = state.liquidity;
@@ -52245,16 +53195,17 @@ var Erc7540Abi = [
52245
53195
  // src/vaults/lst/withdrawals/readers/erc7540.ts
52246
53196
  var readerErc7540 = {
52247
53197
  fetch: async (user, multicallRetry, chainId, entry) => {
53198
+ const requestContract = entry.lst;
52248
53199
  const stage1 = await multicallRetry({
52249
53200
  chain: chainId,
52250
53201
  calls: [
52251
53202
  {
52252
- address: entry.lst,
53203
+ address: requestContract,
52253
53204
  name: "pendingRedeemRequest",
52254
53205
  params: [0n, user]
52255
53206
  },
52256
53207
  {
52257
- address: entry.lst,
53208
+ address: requestContract,
52258
53209
  name: "claimableRedeemRequest",
52259
53210
  params: [0n, user]
52260
53211
  }
@@ -52269,7 +53220,7 @@ var readerErc7540 = {
52269
53220
  chain: chainId,
52270
53221
  calls: [
52271
53222
  {
52272
- address: entry.lst,
53223
+ address: requestContract,
52273
53224
  name: "convertToAssets",
52274
53225
  params: [claimable]
52275
53226
  }
@@ -52283,6 +53234,8 @@ var readerErc7540 = {
52283
53234
  symbol: entry.symbol,
52284
53235
  requestId: "0",
52285
53236
  amountUnderlying: amount.toString(),
53237
+ // The 7540 claim (`redeem`) takes the share amount.
53238
+ shares: claimable.toString(),
52286
53239
  status: "claimable"
52287
53240
  });
52288
53241
  }
@@ -52295,6 +53248,7 @@ var readerErc7540 = {
52295
53248
  // Approximate to the share value at current price; UI can
52296
53249
  // re-convert if it has the share exchangeRate.
52297
53250
  amountUnderlying: pending.toString(),
53251
+ shares: pending.toString(),
52298
53252
  status: "pending"
52299
53253
  });
52300
53254
  }
@@ -52353,6 +53307,172 @@ var readerEthenaCooldown = {
52353
53307
  }
52354
53308
  };
52355
53309
 
53310
+ // src/vaults/lst/withdrawals/abis/susd3.ts
53311
+ var Susd3CooldownStatusAbi = [
53312
+ {
53313
+ name: "getCooldownStatus",
53314
+ type: "function",
53315
+ stateMutability: "view",
53316
+ inputs: [{ type: "address", name: "user" }],
53317
+ outputs: [
53318
+ { type: "uint256", name: "cooldownEnd" },
53319
+ { type: "uint256", name: "windowEnd" },
53320
+ { type: "uint256", name: "shares" }
53321
+ ]
53322
+ },
53323
+ {
53324
+ name: "convertToAssets",
53325
+ type: "function",
53326
+ stateMutability: "view",
53327
+ inputs: [{ type: "uint256", name: "shares" }],
53328
+ outputs: [{ type: "uint256", name: "assets" }]
53329
+ }
53330
+ ];
53331
+
53332
+ // src/vaults/lst/withdrawals/readers/susd3.ts
53333
+ var readerSusd3Cooldown = {
53334
+ fetch: async (user, multicallRetry, chainId, entry) => {
53335
+ const res = await multicallRetry({
53336
+ chain: chainId,
53337
+ calls: [
53338
+ { address: entry.lst, name: "getCooldownStatus", params: [user] }
53339
+ ],
53340
+ abi: [Susd3CooldownStatusAbi]
53341
+ });
53342
+ const cell = res[0];
53343
+ let cooldownEnd;
53344
+ let windowEnd;
53345
+ let shares;
53346
+ if (Array.isArray(cell)) {
53347
+ cooldownEnd = toBigInt14(cell[0]);
53348
+ windowEnd = toBigInt14(cell[1]);
53349
+ shares = toBigInt14(cell[2]);
53350
+ } else if (cell && typeof cell === "object") {
53351
+ cooldownEnd = toBigInt14(cell.cooldownEnd);
53352
+ windowEnd = toBigInt14(cell.windowEnd);
53353
+ shares = toBigInt14(cell.shares);
53354
+ }
53355
+ if (!shares || shares === 0n) return [];
53356
+ let amount = shares;
53357
+ try {
53358
+ const stage2 = await multicallRetry({
53359
+ chain: chainId,
53360
+ calls: [
53361
+ { address: entry.lst, name: "convertToAssets", params: [shares] }
53362
+ ],
53363
+ abi: [Susd3CooldownStatusAbi]
53364
+ });
53365
+ amount = toBigInt14(stage2[0]) ?? shares;
53366
+ } catch {
53367
+ }
53368
+ const readyAt = Number(cooldownEnd ?? 0n);
53369
+ const expiresAt = windowEnd && windowEnd > 0n && windowEnd < 10n ** 12n ? Number(windowEnd) : void 0;
53370
+ const out = [
53371
+ {
53372
+ lst: entry.lst,
53373
+ brand: entry.brand,
53374
+ symbol: entry.symbol,
53375
+ requestId: "0",
53376
+ amountUnderlying: amount.toString(),
53377
+ shares: shares.toString(),
53378
+ status: computeStatus(readyAt, expiresAt),
53379
+ readyAt,
53380
+ ...expiresAt !== void 0 ? { expiresAt } : {}
53381
+ }
53382
+ ];
53383
+ return out;
53384
+ }
53385
+ };
53386
+
53387
+ // src/vaults/lst/withdrawals/abis/strataCooldown.ts
53388
+ var StrataCooldownBalanceAbi = [
53389
+ {
53390
+ name: "balanceOf",
53391
+ type: "function",
53392
+ stateMutability: "view",
53393
+ inputs: [
53394
+ { type: "address", name: "token" },
53395
+ { type: "address", name: "user" }
53396
+ ],
53397
+ outputs: [
53398
+ {
53399
+ type: "tuple",
53400
+ name: "state",
53401
+ components: [
53402
+ { type: "uint256", name: "pending" },
53403
+ { type: "uint256", name: "claimable" },
53404
+ { type: "uint256", name: "nextUnlockAt" },
53405
+ { type: "uint256", name: "nextUnlockAmount" },
53406
+ { type: "uint256", name: "totalRequests" }
53407
+ ]
53408
+ }
53409
+ ]
53410
+ }
53411
+ ];
53412
+
53413
+ // src/vaults/lst/withdrawals/readers/strataCooldown.ts
53414
+ var readerStrataCooldown = {
53415
+ fetch: async (user, multicallRetry, chainId, entry) => {
53416
+ const escrowToken = entry.escrowToken;
53417
+ if (!escrowToken) return [];
53418
+ const contracts = [
53419
+ entry.withdrawalContract,
53420
+ entry.secondaryWithdrawalContract
53421
+ ].filter((c) => !!c);
53422
+ if (contracts.length === 0) return [];
53423
+ const res = await multicallRetry({
53424
+ chain: chainId,
53425
+ calls: contracts.map((address) => ({
53426
+ address,
53427
+ name: "balanceOf",
53428
+ params: [escrowToken, user]
53429
+ })),
53430
+ abi: contracts.map(() => StrataCooldownBalanceAbi)
53431
+ });
53432
+ const out = [];
53433
+ for (let i = 0; i < contracts.length; i++) {
53434
+ const cell = res[i];
53435
+ let pending;
53436
+ let claimable;
53437
+ let nextUnlockAt;
53438
+ if (Array.isArray(cell)) {
53439
+ pending = toBigInt14(cell[0]);
53440
+ claimable = toBigInt14(cell[1]);
53441
+ nextUnlockAt = toNumber(cell[2]);
53442
+ } else if (cell && typeof cell === "object") {
53443
+ pending = toBigInt14(cell.pending);
53444
+ claimable = toBigInt14(cell.claimable);
53445
+ nextUnlockAt = toNumber(cell.nextUnlockAt);
53446
+ }
53447
+ const escrow = { withdrawQueue: contracts[i], claimToken: escrowToken };
53448
+ if (claimable && claimable > 0n) {
53449
+ out.push({
53450
+ lst: entry.lst,
53451
+ brand: entry.brand,
53452
+ symbol: entry.symbol,
53453
+ requestId: `${i * 2}`,
53454
+ amountUnderlying: claimable.toString(),
53455
+ status: "claimable",
53456
+ ...escrow
53457
+ });
53458
+ }
53459
+ if (pending && pending > 0n) {
53460
+ out.push({
53461
+ lst: entry.lst,
53462
+ brand: entry.brand,
53463
+ symbol: entry.symbol,
53464
+ requestId: `${i * 2 + 1}`,
53465
+ amountUnderlying: pending.toString(),
53466
+ status: "pending",
53467
+ ...nextUnlockAt ? { readyAt: nextUnlockAt } : {},
53468
+ ...escrow
53469
+ });
53470
+ }
53471
+ }
53472
+ return out;
53473
+ }
53474
+ };
53475
+
52356
53476
  // src/vaults/lst/withdrawals/abis/etherfi.ts
52357
53477
  var EtherFiWithdrawRequestAbi = [
52358
53478
  {
@@ -52567,7 +53687,9 @@ var readerKelp = {
52567
53687
  }
52568
53688
  const stage2 = await multicallRetry({
52569
53689
  chain: chainId,
52570
- calls: detailCalls.map(({ _asset: _3, ...rest }) => rest),
53690
+ calls: detailCalls.map(
53691
+ ({ _asset: _3, ...rest }) => rest
53692
+ ),
52571
53693
  abi: detailCalls.map(() => KelpWithdrawalManagerAbi)
52572
53694
  });
52573
53695
  const out = [];
@@ -53121,9 +54243,7 @@ var readerMantle = {
53121
54243
  const results = await multicallRetry({
53122
54244
  chain: chainId,
53123
54245
  calls,
53124
- abi: calls.map(
53125
- () => MantleUnstakeRequestsManagerAbi
53126
- )
54246
+ abi: calls.map(() => MantleUnstakeRequestsManagerAbi)
53127
54247
  });
53128
54248
  const out = [];
53129
54249
  const lcUser = user.toLowerCase();
@@ -54000,6 +55120,10 @@ var buildWithdrawalReader = (entry) => {
54000
55120
  return readerErc7540;
54001
55121
  case "ethenaCooldown":
54002
55122
  return readerEthenaCooldown;
55123
+ case "susd3Cooldown":
55124
+ return readerSusd3Cooldown;
55125
+ case "strataCooldown":
55126
+ return readerStrataCooldown;
54003
55127
  case "swellNft":
54004
55128
  return readerSwell;
54005
55129
  case "stakeWiseSubgraph":
@@ -54063,6 +55187,14 @@ var LST_WITHDRAWAL_REGISTRY = {
54063
55187
  symbol: "LBTC",
54064
55188
  reader: "unverified"
54065
55189
  },
55190
+ {
55191
+ // Lombard LBTCv (Veda BoringVault) — queue mechanics not yet
55192
+ // implemented; placeholder so the orchestrator surfaces the asset.
55193
+ lst: "0x5401b8620e5fb570064ca9114fd1e135fd77d57c",
55194
+ brand: "Lombard",
55195
+ symbol: "LBTCv",
55196
+ reader: "unverified"
55197
+ },
54066
55198
  {
54067
55199
  lst: "0x657e8c867d8b37dcc18fa4caead9c45eb088c642",
54068
55200
  brand: "ether.fi",
@@ -54129,6 +55261,134 @@ var LST_WITHDRAWAL_REGISTRY = {
54129
55261
  symbol: "savETH",
54130
55262
  reader: "ethenaCooldown"
54131
55263
  },
55264
+ {
55265
+ // Tori strUSD — StakedUSDeV2 clone over trUSD; same cooldowns(address)
55266
+ // escrow surface (7d, owner-mutable), claim via `unstake`.
55267
+ lst: "0x280839980a7ed0d7717f64125fe241012e5f5815",
55268
+ brand: "Tori",
55269
+ symbol: "strUSD",
55270
+ reader: "ethenaCooldown"
55271
+ },
55272
+ {
55273
+ // Neutrl sNUSD — StakedUSDeV2 clone over NUSD; cooldowns(address)
55274
+ // escrow (10d), claim via `unstake`.
55275
+ lst: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313",
55276
+ brand: "Neutrl",
55277
+ symbol: "sNUSD",
55278
+ reader: "ethenaCooldown"
55279
+ },
55280
+ {
55281
+ // 3Jane sUSD3 — startCooldown(shares) → 30d → plain 4626 redeem
55282
+ // inside the withdrawal window; getCooldownStatus(address) getter.
55283
+ lst: "0xf689555121e529ff0463e191f9bd9d1e496164a7",
55284
+ brand: "3Jane",
55285
+ symbol: "sUSD3",
55286
+ reader: "susd3Cooldown"
55287
+ },
55288
+ {
55289
+ // Apyx apyUSD — NOT enumerable today. The 4626 redeem escrows the
55290
+ // apxUSD and mints a **soulbound ERC-721** on the receipt contract
55291
+ // `apyUSD.receipt()` = 0x9bf51f33…, which is the only handle on the
55292
+ // pending exit and exposes no per-owner enumeration. The vault also
55293
+ // has an `unlockToken()` (0x93775e2d…) carrying 7540-shaped getters,
55294
+ // but they are the wrong surface: verified 2026-08-04 that
55295
+ // `pendingRedeemRequest(0, user)` / `claimableRedeemRequest(0, user)`
55296
+ // both return 0 for addresses genuinely holding open receipt NFTs.
55297
+ // The claim needs the `tokenId` (read from the redeem's `Transfer`
55298
+ // log), so the real fix is a caller-supplied-ids reader in the
55299
+ // Mantle/Puffer/TruFin mould — see INDEXING_STRATEGIES.md.
55300
+ lst: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
55301
+ brand: "Apyx",
55302
+ symbol: "apyUSD",
55303
+ reader: "unverified"
55304
+ },
55305
+ // Strata tranche markets — ONE entry per market (not per tranche):
55306
+ // both tranches escrow into the same two per-market ICooldown
55307
+ // contracts keyed by (escrowToken, user) with no tranche
55308
+ // attribution, so per-tranche rows would double-report. `lst` is the
55309
+ // SENIOR tranche address — the catalog resolves it to the savings
55310
+ // provider, and the calldata-sdk `strata` claim built against it
55311
+ // finalizes the whole market's unlocked requests (senior AND
55312
+ // junior). The escrow is KEYED by the collateral token but its
55313
+ // recorded amounts are per-leg — see the reader for the trap.
55314
+ {
55315
+ lst: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
55316
+ // srUSDe
55317
+ brand: "Strata",
55318
+ symbol: "srUSDe/jrUSDe",
55319
+ reader: "strataCooldown",
55320
+ withdrawalContract: "0x735eddf50ca2371aa48466469c742e684c610f74",
55321
+ // UnstakeCooldown
55322
+ secondaryWithdrawalContract: "0xd6dad17d025cddded27305aebab8b277996a6faf",
55323
+ // ERC20Cooldown
55324
+ escrowToken: "0x9d39a5de30e57443bff2a8307a4256c8797a3497"
55325
+ // sUSDe
55326
+ },
55327
+ {
55328
+ lst: "0x65a44528e8868166401ea08b549e19552af589db",
55329
+ // srNUSD
55330
+ brand: "Strata",
55331
+ symbol: "srNUSD/jrNUSD",
55332
+ reader: "strataCooldown",
55333
+ withdrawalContract: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
55334
+ // NeutrlUnstakeCooldown
55335
+ secondaryWithdrawalContract: "0x1abc3c3c15a862276d057b2acbcfeab358907990",
55336
+ // NeutrlERC20Cooldown
55337
+ escrowToken: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313"
55338
+ // sNUSD
55339
+ },
55340
+ {
55341
+ lst: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
55342
+ // srmHYPER
55343
+ brand: "Strata",
55344
+ symbol: "srmHYPER/jrmHYPER",
55345
+ reader: "strataCooldown",
55346
+ withdrawalContract: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
55347
+ // MHyperUnstakeCooldown
55348
+ secondaryWithdrawalContract: "0x71ec07bba60e854c4b2466068be1c8d5b5788fda",
55349
+ // MHyperERC20Cooldown
55350
+ escrowToken: "0x9b5528528656dbc094765e2abb79f293c21191b9"
55351
+ // mHYPER
55352
+ },
55353
+ {
55354
+ lst: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
55355
+ // srmM1-USD
55356
+ brand: "Strata",
55357
+ symbol: "srmM1-USD/jrmM1-USD",
55358
+ reader: "strataCooldown",
55359
+ withdrawalContract: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
55360
+ // MM1USDUnstakeCooldown
55361
+ secondaryWithdrawalContract: "0x4c2680ae06a0bb0b091e5ccca13cb03f4f72296e",
55362
+ // MM1USDERC20Cooldown
55363
+ escrowToken: "0xcc5c22c7a6bcc25e66726aef011dde74289ed203"
55364
+ // mM1-USD
55365
+ },
55366
+ {
55367
+ lst: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
55368
+ // srUSDat
55369
+ brand: "Strata",
55370
+ symbol: "srUSDat/jrUSDat",
55371
+ reader: "strataCooldown",
55372
+ withdrawalContract: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
55373
+ // SaturnUnstakeCooldown
55374
+ secondaryWithdrawalContract: "0x25138d10837ab0278eb860454e1045f2b92929ab",
55375
+ // SaturnERC20Cooldown
55376
+ escrowToken: "0xd166337499e176bbc38a1fbd113ab144e5bd2df7"
55377
+ // sUSDat
55378
+ },
55379
+ {
55380
+ lst: "0x35bff778d3fc53a561486bf28e761428499232eb",
55381
+ // srPRIME
55382
+ brand: "Strata",
55383
+ symbol: "srPRIME/jrPRIME",
55384
+ reader: "strataCooldown",
55385
+ withdrawalContract: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
55386
+ // FigureUnstakeCooldown
55387
+ secondaryWithdrawalContract: "0xbe71d21addba5c9aac5b4e006db1715ef1e324be",
55388
+ // FigureERC20Cooldown
55389
+ escrowToken: "0x19ebb35279a16207ec4ba82799cc64715065f7f6"
55390
+ // PRIME
55391
+ },
54132
55392
  {
54133
55393
  lst: "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee",
54134
55394
  brand: "EtherFi",
@@ -54228,6 +55488,14 @@ var LST_WITHDRAWAL_REGISTRY = {
54228
55488
  symbol: "rETH",
54229
55489
  reader: "noQueue"
54230
55490
  },
55491
+ {
55492
+ // Frax sfrxETH — vanilla ERC-4626 instant redeem to frxETH (the
55493
+ // frxETH → ETH leg is DEX-only, not a protocol queue).
55494
+ lst: "0xac3e018457b222d93114458476f3e3416abbe38f",
55495
+ brand: "Frax",
55496
+ symbol: "sfrxETH",
55497
+ reader: "noQueue"
55498
+ },
54231
55499
  {
54232
55500
  lst: "0xbe9895146f7af43049ca1c1ae358b0541ea49704",
54233
55501
  brand: "Coinbase",
@@ -54350,6 +55618,36 @@ var LST_WITHDRAWAL_REGISTRY = {
54350
55618
  reader: "ethenaCooldown"
54351
55619
  }
54352
55620
  ],
55621
+ // Monad LSTs — all four are `queued` in the main registry but their
55622
+ // per-protocol request enumeration is not implemented yet; listed as
55623
+ // `unverified` placeholders so the orchestrator surfaces the asset
55624
+ // (returning []) instead of silently omitting it.
55625
+ "143": [
55626
+ {
55627
+ lst: "0x1b68626dca36c7fe922fd2d55e4f631d962de19c",
55628
+ brand: "Shmonad",
55629
+ symbol: "shMON",
55630
+ reader: "unverified"
55631
+ },
55632
+ {
55633
+ lst: "0x0c65a0bc65a5d819235b71f554d210d3f80e0852",
55634
+ brand: "aPriori",
55635
+ symbol: "aprMON",
55636
+ reader: "unverified"
55637
+ },
55638
+ {
55639
+ lst: "0xa3227c5969757783154c60bf0bc1944180ed81b9",
55640
+ brand: "Kintsu",
55641
+ symbol: "sMON",
55642
+ reader: "unverified"
55643
+ },
55644
+ {
55645
+ lst: "0x8498312a6b3cbd158bf0c93abdcf29e6e4f55081",
55646
+ brand: "Magma",
55647
+ symbol: "gMON",
55648
+ reader: "unverified"
55649
+ }
55650
+ ],
54353
55651
  "146": [
54354
55652
  {
54355
55653
  lst: "0xe5da20f15420ad15de0fa650600afc998bbe3955",
@@ -54631,7 +55929,7 @@ var NavOracleReadAbi = [
54631
55929
  ];
54632
55930
 
54633
55931
  // src/vaults/savings/readers/shared.ts
54634
- var ONE_E1810 = 10n ** 18n;
55932
+ var ONE_E1811 = 10n ** 18n;
54635
55933
  var toBigInt15 = (v) => {
54636
55934
  if (v === void 0 || v === null) return void 0;
54637
55935
  if (typeof v === "bigint") return v;
@@ -54672,7 +55970,7 @@ var readerErc46262 = (entry) => {
54672
55970
  return {
54673
55971
  totalAssets,
54674
55972
  totalSupply,
54675
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit
55973
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit
54676
55974
  };
54677
55975
  }
54678
55976
  };
@@ -54780,7 +56078,7 @@ var readerErc4626Idle = (entry) => {
54780
56078
  return {
54781
56079
  totalAssets,
54782
56080
  totalSupply,
54783
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit,
56081
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
54784
56082
  ...capacity !== void 0 ? {
54785
56083
  instantRedeemCapacity: capacity,
54786
56084
  instantRedeemEnabled: true,
@@ -54829,7 +56127,7 @@ var readerErc4626WithdrawLimit = (entry) => {
54829
56127
  return {
54830
56128
  totalAssets,
54831
56129
  totalSupply,
54832
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit,
56130
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
54833
56131
  ...capacity !== void 0 ? {
54834
56132
  instantRedeemCapacity: capacity,
54835
56133
  instantRedeemEnabled: true,
@@ -54861,7 +56159,7 @@ var readerNavOracle = (entry) => {
54861
56159
  const exchangeRate = toBigInt15(raw);
54862
56160
  if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
54863
56161
  return {
54864
- totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1810 * shareUnit),
56162
+ totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1811 * shareUnit),
54865
56163
  totalSupply,
54866
56164
  exchangeRate
54867
56165
  };
@@ -54875,7 +56173,7 @@ var readerNativeWnlp = (entry) => {
54875
56173
  return {
54876
56174
  calls: [
54877
56175
  { address, name: "totalSupply", params: [] },
54878
- { address, name: "getNlpByWnlp", params: [ONE_E1810] },
56176
+ { address, name: "getNlpByWnlp", params: [ONE_E1811] },
54879
56177
  { address, name: "instantRedeemFeeBips", params: [] },
54880
56178
  { address, name: "instantRedeemEnabled", params: [] },
54881
56179
  // Falls back to the vault itself when no CreditVault is pinned —
@@ -54909,7 +56207,7 @@ var readerNativeWnlp = (entry) => {
54909
56207
  const windowSeconds = toBigInt15(window);
54910
56208
  const bips = toBigInt15(feeBips);
54911
56209
  return {
54912
- totalAssets: totalSupply * exchangeRate / ONE_E1810,
56210
+ totalAssets: totalSupply * exchangeRate / ONE_E1811,
54913
56211
  totalSupply,
54914
56212
  exchangeRate,
54915
56213
  // `instantRedeemFeeBips` on-chain is already basis points, so it
@@ -54947,7 +56245,7 @@ var buildReader2 = (entry) => {
54947
56245
  var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
54948
56246
 
54949
56247
  // src/vaults/savings/fetchPublic.ts
54950
- var ONE_E1811 = 10n ** 18n;
56248
+ var ONE_E1812 = 10n ** 18n;
54951
56249
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
54952
56250
  const entries = getSavingsRegistry(chainId);
54953
56251
  if (entries.length === 0) return {};
@@ -54996,8 +56294,8 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
54996
56294
  1,
54997
56295
  Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
54998
56296
  ) : 1;
54999
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1811;
55000
- const convertToShares = state.exchangeRate > 0n ? ONE_E1811 * shareUnit / state.exchangeRate : 0n;
56297
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1812;
56298
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1812 * shareUnit / state.exchangeRate : 0n;
55001
56299
  const displayName = composeVaultDisplayName(
55002
56300
  entry.brand,
55003
56301
  entry.brand,
@@ -56714,23 +58012,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
56714
58012
  const indexMax = price(prices, m.indexToken)?.max;
56715
58013
  if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
56716
58014
  const base = i * SLOTS;
56717
- const big7 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
58015
+ const big9 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
56718
58016
  const cap = computeDepositCapacityUsd(
56719
- [info?.longTokenAmount, longMax, big7(0), big7(2)],
56720
- [info?.shortTokenAmount, shortMax, big7(1), big7(3)]
58017
+ [info?.longTokenAmount, longMax, big9(0), big9(2)],
58018
+ [info?.shortTokenAmount, shortMax, big9(1), big9(3)]
56721
58019
  );
56722
58020
  if (cap != null) value.depositCapacityUsd = cap;
56723
58021
  if (indexMax != null) {
56724
58022
  const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
56725
- const reservedUsdLong = (big7(4) + big7(5)) / divisor * indexMax;
56726
- const reservedUsdShort = (big7(6) + big7(7)) / divisor;
58023
+ const reservedUsdLong = (big9(4) + big9(5)) / divisor * indexMax;
58024
+ const reservedUsdShort = (big9(6) + big9(7)) / divisor;
56727
58025
  const liq = computeLiquidityUsd(
56728
58026
  info?.longTokenUsd,
56729
58027
  info?.shortTokenUsd,
56730
58028
  reservedUsdLong,
56731
58029
  reservedUsdShort,
56732
- big7(8),
56733
- big7(9)
58030
+ big9(8),
58031
+ big9(9)
56734
58032
  );
56735
58033
  if (liq != null)
56736
58034
  value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
@@ -56929,21 +58227,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
56929
58227
  } catch {
56930
58228
  return void 0;
56931
58229
  }
56932
- const big7 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
56933
- const base = big7(0);
56934
- const mult = big7(1);
58230
+ const big9 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
58231
+ const base = big9(0);
58232
+ const mult = big9(1);
56935
58233
  if (base === 0n && mult === 0n) return void 0;
56936
58234
  const PRECISION = 10n ** 30n;
56937
58235
  const adjusted = (opGas) => base + opGas * mult / PRECISION;
56938
58236
  const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
56939
- const glvExtra = big7(6) * GLV_NOMINAL_MARKET_COUNT;
58237
+ const glvExtra = big9(6) * GLV_NOMINAL_MARKET_COUNT;
56940
58238
  return {
56941
58239
  chainId,
56942
58240
  gasPriceWei: gasPriceWei.toString(),
56943
- deposit: fee(big7(2)),
56944
- withdrawal: fee(big7(3)),
56945
- glvDeposit: fee(big7(4) + glvExtra),
56946
- glvWithdrawal: fee(big7(5) + glvExtra)
58241
+ deposit: fee(big9(2)),
58242
+ withdrawal: fee(big9(3)),
58243
+ glvDeposit: fee(big9(4) + glvExtra),
58244
+ glvWithdrawal: fee(big9(5) + glvExtra)
56947
58245
  };
56948
58246
  };
56949
58247
 
@@ -57330,7 +58628,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
57330
58628
  };
57331
58629
 
57332
58630
  // src/vaults/yield/annualize.ts
57333
- var YEAR_SECONDS8 = 365 * 24 * 60 * 60;
58631
+ var YEAR_SECONDS10 = 365 * 24 * 60 * 60;
57334
58632
  var SCALE = 10n ** 18n;
57335
58633
  var appendSnapshot = (points, snap, options) => {
57336
58634
  const maxPoints = options?.maxPoints ?? 90;
@@ -57359,7 +58657,7 @@ var computeVaultApr = (points, options) => {
57359
58657
  if (pThen === 0n) return void 0;
57360
58658
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
57361
58659
  const ratio = Number(ratioScaled) / 1e18;
57362
- const apr = (ratio - 1) * (YEAR_SECONDS8 / windowSeconds);
58660
+ const apr = (ratio - 1) * (YEAR_SECONDS10 / windowSeconds);
57363
58661
  return {
57364
58662
  apr,
57365
58663
  sharePriceNow: now.p,
@@ -58162,6 +59460,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
58162
59460
  return parseTokenBalanceResult(rawResult, prepared.query);
58163
59461
  }
58164
59462
 
58165
- 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 };
59463
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, EXACTLY_LENDER_KEY, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, 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, 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 };
58166
59464
  //# sourceMappingURL=index.js.map
58167
59465
  //# sourceMappingURL=index.js.map