@1delta/margin-fetcher 0.0.409 → 0.0.410

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, InvalidAddressError, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-SRWUFRRR.js';
1
+ import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, stringToHex, erc20Abi, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-YILYOOYB.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isInverse, isTermMax, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isInverse, isTermMax, isUsdd, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
- import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
6
+ import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, usddLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, usddConfigFor, usddChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
8
  import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
9
- import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
9
+ import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, InverseEscrowAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, TermPriceConsumerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
10
10
  export { MorphoLensAbi } from '@1delta/abis';
11
11
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
12
12
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
@@ -7519,6 +7519,9 @@ var getLendersForChain = (c) => {
7519
7519
  for (const l of inverseLendersByChain(c)) {
7520
7520
  lenders.push(l);
7521
7521
  }
7522
+ for (const l of usddLendersByChain(c)) {
7523
+ lenders.push(l);
7524
+ }
7522
7525
  if (tellerConfigByChain(c)?.tellerV2 && tellerPoolsByChain(c).length > 0) {
7523
7526
  lenders.push(Lender.TELLER);
7524
7527
  }
@@ -7540,7 +7543,7 @@ var filterLendersByProtocol = (allLenders, protocolList) => {
7540
7543
  (b) => protocolList.includes(b)
7541
7544
  );
7542
7545
  return allLenders.filter(
7543
- (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER")
7546
+ (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER") || protocolList.includes(Lender.USDD) && lender?.startsWith("USDD")
7544
7547
  );
7545
7548
  };
7546
7549
  var getAavesForChain = () => {
@@ -11205,8 +11208,8 @@ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs =
11205
11208
  const brokers = await resolveListaBrokers(chainId, marketKeys, getClient);
11206
11209
  const ids = Object.keys(brokers);
11207
11210
  const out = {};
11208
- const cacheKey5 = `${chainId}:${account.toLowerCase()}`;
11209
- BROKER_USER_CACHE[cacheKey5] = out;
11211
+ const cacheKey6 = `${chainId}:${account.toLowerCase()}`;
11212
+ BROKER_USER_CACHE[cacheKey6] = out;
11210
11213
  if (ids.length === 0) return out;
11211
11214
  try {
11212
11215
  const client = getClient(chainId);
@@ -13035,7 +13038,7 @@ function normalizeToBytes(input) {
13035
13038
  return out;
13036
13039
  }
13037
13040
  function readAddress(bytes, offset, len) {
13038
- const hex = toHex(bytes.subarray(offset, offset + len));
13041
+ const hex = toHex2(bytes.subarray(offset, offset + len));
13039
13042
  return "0x" + hex;
13040
13043
  }
13041
13044
  function readUintBE(bytes, offset, len) {
@@ -13046,7 +13049,7 @@ function readUintBE(bytes, offset, len) {
13046
13049
  }
13047
13050
  return v;
13048
13051
  }
13049
- function toHex(arr) {
13052
+ function toHex2(arr) {
13050
13053
  let s = "";
13051
13054
  for (let i = 0; i < arr.length; i++) {
13052
13055
  const h = arr[i].toString(16).padStart(2, "0");
@@ -22915,7 +22918,7 @@ async function fetchTellerMarkets(chainId) {
22915
22918
  } catch {
22916
22919
  return { chainId, pools: [] };
22917
22920
  }
22918
- const big7 = (i) => {
22921
+ const big9 = (i) => {
22919
22922
  const r = results[i];
22920
22923
  if (typeof r === "bigint") return r;
22921
22924
  if (typeof r === "number") return BigInt(r);
@@ -22929,20 +22932,20 @@ async function fetchTellerMarkets(chainId) {
22929
22932
  return null;
22930
22933
  };
22931
22934
  const num9 = (i) => {
22932
- const b = big7(i);
22935
+ const b = big9(i);
22933
22936
  return b === null ? null : Number(b);
22934
22937
  };
22935
22938
  const pool0 = pools.map((config, i) => {
22936
22939
  const base = i * READS_PER_POOL;
22937
22940
  return {
22938
22941
  config,
22939
- available: big7(base),
22940
- committed: big7(base + 1),
22942
+ available: big9(base),
22943
+ committed: big9(base + 1),
22941
22944
  minRateBps: num9(base + 2),
22942
- collateralPerPrincipal: big7(base + 3),
22945
+ collateralPerPrincipal: big9(base + 3),
22943
22946
  maxLoanDuration: num9(base + 4),
22944
- marketId: big7(base + 5),
22945
- totalAssets: big7(base + 6)
22947
+ marketId: big9(base + 5),
22948
+ totalAssets: big9(base + 6)
22946
22949
  };
22947
22950
  });
22948
22951
  const attByMarket = /* @__PURE__ */ new Map();
@@ -24175,6 +24178,264 @@ function convertInverseMarketsToResponse(raw, chainId, prices = {}, _additionalY
24175
24178
  }
24176
24179
  return out;
24177
24180
  }
24181
+ var READS_PER_ILK = 4;
24182
+ var USDD_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi, erc20Abi];
24183
+ var usddIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
24184
+ async function fetchUsddMarkets(lender, chainId) {
24185
+ const config = usddConfigFor(lender, chainId);
24186
+ const chainData = usddChainData(lender, chainId);
24187
+ const markets = chainData?.markets ?? [];
24188
+ if (!config || markets.length === 0) {
24189
+ return { lender, config, chainData, markets: [] };
24190
+ }
24191
+ const calls = markets.flatMap((m) => {
24192
+ const ilk32 = usddIlkBytes32(m.ilk);
24193
+ return [
24194
+ { address: config.vat, name: "ilks", params: [ilk32] },
24195
+ { address: config.jug, name: "ilks", params: [ilk32] },
24196
+ { address: config.spot, name: "ilks", params: [ilk32] },
24197
+ { address: m.collToken, name: "balanceOf", params: [m.gemJoin] }
24198
+ ];
24199
+ });
24200
+ let results = [];
24201
+ try {
24202
+ results = await multicallRetryUniversal({
24203
+ chain: chainId,
24204
+ calls,
24205
+ abi: markets.flatMap(() => USDD_ABI_PER_READ),
24206
+ allowFailure: true
24207
+ });
24208
+ } catch {
24209
+ return { lender, config, chainData, markets: [] };
24210
+ }
24211
+ const big9 = (v) => {
24212
+ if (typeof v === "bigint") return v;
24213
+ if (typeof v === "number") return BigInt(v);
24214
+ return null;
24215
+ };
24216
+ const field12 = (res, name, idx) => big9(res?.[name] ?? res?.[idx]);
24217
+ const out = markets.map((market, i) => {
24218
+ const base = i * READS_PER_ILK;
24219
+ const vatIlk = results[base];
24220
+ const jugIlk = results[base + 1];
24221
+ const spotIlk = results[base + 2];
24222
+ return {
24223
+ market,
24224
+ Art: field12(vatIlk, "Art", 0),
24225
+ rate: field12(vatIlk, "rate", 1),
24226
+ spot: field12(vatIlk, "spot", 2),
24227
+ line: field12(vatIlk, "line", 3),
24228
+ dust: field12(vatIlk, "dust", 4),
24229
+ duty: field12(jugIlk, "duty", 0),
24230
+ mat: field12(spotIlk, "mat", 1),
24231
+ joinBalance: big9(results[base + 3])
24232
+ };
24233
+ });
24234
+ return { lender, config, chainData, markets: out };
24235
+ }
24236
+
24237
+ // src/lending/public-data/usdd/convertPublic.ts
24238
+ function usddLenderKey(lender, chainId, ilk) {
24239
+ return `${lender}_${chainId}_${ilk}`;
24240
+ }
24241
+ function usddKeyParts(key) {
24242
+ if (!key.startsWith("USDD_")) return void 0;
24243
+ const suffix = key.slice("USDD_".length);
24244
+ const m = suffix.match(/^(\d+)_([A-Z0-9][A-Z0-9-]*)$/);
24245
+ if (!m) return void 0;
24246
+ return { lender: "USDD", chainId: m[1], ilk: m[2] };
24247
+ }
24248
+ var WAD8 = 1e18;
24249
+ var RAY3 = 1e27;
24250
+ var RAD = 1e45;
24251
+ var YEAR_SECONDS2 = 31536e3;
24252
+ function toHuman4(raw, decimals) {
24253
+ return Number(raw) / 10 ** decimals;
24254
+ }
24255
+ function currencyFor9(address, decimals, symbol, tokens) {
24256
+ const lower3 = address.toLowerCase();
24257
+ return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
24258
+ }
24259
+ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
24260
+ intrinsicYields: {},
24261
+ lenderRewards: {},
24262
+ loaded: true
24263
+ }, tokens = {}) {
24264
+ const out = {};
24265
+ const cfg = raw?.config;
24266
+ const chainData = raw?.chainData;
24267
+ if (!cfg || !chainData) return out;
24268
+ const debtAddr = cfg.usdd.toLowerCase();
24269
+ const debtDecimals = cfg.debtDecimals ?? 18;
24270
+ const debtToken = tokens[debtAddr];
24271
+ const debtSymbol = debtToken?.symbol ?? "USDD";
24272
+ const debtPriceKey = toOracleKey(debtToken?.assetGroup) || toGenericPriceKey(debtAddr, chainId);
24273
+ const debtPrice = prices[debtPriceKey] || 1;
24274
+ for (const m of raw.markets ?? []) {
24275
+ const market = m.market;
24276
+ const lenderKey = usddLenderKey(raw.lender, chainId, market.ilk);
24277
+ const collAddr = market.collToken.toLowerCase();
24278
+ const collDecimals = market.collDecimals;
24279
+ const collToken = tokens[collAddr];
24280
+ const collSymbol = collToken?.symbol ?? market.collSymbol ?? market.ilk.split("-")[0];
24281
+ const marketName = market.name ?? `${debtSymbol} / ${collSymbol}`;
24282
+ const collPriceKey = toOracleKey(collToken?.assetGroup) || toGenericPriceKey(collAddr, chainId);
24283
+ const spotDerivedPrice = m.spot !== null && m.mat !== null ? Number(m.spot) / RAY3 * (Number(m.mat) / RAY3) : 0;
24284
+ const collPrice = spotDerivedPrice || (prices[collPriceKey] ?? 0);
24285
+ const totalDebt = m.Art !== null && m.rate !== null ? Number(m.Art * m.rate / BigInt(1e27)) / 10 ** debtDecimals : 0;
24286
+ const totalColl = m.joinBalance !== null ? toHuman4(m.joinBalance, collDecimals) : 0;
24287
+ const mat = m.mat !== null ? Number(m.mat) / RAY3 : Number(market.mat) / RAY3 || 1.5;
24288
+ const ltv = mat > 0 ? 1 / mat : 0;
24289
+ const chop = market.chop ? Number(market.chop) / WAD8 : 0;
24290
+ const liqPenalty = chop > 1 ? chop - 1 : 0;
24291
+ const duty = m.duty !== null ? m.duty : BigInt(market.duty ?? 0);
24292
+ const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY3 * YEAR_SECONDS2 * 100 : 0;
24293
+ const line = m.line !== null ? Number(m.line) / RAD : 0;
24294
+ let borrowLiquidity = Math.max(0, line - totalDebt);
24295
+ const halted = line === 0;
24296
+ const entry = { data: {} };
24297
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
24298
+ entry.data[collUid] = {
24299
+ marketUid: collUid,
24300
+ name: "Collateral " + collSymbol,
24301
+ poolId: market.gemJoin.toLowerCase(),
24302
+ underlying: collAddr,
24303
+ asset: currencyFor9(collAddr, collDecimals, collSymbol, tokens),
24304
+ totalDeposits: totalColl,
24305
+ totalDebtStable: 0,
24306
+ totalDebt: 0,
24307
+ totalLiquidity: totalColl,
24308
+ borrowLiquidity: 0,
24309
+ totalLiquidityUSD: totalColl * collPrice,
24310
+ borrowLiquidityUSD: 0,
24311
+ totalDepositsUSD: totalColl * collPrice,
24312
+ totalDebtStableUSD: 0,
24313
+ totalDebtUSD: 0,
24314
+ utilization: 0,
24315
+ depositRate: 0,
24316
+ variableBorrowRate: 0,
24317
+ stableBorrowRate: 0,
24318
+ intrinsicYield: 0,
24319
+ rewards: void 0,
24320
+ decimals: collDecimals,
24321
+ config: {
24322
+ 0: {
24323
+ category: 0,
24324
+ borrowCollateralFactor: ltv,
24325
+ collateralFactor: ltv,
24326
+ borrowFactor: 1,
24327
+ liquidationPenalty: liqPenalty,
24328
+ closeFactor: 1,
24329
+ collateralDisabled: false,
24330
+ debtDisabled: true
24331
+ }
24332
+ },
24333
+ closeFactor: 1,
24334
+ collateralActive: true,
24335
+ borrowingEnabled: false,
24336
+ depositsEnabled: !halted,
24337
+ hasStable: false,
24338
+ isActive: !halted,
24339
+ isFrozen: halted
24340
+ };
24341
+ const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
24342
+ entry.data[loanUid] = {
24343
+ marketUid: loanUid,
24344
+ name: debtSymbol,
24345
+ poolId: cfg.vat.toLowerCase(),
24346
+ underlying: debtAddr,
24347
+ asset: currencyFor9(debtAddr, debtDecimals, debtSymbol, tokens),
24348
+ totalDeposits: 0,
24349
+ totalDebtStable: 0,
24350
+ totalDebt,
24351
+ totalLiquidity: borrowLiquidity,
24352
+ borrowLiquidity,
24353
+ totalLiquidityUSD: borrowLiquidity * debtPrice,
24354
+ borrowLiquidityUSD: borrowLiquidity * debtPrice,
24355
+ totalDepositsUSD: 0,
24356
+ totalDebtStableUSD: 0,
24357
+ totalDebtUSD: totalDebt * debtPrice,
24358
+ utilization: 0,
24359
+ // The earn side is sUSDD (savings provider), not a lending deposit.
24360
+ depositRate: 0,
24361
+ variableBorrowRate: borrowApr,
24362
+ stableBorrowRate: 0,
24363
+ // Governance-set per-ilk stability fee — no utilization curve.
24364
+ rateModel: "protocolSet",
24365
+ intrinsicYield: 0,
24366
+ rewards: void 0,
24367
+ decimals: debtDecimals,
24368
+ config: {
24369
+ 0: {
24370
+ category: 0,
24371
+ borrowCollateralFactor: 0,
24372
+ collateralFactor: 0,
24373
+ borrowFactor: 1,
24374
+ liquidationPenalty: liqPenalty,
24375
+ closeFactor: 1,
24376
+ collateralDisabled: true,
24377
+ debtDisabled: halted
24378
+ }
24379
+ },
24380
+ closeFactor: 1,
24381
+ collateralActive: false,
24382
+ borrowingEnabled: !halted,
24383
+ depositsEnabled: false,
24384
+ hasStable: false,
24385
+ variableBorrowDisabled: halted,
24386
+ isActive: !halted,
24387
+ isFrozen: halted
24388
+ };
24389
+ entry.params = {
24390
+ market: {
24391
+ lender: lenderKey,
24392
+ name: marketName,
24393
+ loanDecimals: debtDecimals,
24394
+ collateralDecimals: collDecimals,
24395
+ // The gem join doubles as the market id (marketUid address) — one
24396
+ // adapter per ilk, like River's TroveManager.
24397
+ id: market.gemJoin.toLowerCase(),
24398
+ lltv: m.mat !== null ? m.mat.toString() : market.mat,
24399
+ oracle: market.pip ?? zeroAddress,
24400
+ irm: zeroAddress,
24401
+ collateralAddress: collAddr,
24402
+ loanAddress: debtAddr,
24403
+ // --- USDD descriptor (metadata + live snapshot; consumed by the
24404
+ // calldata builders + worker-api resolvers) ---
24405
+ usdd: {
24406
+ ilk: market.ilk,
24407
+ /** Per-second stability fee (ray string) — live, metadata fallback. */
24408
+ duty: duty.toString(),
24409
+ /** Liquidation ratio (ray string). */
24410
+ mat: m.mat !== null ? m.mat.toString() : market.mat,
24411
+ /** Liquidation penalty multiplier (wad string, Dog.chop). */
24412
+ chop: market.chop,
24413
+ /** Ilk debt ceiling / per-CDP floor (rad strings). */
24414
+ line: m.line !== null ? m.line.toString() : market.line,
24415
+ dust: m.dust !== null ? m.dust.toString() : market.dust,
24416
+ /** Debt accumulator (ray string) — art × rate = debt. */
24417
+ rate: m.rate !== null ? m.rate.toString() : void 0,
24418
+ addresses: {
24419
+ vat: cfg.vat,
24420
+ jug: cfg.jug,
24421
+ spot: cfg.spot,
24422
+ dog: cfg.dog,
24423
+ cdpManager: cfg.cdpManager,
24424
+ proxyActions: cfg.proxyActions,
24425
+ proxyRegistry: cfg.proxyRegistry,
24426
+ usddJoin: cfg.usddJoin,
24427
+ gemJoin: market.gemJoin,
24428
+ clip: market.clip,
24429
+ pip: market.pip
24430
+ }
24431
+ }
24432
+ }
24433
+ };
24434
+ entry.chainId = chainId;
24435
+ out[lenderKey] = entry;
24436
+ }
24437
+ return out;
24438
+ }
24178
24439
 
24179
24440
  // src/lending/public-data/silo-v2/fetchPublic.ts
24180
24441
  var BASE_URL2 = "https://api-v3.silo.finance";
@@ -24785,6 +25046,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
24785
25046
  if (isTeller(lender)) return await fetchTellerMarkets(chainId);
24786
25047
  if (isInverse(lender)) return await fetchInverseMarkets(lender, chainId);
24787
25048
  if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
25049
+ if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
24788
25050
  return {};
24789
25051
  }
24790
25052
  function convertLenderDataFromApi(lender, chainId, data, prices, additionalYields, list = {}) {
@@ -24846,6 +25108,14 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
24846
25108
  additionalYields,
24847
25109
  list
24848
25110
  );
25111
+ if (isUsdd(lender))
25112
+ return convertUsddMarketsToResponse(
25113
+ data,
25114
+ chainId,
25115
+ prices,
25116
+ additionalYields,
25117
+ list
25118
+ );
24849
25119
  if (isTermMax(lender))
24850
25120
  return convertTermMaxMarketsToResponse(
24851
25121
  data,
@@ -25055,6 +25325,7 @@ function lenderApiOnly(lender, chainId) {
25055
25325
  if (isTeller(lender)) return true;
25056
25326
  if (isInverse(lender)) return true;
25057
25327
  if (isTermMax(lender)) return true;
25328
+ if (isUsdd(lender)) return true;
25058
25329
  return false;
25059
25330
  }
25060
25331
  function lenderApiWithOnChainFallback(lender, chainId) {
@@ -26246,15 +26517,132 @@ var buildInverseUserCall = (chainId, lender, account) => {
26246
26517
  );
26247
26518
  return calls;
26248
26519
  };
26249
- var TELLER_CALLS_PER_BID = 4;
26520
+ var USDD_CALLS_PER_CDP = 1;
26521
+ var MAX_CDP_WALK = 64;
26250
26522
  var CACHE_TTL_MS2 = 5 * 6e4;
26251
26523
  var discoveryCache2 = /* @__PURE__ */ new Map();
26252
26524
  var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26253
- var getCachedTellerBids = (chainId, account) => {
26525
+ var getCachedUsddCdps = (chainId, account) => {
26254
26526
  const hit = discoveryCache2.get(cacheKey2(chainId, account));
26255
26527
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
26256
26528
  return hit;
26257
26529
  };
26530
+ var big = (v) => {
26531
+ try {
26532
+ if (typeof v === "bigint") return v;
26533
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
26534
+ } catch {
26535
+ }
26536
+ return 0n;
26537
+ };
26538
+ var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
26539
+ var buildUsddUserCall = async (chainId, lender, account) => {
26540
+ const cfg = usddConfigFor(lender, chainId);
26541
+ const markets = usddChainData(lender, chainId)?.markets ?? [];
26542
+ const stash = (d) => discoveryCache2.set(cacheKey2(chainId, account), d);
26543
+ if (!cfg || markets.length === 0) {
26544
+ stash({ cdps: [], ilks: [], at: Date.now() });
26545
+ return [];
26546
+ }
26547
+ const curated = new Set(markets.map((m) => m.ilk));
26548
+ const zero = "0x0000000000000000000000000000000000000000";
26549
+ const owners = [];
26550
+ try {
26551
+ const [rawCount, rawFirst, rawProxy] = await multicallRetryUniversal({
26552
+ chain: chainId,
26553
+ abi: [...UsddCdpManagerAbi, ...UsddProxyRegistryAbi],
26554
+ calls: [
26555
+ { address: cfg.cdpManager, name: "count", params: [account] },
26556
+ { address: cfg.cdpManager, name: "first", params: [account] },
26557
+ { address: cfg.proxyRegistry, name: "proxies", params: [account] }
26558
+ ],
26559
+ allowFailure: false
26560
+ });
26561
+ owners.push({ owner: account, count: big(rawCount), cursor: big(rawFirst) });
26562
+ const proxy = String(rawProxy ?? zero);
26563
+ if (proxy.toLowerCase() !== zero) {
26564
+ const [pCount, pFirst] = await multicallRetryUniversal({
26565
+ chain: chainId,
26566
+ abi: UsddCdpManagerAbi,
26567
+ calls: [
26568
+ { address: cfg.cdpManager, name: "count", params: [proxy] },
26569
+ { address: cfg.cdpManager, name: "first", params: [proxy] }
26570
+ ],
26571
+ allowFailure: false
26572
+ });
26573
+ owners.push({ owner: proxy, count: big(pCount), cursor: big(pFirst) });
26574
+ }
26575
+ } catch {
26576
+ return [];
26577
+ }
26578
+ const live = owners.filter((o) => o.count > 0n && o.cursor !== 0n);
26579
+ if (live.length === 0) {
26580
+ stash({ cdps: [], ilks: [], at: Date.now() });
26581
+ return [];
26582
+ }
26583
+ const cdps = [];
26584
+ try {
26585
+ for (const head of live) {
26586
+ let cursor = head.cursor;
26587
+ const steps = Number(
26588
+ head.count > BigInt(MAX_CDP_WALK) ? MAX_CDP_WALK : head.count
26589
+ );
26590
+ if (head.count > BigInt(MAX_CDP_WALK)) {
26591
+ console.warn(
26592
+ `USDD: owner ${head.owner} holds ${head.count} CDPs on chain ${chainId} \u2014 truncating discovery at ${MAX_CDP_WALK}`
26593
+ );
26594
+ }
26595
+ for (let i = 0; i < steps && cursor !== 0n; i++) {
26596
+ const [urn, ilk32, link] = await multicallRetryUniversal({
26597
+ chain: chainId,
26598
+ abi: UsddCdpManagerAbi,
26599
+ calls: [
26600
+ { address: cfg.cdpManager, name: "urns", params: [cursor] },
26601
+ { address: cfg.cdpManager, name: "ilks", params: [cursor] },
26602
+ { address: cfg.cdpManager, name: "list", params: [cursor] }
26603
+ ],
26604
+ allowFailure: false
26605
+ });
26606
+ let ilk = "";
26607
+ try {
26608
+ ilk = hexToString(ilk32, { size: 32 }).replace(/[\s\0]+$/g, "");
26609
+ } catch {
26610
+ }
26611
+ if (curated.has(ilk)) {
26612
+ cdps.push({ cdpId: cursor.toString(), urn: String(urn), ilk });
26613
+ }
26614
+ cursor = big(field6(link, "next", 1));
26615
+ }
26616
+ }
26617
+ } catch {
26618
+ return [];
26619
+ }
26620
+ const ilks = [...new Set(cdps.map((c) => c.ilk))];
26621
+ stash({ cdps, ilks, at: Date.now() });
26622
+ if (cdps.length === 0) return [];
26623
+ const calls = cdps.map((c) => ({
26624
+ address: cfg.vat,
26625
+ name: "urns",
26626
+ params: [usddIlkBytes32(c.ilk), c.urn]
26627
+ }));
26628
+ for (const ilk of ilks) {
26629
+ calls.push({
26630
+ address: cfg.vat,
26631
+ name: "ilks",
26632
+ params: [usddIlkBytes32(ilk)]
26633
+ });
26634
+ }
26635
+ return calls;
26636
+ };
26637
+ var TELLER_CALLS_PER_BID = 4;
26638
+ var CACHE_TTL_MS3 = 5 * 6e4;
26639
+ var discoveryCache3 = /* @__PURE__ */ new Map();
26640
+ var cacheKey3 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26641
+ var getCachedTellerBids = (chainId, account) => {
26642
+ const hit = discoveryCache3.get(cacheKey3(chainId, account));
26643
+ if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
26644
+ return hit;
26645
+ };
26258
26646
  var nowSec5 = () => Math.floor(Date.now() / 1e3);
26259
26647
  var toBigints = (arr) => {
26260
26648
  if (!Array.isArray(arr)) return [];
@@ -26292,7 +26680,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26292
26680
  return [];
26293
26681
  }
26294
26682
  if (ids.length === 0) {
26295
- discoveryCache2.set(cacheKey2(chainId, account), { bids: [], at: Date.now() });
26683
+ discoveryCache3.set(cacheKey3(chainId, account), { bids: [], at: Date.now() });
26296
26684
  return [];
26297
26685
  }
26298
26686
  const poolByAddr = /* @__PURE__ */ new Map();
@@ -26319,7 +26707,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26319
26707
  const pool = poolByAddr.get(lenderAddr);
26320
26708
  if (pool) kept.push({ bidId: id, pool });
26321
26709
  });
26322
- discoveryCache2.set(cacheKey2(chainId, account), { bids: kept, at: Date.now() });
26710
+ discoveryCache3.set(cacheKey3(chainId, account), { bids: kept, at: Date.now() });
26323
26711
  if (kept.length === 0) return [];
26324
26712
  const ts = nowSec5();
26325
26713
  const calls = [];
@@ -26344,12 +26732,12 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
26344
26732
  return calls;
26345
26733
  };
26346
26734
  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()}`;
26735
+ var CACHE_TTL_MS4 = 5 * 6e4;
26736
+ var discoveryCache4 = /* @__PURE__ */ new Map();
26737
+ var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
26350
26738
  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;
26739
+ const hit = discoveryCache4.get(cacheKey4(chainId, account));
26740
+ if (!hit || Date.now() - hit.at > CACHE_TTL_MS4) return void 0;
26353
26741
  return hit;
26354
26742
  };
26355
26743
  var buildTermMaxUserCall = async (chainId, _lender, account) => {
@@ -26364,11 +26752,11 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
26364
26752
  }
26365
26753
  }
26366
26754
  if (markets.length === 0) {
26367
- discoveryCache3.set(cacheKey3(chainId, account), { markets: [], at: Date.now() });
26755
+ discoveryCache4.set(cacheKey4(chainId, account), { markets: [], at: Date.now() });
26368
26756
  return [];
26369
26757
  }
26370
26758
  markets = [...markets].sort((a, b) => a.market.localeCompare(b.market));
26371
- discoveryCache3.set(cacheKey3(chainId, account), { markets, at: Date.now() });
26759
+ discoveryCache4.set(cacheKey4(chainId, account), { markets, at: Date.now() });
26372
26760
  return [
26373
26761
  {
26374
26762
  address: proto.viewer,
@@ -26401,22 +26789,30 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
26401
26789
  if (isTeller(lender)) return buildTellerUserCall(chainId, lender, account);
26402
26790
  if (isTermMax(lender)) return buildTermMaxUserCall(chainId, lender, account);
26403
26791
  if (isInverse(lender)) return buildInverseUserCall(chainId, lender, account);
26792
+ if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
26404
26793
  if (isCompoundV3Type(lender))
26405
26794
  return buildCompoundV3UserCall(chainId, lender, account);
26406
26795
  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);
26796
+ return buildEulerUserCall(
26797
+ chainId,
26798
+ lender,
26799
+ account,
26800
+ params?.subAccountIndexes
26801
+ );
26802
+ if (isSiloV2Type(lender)) return buildSiloV2UserCall(chainId, lender, account);
26803
+ if (isSiloV3Type(lender)) return buildSiloV3UserCall(chainId, lender, account);
26412
26804
  if (isCompoundV2Type(lender))
26413
26805
  return buildCompoundV2UserCall(chainId, lender, account);
26414
- if (isFluid(lender))
26415
- return buildFluidUserCall(chainId, lender, account);
26806
+ if (isFluid(lender)) return buildFluidUserCall(chainId, lender, account);
26416
26807
  if (isGearboxV3(lender))
26417
26808
  return buildGearboxV3UserCall(chainId, lender, account);
26418
26809
  if (isDolomite(lender))
26419
- return buildDolomiteUserCall(chainId, lender, account, params?.accountNumbers);
26810
+ return buildDolomiteUserCall(
26811
+ chainId,
26812
+ lender,
26813
+ account,
26814
+ params?.accountNumbers
26815
+ );
26420
26816
  return [];
26421
26817
  }
26422
26818
  function organizeUserQueries(queries) {
@@ -26429,10 +26825,11 @@ function organizeUserQueries(queries) {
26429
26825
  const river = queries.filter((q) => isRiver(q.lender));
26430
26826
  const teller = queries.filter((q) => isTeller(q.lender));
26431
26827
  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)
26828
+ const usdd = queries.filter((q) => isUsdd(q.lender));
26829
+ if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0)
26433
26830
  return queries;
26434
26831
  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)
26832
+ (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isUsdd(q.lender)
26436
26833
  );
26437
26834
  const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
26438
26835
  const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
@@ -26493,6 +26890,14 @@ function organizeUserQueries(queries) {
26493
26890
  assets: void 0
26494
26891
  });
26495
26892
  }
26893
+ if (usdd.length > 0) {
26894
+ result.push({
26895
+ lender: Lender.USDD,
26896
+ account: usdd[0].account,
26897
+ params: usdd.map((p) => p.lender),
26898
+ assets: void 0
26899
+ });
26900
+ }
26496
26901
  if (teller.length > 0) {
26497
26902
  result.push({
26498
26903
  lender: Lender.TELLER,
@@ -28856,7 +29261,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
28856
29261
  totalCalls
28857
29262
  ];
28858
29263
  };
28859
- var WAD8 = 1000000000000000000n;
29264
+ var WAD9 = 1000000000000000000n;
28860
29265
  function toBigInt11(v) {
28861
29266
  if (v === void 0 || v === null || v === "0x") return 0n;
28862
29267
  if (typeof v === "bigint") return v;
@@ -28898,8 +29303,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
28898
29303
  const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
28899
29304
  const debtNum = Number(debtStr);
28900
29305
  const repoBalance = toBigInt11(balanceResult);
28901
- const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD8;
28902
- const lentUnits = repoBalance * redemptionValue / WAD8;
29306
+ const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD9;
29307
+ const lentUnits = repoBalance * redemptionValue / WAD9;
28903
29308
  const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
28904
29309
  const depositsNum = Number(depositsStr);
28905
29310
  const posData = {};
@@ -28976,20 +29381,43 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
28976
29381
  ];
28977
29382
  };
28978
29383
  var nowSec6 = () => Math.floor(Date.now() / 1e3);
29384
+ var DAY_SECONDS = 86400n;
29385
+ var WAD10 = 10n ** 18n;
28979
29386
  function sumPreview(positions) {
28980
29387
  return positions.reduce((acc, p) => acc + p.previewValue, 0n);
28981
29388
  }
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
- }));
29389
+ var faceOf = (p) => p.position.principal + p.position.fee;
29390
+ function toDetail(positions, kind, now, penaltyRate, penaltyApr) {
29391
+ return positions.map((p) => {
29392
+ const maturity = Number(p.maturity);
29393
+ const overdue = maturity < now;
29394
+ const face = faceOf(p);
29395
+ const gap = face > p.previewValue ? face - p.previewValue : 0n;
29396
+ const excess = p.previewValue > face ? p.previewValue - face : 0n;
29397
+ return {
29398
+ maturity,
29399
+ kind,
29400
+ principal: p.position.principal.toString(),
29401
+ fee: p.position.fee.toString(),
29402
+ faceValue: face.toString(),
29403
+ previewValue: p.previewValue.toString(),
29404
+ overdue,
29405
+ secondsLate: overdue ? now - maturity : 0,
29406
+ ...kind === "borrow" ? {
29407
+ ...overdue ? { latePenalty: excess.toString() } : { earlyRepayDiscount: gap.toString() },
29408
+ // face × penaltyRate × 1 day — what another day of being late adds.
29409
+ latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD10).toString(),
29410
+ latePenaltyApr: penaltyApr
29411
+ } : {
29412
+ ...overdue ? {} : { earlyExitCost: gap.toString() },
29413
+ // Deposits carry no penalty: at/after maturity the payout is face.
29414
+ latePenaltyPerDay: "0",
29415
+ latePenaltyApr: 0
29416
+ }
29417
+ };
29418
+ });
28991
29419
  }
28992
- var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29420
+ var getExactlyUserDataConverter = (_lender, chainId, account, meta, requestedLenders) => {
28993
29421
  const expected = exactlyConfig()?.[chainId]?.previewer ? 1 : 0;
28994
29422
  return [
28995
29423
  (data) => {
@@ -28998,6 +29426,44 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
28998
29426
  if (!res || res === "0x" || !Array.isArray(res)) return void 0;
28999
29427
  const markets = res;
29000
29428
  const now = nowSec6();
29429
+ const enteredCollateral = markets.filter(
29430
+ (c) => c.isCollateral && c.floatingDepositAssets + sumPreview(c.fixedDepositPositions) > 0n
29431
+ );
29432
+ const collateralRow = (c, lenderKey, metaMap) => {
29433
+ const cDeposit = c.floatingDepositAssets + sumPreview(c.fixedDepositPositions);
29434
+ const collAddr = c.asset.toLowerCase();
29435
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
29436
+ const collMeta = metaMap[collUid];
29437
+ const collDec = collMeta?.asset?.decimals ?? c.decimals;
29438
+ const collDisplayPrice = collMeta ? getDisplayPrice(collMeta) : 0;
29439
+ const collOraclePrice = collMeta ? getOraclePrice(collMeta) : 0;
29440
+ const collPriceHist = collMeta?.price?.priceUsd24h ?? collDisplayPrice;
29441
+ const collStr = parseRawAmount(cDeposit.toString(), collDec);
29442
+ const collNum = Number(collStr);
29443
+ return {
29444
+ uid: collUid,
29445
+ usd24h: collNum * collPriceHist,
29446
+ row: {
29447
+ marketUid: collUid,
29448
+ underlying: collAddr,
29449
+ deposits: collStr,
29450
+ debt: "0",
29451
+ debtStable: "0",
29452
+ depositsUSD: collNum * collDisplayPrice,
29453
+ debtUSD: 0,
29454
+ debtStableUSD: 0,
29455
+ depositsUSDOracle: collNum * collOraclePrice,
29456
+ debtUSDOracle: 0,
29457
+ debtStableUSDOracle: 0,
29458
+ stableBorrowRate: "0",
29459
+ collateralEnabled: true,
29460
+ claimableRewards: 0,
29461
+ // The SAME deposit reports as the own-asset row under its own
29462
+ // market key — cross-key aggregation must skip flagged rows.
29463
+ crossCollateral: true
29464
+ }
29465
+ };
29466
+ };
29001
29467
  const out = {};
29002
29468
  for (const m of markets) {
29003
29469
  const lenderKey = exactlyLenderKey(m.market);
@@ -29023,9 +29489,22 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29023
29489
  decimals
29024
29490
  );
29025
29491
  const fixedDebtStr = parseRawAmount(fixedDebtUnits.toString(), decimals);
29492
+ const penaltyApr = exactlyPenaltyRateToAprPercent(m.penaltyRate);
29026
29493
  const fixedPositions = [
29027
- ...toDetail(m.fixedDepositPositions, "deposit", now),
29028
- ...toDetail(m.fixedBorrowPositions, "borrow", now)
29494
+ ...toDetail(
29495
+ m.fixedDepositPositions,
29496
+ "deposit",
29497
+ now,
29498
+ m.penaltyRate,
29499
+ penaltyApr
29500
+ ),
29501
+ ...toDetail(
29502
+ m.fixedBorrowPositions,
29503
+ "borrow",
29504
+ now,
29505
+ m.penaltyRate,
29506
+ penaltyApr
29507
+ )
29029
29508
  ];
29030
29509
  const posData = {};
29031
29510
  let depositsUSD24h = depositsNum * loanPriceHist;
@@ -29051,6 +29530,11 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29051
29530
  for (const p of m.fixedBorrowPositions) {
29052
29531
  const maturity = Number(p.maturity);
29053
29532
  const trancheStr = parseRawAmount(p.previewValue.toString(), decimals);
29533
+ const isMatured = maturity < now;
29534
+ const face = faceOf(p);
29535
+ const faceStr = parseRawAmount(face.toString(), decimals);
29536
+ const discount = isMatured ? "0" : parseRawAmount((face - p.previewValue).toString(), decimals);
29537
+ const penalty = isMatured ? parseRawAmount((p.previewValue - face).toString(), decimals) : "0";
29054
29538
  posData[`${loanUid}#${maturity}`] = {
29055
29539
  marketUid: loanUid,
29056
29540
  underlying: assetAddr,
@@ -29070,49 +29554,35 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29070
29554
  loanId: String(maturity),
29071
29555
  termId: maturity,
29072
29556
  isDynamic: false,
29557
+ // `debt` is the repay-NOW cost (discounted early, penalized when
29558
+ // overdue); `faceValue` is what settling AT maturity costs.
29073
29559
  debt: trancheStr,
29560
+ faceValue: faceStr,
29074
29561
  maturity,
29075
29562
  accruedInterest: parseRawAmount(
29076
29563
  p.position.fee.toString(),
29077
29564
  decimals
29078
29565
  ),
29079
- isMatured: maturity < now
29566
+ isMatured,
29567
+ /** rebate if repaid now, before maturity (never a fee) */
29568
+ earlyRepayDiscount: discount,
29569
+ /** penalty already accrued past maturity */
29570
+ latePenalty: penalty,
29571
+ /** further penalty per day overdue — linear on face */
29572
+ latePenaltyPerDay: parseRawAmount(
29573
+ (face * m.penaltyRate * DAY_SECONDS / WAD10).toString(),
29574
+ decimals
29575
+ ),
29576
+ latePenaltyApr: penaltyApr,
29577
+ secondsLate: isMatured ? now - maturity : 0
29080
29578
  }
29081
29579
  };
29082
29580
  }
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
- };
29115
- }
29581
+ for (const c of enteredCollateral) {
29582
+ if (c.market.toLowerCase() === m.market.toLowerCase()) continue;
29583
+ const { uid, usd24h, row } = collateralRow(c, lenderKey, metaMap);
29584
+ posData[uid] = row;
29585
+ depositsUSD24h += usd24h;
29116
29586
  }
29117
29587
  const userData = createMultiAccountTypeUserState(
29118
29588
  {
@@ -29131,12 +29601,41 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
29131
29601
  );
29132
29602
  if (userData && userData.data.length > 0) out[lenderKey] = userData;
29133
29603
  }
29604
+ if (enteredCollateral.length > 0 && requestedLenders?.length) {
29605
+ for (const req of new Set(
29606
+ requestedLenders.map((l) => l?.toUpperCase())
29607
+ )) {
29608
+ if (!req?.startsWith("EXACTLY_") || out[req]) continue;
29609
+ const metaMap = meta?.[req];
29610
+ if (!metaMap) continue;
29611
+ const posData = {};
29612
+ let depositsUSD24h = 0;
29613
+ for (const c of enteredCollateral) {
29614
+ if (exactlyLenderKey(c.market) === req) continue;
29615
+ const { uid, usd24h, row } = collateralRow(c, req, metaMap);
29616
+ posData[uid] = row;
29617
+ depositsUSD24h += usd24h;
29618
+ }
29619
+ if (Object.keys(posData).length === 0) continue;
29620
+ const userData = createMultiAccountTypeUserState(
29621
+ {
29622
+ chainId,
29623
+ account,
29624
+ lendingPositions: { "0": posData },
29625
+ modes: { "0": 0 }
29626
+ },
29627
+ metaMap,
29628
+ { "0": { totalDeposits24h: depositsUSD24h, totalDebt24h: 0 } }
29629
+ );
29630
+ if (userData && userData.data.length > 0) out[req] = userData;
29631
+ }
29632
+ }
29134
29633
  return Object.keys(out).length > 0 ? out : void 0;
29135
29634
  },
29136
29635
  expected
29137
29636
  ];
29138
29637
  };
29139
- var big = (v) => {
29638
+ var big2 = (v) => {
29140
29639
  try {
29141
29640
  if (typeof v === "bigint") return v;
29142
29641
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29144,7 +29643,7 @@ var big = (v) => {
29144
29643
  }
29145
29644
  return 0n;
29146
29645
  };
29147
- var field6 = (res, name, idx) => big(res?.[name] ?? res?.[idx]);
29646
+ var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
29148
29647
  var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29149
29648
  const cfg = liquityConfigFor(lender, chainId);
29150
29649
  const branches = liquityBranchesByChain(lender, chainId);
@@ -29191,29 +29690,29 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29191
29690
  const owner = typeof ownerRaw === "string" ? ownerRaw.toLowerCase() : void 0;
29192
29691
  if (owner !== accountLower) return;
29193
29692
  if (!troveData || troveData === "0x") return;
29194
- const entireDebt = field6(troveData, "entireDebt", 0);
29195
- const entireColl = field6(troveData, "entireColl", 1);
29693
+ const entireDebt = field7(troveData, "entireDebt", 0);
29694
+ const entireColl = field7(troveData, "entireColl", 1);
29196
29695
  if (entireDebt === 0n && entireColl === 0n) return;
29197
29696
  const troveInfo = {
29198
29697
  troveId: t.troveId,
29199
29698
  collIndex: branch.collIndex,
29200
- annualInterestRate: field6(
29699
+ annualInterestRate: field7(
29201
29700
  troveData,
29202
29701
  "annualInterestRate",
29203
29702
  6
29204
29703
  ).toString(),
29205
29704
  lastInterestRateAdjTime: Number(
29206
- field6(troveData, "lastInterestRateAdjTime", 9)
29705
+ field7(troveData, "lastInterestRateAdjTime", 9)
29207
29706
  ),
29208
29707
  zombie: t.zombie,
29209
- redistCollGain: field6(troveData, "redistCollGain", 3).toString(),
29210
- redistBoldDebtGain: field6(
29708
+ redistCollGain: field7(troveData, "redistCollGain", 3).toString(),
29709
+ redistBoldDebtGain: field7(
29211
29710
  troveData,
29212
29711
  "redistBoldDebtGain",
29213
29712
  2
29214
29713
  ).toString(),
29215
- accruedInterest: field6(troveData, "accruedInterest", 4).toString(),
29216
- accruedBatchManagementFee: field6(
29714
+ accruedInterest: field7(troveData, "accruedInterest", 4).toString(),
29715
+ accruedBatchManagementFee: field7(
29217
29716
  troveData,
29218
29717
  "accruedBatchManagementFee",
29219
29718
  8
@@ -29265,11 +29764,11 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29265
29764
  };
29266
29765
  });
29267
29766
  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;
29767
+ const spDeposit = big2(slice2[spBase]);
29768
+ const spYield = big2(slice2[spBase + 1]);
29769
+ const spCollGain = big2(slice2[spBase + 2]);
29770
+ const spStashed = big2(slice2[spBase + 3]);
29771
+ const collSurplus = branch.collSurplusPool ? big2(slice2[spBase + 4]) : 0n;
29273
29772
  const spStable = spDeposit + spYield;
29274
29773
  const spColl = spCollGain + spStashed + collSurplus;
29275
29774
  if (spStable > 0n || spColl > 0n) {
@@ -29348,7 +29847,7 @@ var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
29348
29847
  expected
29349
29848
  ];
29350
29849
  };
29351
- var big2 = (v) => {
29850
+ var big3 = (v) => {
29352
29851
  try {
29353
29852
  if (typeof v === "bigint") return v;
29354
29853
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29356,7 +29855,7 @@ var big2 = (v) => {
29356
29855
  }
29357
29856
  return 0n;
29358
29857
  };
29359
- var field7 = (res, name, idx) => big2(res?.[name] ?? res?.[idx]);
29858
+ var field8 = (res, name, idx) => big3(res?.[name] ?? res?.[idx]);
29360
29859
  var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29361
29860
  const cfg = riverConfigFor(lender, chainId);
29362
29861
  const markets = riverChainData(lender, chainId)?.markets ?? [];
@@ -29368,13 +29867,13 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29368
29867
  const debtAddr = cfg.debtToken.toLowerCase();
29369
29868
  const debtDecimals = cfg.debtDecimals ?? 18;
29370
29869
  const out = {};
29371
- const spDeposit = big2(data[markets.length * RIVER_CALLS_PER_MARKET]);
29870
+ const spDeposit = big3(data[markets.length * RIVER_CALLS_PER_MARKET]);
29372
29871
  markets.forEach((market, i) => {
29373
29872
  const base = i * RIVER_CALLS_PER_MARKET;
29374
29873
  const entire = data[base];
29375
29874
  if (isFailedCall(entire) || isFailedCall(data[base + 1])) return;
29376
- const status = Number(big2(data[base + 1]));
29377
- const surplus = big2(data[base + 2]);
29875
+ const status = Number(big3(data[base + 1]));
29876
+ const surplus = big3(data[base + 2]);
29378
29877
  const lenderKey = riverLenderKey(lender, chainId, market.index);
29379
29878
  const metaMap = meta?.[lenderKey];
29380
29879
  if (!metaMap) return;
@@ -29393,8 +29892,8 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29393
29892
  const lendingPositions = {};
29394
29893
  const modes = {};
29395
29894
  const hist = {};
29396
- const debt = field7(entire, "debt", 0);
29397
- const coll = field7(entire, "coll", 1);
29895
+ const debt = field8(entire, "debt", 0);
29896
+ const coll = field8(entire, "coll", 1);
29398
29897
  if (status === 1 && (debt > 0n || coll > 0n)) {
29399
29898
  const riverInfo = {
29400
29899
  index: market.index,
@@ -29482,7 +29981,7 @@ var getRiverUserDataConverter = (lender, chainId, account, meta) => {
29482
29981
  expected
29483
29982
  ];
29484
29983
  };
29485
- var big3 = (v) => {
29984
+ var big4 = (v) => {
29486
29985
  try {
29487
29986
  if (typeof v === "bigint") return v;
29488
29987
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29501,20 +30000,20 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
29501
30000
  const dolaAddr = cfg.dola.toLowerCase();
29502
30001
  const debtDecimals = cfg.debtDecimals ?? 18;
29503
30002
  const tailBase = markets.length * INVERSE_CALLS_PER_MARKET;
29504
- const dbrBalance = big3(data[tailBase]);
29505
- const dbrDeficit = big3(data[tailBase + 1]);
30003
+ const dbrBalance = big4(data[tailBase]);
30004
+ const dbrDeficit = big4(data[tailBase + 1]);
29506
30005
  const dbrSignedRaw = data[tailBase + 2];
29507
- const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big3(dbrSignedRaw);
30006
+ const dbrSigned = isFailedCall(dbrSignedRaw) ? 0n : big4(dbrSignedRaw);
29508
30007
  const out = {};
29509
30008
  markets.forEach((market, i) => {
29510
30009
  const base = i * INVERSE_CALLS_PER_MARKET;
29511
- const escrowBal = isFailedCall(data[base]) ? 0n : big3(data[base]);
30010
+ const escrowBal = isFailedCall(data[base]) ? 0n : big4(data[base]);
29512
30011
  const debtRaw = data[base + 1];
29513
30012
  if (isFailedCall(debtRaw)) return;
29514
- const debt = big3(debtRaw);
30013
+ const debt = big4(debtRaw);
29515
30014
  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]);
30015
+ const creditLimit = isFailedCall(data[base + 2]) ? 0n : big4(data[base + 2]);
30016
+ const withdrawalLimit = isFailedCall(data[base + 3]) ? 0n : big4(data[base + 3]);
29518
30017
  const lenderKey = inverseLenderKey(lender, market.address);
29519
30018
  const metaMap = meta?.[lenderKey];
29520
30019
  if (!metaMap) return;
@@ -29597,10 +30096,132 @@ var getInverseUserDataConverter = (lender, chainId, account, meta) => {
29597
30096
  expected
29598
30097
  ];
29599
30098
  };
30099
+ var RAY4 = 10n ** 27n;
30100
+ var big5 = (v) => {
30101
+ try {
30102
+ if (typeof v === "bigint") return v;
30103
+ if (typeof v === "number" || typeof v === "string") return BigInt(v);
30104
+ } catch {
30105
+ }
30106
+ return 0n;
30107
+ };
30108
+ var field9 = (res, name, idx) => big5(res?.[name] ?? res?.[idx]);
30109
+ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
30110
+ const cfg = usddConfigFor(lender, chainId);
30111
+ const markets = usddChainData(lender, chainId)?.markets ?? [];
30112
+ const discovery = getCachedUsddCdps(chainId, account);
30113
+ const cdps = discovery?.cdps ?? [];
30114
+ const ilks = discovery?.ilks ?? [];
30115
+ const expected = cfg && markets.length > 0 && cdps.length > 0 ? cdps.length * USDD_CALLS_PER_CDP + ilks.length : 0;
30116
+ return [
30117
+ (data) => {
30118
+ if (!cfg || expected === 0) return void 0;
30119
+ if (!data || data.length < expected) return void 0;
30120
+ const debtAddr = cfg.usdd.toLowerCase();
30121
+ const debtDecimals = cfg.debtDecimals ?? 18;
30122
+ const rateByIlk = /* @__PURE__ */ new Map();
30123
+ ilks.forEach((ilk, i) => {
30124
+ const res = data[cdps.length * USDD_CALLS_PER_CDP + i];
30125
+ if (!isFailedCall(res)) rateByIlk.set(ilk, field9(res, "rate", 1));
30126
+ });
30127
+ const perMarket = /* @__PURE__ */ new Map();
30128
+ cdps.forEach((cdp, i) => {
30129
+ const res = data[i * USDD_CALLS_PER_CDP];
30130
+ if (isFailedCall(res)) return;
30131
+ const ink = field9(res, "ink", 0);
30132
+ const art = field9(res, "art", 1);
30133
+ const rate = rateByIlk.get(cdp.ilk) ?? RAY4;
30134
+ const debt = art * rate / RAY4;
30135
+ if (ink === 0n && debt === 0n) return;
30136
+ const market = markets.find((m) => m.ilk === cdp.ilk);
30137
+ if (!market) return;
30138
+ const key = usddLenderKey(lender, chainId, cdp.ilk);
30139
+ if (!perMarket.has(key)) perMarket.set(key, { market, positions: [] });
30140
+ perMarket.get(key).positions.push({ cdp, ink, debt });
30141
+ });
30142
+ const out = {};
30143
+ for (const [lenderKey, { market, positions }] of perMarket) {
30144
+ const metaMap = meta?.[lenderKey];
30145
+ if (!metaMap) continue;
30146
+ const collAddr = market.collToken.toLowerCase();
30147
+ const collUid = createMarketUid(chainId, lenderKey, collAddr);
30148
+ const loanUid = createMarketUid(chainId, lenderKey, debtAddr);
30149
+ const collMeta = metaMap[collUid];
30150
+ const loanMeta = metaMap[loanUid];
30151
+ collMeta?.asset?.decimals ?? market.collDecimals;
30152
+ const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
30153
+ const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
30154
+ const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
30155
+ const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
30156
+ const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
30157
+ const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
30158
+ const lendingPositions = {};
30159
+ const modes = {};
30160
+ const hist = {};
30161
+ for (const { cdp, ink, debt } of positions) {
30162
+ const collStr = parseRawAmount(ink.toString(), 18);
30163
+ const collNum = Number(collStr);
30164
+ const debtStr = parseRawAmount(debt.toString(), debtDecimals);
30165
+ const debtNum = Number(debtStr);
30166
+ const usddInfo = { ...cdp };
30167
+ lendingPositions[cdp.cdpId] = {
30168
+ [collUid]: {
30169
+ marketUid: collUid,
30170
+ underlying: collAddr,
30171
+ deposits: collStr,
30172
+ debt: "0",
30173
+ debtStable: "0",
30174
+ depositsUSD: collNum * collDisplay,
30175
+ debtUSD: 0,
30176
+ debtStableUSD: 0,
30177
+ depositsUSDOracle: collNum * collOracle,
30178
+ debtUSDOracle: 0,
30179
+ debtStableUSDOracle: 0,
30180
+ stableBorrowRate: "0",
30181
+ collateralEnabled: true,
30182
+ claimableRewards: 0
30183
+ },
30184
+ [loanUid]: {
30185
+ marketUid: loanUid,
30186
+ underlying: debtAddr,
30187
+ deposits: "0",
30188
+ debt: debtStr,
30189
+ debtStable: "0",
30190
+ depositsUSD: 0,
30191
+ debtUSD: debtNum * loanDisplay,
30192
+ debtStableUSD: 0,
30193
+ depositsUSDOracle: 0,
30194
+ debtUSDOracle: debtNum * loanOracle,
30195
+ debtStableUSDOracle: 0,
30196
+ stableBorrowRate: "0",
30197
+ collateralEnabled: false,
30198
+ claimableRewards: 0,
30199
+ usddInfo
30200
+ }
30201
+ };
30202
+ modes[cdp.cdpId] = 0;
30203
+ hist[cdp.cdpId] = {
30204
+ totalDeposits24h: collNum * collHist,
30205
+ totalDebt24h: debtNum * loanHist
30206
+ };
30207
+ }
30208
+ if (Object.keys(lendingPositions).length === 0) continue;
30209
+ const userData = createMultiAccountTypeUserState(
30210
+ { chainId, account, lendingPositions, modes },
30211
+ metaMap,
30212
+ hist
30213
+ );
30214
+ if (userData && userData.data.length > 0) out[lenderKey] = userData;
30215
+ }
30216
+ return Object.keys(out).length > 0 ? out : void 0;
30217
+ },
30218
+ expected
30219
+ ];
30220
+ };
29600
30221
 
29601
30222
  // src/lending/user-data/teller/userCallParse.ts
29602
30223
  var nowSec7 = () => Math.floor(Date.now() / 1e3);
29603
- var big4 = (v) => {
30224
+ var big6 = (v) => {
29604
30225
  try {
29605
30226
  if (typeof v === "bigint") return v;
29606
30227
  if (typeof v === "number" || typeof v === "string") return BigInt(v);
@@ -29608,7 +30229,7 @@ var big4 = (v) => {
29608
30229
  }
29609
30230
  return 0n;
29610
30231
  };
29611
- var field8 = (res, name, idx) => res?.[name] ?? res?.[idx];
30232
+ var field10 = (res, name, idx) => res?.[name] ?? res?.[idx];
29612
30233
  var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29613
30234
  const discovery = getCachedTellerBids(chainId, account);
29614
30235
  const kept = discovery?.bids ?? [];
@@ -29622,7 +30243,7 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29622
30243
  const base = i * TELLER_CALLS_PER_BID;
29623
30244
  const bidRes = data[base];
29624
30245
  const owed = data[base + 1];
29625
- const collAmount = big4(data[base + 2]);
30246
+ const collAmount = big6(data[base + 2]);
29626
30247
  const defaulted = !!data[base + 3];
29627
30248
  if (isFailedCall(bidRes) || isFailedCall(owed) || !bidRes) return;
29628
30249
  const pool = b.pool;
@@ -29643,17 +30264,17 @@ var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
29643
30264
  const collDisplay = collMeta ? getDisplayPrice(collMeta) : 0;
29644
30265
  const collOracle = collMeta ? getOraclePrice(collMeta) : 0;
29645
30266
  const collHist = collMeta?.price?.priceUsd24h ?? collDisplay;
29646
- const owedPrincipal = big4(field8(owed, "principal", 0));
29647
- const owedInterest = big4(field8(owed, "interest", 1));
30267
+ const owedPrincipal = big6(field10(owed, "principal", 0));
30268
+ const owedInterest = big6(field10(owed, "interest", 1));
29648
30269
  const owedTotal = owedPrincipal + owedInterest;
29649
30270
  if (owedTotal === 0n && collAmount === 0n) return;
29650
- const loanDetails = field8(bidRes, "loanDetails", 5);
29651
- const terms = field8(bidRes, "terms", 6);
30271
+ const loanDetails = field10(bidRes, "loanDetails", 5);
30272
+ const terms = field10(bidRes, "terms", 6);
29652
30273
  const acceptedTs = Number(
29653
- big4(field8(loanDetails, "acceptedTimestamp", 4))
30274
+ big6(field10(loanDetails, "acceptedTimestamp", 4))
29654
30275
  );
29655
- const loanDuration = Number(big4(field8(loanDetails, "loanDuration", 6)));
29656
- const aprBps = Number(big4(field8(terms, "APR", 2)));
30276
+ const loanDuration = Number(big6(field10(loanDetails, "loanDuration", 6)));
30277
+ const aprBps = Number(big6(field10(terms, "APR", 2)));
29657
30278
  const maturity = acceptedTs > 0 ? acceptedTs + loanDuration : void 0;
29658
30279
  const isMatured = defaulted || maturity !== void 0 && maturity < now;
29659
30280
  const collStr = parseRawAmount(collAmount.toString(), collDecimals);
@@ -29751,7 +30372,7 @@ function toBigInt12(v) {
29751
30372
  return 0n;
29752
30373
  }
29753
30374
  }
29754
- function field9(res, name, index) {
30375
+ function field11(res, name, index) {
29755
30376
  if (res && typeof res === "object" && !Array.isArray(res) && name in res) {
29756
30377
  return res[name];
29757
30378
  }
@@ -29759,18 +30380,18 @@ function field9(res, name, index) {
29759
30380
  return void 0;
29760
30381
  }
29761
30382
  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);
30383
+ const ftBalance = toBigInt12(field11(res, "ftBalance", 2));
30384
+ const xtBalance = toBigInt12(field11(res, "xtBalance", 3));
30385
+ const rawGts = field11(res, "gtInfo", 4);
29765
30386
  const gts = [];
29766
30387
  if (Array.isArray(rawGts)) {
29767
30388
  for (const g of rawGts) {
29768
- const loanId = toBigInt12(field9(g, "loanId", 0));
30389
+ const loanId = toBigInt12(field11(g, "loanId", 0));
29769
30390
  if (loanId === 0n) continue;
29770
30391
  gts.push({
29771
30392
  loanId: loanId.toString(),
29772
- collateralAmt: toBigInt12(field9(g, "collateralAmt", 1)),
29773
- debtAmt: toBigInt12(field9(g, "debtAmt", 2))
30393
+ collateralAmt: toBigInt12(field11(g, "collateralAmt", 1)),
30394
+ debtAmt: toBigInt12(field11(g, "debtAmt", 2))
29774
30395
  });
29775
30396
  }
29776
30397
  }
@@ -29940,7 +30561,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
29940
30561
  if (isTerm(lender))
29941
30562
  return getTermUserDataConverter(lender, chainId, account, meta);
29942
30563
  if (isExactly(lender))
29943
- return getExactlyUserDataConverter(lender, chainId, account, meta);
30564
+ return getExactlyUserDataConverter(lender, chainId, account, meta, params);
29944
30565
  if (isLiquityFamily(lender))
29945
30566
  return getLiquityUserDataConverter(lender, chainId, account, meta);
29946
30567
  if (isRiver(lender))
@@ -29951,6 +30572,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
29951
30572
  return getTermMaxUserDataConverter(lender, chainId, account, meta);
29952
30573
  if (isInverse(lender))
29953
30574
  return getInverseUserDataConverter(lender, chainId, account, meta);
30575
+ if (isUsdd(lender))
30576
+ return getUsddUserDataConverter(lender, chainId, account, meta);
29954
30577
  if (isCompoundV3Type(lender))
29955
30578
  return getCompoundV3UserDataConverter(
29956
30579
  lender,
@@ -30063,7 +30686,7 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
30063
30686
  };
30064
30687
 
30065
30688
  // src/utils/rpcCall.ts
30066
- var multicall3Abi = [
30689
+ var multicall3Abi2 = [
30067
30690
  {
30068
30691
  type: "function",
30069
30692
  name: "aggregate3",
@@ -30139,7 +30762,7 @@ function createMulticallRpcCall(preparedCalls, multicallAddress, batchSize = MUL
30139
30762
  };
30140
30763
  });
30141
30764
  const multicallData = encodeFunctionData({
30142
- abi: multicall3Abi,
30765
+ abi: multicall3Abi2,
30143
30766
  functionName: "aggregate3",
30144
30767
  args: [aggregate3Calls]
30145
30768
  });
@@ -34550,6 +35173,7 @@ var getAbi2 = (lender) => {
34550
35173
  return [...TellerV2Abi, ...TellerCollateralManagerAbi];
34551
35174
  if (isInverse(lender))
34552
35175
  return [...InverseMarketAbi, ...InverseEscrowAbi, ...InverseDbrAbi];
35176
+ if (isUsdd(lender)) return [...UsddVatAbi];
34553
35177
  if (isInit(lender)) return InitLensAbi;
34554
35178
  if (isEulerType(lender)) return accountLensAbi;
34555
35179
  if (isCompoundV2Type(lender))
@@ -35106,7 +35730,7 @@ var MORPHO_API_CHAIN_IDS = {
35106
35730
  [Chain.UNICHAIN]: 130
35107
35731
  };
35108
35732
  var FETCH_TIMEOUT_MS = 3e3;
35109
- var CACHE_TTL_MS4 = 2e3;
35733
+ var CACHE_TTL_MS5 = 2e3;
35110
35734
  var buildSubgraphQuery = (account) => `
35111
35735
  {
35112
35736
  account(id: "${account.toLowerCase()}") {
@@ -35161,11 +35785,11 @@ async function fetchJsonWithProxyFallback(url, body, proxyConfig) {
35161
35785
  }
35162
35786
  var inflight = /* @__PURE__ */ new Map();
35163
35787
  var resolved = /* @__PURE__ */ new Map();
35164
- function cacheKey4(chainId, account) {
35788
+ function cacheKey5(chainId, account) {
35165
35789
  return `${chainId}:${account.toLowerCase()}`;
35166
35790
  }
35167
35791
  async function dedupedFetch(chainId, account, loader) {
35168
- const key = cacheKey4(chainId, account);
35792
+ const key = cacheKey5(chainId, account);
35169
35793
  const now = Date.now();
35170
35794
  const cached = resolved.get(key);
35171
35795
  if (cached && cached.expiresAt > now) {
@@ -35174,7 +35798,7 @@ async function dedupedFetch(chainId, account, loader) {
35174
35798
  const existing = inflight.get(key);
35175
35799
  if (existing) return existing;
35176
35800
  const promise = loader().then((value) => {
35177
- resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS4 });
35801
+ resolved.set(key, { value, expiresAt: Date.now() + CACHE_TTL_MS5 });
35178
35802
  return value;
35179
35803
  }).finally(() => {
35180
35804
  inflight.delete(key);
@@ -35306,8 +35930,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
35306
35930
  return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
35307
35931
  }
35308
35932
  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]) }))
35933
+ const wa = (field12, weightField) => calculateWeightedAverage(
35934
+ items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field12], weight: Math.abs(i[weightField]) }))
35311
35935
  );
35312
35936
  return {
35313
35937
  apr: wa("apr", "nav"),
@@ -36577,8 +37201,8 @@ var rswethFetcher = {
36577
37201
  };
36578
37202
 
36579
37203
  // src/yields/intrinsic/annualizeRate.ts
36580
- var YEAR_SECONDS2 = 365 * 24 * 60 * 60;
36581
- var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS2 / elapsedSeconds) * 100;
37204
+ var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
37205
+ var annualizeGrowthPercent = (growth, elapsedSeconds) => growth * (YEAR_SECONDS3 / elapsedSeconds) * 100;
36582
37206
  var annualizeRateDeltaPercent = (rateNow, rateThen, elapsedSeconds) => {
36583
37207
  const growth = typeof rateNow === "bigint" && typeof rateThen === "bigint" ? Number(rateNow - rateThen) / Number(rateThen) : Number(rateNow) / Number(rateThen) - 1;
36584
37208
  return annualizeGrowthPercent(growth, elapsedSeconds);
@@ -37045,8 +37669,8 @@ var stKaiaFetcher = {
37045
37669
  // src/yields/intrinsic/fetchers/lista.ts
37046
37670
  var HISTORY_URL = "https://api.lista.org/api/datachart/history";
37047
37671
  var SLISBNB = "Lista Staked BNB::slisBNB";
37048
- var DAY_SECONDS = 86400;
37049
- var LOOKBACK_SECONDS = 14 * DAY_SECONDS;
37672
+ var DAY_SECONDS2 = 86400;
37673
+ var LOOKBACK_SECONDS = 14 * DAY_SECONDS2;
37050
37674
  var TIMEOUT_MS = 8e3;
37051
37675
  var slisBnbFetcher = {
37052
37676
  label: "SLISBNB",
@@ -37620,7 +38244,7 @@ var FRXETH_SUMMARY_URL = "https://api.frax.finance/v2/frxeth/summary/latest";
37620
38244
  var SFRXETH = "0xac3e018457b222d93114458476f3e3416abbe38f";
37621
38245
  var SFRXUSD = "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6";
37622
38246
  var SFRAX = "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32";
37623
- var YEAR_SECONDS3 = 31536000n;
38247
+ var YEAR_SECONDS4 = 31536000n;
37624
38248
  var ONE_E186 = 10n ** 18n;
37625
38249
  var SFRXETH_KEY = "SFRXETH";
37626
38250
  var SFRXUSD_KEY = "SFRXUSD";
@@ -37720,7 +38344,7 @@ var fetchSfrxEthAprOnChain = async () => {
37720
38344
  const window = BigInt(cycleEnd) - BigInt(lastSync);
37721
38345
  if (window <= 0n || totalAssets === 0n) return 0;
37722
38346
  const perSecond = lastRewardAmount / window;
37723
- return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / totalAssets) / 1e16;
38347
+ return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / totalAssets) / 1e16;
37724
38348
  };
37725
38349
  var fetchSfrxEthApr = async () => {
37726
38350
  try {
@@ -37752,7 +38376,7 @@ var fetchFraxSavingsAprs = async () => {
37752
38376
  const uncapped = window > 0n ? rewardCycleAmount / window : 0n;
37753
38377
  const cap = maxPerSecondPerAsset * storedTotalAssets / ONE_E186;
37754
38378
  const perSecond = uncapped < cap ? uncapped : cap;
37755
- return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / storedTotalAssets) / 1e16;
38379
+ return Number(perSecond * YEAR_SECONDS4 * ONE_E186 / storedTotalAssets) / 1e16;
37756
38380
  };
37757
38381
  return { sfrxUsd: aprAt(0), sfrax: aprAt(3) };
37758
38382
  };
@@ -39380,8 +40004,8 @@ var hastraPrimeFetcher = {
39380
40004
  return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
39381
40005
  }
39382
40006
  };
39383
- var RAY3 = 10n ** 27n;
39384
- var YEAR_SECONDS4 = 31536e3;
40007
+ var RAY5 = 10n ** 27n;
40008
+ var YEAR_SECONDS5 = 31536e3;
39385
40009
  var SPARK_VAULTS_V2 = [
39386
40010
  {
39387
40011
  chainId: Chain.ETHEREUM_MAINNET,
@@ -39457,9 +40081,9 @@ var SSR_ABI = [
39457
40081
  }
39458
40082
  ];
39459
40083
  var aprFromVsr = (vsr) => {
39460
- if (vsr <= RAY3) return 0;
39461
- const perSecond = Number(vsr - RAY3) / 1e27;
39462
- return perSecond * YEAR_SECONDS4 * 100;
40084
+ if (vsr <= RAY5) return 0;
40085
+ const perSecond = Number(vsr - RAY5) / 1e27;
40086
+ return perSecond * YEAR_SECONDS5 * 100;
39463
40087
  };
39464
40088
  var chainsOf = (vaults) => [
39465
40089
  ...new Set(vaults.map((v) => v.chainId))
@@ -39478,7 +40102,7 @@ var fetchChain = async (chainId, vaults) => {
39478
40102
  const out = {};
39479
40103
  vaults.forEach((v, i) => {
39480
40104
  const vsr = results[i];
39481
- if (typeof vsr !== "bigint" || vsr < RAY3) return;
40105
+ if (typeof vsr !== "bigint" || vsr < RAY5) return;
39482
40106
  const apr = aprFromVsr(vsr);
39483
40107
  out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
39484
40108
  if (v.assetGroup) out[v.assetGroup] = apr;
@@ -39492,7 +40116,7 @@ var fetchSusdcApr = async () => {
39492
40116
  calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
39493
40117
  allowFailure: false
39494
40118
  });
39495
- if (typeof ssr !== "bigint" || ssr < RAY3) {
40119
+ if (typeof ssr !== "bigint" || ssr < RAY5) {
39496
40120
  throw new Error("Spark sUSDC: unreadable ssr()");
39497
40121
  }
39498
40122
  const apr = aprFromVsr(ssr);
@@ -39551,9 +40175,9 @@ var SUSDP_VAULTS = [
39551
40175
  address: "0x472ed57b376fe400259fb28e5c46eb53f0e3e7e7"
39552
40176
  }
39553
40177
  ];
39554
- var YEAR_SECONDS5 = 31536e3;
40178
+ var YEAR_SECONDS6 = 31536e3;
39555
40179
  var BASE_27 = 1e27;
39556
- var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS5 * 100;
40180
+ var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS6 * 100;
39557
40181
  var SUSDP_KEY = "SUSDP";
39558
40182
  var SUSDP_GROUP_KEY = "Staked USDp::sUSDp";
39559
40183
  var parallelFetcher = {
@@ -39716,7 +40340,9 @@ var reProtocolFetcher = {
39716
40340
  var USD3_KEY = "3JANE::USD3";
39717
40341
  var SUSD3_KEY = "3JANE::sUSD3";
39718
40342
  var USD3_GROUP_KEY = "3Jane USD3::USD3";
39719
- var SUSD3_GROUP_KEY = "3Jane Staked USD3::SUSD3";
40343
+ var SUSD3_GROUP_KEY = "3Jane Staked USD3::sUSD3";
40344
+ var USD3_LEGACY_GROUP_KEY = "USD3::USD3";
40345
+ var SUSD3_LEGACY_GROUP_KEY = "sUSD3::sUSD3";
39720
40346
  var USD3_POOL = "f8cd444e-d99f-4132-b234-fd3482bf8806";
39721
40347
  var SUSD3_POOL = "a99bb965-ebaa-4d98-9ed2-fa18de52c605";
39722
40348
  var threeJaneFetcher = {
@@ -39731,11 +40357,13 @@ var threeJaneFetcher = {
39731
40357
  const apr = apyToAprPercent(usd3.value);
39732
40358
  out[USD3_KEY] = apr;
39733
40359
  out[USD3_GROUP_KEY] = apr;
40360
+ out[USD3_LEGACY_GROUP_KEY] = apr;
39734
40361
  }
39735
40362
  if (susd3.status === "fulfilled") {
39736
40363
  const apr = apyToAprPercent(susd3.value);
39737
40364
  out[SUSD3_KEY] = apr;
39738
40365
  out[SUSD3_GROUP_KEY] = apr;
40366
+ out[SUSD3_LEGACY_GROUP_KEY] = apr;
39739
40367
  }
39740
40368
  if (Object.keys(out).length === 0) {
39741
40369
  throw new Error("3Jane: DefiLlama returned no apy for either pool");
@@ -39771,7 +40399,7 @@ var toriFetcher = {
39771
40399
  };
39772
40400
  var CHAIN_ID8 = Chain.ETHEREUM_MAINNET;
39773
40401
  var SNUSD = "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313";
39774
- var YEAR_SECONDS6 = 31536000n;
40402
+ var YEAR_SECONDS7 = 31536000n;
39775
40403
  var ONE_E187 = 10n ** 18n;
39776
40404
  var SNUSD_KEY = "SNUSD";
39777
40405
  var SNUSD_GROUP_KEY = "Staked NUSD::sNUSD";
@@ -39823,7 +40451,7 @@ var fetchSnusdAprOnChain = async () => {
39823
40451
  const window = elapsed > vestingPeriod ? elapsed : vestingPeriod;
39824
40452
  if (window <= 0n) return 0;
39825
40453
  const perSecond = vestingAmount / window;
39826
- return Number(perSecond * YEAR_SECONDS6 * ONE_E187 / totalAssets) / 1e16;
40454
+ return Number(perSecond * YEAR_SECONDS7 * ONE_E187 / totalAssets) / 1e16;
39827
40455
  };
39828
40456
  var snusdFetcher = {
39829
40457
  label: "SNUSD",
@@ -39836,8 +40464,179 @@ var snusdFetcher = {
39836
40464
  };
39837
40465
  }
39838
40466
  };
39839
- var RAY4 = 10n ** 27n;
39840
- var YEAR_SECONDS7 = 31536e3;
40467
+ var CHAIN_ID9 = Chain.ETHEREUM_MAINNET;
40468
+ var APYUSD = "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a";
40469
+ var APYX_LINEAR_VEST = "0x0d62b4cc02b4b51ed19ddf41d7a7979cf394c99f";
40470
+ var APYX_DISCOVER_URL = "https://api.apyx.fi/v1/rewards/seasons/2/discover";
40471
+ var APYX_DEFILLAMA_POOL = "cb6139f9-4a68-4efd-8245-0312a92aee55";
40472
+ var YEAR_SECONDS8 = 31536000n;
40473
+ var ONE_E188 = 10n ** 18n;
40474
+ var APYUSD_KEY = "APYUSD";
40475
+ var APYUSD_GROUP_KEY = "apyUSD::APYUSD";
40476
+ var APYUSD_LEGACY_GROUP_KEY = "apyUSD::apyUSD";
40477
+ var APYX_READ_ABI = [
40478
+ {
40479
+ name: "totalAssets",
40480
+ type: "function",
40481
+ stateMutability: "view",
40482
+ inputs: [],
40483
+ outputs: [{ type: "uint256" }]
40484
+ },
40485
+ {
40486
+ name: "unvestedAmount",
40487
+ type: "function",
40488
+ stateMutability: "view",
40489
+ inputs: [],
40490
+ outputs: [{ type: "uint256" }]
40491
+ },
40492
+ {
40493
+ name: "vestingPeriodRemaining",
40494
+ type: "function",
40495
+ stateMutability: "view",
40496
+ inputs: [],
40497
+ outputs: [{ type: "uint256" }]
40498
+ }
40499
+ ];
40500
+ var fetchApyusdAprOnChain = async () => {
40501
+ const [totalAssets, unvested, periodRemaining] = await multicallRetryUniversal({
40502
+ chain: CHAIN_ID9,
40503
+ abi: APYX_READ_ABI,
40504
+ calls: [
40505
+ { address: APYUSD, name: "totalAssets", params: [] },
40506
+ { address: APYX_LINEAR_VEST, name: "unvestedAmount", params: [] },
40507
+ {
40508
+ address: APYX_LINEAR_VEST,
40509
+ name: "vestingPeriodRemaining",
40510
+ params: []
40511
+ }
40512
+ ],
40513
+ allowFailure: false
40514
+ });
40515
+ if (totalAssets === 0n || periodRemaining === 0n || unvested === 0n) {
40516
+ throw new Error("apyx vesting state empty");
40517
+ }
40518
+ const perSecond = unvested / periodRemaining;
40519
+ return Number(perSecond * YEAR_SECONDS8 * ONE_E188 / totalAssets) / 1e16;
40520
+ };
40521
+ var fetchApyusdApyFromApi = async () => {
40522
+ const res = await fetch(APYX_DISCOVER_URL, {
40523
+ headers: { accept: "application/json" },
40524
+ signal: AbortSignal.timeout(8e3)
40525
+ });
40526
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
40527
+ const items = (await res.json())?.data?.items ?? [];
40528
+ const row = items.find(
40529
+ (it) => it?.protocol === "Apyx" && it?.network === "ethereum" && Array.isArray(it?.assetSymbols) && it.assetSymbols.includes("apyUSD") && it?.apy != null
40530
+ );
40531
+ const apy = Number(row?.apy);
40532
+ if (Number.isFinite(apy) && apy > 0) return apy;
40533
+ throw new Error("apyUSD apy missing");
40534
+ };
40535
+ var apyxFetcher = {
40536
+ label: "APYUSD",
40537
+ fetch: async () => {
40538
+ const apr = await fetchApyusdAprOnChain().catch(async () => apyToAprPercent(await fetchApyusdApyFromApi())).catch(() => fetchDefiLlamaApy(APYX_DEFILLAMA_POOL)).catch(() => 0);
40539
+ return {
40540
+ [APYUSD_KEY]: apr,
40541
+ [APYUSD_GROUP_KEY]: apr,
40542
+ [APYUSD_LEGACY_GROUP_KEY]: apr
40543
+ };
40544
+ }
40545
+ };
40546
+
40547
+ // src/yields/intrinsic/fetchers/strata.ts
40548
+ var STRATA_ANALYTICS_URL = "https://s3.strata.money/tranches/analytics-v18.json";
40549
+ var SRUSDE_KEY = "Strata Senior USDe::SRUSDE";
40550
+ var JRUSDE_KEY = "Strata Junior USDe::jrUSDe";
40551
+ var SRNUSD_KEY = "Strata Senior NUSD::srNUSD";
40552
+ var JRNUSD_KEY = "Strata Junior NUSD::JRNUSD";
40553
+ var SRMHYPER_KEY = "Strata Senior mHYPER::srmHYPER";
40554
+ var JRMHYPER_KEY = "Strata Junior mHYPER::JRMHYPER";
40555
+ var SRMM1USD_KEY = "Strata Senior mM1-USD::SRMM1-USD";
40556
+ var JRMM1USD_KEY = "Strata Junior mM1-USD::JRMM1-USD";
40557
+ var SRUSDAT_KEY = "Strata Senior USDat::SRUSDAT";
40558
+ var JRUSDAT_KEY = "Strata Junior USDat::JRUSDAT";
40559
+ var SRPRIME_KEY = "Strata Senior PRIME::srPRIME";
40560
+ var JRPRIME_KEY = "Strata Junior PRIME::jrPRIME";
40561
+ var STRATA_MARKETS = [
40562
+ {
40563
+ cdo: "ethenaCdo",
40564
+ sr: { key: SRUSDE_KEY, llamaPool: "843be062-d836-43ef-9670-c78d6ecb60bf" },
40565
+ jr: { key: JRUSDE_KEY, llamaPool: "8352355c-5ad7-45c5-aca2-628de224f8d8" }
40566
+ },
40567
+ {
40568
+ cdo: "neutrlCdo",
40569
+ sr: { key: SRNUSD_KEY, llamaPool: "979711ce-d0c0-4aae-a5fc-d7b76e868649" },
40570
+ jr: { key: JRNUSD_KEY, llamaPool: "947928b7-c446-49d7-a378-392df37660f7" }
40571
+ },
40572
+ {
40573
+ cdo: "mhyperCdo",
40574
+ sr: {
40575
+ key: SRMHYPER_KEY,
40576
+ llamaPool: "a0560647-eb43-45d9-880d-3155db6d357e"
40577
+ },
40578
+ jr: {
40579
+ key: JRMHYPER_KEY,
40580
+ llamaPool: "908664de-79ee-4f4f-9347-40da76a43552"
40581
+ }
40582
+ },
40583
+ {
40584
+ cdo: "mm1usdCdo",
40585
+ sr: {
40586
+ key: SRMM1USD_KEY,
40587
+ llamaPool: "8139ac7b-c983-4800-bb98-60abe3d68157"
40588
+ },
40589
+ jr: {
40590
+ key: JRMM1USD_KEY,
40591
+ llamaPool: "2172d4b0-9a76-4452-af46-2ce833d2c612"
40592
+ }
40593
+ },
40594
+ {
40595
+ cdo: "saturnCdo",
40596
+ sr: { key: SRUSDAT_KEY, llamaPool: "d0f93146-6936-4fac-841e-68178b5a59b2" },
40597
+ jr: { key: JRUSDAT_KEY, llamaPool: "1f42963b-ff24-4563-acb7-0fd35e6ec45b" }
40598
+ },
40599
+ {
40600
+ cdo: "figureCdo",
40601
+ sr: { key: SRPRIME_KEY, llamaPool: "c590eff9-9de2-462c-b629-7e9c89f0b8e9" },
40602
+ jr: { key: JRPRIME_KEY, llamaPool: "f88ff950-9096-46c0-bb9e-93f4d8266c41" }
40603
+ }
40604
+ ];
40605
+ var fetchStrataAnalytics = async () => {
40606
+ const res = await fetch(STRATA_ANALYTICS_URL, {
40607
+ headers: { accept: "application/json" },
40608
+ signal: AbortSignal.timeout(8e3)
40609
+ });
40610
+ if (!res.ok) throw new Error(`Strata analytics HTTP ${res.status}`);
40611
+ return await res.json();
40612
+ };
40613
+ var strataFetcher = {
40614
+ label: "STRATA",
40615
+ fetch: async () => {
40616
+ const analytics = await fetchStrataAnalytics().catch(() => null);
40617
+ const out = {};
40618
+ await Promise.all(
40619
+ STRATA_MARKETS.flatMap(
40620
+ ({ cdo, sr, jr }) => [
40621
+ [sr, analytics?.[cdo]?.week?.srt?.apr],
40622
+ [jr, analytics?.[cdo]?.week?.jrt?.apr]
40623
+ ].map(async ([tranche, apr]) => {
40624
+ if (typeof apr === "number" && Number.isFinite(apr)) {
40625
+ out[tranche.key] = apr;
40626
+ return;
40627
+ }
40628
+ const llamaApy = await fetchDefiLlamaApy(tranche.llamaPool).catch(
40629
+ () => null
40630
+ );
40631
+ if (llamaApy !== null) out[tranche.key] = apyToAprPercent(llamaApy);
40632
+ })
40633
+ )
40634
+ );
40635
+ return out;
40636
+ }
40637
+ };
40638
+ var RAY6 = 10n ** 27n;
40639
+ var YEAR_SECONDS9 = 31536e3;
39841
40640
  var DSR_ABI = [
39842
40641
  {
39843
40642
  name: "dsr",
@@ -39863,9 +40662,9 @@ var USDD_EARN_APY_URL = "https://openapi.usdd.io/api/v1/external/earn-apy";
39863
40662
  var susddKey = (chainId) => `USDD::${chainId}::sUSDD`;
39864
40663
  var SUSDD_GROUP_KEY = "Savings Usdd::sUSDD";
39865
40664
  var aprFromDsr = (dsr) => {
39866
- if (dsr <= RAY4) return 0;
39867
- const perSecond = Number(dsr - RAY4) / 1e27;
39868
- return perSecond * YEAR_SECONDS7 * 100;
40665
+ if (dsr <= RAY6) return 0;
40666
+ const perSecond = Number(dsr - RAY6) / 1e27;
40667
+ return perSecond * YEAR_SECONDS9 * 100;
39869
40668
  };
39870
40669
  var fetchChainDsr = async (chainId, pot) => {
39871
40670
  const [dsr] = await multicallRetryUniversal({
@@ -39874,7 +40673,7 @@ var fetchChainDsr = async (chainId, pot) => {
39874
40673
  calls: [{ address: pot, name: "dsr", params: [] }],
39875
40674
  allowFailure: false
39876
40675
  });
39877
- if (typeof dsr !== "bigint" || dsr < RAY4) {
40676
+ if (typeof dsr !== "bigint" || dsr < RAY6) {
39878
40677
  throw new Error(`USDD: unreadable dsr() on chain ${chainId}`);
39879
40678
  }
39880
40679
  return aprFromDsr(dsr);
@@ -41410,6 +42209,270 @@ var SINGLE_CHAIN_ENTRIES = {
41410
42209
  yieldFetcher: snusdFetcher,
41411
42210
  yieldKey: SNUSD_KEY
41412
42211
  },
42212
+ {
42213
+ // Apyx apyUSD — ERC-4626 over apxUSD, the "Dividend-Backed
42214
+ // Dollar" (variable-rate perpetual preferred stock of DAT
42215
+ // companies, STRC/Strategy). Yield = off-chain dividends minted
42216
+ // as apxUSD and dripped in through a 14-day LinearVestV0
42217
+ // (0x0d62b4cc…, `pullVestedYield`). No on-chain solvency
42218
+ // invariant — RWA/NAV trust class. apxUSD minting is
42219
+ // EIP-712/m-of-n gated (institutional) but the 4626 stake side is
42220
+ // permissionless (`maxDeposit` = uint.max), with deep secondary
42221
+ // apxUSD liquidity (Curve / Uni v4).
42222
+ //
42223
+ // EXIT (fork-verified 2026-08-04, and NOT what the docs site
42224
+ // describes): a 4626 redeem pays the caller nothing. It takes the
42225
+ // vault's flat `unlockingFee()` (0.1%), escrows the apxUSD in the
42226
+ // unlock-RECEIPT contract (`receipt()` = 0x9bf51f33…) and mints a
42227
+ // soulbound ERC-721 keyed by tokenId. Claims are blocked for
42228
+ // `feeCurve.minDuration` (3 days — hence the cooldown below) and
42229
+ // then carry a fee decaying to zero at `maxDuration` (20 days):
42230
+ // measured 3.40% at 3d, 2.60% at 7d, 0% at 20d. The curve is
42231
+ // GLOBAL and admin-settable (capped 5%), so it re-prices receipts
42232
+ // already in flight — quote `previewClaim(tokenId)` live rather
42233
+ // than trusting a stored figure. The vault's legacy
42234
+ // `unlockToken()` (0x93775e2d…) is still deployed but off the
42235
+ // redemption path. Base/BNB carry bridged mirrors whose 4626
42236
+ // surface reverts (plus Solana) — Ethereum-only row.
42237
+ address: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
42238
+ underlying: "0x98a878b1cd98131b271883b390f68d2c90674665",
42239
+ // apxUSD
42240
+ symbol: "apyUSD",
42241
+ brand: "Apyx",
42242
+ description: "apxUSD is Apyx's dividend-backed dollar \u2014 collateralized by variable-rate perpetual preferred stock issued by Digital Asset Treasury companies (e.g. Strategy's STRC). apyUSD stakes it and accrues the preferred-share dividends via an appreciating share price. Exiting mints a transfer-locked receipt NFT: it cannot be claimed for 3 days, then costs a fee that decays from ~3.4% to zero at 20 days (plus a flat 0.1% on the way out). The backing lives off-chain (NAV trust).",
42243
+ decimals: 18,
42244
+ isRebasing: false,
42245
+ isMintable: true,
42246
+ withdrawalMode: "request-based",
42247
+ // Earliest claim = the receipt's `claimableAt` (`feeCurve.minDuration`,
42248
+ // 3 days). Waiting the full 20 days is what makes the exit free —
42249
+ // see the note above; both bounds are admin-mutable.
42250
+ withdrawalCooldownSeconds: 3 * 86400,
42251
+ withdrawQueue: "0x9bf51f33955ec70f87c4b5c49441815589043237",
42252
+ yieldFetcher: apyxFetcher,
42253
+ yieldKey: APYUSD_KEY
42254
+ },
42255
+ // ---- Strata (docs.strata.markets) — senior/junior risk tranches ----
42256
+ //
42257
+ // Six CDO markets, twelve ERC-4626 tranche tokens, all Ethereum.
42258
+ // Each market pools a yield-bearing collateral (sUSDe, sNUSD,
42259
+ // mHYPER, mM1-USD, sUSDat, PRIME) and splits its realized yield:
42260
+ // the senior earns a benchmark-floored rate (its `maxDeposit` is
42261
+ // coverage-cap-gated), the junior takes the residual — levered
42262
+ // upside AND first-loss capital (jrUSDat marked down to ~0.36
42263
+ // absorbing the 2026-07 USDat depeg; junior redemptions pause when
42264
+ // senior coverage drops below the market's minimum). Exits are
42265
+ // two-legged and both escrow through the market's cooldown
42266
+ // contracts, claimed via `finalize`: redeeming into the collateral
42267
+ // token runs a governance cooldown (0 seconds = effectively instant
42268
+ // on every market at integration), while the plain-4626 base-asset
42269
+ // redeem unstakes the collateral first (7d Ethena, 10d Neutrl, ≲3d
42270
+ // Midas) — hence `request-based`, with `withdrawQueue` pointing at
42271
+ // the market's UnstakeCooldown. `previewRedeem` (but NOT
42272
+ // `convertToAssets`) already nets the coverage-dependent exit fee
42273
+ // (0–20 bps). Rates are Strata's own trailing-7d realized figures —
42274
+ // see the fetcher for the junior-tranche caveats. Verified on-chain
42275
+ // 2026-08-04.
42276
+ {
42277
+ address: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
42278
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
42279
+ // USDe
42280
+ symbol: "srUSDe",
42281
+ brand: "Strata",
42282
+ description: "Strata's senior tranche over Ethena USDe: pooled deposits sit in sUSDe and the senior earns a benchmark-floored share of its yield, with the junior tranche absorbing losses first. Exits claim through cooldown contracts \u2014 the sUSDe leg is effectively instant, the USDe leg waits Ethena's 7-day unstake \u2014 minus a small coverage-dependent exit fee.",
42283
+ decimals: 18,
42284
+ isRebasing: false,
42285
+ isMintable: true,
42286
+ withdrawalMode: "request-based",
42287
+ withdrawalCooldownSeconds: 7 * 86400,
42288
+ withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
42289
+ yieldFetcher: strataFetcher,
42290
+ yieldKey: SRUSDE_KEY
42291
+ },
42292
+ {
42293
+ address: "0xc58d044404d8b14e953c115e67823784dea53d8f",
42294
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
42295
+ // USDe
42296
+ symbol: "jrUSDe",
42297
+ brand: "Strata",
42298
+ description: "Strata's junior tranche over Ethena USDe: earns the residual sUSDe yield after the senior's benchmark payment \u2014 levered upside when rates run hot, first-loss capital when they don't (the trailing APR can go negative). Exits mirror srUSDe (instant-ish sUSDe leg, 7-day USDe leg) but pause while senior coverage is below 105%.",
42299
+ decimals: 18,
42300
+ isRebasing: false,
42301
+ isMintable: true,
42302
+ withdrawalMode: "request-based",
42303
+ withdrawalCooldownSeconds: 7 * 86400,
42304
+ withdrawQueue: "0x735eddf50ca2371aa48466469c742e684c610f74",
42305
+ yieldFetcher: strataFetcher,
42306
+ yieldKey: JRUSDE_KEY
42307
+ },
42308
+ {
42309
+ address: "0x65a44528e8868166401ea08b549e19552af589db",
42310
+ underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
42311
+ // NUSD
42312
+ symbol: "srNUSD",
42313
+ brand: "Strata",
42314
+ description: "Strata's senior tranche over Neutrl NUSD: pooled deposits sit in sNUSD and the senior earns a benchmark-floored share of its yield, junior-protected. Exits claim through cooldown contracts \u2014 the sNUSD leg is effectively instant, the NUSD leg waits Neutrl's 10-day unstake \u2014 minus a 0\u20135 bps coverage-dependent exit fee.",
42315
+ decimals: 18,
42316
+ isRebasing: false,
42317
+ isMintable: true,
42318
+ withdrawalMode: "request-based",
42319
+ withdrawalCooldownSeconds: 10 * 86400,
42320
+ withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
42321
+ yieldFetcher: strataFetcher,
42322
+ yieldKey: SRNUSD_KEY
42323
+ },
42324
+ {
42325
+ address: "0xfc807058a352b61aeef6a38e2d0fc3990225e772",
42326
+ underlying: "0xe556aba6fe6036275ec1f87eda296be72c811bce",
42327
+ // NUSD
42328
+ symbol: "jrNUSD",
42329
+ brand: "Strata",
42330
+ description: "Strata's junior tranche over Neutrl NUSD: residual yield after the senior's benchmark payment, first-loss against sNUSD underperformance. Exits run the same cooldown claims as srNUSD (NUSD leg = 10-day unstake) with a 0\u201320 bps coverage-dependent fee, and pause while senior coverage is below the market minimum.",
42331
+ decimals: 18,
42332
+ isRebasing: false,
42333
+ isMintable: true,
42334
+ withdrawalMode: "request-based",
42335
+ withdrawalCooldownSeconds: 10 * 86400,
42336
+ withdrawQueue: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
42337
+ yieldFetcher: strataFetcher,
42338
+ yieldKey: JRNUSD_KEY
42339
+ },
42340
+ {
42341
+ // 18-dec shares over 6-dec USDC (the yUSD case) — the collateral
42342
+ // is 18-dec mHYPER, but the vault accounts in USDC.
42343
+ address: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
42344
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42345
+ // USDC
42346
+ symbol: "srmHYPER",
42347
+ brand: "Strata",
42348
+ description: "Strata's senior tranche over Midas mHYPER (Hyperithm's multi-chain stablecoin yield strategy), accounted in USDC: benchmark-floored yield (Aave USDC/USDT supply rate + 3% premium), junior-protected. Exits claim through cooldown contracts \u2014 the mHYPER leg is effectively instant, the USDC leg follows Midas's \u22723-day redemption schedule \u2014 minus a 0\u20135 bps fee.",
42349
+ decimals: 18,
42350
+ underlyingDecimals: 6,
42351
+ isRebasing: false,
42352
+ isMintable: true,
42353
+ withdrawalMode: "request-based",
42354
+ withdrawalCooldownSeconds: 3 * 86400,
42355
+ withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
42356
+ yieldFetcher: strataFetcher,
42357
+ yieldKey: SRMHYPER_KEY
42358
+ },
42359
+ {
42360
+ address: "0xeb205d26e9e605ec82d1c0d652e00037c278714b",
42361
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42362
+ // USDC
42363
+ symbol: "jrmHYPER",
42364
+ brand: "Strata",
42365
+ description: "Strata's junior tranche over Midas mHYPER, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the mHYPER strategy. Exits mirror srmHYPER (USDC leg \u22723 days via Midas) and pause while senior coverage is below the market minimum.",
42366
+ decimals: 18,
42367
+ underlyingDecimals: 6,
42368
+ isRebasing: false,
42369
+ isMintable: true,
42370
+ withdrawalMode: "request-based",
42371
+ withdrawalCooldownSeconds: 3 * 86400,
42372
+ withdrawQueue: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
42373
+ yieldFetcher: strataFetcher,
42374
+ yieldKey: JRMHYPER_KEY
42375
+ },
42376
+ {
42377
+ address: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
42378
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42379
+ // USDC
42380
+ symbol: "srmM1-USD",
42381
+ brand: "Strata",
42382
+ description: "Strata's senior tranche over Midas mM1-USD, accounted in USDC: benchmark-floored share of the mM1-USD yield, junior-protected. Exits claim through cooldown contracts \u2014 the mM1-USD leg is effectively instant, the USDC leg follows Midas's redemption schedule.",
42383
+ decimals: 18,
42384
+ underlyingDecimals: 6,
42385
+ isRebasing: false,
42386
+ isMintable: true,
42387
+ withdrawalMode: "request-based",
42388
+ withdrawalCooldownSeconds: 3 * 86400,
42389
+ withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
42390
+ yieldFetcher: strataFetcher,
42391
+ yieldKey: SRMM1USD_KEY
42392
+ },
42393
+ {
42394
+ address: "0xf7eb8dfec75c42d2d2247fe76ccaedc59f821688",
42395
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42396
+ // USDC
42397
+ symbol: "jrmM1-USD",
42398
+ brand: "Strata",
42399
+ description: "Strata's junior tranche over Midas mM1-USD, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the mM1-USD strategy. Exits mirror srmM1-USD and pause while senior coverage is below the market minimum.",
42400
+ decimals: 18,
42401
+ underlyingDecimals: 6,
42402
+ isRebasing: false,
42403
+ isMintable: true,
42404
+ withdrawalMode: "request-based",
42405
+ withdrawalCooldownSeconds: 3 * 86400,
42406
+ withdrawQueue: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
42407
+ yieldFetcher: strataFetcher,
42408
+ yieldKey: JRMM1USD_KEY
42409
+ },
42410
+ {
42411
+ // Accounted in 6-dec USDat (Saturn Dollar); collateral is staked
42412
+ // 18-dec sUSDat.
42413
+ address: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
42414
+ underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
42415
+ // USDat
42416
+ symbol: "srUSDat",
42417
+ brand: "Strata",
42418
+ description: "Strata's senior tranche over Saturn USDat (a Strategy-preferred-stock-backed dollar): fixed yield at 65% of the STRC dividend rate, junior-protected \u2014 the senior held its rate straight through the 2026-07 USDat depeg that the junior absorbed. Exits claim through cooldown contracts (the sUSDat leg effectively instant) minus a 0\u20135 bps fee.",
42419
+ decimals: 18,
42420
+ underlyingDecimals: 6,
42421
+ isRebasing: false,
42422
+ isMintable: true,
42423
+ withdrawalMode: "request-based",
42424
+ withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
42425
+ yieldFetcher: strataFetcher,
42426
+ yieldKey: SRUSDAT_KEY
42427
+ },
42428
+ {
42429
+ address: "0x011e55d2b28306458e37ca7e997c879bb25a455d",
42430
+ underlying: "0x23238f20b894f29041f48d88ee91131c395aaa71",
42431
+ // USDat
42432
+ symbol: "jrUSDat",
42433
+ brand: "Strata",
42434
+ description: "Strata's junior tranche over Saturn USDat \u2014 first-loss capital that proved it: the 2026-07 USDat collateral depeg marked jrUSDat down to ~0.36 while the senior stayed whole, and its trailing APR is depeg-recovery-inflated. Exits claim through cooldown contracts and pause while senior coverage is below the market minimum.",
42435
+ decimals: 18,
42436
+ underlyingDecimals: 6,
42437
+ isRebasing: false,
42438
+ isMintable: true,
42439
+ withdrawalMode: "request-based",
42440
+ withdrawQueue: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
42441
+ yieldFetcher: strataFetcher,
42442
+ yieldKey: JRUSDAT_KEY
42443
+ },
42444
+ {
42445
+ address: "0x35bff778d3fc53a561486bf28e761428499232eb",
42446
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42447
+ // USDC
42448
+ symbol: "srPRIME",
42449
+ brand: "Strata",
42450
+ description: "Strata's senior tranche over Hastra PRIME (yield sourced from Figure's YLDS-based lending), accounted in USDC: benchmark-floored share of the PRIME yield, junior-protected. Exits claim through cooldown contracts \u2014 the PRIME leg is effectively instant, the USDC leg follows the strategy's redemption schedule.",
42451
+ decimals: 18,
42452
+ underlyingDecimals: 6,
42453
+ isRebasing: false,
42454
+ isMintable: true,
42455
+ withdrawalMode: "request-based",
42456
+ withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
42457
+ yieldFetcher: strataFetcher,
42458
+ yieldKey: SRPRIME_KEY
42459
+ },
42460
+ {
42461
+ address: "0xf4c91f24e20ee8ed5eda905e501a1136334c2f27",
42462
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
42463
+ // USDC
42464
+ symbol: "jrPRIME",
42465
+ brand: "Strata",
42466
+ description: "Strata's junior tranche over Hastra PRIME, accounted in USDC: residual yield after the senior's benchmark payment, first-loss against the PRIME strategy. Exits mirror srPRIME and pause while senior coverage is below the market minimum.",
42467
+ decimals: 18,
42468
+ underlyingDecimals: 6,
42469
+ isRebasing: false,
42470
+ isMintable: true,
42471
+ withdrawalMode: "request-based",
42472
+ withdrawQueue: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
42473
+ yieldFetcher: strataFetcher,
42474
+ yieldKey: JRPRIME_KEY
42475
+ },
41413
42476
  {
41414
42477
  // Avant savETH — staked avETH (Ethereum, where avETH is native);
41415
42478
  // StakedUSDeV2-style 24h cooldown.
@@ -42639,25 +43702,14 @@ var tethFetcher = {
42639
43702
  }
42640
43703
  };
42641
43704
 
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
43705
  // src/yields/intrinsic/fetchers/anzen.ts
42654
43706
  var SUSDZ_POOL_ID = "46518e93-8197-4539-9861-2340c2ac965a";
42655
- var KEYS4 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
43707
+ var KEYS3 = ["Anzen Staked USDz::SUSDZ", "Anzen Staked USDz::sUSDz", "Staked USDz::sUSDz"];
42656
43708
  var susdzFetcher = {
42657
43709
  label: "SUSDZ",
42658
43710
  fetch: async () => {
42659
43711
  const apr = apyToAprPercent(await fetchDefiLlamaApy(SUSDZ_POOL_ID));
42660
- return Object.fromEntries(KEYS4.map((k) => [k, apr]));
43712
+ return Object.fromEntries(KEYS3.map((k) => [k, apr]));
42661
43713
  }
42662
43714
  };
42663
43715
 
@@ -42692,7 +43744,8 @@ var LENDING_ONLY_FETCHERS = [
42692
43744
  // DefiLlama-mapped intrinsic yields for classifier assets lacking a bespoke source
42693
43745
  lsethFetcher,
42694
43746
  tethFetcher,
42695
- srnusdFetcher,
43747
+ // strataFetcher is NOT here: the Strata tranche savings rows vault-wire
43748
+ // it, so it reaches the global map via `collectVaultFetchers`.
42696
43749
  susdzFetcher
42697
43750
  ];
42698
43751
  var collectVaultFetchers = () => {
@@ -46876,10 +47929,10 @@ function createAssetArrayPerChain() {
46876
47929
  return assetsPerChain;
46877
47930
  }
46878
47931
  var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
46879
- function createSimpleArrayPerChain(fork, field10 = void 0) {
47932
+ function createSimpleArrayPerChain(fork, field12 = void 0) {
46880
47933
  let pools = {};
46881
47934
  Object.entries(fork ?? {}).forEach(([b2, data]) => {
46882
- Object.entries(field10 ? data[field10] : data).forEach(
47935
+ Object.entries(field12 ? data[field12] : data).forEach(
46883
47936
  ([chainId, address]) => {
46884
47937
  if (!pools[chainId]) pools[chainId] = [];
46885
47938
  pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
@@ -49088,9 +50141,9 @@ query EvkByAssets($assets: [Bytes!]!) {
49088
50141
  `;
49089
50142
  var ZERO = 0n;
49090
50143
  var RAY_TO_PERCENT3 = 1e25;
49091
- function readAddress2(field10) {
49092
- if (!field10) return void 0;
49093
- return field10.toLowerCase();
50144
+ function readAddress2(field12) {
50145
+ if (!field12) return void 0;
50146
+ return field12.toLowerCase();
49094
50147
  }
49095
50148
  function parseVaultFee(v) {
49096
50149
  if (v.performanceFee == null) return 0;
@@ -49455,7 +50508,7 @@ var num2 = (v) => {
49455
50508
  const n = Number(v);
49456
50509
  return Number.isFinite(n) ? n : 0;
49457
50510
  };
49458
- var big5 = (v) => {
50511
+ var big7 = (v) => {
49459
50512
  try {
49460
50513
  if (v === void 0 || v === null || v === "") return "0";
49461
50514
  const s = String(v);
@@ -49491,12 +50544,12 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
49491
50544
  const assetEntry = tokenList[underlying];
49492
50545
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
49493
50546
  const priceUsd = prices[priceKey];
49494
- const totalAssets = big5(r.totalAssets);
49495
- const totalSupply = big5(r.totalSupplyAmt);
50547
+ const totalAssets = big7(r.totalAssets);
50548
+ const totalSupply = big7(r.totalSupplyAmt);
49496
50549
  const totalAssetsFormatted = Number(totalAssets) / scale;
49497
50550
  const supplyRate = num2(r.apr) * 100;
49498
50551
  const rewardsRate = num2(r?.incentiveData?.TMX_APR) * 100;
49499
- const rawLiquidity = BigInt(big5(r.redeemableAmt ?? r.idleFunds ?? "0"));
50552
+ const rawLiquidity = BigInt(big7(r.redeemableAmt ?? r.idleFunds ?? "0"));
49500
50553
  const totalAssetsBig = BigInt(totalAssets);
49501
50554
  const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
49502
50555
  const liquidityFormatted = Number(liquidity) / scale;
@@ -49532,7 +50585,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
49532
50585
  liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
49533
50586
  version: r.version,
49534
50587
  isPaused: r.isPaused === true || void 0,
49535
- supplyCap: r.capacity ? big5(r.capacity) : void 0,
50588
+ supplyCap: r.capacity ? big7(r.capacity) : void 0,
49536
50589
  basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
49537
50590
  };
49538
50591
  }
@@ -49588,7 +50641,7 @@ var Erc20DecimalsBalanceAbi = [
49588
50641
 
49589
50642
  // src/vaults/termmax/fetchFromChain.ts
49590
50643
  var DECIMAL_BASE2 = 100000000n;
49591
- var big6 = (v) => {
50644
+ var big8 = (v) => {
49592
50645
  if (v === void 0 || v === null || v === "0x") return 0n;
49593
50646
  try {
49594
50647
  return typeof v === "bigint" ? v : BigInt(v);
@@ -49652,7 +50705,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49652
50705
  vaults.forEach((address, i) => {
49653
50706
  const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
49654
50707
  const asset = addr(at("asset"));
49655
- const totalAssets = big6(at("totalAssets"));
50708
+ const totalAssets = big8(at("totalAssets"));
49656
50709
  if (!asset || totalAssets === 0n) return;
49657
50710
  rows.push({
49658
50711
  address,
@@ -49661,11 +50714,11 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49661
50714
  decimals: num3(at("decimals")) ?? 18,
49662
50715
  asset,
49663
50716
  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,
50717
+ totalSupply: big8(at("totalSupply")),
50718
+ annualizedInterest: big8(at("annualizedInterest")),
50719
+ accretingPrincipal: big8(at("accretingPrincipal")),
50720
+ performanceFeeRate: big8(at("performanceFeeRate")),
50721
+ aprRaw: at("apr") != null ? big8(at("apr")) : void 0,
49669
50722
  curator: addr(at("curator")),
49670
50723
  guardian: addr(at("guardian")),
49671
50724
  timelock: num3(at("timelock")),
@@ -49686,7 +50739,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
49686
50739
  const out = {};
49687
50740
  rows.forEach((r, i) => {
49688
50741
  const assetDecimals = num3(res2[i * 2]) ?? r.decimals;
49689
- const idle = big6(res2[i * 2 + 1]);
50742
+ const idle = big8(res2[i * 2 + 1]);
49690
50743
  const assetEntry = tokenList[r.asset];
49691
50744
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
49692
50745
  const priceUsd = prices[priceKey];
@@ -49806,7 +50859,7 @@ var Erc4626PreviewRedeemAbi = [
49806
50859
  ];
49807
50860
 
49808
50861
  // src/vaults/lst/readers/shared.ts
49809
- var ONE_E188 = 10n ** 18n;
50862
+ var ONE_E189 = 10n ** 18n;
49810
50863
  var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
49811
50864
  var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
49812
50865
  var Multicall3BalanceAbi = [
@@ -49849,7 +50902,7 @@ var readerBeetsStS = (entry) => ({
49849
50902
  }
49850
50903
  const liquidity = toBigInt13(pool);
49851
50904
  return {
49852
- totalAssets: totalSupply * exchangeRate / ONE_E188,
50905
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
49853
50906
  totalSupply,
49854
50907
  exchangeRate,
49855
50908
  liquidity
@@ -49882,7 +50935,7 @@ var readerBenqiSavax = (entry) => ({
49882
50935
  {
49883
50936
  address: entry.address,
49884
50937
  name: "getPooledAvaxByShares",
49885
- params: [ONE_E188]
50938
+ params: [ONE_E189]
49886
50939
  },
49887
50940
  { address: entry.address, name: "totalPooledAvax", params: [] }
49888
50941
  ],
@@ -49893,7 +50946,7 @@ var readerBenqiSavax = (entry) => ({
49893
50946
  if (totalSupply === void 0 || exchangeRate === void 0) {
49894
50947
  return void 0;
49895
50948
  }
49896
- const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E188;
50949
+ const totalAssets = toBigInt13(totalPooled) ?? totalSupply * exchangeRate / ONE_E189;
49897
50950
  return {
49898
50951
  totalAssets,
49899
50952
  totalSupply,
@@ -49912,7 +50965,7 @@ var readerBgtWrapper1to1 = (entry) => ({
49912
50965
  return {
49913
50966
  totalAssets: totalSupply,
49914
50967
  totalSupply,
49915
- exchangeRate: ONE_E188
50968
+ exchangeRate: ONE_E189
49916
50969
  };
49917
50970
  }
49918
50971
  });
@@ -49942,7 +50995,7 @@ var readerDineroBeraEth = (entry) => ({
49942
50995
  return void 0;
49943
50996
  }
49944
50997
  return {
49945
- totalAssets: totalSupply * exchangeRate / ONE_E188,
50998
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
49946
50999
  totalSupply,
49947
51000
  exchangeRate
49948
51001
  };
@@ -49954,7 +51007,7 @@ var readerErc4626 = (entry) => ({
49954
51007
  calls: [
49955
51008
  { address: entry.address, name: "totalAssets", params: [] },
49956
51009
  { address: entry.address, name: "totalSupply", params: [] },
49957
- { address: entry.address, name: "convertToAssets", params: [ONE_E188] }
51010
+ { address: entry.address, name: "convertToAssets", params: [ONE_E189] }
49958
51011
  ],
49959
51012
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
49960
51013
  parse: ([assets, supply, rate]) => {
@@ -49971,7 +51024,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
49971
51024
  calls: [
49972
51025
  { address: entry.address, name: "totalAssets", params: [] },
49973
51026
  { address: entry.address, name: "totalSupply", params: [] },
49974
- { address: entry.address, name: "previewRedeem", params: [ONE_E188] }
51027
+ { address: entry.address, name: "previewRedeem", params: [ONE_E189] }
49975
51028
  ],
49976
51029
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
49977
51030
  parse: ([assets, supply, rate]) => {
@@ -50051,7 +51104,7 @@ var readerEtherFiWeEth = (entry) => {
50051
51104
  }
50052
51105
  }
50053
51106
  return {
50054
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51107
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50055
51108
  totalSupply,
50056
51109
  exchangeRate,
50057
51110
  liquidity
@@ -50084,7 +51137,7 @@ var readerHyperbeatBeHype = (entry) => {
50084
51137
  return {
50085
51138
  totalAssets: totalSupply,
50086
51139
  totalSupply,
50087
- exchangeRate: ONE_E188
51140
+ exchangeRate: ONE_E189
50088
51141
  };
50089
51142
  }
50090
51143
  };
@@ -50092,7 +51145,7 @@ var readerHyperbeatBeHype = (entry) => {
50092
51145
  return {
50093
51146
  calls: [
50094
51147
  { address: entry.address, name: "totalSupply", params: [] },
50095
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E188] }
51148
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E189] }
50096
51149
  ],
50097
51150
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
50098
51151
  parse: ([supply, rate]) => {
@@ -50102,7 +51155,7 @@ var readerHyperbeatBeHype = (entry) => {
50102
51155
  return void 0;
50103
51156
  }
50104
51157
  return {
50105
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51158
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50106
51159
  totalSupply,
50107
51160
  exchangeRate
50108
51161
  };
@@ -50134,7 +51187,7 @@ var readerKelpRsEth = (entry) => {
50134
51187
  return {
50135
51188
  totalAssets: totalSupply,
50136
51189
  totalSupply,
50137
- exchangeRate: ONE_E188
51190
+ exchangeRate: ONE_E189
50138
51191
  };
50139
51192
  }
50140
51193
  };
@@ -50152,7 +51205,7 @@ var readerKelpRsEth = (entry) => {
50152
51205
  return void 0;
50153
51206
  }
50154
51207
  return {
50155
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51208
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50156
51209
  totalSupply,
50157
51210
  exchangeRate
50158
51211
  };
@@ -50184,7 +51237,7 @@ var readerKinetiqKHype = (entry) => {
50184
51237
  return {
50185
51238
  totalAssets: totalSupply,
50186
51239
  totalSupply,
50187
- exchangeRate: ONE_E188
51240
+ exchangeRate: ONE_E189
50188
51241
  };
50189
51242
  }
50190
51243
  };
@@ -50192,7 +51245,7 @@ var readerKinetiqKHype = (entry) => {
50192
51245
  return {
50193
51246
  calls: [
50194
51247
  { address: entry.address, name: "totalSupply", params: [] },
50195
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E188] }
51248
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E189] }
50196
51249
  ],
50197
51250
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
50198
51251
  parse: ([supply, rate]) => {
@@ -50202,7 +51255,7 @@ var readerKinetiqKHype = (entry) => {
50202
51255
  return void 0;
50203
51256
  }
50204
51257
  return {
50205
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51258
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50206
51259
  totalSupply,
50207
51260
  exchangeRate
50208
51261
  };
@@ -50242,7 +51295,7 @@ var readerLairStKaia = (entry) => ({
50242
51295
  if (totalSupply === void 0 || exchangeRate === void 0) {
50243
51296
  return void 0;
50244
51297
  }
50245
- const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E188;
51298
+ const totalAssets = toBigInt13(totalStaking) ?? totalSupply * exchangeRate / ONE_E189;
50246
51299
  return {
50247
51300
  totalAssets,
50248
51301
  totalSupply,
@@ -50276,7 +51329,7 @@ var readerLidoWstEth = (entry) => ({
50276
51329
  return void 0;
50277
51330
  }
50278
51331
  return {
50279
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51332
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50280
51333
  totalSupply,
50281
51334
  exchangeRate
50282
51335
  };
@@ -50314,7 +51367,7 @@ var readerListaSlisBnb = (entry) => {
50314
51367
  return {
50315
51368
  totalAssets: totalSupply,
50316
51369
  totalSupply,
50317
- exchangeRate: ONE_E188
51370
+ exchangeRate: ONE_E189
50318
51371
  };
50319
51372
  }
50320
51373
  };
@@ -50322,7 +51375,7 @@ var readerListaSlisBnb = (entry) => {
50322
51375
  return {
50323
51376
  calls: [
50324
51377
  { address: entry.address, name: "totalSupply", params: [] },
50325
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E188] },
51378
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E189] },
50326
51379
  { address: manager, name: "getTotalPooledBnb", params: [] }
50327
51380
  ],
50328
51381
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -50333,7 +51386,7 @@ var readerListaSlisBnb = (entry) => {
50333
51386
  return void 0;
50334
51387
  }
50335
51388
  const pooledBnb = toBigInt13(pooled);
50336
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E188;
51389
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E189;
50337
51390
  return { totalAssets, totalSupply, exchangeRate };
50338
51391
  }
50339
51392
  };
@@ -50363,7 +51416,7 @@ var readerMantleMEth = (entry) => {
50363
51416
  return {
50364
51417
  totalAssets: totalSupply,
50365
51418
  totalSupply,
50366
- exchangeRate: ONE_E188
51419
+ exchangeRate: ONE_E189
50367
51420
  };
50368
51421
  }
50369
51422
  };
@@ -50371,7 +51424,7 @@ var readerMantleMEth = (entry) => {
50371
51424
  return {
50372
51425
  calls: [
50373
51426
  { address: entry.address, name: "totalSupply", params: [] },
50374
- { address: staking, name: "mETHToETH", params: [ONE_E188] }
51427
+ { address: staking, name: "mETHToETH", params: [ONE_E189] }
50375
51428
  ],
50376
51429
  abis: [TotalSupplyAbi, MantleStakingAbi],
50377
51430
  parse: ([supply, rate]) => {
@@ -50381,7 +51434,7 @@ var readerMantleMEth = (entry) => {
50381
51434
  return void 0;
50382
51435
  }
50383
51436
  return {
50384
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51437
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50385
51438
  totalSupply,
50386
51439
  exchangeRate
50387
51440
  };
@@ -50402,7 +51455,7 @@ var readerOffChain = (entry) => {
50402
51455
  return {
50403
51456
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
50404
51457
  totalSupply,
50405
- exchangeRate: ONE_E188
51458
+ exchangeRate: ONE_E189
50406
51459
  };
50407
51460
  }
50408
51461
  };
@@ -50436,7 +51489,7 @@ var readerRenzoEzEth = (entry) => {
50436
51489
  return {
50437
51490
  totalAssets: totalSupply,
50438
51491
  totalSupply,
50439
- exchangeRate: ONE_E188
51492
+ exchangeRate: ONE_E189
50440
51493
  };
50441
51494
  }
50442
51495
  };
@@ -50455,7 +51508,7 @@ var readerRenzoEzEth = (entry) => {
50455
51508
  return {
50456
51509
  totalAssets: totalTvl,
50457
51510
  totalSupply,
50458
- exchangeRate: totalTvl * ONE_E188 / totalSupply
51511
+ exchangeRate: totalTvl * ONE_E189 / totalSupply
50459
51512
  };
50460
51513
  }
50461
51514
  };
@@ -50511,7 +51564,7 @@ var readerRocketReth = (entry) => {
50511
51564
  }
50512
51565
  const liquidity = depositPool ? toBigInt13(slice2[2]) : void 0;
50513
51566
  return {
50514
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51567
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50515
51568
  totalSupply,
50516
51569
  exchangeRate,
50517
51570
  liquidity
@@ -50553,7 +51606,7 @@ var readerStaderEthx = (entry) => {
50553
51606
  return {
50554
51607
  totalAssets: totalSupply,
50555
51608
  totalSupply,
50556
- exchangeRate: ONE_E188
51609
+ exchangeRate: ONE_E189
50557
51610
  };
50558
51611
  }
50559
51612
  };
@@ -50571,7 +51624,7 @@ var readerStaderEthx = (entry) => {
50571
51624
  return void 0;
50572
51625
  }
50573
51626
  return {
50574
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51627
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50575
51628
  totalSupply,
50576
51629
  exchangeRate
50577
51630
  };
@@ -50588,7 +51641,7 @@ var readerStaderMaticX = (entry) => {
50588
51641
  {
50589
51642
  address: rateAddress,
50590
51643
  name: "convertMaticXToMatic",
50591
- params: [ONE_E188],
51644
+ params: [ONE_E189],
50592
51645
  chainId: homeChainId
50593
51646
  }
50594
51647
  ],
@@ -50603,7 +51656,7 @@ var readerStaderMaticX = (entry) => {
50603
51656
  }
50604
51657
  const isCrossChain = homeContract !== void 0;
50605
51658
  return {
50606
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E188 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E188,
51659
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E189 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E189,
50607
51660
  totalSupply,
50608
51661
  exchangeRate: amountInMatic
50609
51662
  };
@@ -50635,7 +51688,7 @@ var readerStakeWiseOsEth = (entry) => {
50635
51688
  return {
50636
51689
  totalAssets: totalSupply,
50637
51690
  totalSupply,
50638
- exchangeRate: ONE_E188
51691
+ exchangeRate: ONE_E189
50639
51692
  };
50640
51693
  }
50641
51694
  };
@@ -50643,7 +51696,7 @@ var readerStakeWiseOsEth = (entry) => {
50643
51696
  return {
50644
51697
  calls: [
50645
51698
  { address: entry.address, name: "totalSupply", params: [] },
50646
- { address: controller, name: "convertToAssets", params: [ONE_E188] }
51699
+ { address: controller, name: "convertToAssets", params: [ONE_E189] }
50647
51700
  ],
50648
51701
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
50649
51702
  parse: ([supply, rate]) => {
@@ -50653,7 +51706,7 @@ var readerStakeWiseOsEth = (entry) => {
50653
51706
  return void 0;
50654
51707
  }
50655
51708
  return {
50656
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51709
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50657
51710
  totalSupply,
50658
51711
  exchangeRate
50659
51712
  };
@@ -50685,7 +51738,7 @@ var readerStCelo = (entry) => {
50685
51738
  return {
50686
51739
  totalAssets: totalSupply,
50687
51740
  totalSupply,
50688
- exchangeRate: ONE_E188
51741
+ exchangeRate: ONE_E189
50689
51742
  };
50690
51743
  }
50691
51744
  };
@@ -50693,7 +51746,7 @@ var readerStCelo = (entry) => {
50693
51746
  return {
50694
51747
  calls: [
50695
51748
  { address: entry.address, name: "totalSupply", params: [] },
50696
- { address: manager, name: "toCelo", params: [ONE_E188] }
51749
+ { address: manager, name: "toCelo", params: [ONE_E189] }
50697
51750
  ],
50698
51751
  abis: [TotalSupplyAbi, StCeloManagerAbi],
50699
51752
  parse: ([supply, rate]) => {
@@ -50703,7 +51756,7 @@ var readerStCelo = (entry) => {
50703
51756
  return void 0;
50704
51757
  }
50705
51758
  return {
50706
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51759
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50707
51760
  totalSupply,
50708
51761
  exchangeRate
50709
51762
  };
@@ -50736,7 +51789,7 @@ var readerSwellGetRate = (entry) => ({
50736
51789
  return void 0;
50737
51790
  }
50738
51791
  return {
50739
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51792
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50740
51793
  totalSupply,
50741
51794
  exchangeRate
50742
51795
  };
@@ -50767,7 +51820,7 @@ var readerValantisWstHype = (entry) => {
50767
51820
  return {
50768
51821
  totalAssets: totalSupply,
50769
51822
  totalSupply,
50770
- exchangeRate: ONE_E188
51823
+ exchangeRate: ONE_E189
50771
51824
  };
50772
51825
  }
50773
51826
  };
@@ -50785,7 +51838,7 @@ var readerValantisWstHype = (entry) => {
50785
51838
  return void 0;
50786
51839
  }
50787
51840
  return {
50788
- totalAssets: totalSupply * exchangeRate / ONE_E188,
51841
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
50789
51842
  totalSupply,
50790
51843
  exchangeRate
50791
51844
  };
@@ -50819,7 +51872,7 @@ var readerVedaAccountant = (entry) => {
50819
51872
  return {
50820
51873
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
50821
51874
  totalSupply,
50822
- exchangeRate: ONE_E188
51875
+ exchangeRate: ONE_E189
50823
51876
  };
50824
51877
  }
50825
51878
  };
@@ -50838,7 +51891,7 @@ var readerVedaAccountant = (entry) => {
50838
51891
  const exchangeRate = rawRate * scale;
50839
51892
  return {
50840
51893
  totalAssets: rescaleDecimals(
50841
- totalSupply * exchangeRate / ONE_E188,
51894
+ totalSupply * exchangeRate / ONE_E189,
50842
51895
  shareDec,
50843
51896
  underlyingDec
50844
51897
  ),
@@ -50874,9 +51927,9 @@ var readerAnkrRatio = (entry) => ({
50874
51927
  return void 0;
50875
51928
  }
50876
51929
  return {
50877
- totalAssets: totalSupply * ONE_E188 / r,
51930
+ totalAssets: totalSupply * ONE_E189 / r,
50878
51931
  totalSupply,
50879
- exchangeRate: ONE_E188 * ONE_E188 / r
51932
+ exchangeRate: ONE_E189 * ONE_E189 / r
50880
51933
  };
50881
51934
  }
50882
51935
  });
@@ -50920,7 +51973,7 @@ var readerCoreEarnRate = (entry) => {
50920
51973
  return {
50921
51974
  totalAssets: totalSupply * r / CORE_RATE_DENOM,
50922
51975
  totalSupply,
50923
- exchangeRate: r * ONE_E188 / CORE_RATE_DENOM
51976
+ exchangeRate: r * ONE_E189 / CORE_RATE_DENOM
50924
51977
  };
50925
51978
  }
50926
51979
  };
@@ -50942,7 +51995,7 @@ var readerCoreStakedRatio = (entry) => {
50942
51995
  return {
50943
51996
  totalAssets: totalStaked,
50944
51997
  totalSupply,
50945
- exchangeRate: totalStaked * ONE_E188 / totalSupply
51998
+ exchangeRate: totalStaked * ONE_E189 / totalSupply
50946
51999
  };
50947
52000
  }
50948
52001
  };
@@ -50973,7 +52026,7 @@ var readerStellaStDot = (entry) => ({
50973
52026
  {
50974
52027
  address: entry.address,
50975
52028
  name: "getPooledTokenByShares",
50976
- params: [ONE_E188]
52029
+ params: [ONE_E189]
50977
52030
  },
50978
52031
  { address: entry.address, name: "getTotalPooledToken", params: [] }
50979
52032
  ],
@@ -50984,7 +52037,7 @@ var readerStellaStDot = (entry) => ({
50984
52037
  if (totalSupply === void 0 || exchangeRate === void 0) {
50985
52038
  return void 0;
50986
52039
  }
50987
- const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E188;
52040
+ const totalAssets = toBigInt13(pooled) ?? totalSupply * exchangeRate / ONE_E189;
50988
52041
  return {
50989
52042
  totalAssets,
50990
52043
  totalSupply,
@@ -51022,7 +52075,7 @@ var readerKintsuSMon = (entry) => ({
51022
52075
  const totalAssets = toBigInt13(pooled);
51023
52076
  const totalSupply = toBigInt13(shares);
51024
52077
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
51025
- const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E188 / totalSupply : ONE_E188;
52078
+ const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E189 / totalSupply : ONE_E189;
51026
52079
  return { totalAssets, totalSupply, exchangeRate };
51027
52080
  }
51028
52081
  });
@@ -51458,7 +52511,7 @@ var getLstValidators = async (chainId, shareToken) => {
51458
52511
  };
51459
52512
 
51460
52513
  // src/vaults/lst/fetchPublic.ts
51461
- var ONE_E189 = 10n ** 18n;
52514
+ var ONE_E1810 = 10n ** 18n;
51462
52515
  var ERC20_BALANCE_ABI = parseAbi([
51463
52516
  "function balanceOf(address) view returns (uint256)"
51464
52517
  ]);
@@ -51573,8 +52626,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
51573
52626
  const underlyingUnit = 10n ** BigInt(underlyingDec);
51574
52627
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
51575
52628
  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;
52629
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
52630
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
51578
52631
  let liquidityRaw;
51579
52632
  if (state.liquidity !== void 0) {
51580
52633
  liquidityRaw = state.liquidity;
@@ -52245,16 +53298,17 @@ var Erc7540Abi = [
52245
53298
  // src/vaults/lst/withdrawals/readers/erc7540.ts
52246
53299
  var readerErc7540 = {
52247
53300
  fetch: async (user, multicallRetry, chainId, entry) => {
53301
+ const requestContract = entry.lst;
52248
53302
  const stage1 = await multicallRetry({
52249
53303
  chain: chainId,
52250
53304
  calls: [
52251
53305
  {
52252
- address: entry.lst,
53306
+ address: requestContract,
52253
53307
  name: "pendingRedeemRequest",
52254
53308
  params: [0n, user]
52255
53309
  },
52256
53310
  {
52257
- address: entry.lst,
53311
+ address: requestContract,
52258
53312
  name: "claimableRedeemRequest",
52259
53313
  params: [0n, user]
52260
53314
  }
@@ -52269,7 +53323,7 @@ var readerErc7540 = {
52269
53323
  chain: chainId,
52270
53324
  calls: [
52271
53325
  {
52272
- address: entry.lst,
53326
+ address: requestContract,
52273
53327
  name: "convertToAssets",
52274
53328
  params: [claimable]
52275
53329
  }
@@ -52283,6 +53337,8 @@ var readerErc7540 = {
52283
53337
  symbol: entry.symbol,
52284
53338
  requestId: "0",
52285
53339
  amountUnderlying: amount.toString(),
53340
+ // The 7540 claim (`redeem`) takes the share amount.
53341
+ shares: claimable.toString(),
52286
53342
  status: "claimable"
52287
53343
  });
52288
53344
  }
@@ -52295,6 +53351,7 @@ var readerErc7540 = {
52295
53351
  // Approximate to the share value at current price; UI can
52296
53352
  // re-convert if it has the share exchangeRate.
52297
53353
  amountUnderlying: pending.toString(),
53354
+ shares: pending.toString(),
52298
53355
  status: "pending"
52299
53356
  });
52300
53357
  }
@@ -52353,6 +53410,172 @@ var readerEthenaCooldown = {
52353
53410
  }
52354
53411
  };
52355
53412
 
53413
+ // src/vaults/lst/withdrawals/abis/susd3.ts
53414
+ var Susd3CooldownStatusAbi = [
53415
+ {
53416
+ name: "getCooldownStatus",
53417
+ type: "function",
53418
+ stateMutability: "view",
53419
+ inputs: [{ type: "address", name: "user" }],
53420
+ outputs: [
53421
+ { type: "uint256", name: "cooldownEnd" },
53422
+ { type: "uint256", name: "windowEnd" },
53423
+ { type: "uint256", name: "shares" }
53424
+ ]
53425
+ },
53426
+ {
53427
+ name: "convertToAssets",
53428
+ type: "function",
53429
+ stateMutability: "view",
53430
+ inputs: [{ type: "uint256", name: "shares" }],
53431
+ outputs: [{ type: "uint256", name: "assets" }]
53432
+ }
53433
+ ];
53434
+
53435
+ // src/vaults/lst/withdrawals/readers/susd3.ts
53436
+ var readerSusd3Cooldown = {
53437
+ fetch: async (user, multicallRetry, chainId, entry) => {
53438
+ const res = await multicallRetry({
53439
+ chain: chainId,
53440
+ calls: [
53441
+ { address: entry.lst, name: "getCooldownStatus", params: [user] }
53442
+ ],
53443
+ abi: [Susd3CooldownStatusAbi]
53444
+ });
53445
+ const cell = res[0];
53446
+ let cooldownEnd;
53447
+ let windowEnd;
53448
+ let shares;
53449
+ if (Array.isArray(cell)) {
53450
+ cooldownEnd = toBigInt14(cell[0]);
53451
+ windowEnd = toBigInt14(cell[1]);
53452
+ shares = toBigInt14(cell[2]);
53453
+ } else if (cell && typeof cell === "object") {
53454
+ cooldownEnd = toBigInt14(cell.cooldownEnd);
53455
+ windowEnd = toBigInt14(cell.windowEnd);
53456
+ shares = toBigInt14(cell.shares);
53457
+ }
53458
+ if (!shares || shares === 0n) return [];
53459
+ let amount = shares;
53460
+ try {
53461
+ const stage2 = await multicallRetry({
53462
+ chain: chainId,
53463
+ calls: [
53464
+ { address: entry.lst, name: "convertToAssets", params: [shares] }
53465
+ ],
53466
+ abi: [Susd3CooldownStatusAbi]
53467
+ });
53468
+ amount = toBigInt14(stage2[0]) ?? shares;
53469
+ } catch {
53470
+ }
53471
+ const readyAt = Number(cooldownEnd ?? 0n);
53472
+ const expiresAt = windowEnd && windowEnd > 0n && windowEnd < 10n ** 12n ? Number(windowEnd) : void 0;
53473
+ const out = [
53474
+ {
53475
+ lst: entry.lst,
53476
+ brand: entry.brand,
53477
+ symbol: entry.symbol,
53478
+ requestId: "0",
53479
+ amountUnderlying: amount.toString(),
53480
+ shares: shares.toString(),
53481
+ status: computeStatus(readyAt, expiresAt),
53482
+ readyAt,
53483
+ ...expiresAt !== void 0 ? { expiresAt } : {}
53484
+ }
53485
+ ];
53486
+ return out;
53487
+ }
53488
+ };
53489
+
53490
+ // src/vaults/lst/withdrawals/abis/strataCooldown.ts
53491
+ var StrataCooldownBalanceAbi = [
53492
+ {
53493
+ name: "balanceOf",
53494
+ type: "function",
53495
+ stateMutability: "view",
53496
+ inputs: [
53497
+ { type: "address", name: "token" },
53498
+ { type: "address", name: "user" }
53499
+ ],
53500
+ outputs: [
53501
+ {
53502
+ type: "tuple",
53503
+ name: "state",
53504
+ components: [
53505
+ { type: "uint256", name: "pending" },
53506
+ { type: "uint256", name: "claimable" },
53507
+ { type: "uint256", name: "nextUnlockAt" },
53508
+ { type: "uint256", name: "nextUnlockAmount" },
53509
+ { type: "uint256", name: "totalRequests" }
53510
+ ]
53511
+ }
53512
+ ]
53513
+ }
53514
+ ];
53515
+
53516
+ // src/vaults/lst/withdrawals/readers/strataCooldown.ts
53517
+ var readerStrataCooldown = {
53518
+ fetch: async (user, multicallRetry, chainId, entry) => {
53519
+ const escrowToken = entry.escrowToken;
53520
+ if (!escrowToken) return [];
53521
+ const contracts = [
53522
+ entry.withdrawalContract,
53523
+ entry.secondaryWithdrawalContract
53524
+ ].filter((c) => !!c);
53525
+ if (contracts.length === 0) return [];
53526
+ const res = await multicallRetry({
53527
+ chain: chainId,
53528
+ calls: contracts.map((address) => ({
53529
+ address,
53530
+ name: "balanceOf",
53531
+ params: [escrowToken, user]
53532
+ })),
53533
+ abi: contracts.map(() => StrataCooldownBalanceAbi)
53534
+ });
53535
+ const out = [];
53536
+ for (let i = 0; i < contracts.length; i++) {
53537
+ const cell = res[i];
53538
+ let pending;
53539
+ let claimable;
53540
+ let nextUnlockAt;
53541
+ if (Array.isArray(cell)) {
53542
+ pending = toBigInt14(cell[0]);
53543
+ claimable = toBigInt14(cell[1]);
53544
+ nextUnlockAt = toNumber(cell[2]);
53545
+ } else if (cell && typeof cell === "object") {
53546
+ pending = toBigInt14(cell.pending);
53547
+ claimable = toBigInt14(cell.claimable);
53548
+ nextUnlockAt = toNumber(cell.nextUnlockAt);
53549
+ }
53550
+ const escrow = { withdrawQueue: contracts[i], claimToken: escrowToken };
53551
+ if (claimable && claimable > 0n) {
53552
+ out.push({
53553
+ lst: entry.lst,
53554
+ brand: entry.brand,
53555
+ symbol: entry.symbol,
53556
+ requestId: `${i * 2}`,
53557
+ amountUnderlying: claimable.toString(),
53558
+ status: "claimable",
53559
+ ...escrow
53560
+ });
53561
+ }
53562
+ if (pending && pending > 0n) {
53563
+ out.push({
53564
+ lst: entry.lst,
53565
+ brand: entry.brand,
53566
+ symbol: entry.symbol,
53567
+ requestId: `${i * 2 + 1}`,
53568
+ amountUnderlying: pending.toString(),
53569
+ status: "pending",
53570
+ ...nextUnlockAt ? { readyAt: nextUnlockAt } : {},
53571
+ ...escrow
53572
+ });
53573
+ }
53574
+ }
53575
+ return out;
53576
+ }
53577
+ };
53578
+
52356
53579
  // src/vaults/lst/withdrawals/abis/etherfi.ts
52357
53580
  var EtherFiWithdrawRequestAbi = [
52358
53581
  {
@@ -52567,7 +53790,9 @@ var readerKelp = {
52567
53790
  }
52568
53791
  const stage2 = await multicallRetry({
52569
53792
  chain: chainId,
52570
- calls: detailCalls.map(({ _asset: _3, ...rest }) => rest),
53793
+ calls: detailCalls.map(
53794
+ ({ _asset: _3, ...rest }) => rest
53795
+ ),
52571
53796
  abi: detailCalls.map(() => KelpWithdrawalManagerAbi)
52572
53797
  });
52573
53798
  const out = [];
@@ -53121,9 +54346,7 @@ var readerMantle = {
53121
54346
  const results = await multicallRetry({
53122
54347
  chain: chainId,
53123
54348
  calls,
53124
- abi: calls.map(
53125
- () => MantleUnstakeRequestsManagerAbi
53126
- )
54349
+ abi: calls.map(() => MantleUnstakeRequestsManagerAbi)
53127
54350
  });
53128
54351
  const out = [];
53129
54352
  const lcUser = user.toLowerCase();
@@ -54000,6 +55223,10 @@ var buildWithdrawalReader = (entry) => {
54000
55223
  return readerErc7540;
54001
55224
  case "ethenaCooldown":
54002
55225
  return readerEthenaCooldown;
55226
+ case "susd3Cooldown":
55227
+ return readerSusd3Cooldown;
55228
+ case "strataCooldown":
55229
+ return readerStrataCooldown;
54003
55230
  case "swellNft":
54004
55231
  return readerSwell;
54005
55232
  case "stakeWiseSubgraph":
@@ -54063,6 +55290,14 @@ var LST_WITHDRAWAL_REGISTRY = {
54063
55290
  symbol: "LBTC",
54064
55291
  reader: "unverified"
54065
55292
  },
55293
+ {
55294
+ // Lombard LBTCv (Veda BoringVault) — queue mechanics not yet
55295
+ // implemented; placeholder so the orchestrator surfaces the asset.
55296
+ lst: "0x5401b8620e5fb570064ca9114fd1e135fd77d57c",
55297
+ brand: "Lombard",
55298
+ symbol: "LBTCv",
55299
+ reader: "unverified"
55300
+ },
54066
55301
  {
54067
55302
  lst: "0x657e8c867d8b37dcc18fa4caead9c45eb088c642",
54068
55303
  brand: "ether.fi",
@@ -54129,6 +55364,134 @@ var LST_WITHDRAWAL_REGISTRY = {
54129
55364
  symbol: "savETH",
54130
55365
  reader: "ethenaCooldown"
54131
55366
  },
55367
+ {
55368
+ // Tori strUSD — StakedUSDeV2 clone over trUSD; same cooldowns(address)
55369
+ // escrow surface (7d, owner-mutable), claim via `unstake`.
55370
+ lst: "0x280839980a7ed0d7717f64125fe241012e5f5815",
55371
+ brand: "Tori",
55372
+ symbol: "strUSD",
55373
+ reader: "ethenaCooldown"
55374
+ },
55375
+ {
55376
+ // Neutrl sNUSD — StakedUSDeV2 clone over NUSD; cooldowns(address)
55377
+ // escrow (10d), claim via `unstake`.
55378
+ lst: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313",
55379
+ brand: "Neutrl",
55380
+ symbol: "sNUSD",
55381
+ reader: "ethenaCooldown"
55382
+ },
55383
+ {
55384
+ // 3Jane sUSD3 — startCooldown(shares) → 30d → plain 4626 redeem
55385
+ // inside the withdrawal window; getCooldownStatus(address) getter.
55386
+ lst: "0xf689555121e529ff0463e191f9bd9d1e496164a7",
55387
+ brand: "3Jane",
55388
+ symbol: "sUSD3",
55389
+ reader: "susd3Cooldown"
55390
+ },
55391
+ {
55392
+ // Apyx apyUSD — NOT enumerable today. The 4626 redeem escrows the
55393
+ // apxUSD and mints a **soulbound ERC-721** on the receipt contract
55394
+ // `apyUSD.receipt()` = 0x9bf51f33…, which is the only handle on the
55395
+ // pending exit and exposes no per-owner enumeration. The vault also
55396
+ // has an `unlockToken()` (0x93775e2d…) carrying 7540-shaped getters,
55397
+ // but they are the wrong surface: verified 2026-08-04 that
55398
+ // `pendingRedeemRequest(0, user)` / `claimableRedeemRequest(0, user)`
55399
+ // both return 0 for addresses genuinely holding open receipt NFTs.
55400
+ // The claim needs the `tokenId` (read from the redeem's `Transfer`
55401
+ // log), so the real fix is a caller-supplied-ids reader in the
55402
+ // Mantle/Puffer/TruFin mould — see INDEXING_STRATEGIES.md.
55403
+ lst: "0x38eeb52f0771140d10c4e9a9a72349a329fe8a6a",
55404
+ brand: "Apyx",
55405
+ symbol: "apyUSD",
55406
+ reader: "unverified"
55407
+ },
55408
+ // Strata tranche markets — ONE entry per market (not per tranche):
55409
+ // both tranches escrow into the same two per-market ICooldown
55410
+ // contracts keyed by (escrowToken, user) with no tranche
55411
+ // attribution, so per-tranche rows would double-report. `lst` is the
55412
+ // SENIOR tranche address — the catalog resolves it to the savings
55413
+ // provider, and the calldata-sdk `strata` claim built against it
55414
+ // finalizes the whole market's unlocked requests (senior AND
55415
+ // junior). The escrow is KEYED by the collateral token but its
55416
+ // recorded amounts are per-leg — see the reader for the trap.
55417
+ {
55418
+ lst: "0x3d7d6fdf07ee548b939a80edbc9b2256d0cdc003",
55419
+ // srUSDe
55420
+ brand: "Strata",
55421
+ symbol: "srUSDe/jrUSDe",
55422
+ reader: "strataCooldown",
55423
+ withdrawalContract: "0x735eddf50ca2371aa48466469c742e684c610f74",
55424
+ // UnstakeCooldown
55425
+ secondaryWithdrawalContract: "0xd6dad17d025cddded27305aebab8b277996a6faf",
55426
+ // ERC20Cooldown
55427
+ escrowToken: "0x9d39a5de30e57443bff2a8307a4256c8797a3497"
55428
+ // sUSDe
55429
+ },
55430
+ {
55431
+ lst: "0x65a44528e8868166401ea08b549e19552af589db",
55432
+ // srNUSD
55433
+ brand: "Strata",
55434
+ symbol: "srNUSD/jrNUSD",
55435
+ reader: "strataCooldown",
55436
+ withdrawalContract: "0x2a52363a2a0d765b31cb117a8e4d9ce58c2bc749",
55437
+ // NeutrlUnstakeCooldown
55438
+ secondaryWithdrawalContract: "0x1abc3c3c15a862276d057b2acbcfeab358907990",
55439
+ // NeutrlERC20Cooldown
55440
+ escrowToken: "0x08efcc2f3e61185d0ea7f8830b3fec9bfa2ee313"
55441
+ // sNUSD
55442
+ },
55443
+ {
55444
+ lst: "0x627ea69929212916ec57b1b26d2e1a19f6129b53",
55445
+ // srmHYPER
55446
+ brand: "Strata",
55447
+ symbol: "srmHYPER/jrmHYPER",
55448
+ reader: "strataCooldown",
55449
+ withdrawalContract: "0x7910cb19a4f5a36caa2bed0af82cbfff2e08805c",
55450
+ // MHyperUnstakeCooldown
55451
+ secondaryWithdrawalContract: "0x71ec07bba60e854c4b2466068be1c8d5b5788fda",
55452
+ // MHyperERC20Cooldown
55453
+ escrowToken: "0x9b5528528656dbc094765e2abb79f293c21191b9"
55454
+ // mHYPER
55455
+ },
55456
+ {
55457
+ lst: "0xcced21d609cac4a272d0c01a8ff4de9cebc40d60",
55458
+ // srmM1-USD
55459
+ brand: "Strata",
55460
+ symbol: "srmM1-USD/jrmM1-USD",
55461
+ reader: "strataCooldown",
55462
+ withdrawalContract: "0x6f6904ed406cefb34893054a742c6148e9d681c1",
55463
+ // MM1USDUnstakeCooldown
55464
+ secondaryWithdrawalContract: "0x4c2680ae06a0bb0b091e5ccca13cb03f4f72296e",
55465
+ // MM1USDERC20Cooldown
55466
+ escrowToken: "0xcc5c22c7a6bcc25e66726aef011dde74289ed203"
55467
+ // mM1-USD
55468
+ },
55469
+ {
55470
+ lst: "0xfaa9a0e1db9e22ae3a20b2b58a68dc24d053d066",
55471
+ // srUSDat
55472
+ brand: "Strata",
55473
+ symbol: "srUSDat/jrUSDat",
55474
+ reader: "strataCooldown",
55475
+ withdrawalContract: "0x616af703d5739f2122af48c0d1ce0b37e09381ac",
55476
+ // SaturnUnstakeCooldown
55477
+ secondaryWithdrawalContract: "0x25138d10837ab0278eb860454e1045f2b92929ab",
55478
+ // SaturnERC20Cooldown
55479
+ escrowToken: "0xd166337499e176bbc38a1fbd113ab144e5bd2df7"
55480
+ // sUSDat
55481
+ },
55482
+ {
55483
+ lst: "0x35bff778d3fc53a561486bf28e761428499232eb",
55484
+ // srPRIME
55485
+ brand: "Strata",
55486
+ symbol: "srPRIME/jrPRIME",
55487
+ reader: "strataCooldown",
55488
+ withdrawalContract: "0x440938fcb03d64afe50a8168d4b3cfcc341bfbaa",
55489
+ // FigureUnstakeCooldown
55490
+ secondaryWithdrawalContract: "0xbe71d21addba5c9aac5b4e006db1715ef1e324be",
55491
+ // FigureERC20Cooldown
55492
+ escrowToken: "0x19ebb35279a16207ec4ba82799cc64715065f7f6"
55493
+ // PRIME
55494
+ },
54132
55495
  {
54133
55496
  lst: "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee",
54134
55497
  brand: "EtherFi",
@@ -54228,6 +55591,14 @@ var LST_WITHDRAWAL_REGISTRY = {
54228
55591
  symbol: "rETH",
54229
55592
  reader: "noQueue"
54230
55593
  },
55594
+ {
55595
+ // Frax sfrxETH — vanilla ERC-4626 instant redeem to frxETH (the
55596
+ // frxETH → ETH leg is DEX-only, not a protocol queue).
55597
+ lst: "0xac3e018457b222d93114458476f3e3416abbe38f",
55598
+ brand: "Frax",
55599
+ symbol: "sfrxETH",
55600
+ reader: "noQueue"
55601
+ },
54231
55602
  {
54232
55603
  lst: "0xbe9895146f7af43049ca1c1ae358b0541ea49704",
54233
55604
  brand: "Coinbase",
@@ -54350,6 +55721,36 @@ var LST_WITHDRAWAL_REGISTRY = {
54350
55721
  reader: "ethenaCooldown"
54351
55722
  }
54352
55723
  ],
55724
+ // Monad LSTs — all four are `queued` in the main registry but their
55725
+ // per-protocol request enumeration is not implemented yet; listed as
55726
+ // `unverified` placeholders so the orchestrator surfaces the asset
55727
+ // (returning []) instead of silently omitting it.
55728
+ "143": [
55729
+ {
55730
+ lst: "0x1b68626dca36c7fe922fd2d55e4f631d962de19c",
55731
+ brand: "Shmonad",
55732
+ symbol: "shMON",
55733
+ reader: "unverified"
55734
+ },
55735
+ {
55736
+ lst: "0x0c65a0bc65a5d819235b71f554d210d3f80e0852",
55737
+ brand: "aPriori",
55738
+ symbol: "aprMON",
55739
+ reader: "unverified"
55740
+ },
55741
+ {
55742
+ lst: "0xa3227c5969757783154c60bf0bc1944180ed81b9",
55743
+ brand: "Kintsu",
55744
+ symbol: "sMON",
55745
+ reader: "unverified"
55746
+ },
55747
+ {
55748
+ lst: "0x8498312a6b3cbd158bf0c93abdcf29e6e4f55081",
55749
+ brand: "Magma",
55750
+ symbol: "gMON",
55751
+ reader: "unverified"
55752
+ }
55753
+ ],
54353
55754
  "146": [
54354
55755
  {
54355
55756
  lst: "0xe5da20f15420ad15de0fa650600afc998bbe3955",
@@ -54631,7 +56032,7 @@ var NavOracleReadAbi = [
54631
56032
  ];
54632
56033
 
54633
56034
  // src/vaults/savings/readers/shared.ts
54634
- var ONE_E1810 = 10n ** 18n;
56035
+ var ONE_E1811 = 10n ** 18n;
54635
56036
  var toBigInt15 = (v) => {
54636
56037
  if (v === void 0 || v === null) return void 0;
54637
56038
  if (typeof v === "bigint") return v;
@@ -54672,7 +56073,7 @@ var readerErc46262 = (entry) => {
54672
56073
  return {
54673
56074
  totalAssets,
54674
56075
  totalSupply,
54675
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit
56076
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit
54676
56077
  };
54677
56078
  }
54678
56079
  };
@@ -54780,7 +56181,7 @@ var readerErc4626Idle = (entry) => {
54780
56181
  return {
54781
56182
  totalAssets,
54782
56183
  totalSupply,
54783
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit,
56184
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
54784
56185
  ...capacity !== void 0 ? {
54785
56186
  instantRedeemCapacity: capacity,
54786
56187
  instantRedeemEnabled: true,
@@ -54829,7 +56230,7 @@ var readerErc4626WithdrawLimit = (entry) => {
54829
56230
  return {
54830
56231
  totalAssets,
54831
56232
  totalSupply,
54832
- exchangeRate: convertToAssetsRaw * ONE_E1810 / underlyingUnit,
56233
+ exchangeRate: convertToAssetsRaw * ONE_E1811 / underlyingUnit,
54833
56234
  ...capacity !== void 0 ? {
54834
56235
  instantRedeemCapacity: capacity,
54835
56236
  instantRedeemEnabled: true,
@@ -54861,7 +56262,7 @@ var readerNavOracle = (entry) => {
54861
56262
  const exchangeRate = toBigInt15(raw);
54862
56263
  if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
54863
56264
  return {
54864
- totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1810 * shareUnit),
56265
+ totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E1811 * shareUnit),
54865
56266
  totalSupply,
54866
56267
  exchangeRate
54867
56268
  };
@@ -54875,7 +56276,7 @@ var readerNativeWnlp = (entry) => {
54875
56276
  return {
54876
56277
  calls: [
54877
56278
  { address, name: "totalSupply", params: [] },
54878
- { address, name: "getNlpByWnlp", params: [ONE_E1810] },
56279
+ { address, name: "getNlpByWnlp", params: [ONE_E1811] },
54879
56280
  { address, name: "instantRedeemFeeBips", params: [] },
54880
56281
  { address, name: "instantRedeemEnabled", params: [] },
54881
56282
  // Falls back to the vault itself when no CreditVault is pinned —
@@ -54909,7 +56310,7 @@ var readerNativeWnlp = (entry) => {
54909
56310
  const windowSeconds = toBigInt15(window);
54910
56311
  const bips = toBigInt15(feeBips);
54911
56312
  return {
54912
- totalAssets: totalSupply * exchangeRate / ONE_E1810,
56313
+ totalAssets: totalSupply * exchangeRate / ONE_E1811,
54913
56314
  totalSupply,
54914
56315
  exchangeRate,
54915
56316
  // `instantRedeemFeeBips` on-chain is already basis points, so it
@@ -54947,7 +56348,7 @@ var buildReader2 = (entry) => {
54947
56348
  var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
54948
56349
 
54949
56350
  // src/vaults/savings/fetchPublic.ts
54950
- var ONE_E1811 = 10n ** 18n;
56351
+ var ONE_E1812 = 10n ** 18n;
54951
56352
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
54952
56353
  const entries = getSavingsRegistry(chainId);
54953
56354
  if (entries.length === 0) return {};
@@ -54996,8 +56397,8 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
54996
56397
  1,
54997
56398
  Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
54998
56399
  ) : 1;
54999
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1811;
55000
- const convertToShares = state.exchangeRate > 0n ? ONE_E1811 * shareUnit / state.exchangeRate : 0n;
56400
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1812;
56401
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1812 * shareUnit / state.exchangeRate : 0n;
55001
56402
  const displayName = composeVaultDisplayName(
55002
56403
  entry.brand,
55003
56404
  entry.brand,
@@ -56714,23 +58115,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
56714
58115
  const indexMax = price(prices, m.indexToken)?.max;
56715
58116
  if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
56716
58117
  const base = i * SLOTS;
56717
- const big7 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
58118
+ const big9 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
56718
58119
  const cap = computeDepositCapacityUsd(
56719
- [info?.longTokenAmount, longMax, big7(0), big7(2)],
56720
- [info?.shortTokenAmount, shortMax, big7(1), big7(3)]
58120
+ [info?.longTokenAmount, longMax, big9(0), big9(2)],
58121
+ [info?.shortTokenAmount, shortMax, big9(1), big9(3)]
56721
58122
  );
56722
58123
  if (cap != null) value.depositCapacityUsd = cap;
56723
58124
  if (indexMax != null) {
56724
58125
  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;
58126
+ const reservedUsdLong = (big9(4) + big9(5)) / divisor * indexMax;
58127
+ const reservedUsdShort = (big9(6) + big9(7)) / divisor;
56727
58128
  const liq = computeLiquidityUsd(
56728
58129
  info?.longTokenUsd,
56729
58130
  info?.shortTokenUsd,
56730
58131
  reservedUsdLong,
56731
58132
  reservedUsdShort,
56732
- big7(8),
56733
- big7(9)
58133
+ big9(8),
58134
+ big9(9)
56734
58135
  );
56735
58136
  if (liq != null)
56736
58137
  value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
@@ -56929,21 +58330,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
56929
58330
  } catch {
56930
58331
  return void 0;
56931
58332
  }
56932
- const big7 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
56933
- const base = big7(0);
56934
- const mult = big7(1);
58333
+ const big9 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
58334
+ const base = big9(0);
58335
+ const mult = big9(1);
56935
58336
  if (base === 0n && mult === 0n) return void 0;
56936
58337
  const PRECISION = 10n ** 30n;
56937
58338
  const adjusted = (opGas) => base + opGas * mult / PRECISION;
56938
58339
  const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
56939
- const glvExtra = big7(6) * GLV_NOMINAL_MARKET_COUNT;
58340
+ const glvExtra = big9(6) * GLV_NOMINAL_MARKET_COUNT;
56940
58341
  return {
56941
58342
  chainId,
56942
58343
  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)
58344
+ deposit: fee(big9(2)),
58345
+ withdrawal: fee(big9(3)),
58346
+ glvDeposit: fee(big9(4) + glvExtra),
58347
+ glvWithdrawal: fee(big9(5) + glvExtra)
56947
58348
  };
56948
58349
  };
56949
58350
 
@@ -57330,7 +58731,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
57330
58731
  };
57331
58732
 
57332
58733
  // src/vaults/yield/annualize.ts
57333
- var YEAR_SECONDS8 = 365 * 24 * 60 * 60;
58734
+ var YEAR_SECONDS10 = 365 * 24 * 60 * 60;
57334
58735
  var SCALE = 10n ** 18n;
57335
58736
  var appendSnapshot = (points, snap, options) => {
57336
58737
  const maxPoints = options?.maxPoints ?? 90;
@@ -57359,7 +58760,7 @@ var computeVaultApr = (points, options) => {
57359
58760
  if (pThen === 0n) return void 0;
57360
58761
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
57361
58762
  const ratio = Number(ratioScaled) / 1e18;
57362
- const apr = (ratio - 1) * (YEAR_SECONDS8 / windowSeconds);
58763
+ const apr = (ratio - 1) * (YEAR_SECONDS10 / windowSeconds);
57363
58764
  return {
57364
58765
  apr,
57365
58766
  sharePriceNow: now.p,
@@ -58162,6 +59563,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
58162
59563
  return parseTokenBalanceResult(rawResult, prepared.query);
58163
59564
  }
58164
59565
 
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 };
59566
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey };
58166
59567
  //# sourceMappingURL=index.js.map
58167
59568
  //# sourceMappingURL=index.js.map