@1delta/margin-fetcher 0.0.400 → 0.0.403

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
@@ -5,7 +5,7 @@ import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket
5
5
  export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
6
  import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, tellerConfigByChain, tellerPoolsByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
- import { getEvmClient, multicallRetryUniversal, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
8
+ import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
9
9
  import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, GearboxCreditAccountCompressorV310Abi, TermPriceConsumerAbi } from '@1delta/abis';
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';
@@ -11288,8 +11288,10 @@ var MORPHO_LENS = {
11288
11288
  [Chain.ETHEREUM_MAINNET]: "0xFc107f469A92c0de7B3105B802584CD6c7D710C2",
11289
11289
  [Chain.PLASMA_MAINNET]: "0xcB6Eb8df68153cebF60E1872273Ef52075a5C297",
11290
11290
  [Chain.BERACHAIN]: "0x7a59ddbB76521E8982Fa3A08598C9a83b14A6C07",
11291
- [Chain.BNB_SMART_CHAIN_MAINNET]: "0x79f4061BF049c5c6CAC6bfe2415c2460815F4ac7",
11292
- // lista lens
11291
+ // Serves BOTH Morpho Blue and Lista on 56 — one lens exposes
11292
+ // `get{,Lista,Moolah}{Market,User}DataCompact`. Byte-identical to the
11293
+ // previous entry 0x79f4061B… (same keccak), so Lista is unaffected.
11294
+ [Chain.BNB_SMART_CHAIN_MAINNET]: "0x7812227c90D55Cc1620C425980141e60b7635824",
11293
11295
  [Chain.UNICHAIN]: "0xA453ba397c61B0c292EA3959A858821145B2707F",
11294
11296
  [Chain.SEI_NETWORK]: "0xcB6Eb8df68153cebF60E1872273Ef52075a5C297",
11295
11297
  [Chain.MONAD_MAINNET]: "0x0bd7473CbBf81d9dD936c61117eD230d95006CA2",
@@ -11304,10 +11306,24 @@ var MORPHO_LENS = {
11304
11306
  [Chain.ABSTRACT]: "0x8e24cfc19c6c00c524353cb8816f5f1c2f33c201",
11305
11307
  [Chain.INK]: "0x0bd7473CbBf81d9dD936c61117eD230d95006CA2",
11306
11308
  [Chain.KAIA_MAINNET]: "0x925716D57c842B50806884EDb295bA3E3A8EBdFE",
11307
- // blue-api does not index these two, so the lens is the ONLY way to read
11309
+ // blue-api does not index these four, so the lens is the ONLY way to read
11308
11310
  // their Morpho markets — see `lenderApiOnly` in fetchLenderAll.ts.
11309
11311
  [Chain.GNOSIS]: "0x98542B95B44a4732EffB1F4F01A696F1546236d3",
11310
- [Chain.AVALANCHE_C_CHAIN]: "0x2eA75bBBc5615651efc9401FBc9Db4d03B055CA6"
11312
+ // Same address as Gnosis — same deployer + nonce.
11313
+ [Chain.XDC_NETWORK]: "0x98542B95B44a4732EffB1F4F01A696F1546236d3",
11314
+ [Chain.AVALANCHE_C_CHAIN]: "0x2eA75bBBc5615651efc9401FBc9Db4d03B055CA6",
11315
+ // Same address as HyperEVM — same deployer + nonce, so CREATE lands
11316
+ // identically on both chains.
11317
+ [Chain.MEGAETH_MAINNET]: "0x6Bc6aCB905c1216B0119C87Bf9E178ce298310FA",
11318
+ // Deployed 2026-08-03. Same reason as the block above — blue-api indexes
11319
+ // none of these, so the lens is the only read path. Sonic and Morph already
11320
+ // had markets in the registry (9 and 1) that were silently unreadable.
11321
+ [Chain.SONIC_MAINNET]: "0xd184c5315B728c1C990f59dDD275c8155f8e255c",
11322
+ [Chain.CRONOS_MAINNET]: "0x79f4061BF049c5c6CAC6bfe2415c2460815F4ac7",
11323
+ [Chain.MORPH]: "0x79f4061BF049c5c6CAC6bfe2415c2460815F4ac7",
11324
+ [Chain.MODE]: "0x2eA75bBBc5615651efc9401FBc9Db4d03B055CA6",
11325
+ [Chain.LINEA]: "0x2eA75bBBc5615651efc9401FBc9Db4d03B055CA6",
11326
+ [Chain.SCROLL]: "0x4aEA1CE479BF7E036bBB6826A2bF084bce6560a0"
11311
11327
  };
11312
11328
  var buildMorphoUserCallWithLens = (chainId, account, lender, marketsToQuery) => {
11313
11329
  const marketSlices = chunk(marketsToQuery, 100);
@@ -11323,7 +11339,13 @@ var buildMorphoUserCallWithLens = (chainId, account, lender, marketsToQuery) =>
11323
11339
  }));
11324
11340
  };
11325
11341
  var buildMorphoTypeUserCallWithLens = (chainId, account, lender, marketsToQuery, getClient) => {
11326
- return lender === Lender.MORPHO_BLUE ? buildMorphoUserCallWithLens(chainId, account, lender, marketsToQuery) : buildListaUserCallWithLens(chainId, account, lender, marketsToQuery, getClient);
11342
+ return lender === Lender.MORPHO_BLUE ? buildMorphoUserCallWithLens(chainId, account, lender, marketsToQuery) : buildListaUserCallWithLens(
11343
+ chainId,
11344
+ account,
11345
+ lender,
11346
+ marketsToQuery,
11347
+ getClient
11348
+ );
11327
11349
  };
11328
11350
  var buildListaUserCallWithLens = async (chainId, account, lender, marketsToQuery, getClient) => {
11329
11351
  await fetchListaBrokerUserData(
@@ -23962,6 +23984,14 @@ function lenderApiOnly(lender, chainId) {
23962
23984
  if (chainId === "4114") return false;
23963
23985
  if (chainId === Chain.GNOSIS) return false;
23964
23986
  if (chainId === Chain.AVALANCHE_C_CHAIN) return false;
23987
+ if (chainId === Chain.MEGAETH_MAINNET) return false;
23988
+ if (chainId === Chain.XDC_NETWORK) return false;
23989
+ if (chainId === Chain.SONIC_MAINNET) return false;
23990
+ if (chainId === Chain.CRONOS_MAINNET) return false;
23991
+ if (chainId === Chain.MORPH) return false;
23992
+ if (chainId === Chain.MODE) return false;
23993
+ if (chainId === Chain.LINEA) return false;
23994
+ if (chainId === Chain.SCROLL) return false;
23965
23995
  return true;
23966
23996
  }
23967
23997
  if (isMidnight(lender)) return true;
@@ -24246,14 +24276,14 @@ var { isArray } = lodash;
24246
24276
  var maxRetries = 3;
24247
24277
  var MULTICALL_FAILURE = "0x";
24248
24278
  var isFailedCall = (value) => value === void 0 || value === null || value === MULTICALL_FAILURE;
24249
- var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient18, nextRpcId, batchSize, logs) => {
24279
+ var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient17, nextRpcId, batchSize, logs) => {
24250
24280
  const failedIdx = [];
24251
24281
  for (let i = 0; i < mapped.length; i++) {
24252
24282
  if (isFailedCall(mapped[i])) failedIdx.push(i);
24253
24283
  }
24254
24284
  if (failedIdx.length === 0) return mapped;
24255
24285
  try {
24256
- const provider = getEvmClient18(chainId, nextRpcId);
24286
+ const provider = getEvmClient17(chainId, nextRpcId);
24257
24287
  const returnData = await provider.multicall({
24258
24288
  allowFailure: true,
24259
24289
  batchSize,
@@ -24267,9 +24297,9 @@ var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient18, nextRp
24267
24297
  }
24268
24298
  return mapped;
24269
24299
  };
24270
- var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false) => {
24300
+ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient17, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false) => {
24271
24301
  try {
24272
- const provider = getEvmClient18(chainId, providerId);
24302
+ const provider = getEvmClient17(chainId, providerId);
24273
24303
  const abiIsArray = isArray(abi[0]);
24274
24304
  const contracts = calls.map(({ address, name, params }, i) => ({
24275
24305
  abi: abiIsArray ? abi?.[i] : abi,
@@ -24291,7 +24321,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24291
24321
  chainId,
24292
24322
  contracts,
24293
24323
  res,
24294
- getEvmClient18,
24324
+ getEvmClient17,
24295
24325
  providerId + 1,
24296
24326
  batchSize,
24297
24327
  logs
@@ -24305,7 +24335,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24305
24335
  chainId,
24306
24336
  abi,
24307
24337
  calls,
24308
- getEvmClient18,
24338
+ getEvmClient17,
24309
24339
  retry,
24310
24340
  providerId,
24311
24341
  retries,
@@ -24316,13 +24346,13 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24316
24346
  );
24317
24347
  }
24318
24348
  };
24319
- var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false) => {
24349
+ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient17, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false) => {
24320
24350
  if (poolSize <= 1) {
24321
24351
  return multicallViemAbiArray(
24322
24352
  chainId,
24323
24353
  abi,
24324
24354
  calls,
24325
- getEvmClient18,
24355
+ getEvmClient17,
24326
24356
  true,
24327
24357
  0,
24328
24358
  retries,
@@ -24347,7 +24377,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolS
24347
24377
  const results = new Array(contracts.length);
24348
24378
  const runBatch = async (batch, rpcId, attemptsLeft, size) => {
24349
24379
  try {
24350
- const provider = getEvmClient18(chainId, rpcId);
24380
+ const provider = getEvmClient17(chainId, rpcId);
24351
24381
  const returnData = await provider.multicall({
24352
24382
  allowFailure,
24353
24383
  batchSize: size,
@@ -24361,7 +24391,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolS
24361
24391
  chainId,
24362
24392
  batch.items,
24363
24393
  mapped,
24364
- getEvmClient18,
24394
+ getEvmClient17,
24365
24395
  rpcId + 1,
24366
24396
  size,
24367
24397
  logs
@@ -33199,7 +33229,7 @@ function unflattenLenderData(pools) {
33199
33229
  }
33200
33230
  return result;
33201
33231
  }
33202
- var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, concurrency = 1) => {
33232
+ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient17, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, concurrency = 1) => {
33203
33233
  const queries = organizeUserQueries(queriesRaw);
33204
33234
  const builtCalls = await Promise.all(
33205
33235
  queries.map(async (query3) => {
@@ -33209,7 +33239,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowF
33209
33239
  query3.lender,
33210
33240
  query3.account,
33211
33241
  query3.params,
33212
- getEvmClient18
33242
+ getEvmClient17
33213
33243
  );
33214
33244
  return callData.map((call) => ({ call, abi: call.abi ?? abi }));
33215
33245
  })
@@ -33219,7 +33249,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowF
33219
33249
  chainId,
33220
33250
  calls.map((call) => call.abi),
33221
33251
  calls.map((call) => call.call),
33222
- getEvmClient18,
33252
+ getEvmClient17,
33223
33253
  concurrency,
33224
33254
  retries,
33225
33255
  allowFailure,
@@ -36151,6 +36181,166 @@ var monadLstFetcher = {
36151
36181
  return out;
36152
36182
  }
36153
36183
  };
36184
+ var CHAIN_ID7 = Chain.ETHEREUM_MAINNET;
36185
+ var FRXETH_SUMMARY_URL = "https://api.frax.finance/v2/frxeth/summary/latest";
36186
+ var SFRXETH = "0xac3e018457b222d93114458476f3e3416abbe38f";
36187
+ var SFRXUSD = "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6";
36188
+ var SFRAX = "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32";
36189
+ var YEAR_SECONDS3 = 31536000n;
36190
+ var ONE_E186 = 10n ** 18n;
36191
+ var SFRXETH_KEY = "SFRXETH";
36192
+ var SFRXUSD_KEY = "SFRXUSD";
36193
+ var SFRXUSD_GROUP_KEY = "Staked Frax USD::sfrxUSD";
36194
+ var SFRAX_KEY = "SFRAX";
36195
+ var SFRAX_GROUP_KEY = "Staked FRAX::SFRAX";
36196
+ var XERC4626_ABI = [
36197
+ {
36198
+ name: "rewardsCycleEnd",
36199
+ type: "function",
36200
+ stateMutability: "view",
36201
+ inputs: [],
36202
+ outputs: [{ type: "uint32" }]
36203
+ },
36204
+ {
36205
+ name: "lastSync",
36206
+ type: "function",
36207
+ stateMutability: "view",
36208
+ inputs: [],
36209
+ outputs: [{ type: "uint32" }]
36210
+ },
36211
+ {
36212
+ name: "lastRewardAmount",
36213
+ type: "function",
36214
+ stateMutability: "view",
36215
+ inputs: [],
36216
+ outputs: [{ type: "uint192" }]
36217
+ },
36218
+ {
36219
+ name: "totalAssets",
36220
+ type: "function",
36221
+ stateMutability: "view",
36222
+ inputs: [],
36223
+ outputs: [{ type: "uint256" }]
36224
+ }
36225
+ ];
36226
+ var LINEAR_REWARDS_ABI = [
36227
+ {
36228
+ name: "rewardsCycleData",
36229
+ type: "function",
36230
+ stateMutability: "view",
36231
+ inputs: [],
36232
+ outputs: [
36233
+ { type: "uint40", name: "cycleEnd" },
36234
+ { type: "uint40", name: "lastSync" },
36235
+ { type: "uint216", name: "rewardCycleAmount" }
36236
+ ]
36237
+ },
36238
+ {
36239
+ name: "maxDistributionPerSecondPerAsset",
36240
+ type: "function",
36241
+ stateMutability: "view",
36242
+ inputs: [],
36243
+ outputs: [{ type: "uint256" }]
36244
+ },
36245
+ {
36246
+ name: "storedTotalAssets",
36247
+ type: "function",
36248
+ stateMutability: "view",
36249
+ inputs: [],
36250
+ outputs: [{ type: "uint256" }]
36251
+ }
36252
+ ];
36253
+ var robustFetchJson2 = async (url, { timeoutMs = 5e3, attempts = 3 } = {}) => {
36254
+ let lastErr;
36255
+ for (let i = 0; i < attempts; i++) {
36256
+ try {
36257
+ const res = await fetch(url, {
36258
+ headers: {
36259
+ accept: "application/json",
36260
+ "user-agent": "1delta-margin-fetcher"
36261
+ },
36262
+ signal: AbortSignal.timeout(timeoutMs)
36263
+ });
36264
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
36265
+ return await res.json();
36266
+ } catch (e) {
36267
+ lastErr = e;
36268
+ if (i < attempts - 1)
36269
+ await new Promise((r) => setTimeout(r, 250 * (i + 1)));
36270
+ }
36271
+ }
36272
+ throw lastErr;
36273
+ };
36274
+ var fetchSfrxEthAprOnChain = async () => {
36275
+ const [cycleEnd, lastSync, lastRewardAmount, totalAssets] = await multicallRetryUniversal({
36276
+ chain: CHAIN_ID7,
36277
+ abi: XERC4626_ABI,
36278
+ calls: [
36279
+ { address: SFRXETH, name: "rewardsCycleEnd", params: [] },
36280
+ { address: SFRXETH, name: "lastSync", params: [] },
36281
+ { address: SFRXETH, name: "lastRewardAmount", params: [] },
36282
+ { address: SFRXETH, name: "totalAssets", params: [] }
36283
+ ],
36284
+ allowFailure: false
36285
+ });
36286
+ const window = BigInt(cycleEnd) - BigInt(lastSync);
36287
+ if (window <= 0n || totalAssets === 0n) return 0;
36288
+ const perSecond = lastRewardAmount / window;
36289
+ return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / totalAssets) / 1e16;
36290
+ };
36291
+ var fetchSfrxEthApr = async () => {
36292
+ try {
36293
+ const res = await robustFetchJson2(FRXETH_SUMMARY_URL);
36294
+ const apr = Number(res?.sfrxethApr);
36295
+ if (Number.isFinite(apr) && apr >= 0) return apr;
36296
+ throw new Error("sfrxethApr missing or non-numeric");
36297
+ } catch {
36298
+ return fetchSfrxEthAprOnChain();
36299
+ }
36300
+ };
36301
+ var fetchFraxSavingsAprs = async () => {
36302
+ const results = await multicallRetryUniversal({
36303
+ chain: CHAIN_ID7,
36304
+ abi: LINEAR_REWARDS_ABI,
36305
+ calls: [SFRXUSD, SFRAX].flatMap((address) => [
36306
+ { address, name: "rewardsCycleData", params: [] },
36307
+ { address, name: "maxDistributionPerSecondPerAsset", params: [] },
36308
+ { address, name: "storedTotalAssets", params: [] }
36309
+ ]),
36310
+ allowFailure: false
36311
+ });
36312
+ const aprAt = (offset) => {
36313
+ const [cycleEnd, lastSync, rewardCycleAmount] = results[offset];
36314
+ const maxPerSecondPerAsset = results[offset + 1];
36315
+ const storedTotalAssets = results[offset + 2];
36316
+ if (storedTotalAssets === 0n) return 0;
36317
+ const window = BigInt(cycleEnd) - BigInt(lastSync);
36318
+ const uncapped = window > 0n ? rewardCycleAmount / window : 0n;
36319
+ const cap = maxPerSecondPerAsset * storedTotalAssets / ONE_E186;
36320
+ const perSecond = uncapped < cap ? uncapped : cap;
36321
+ return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / storedTotalAssets) / 1e16;
36322
+ };
36323
+ return { sfrxUsd: aprAt(0), sfrax: aprAt(3) };
36324
+ };
36325
+ var sfrxEthFetcher = {
36326
+ label: "SFRXETH",
36327
+ fetch: async () => {
36328
+ const apr = await fetchSfrxEthApr();
36329
+ return { [SFRXETH_KEY]: apr };
36330
+ }
36331
+ };
36332
+ var fraxSavingsFetcher = {
36333
+ label: "SFRXUSD_SFRAX",
36334
+ fetch: async () => {
36335
+ const { sfrxUsd, sfrax: sfrax2 } = await fetchFraxSavingsAprs();
36336
+ return {
36337
+ [SFRXUSD_KEY]: sfrxUsd,
36338
+ [SFRXUSD_GROUP_KEY]: sfrxUsd,
36339
+ [SFRAX_KEY]: sfrax2,
36340
+ [SFRAX_GROUP_KEY]: sfrax2
36341
+ };
36342
+ }
36343
+ };
36154
36344
 
36155
36345
  // src/vaults/lst/registry.ts
36156
36346
  var LST_REGISTRY = {
@@ -36257,6 +36447,39 @@ var LST_REGISTRY = {
36257
36447
  yieldFetcher: wstethFetcher,
36258
36448
  yieldKey: "WSTETH"
36259
36449
  },
36450
+ {
36451
+ // Frax sfrxETH — a plain ERC-4626 over **frxETH**, not over ETH:
36452
+ // `asset()` is frxETH and `convertToAssets` is denominated in it,
36453
+ // so `underlying` is frxETH rather than the native sentinel.
36454
+ //
36455
+ // Two exits, and they behave differently. sfrxETH → frxETH is an
36456
+ // unconditional same-block `redeem` (the vault holds the whole
36457
+ // frxETH float), which is what `withdrawalMode` describes. frxETH
36458
+ // → ETH has **no protocol redemption at all** — the frxETHMinter
36459
+ // is one-way — so that leg is DEX-only (Curve frxETH/ETH). Modeled
36460
+ // as `instant-or-queued` because the *listed underlying* is always
36461
+ // instantly redeemable; see LST_DEPOSIT_INTERFACES.md.
36462
+ address: "0xac3e018457b222d93114458476f3e3416abbe38f",
36463
+ underlying: "0x5e8422345238f34275888049021821e8e08caa1f",
36464
+ // frxETH
36465
+ symbol: "sfrxETH",
36466
+ brand: "Frax",
36467
+ decimals: 18,
36468
+ reader: "erc4626",
36469
+ isErc4626: true,
36470
+ isRebasing: false,
36471
+ isMintable: true,
36472
+ // Native ETH mints in one call via `frxETHMinter.submitAndDeposit`
36473
+ // (ETH → frxETH → sfrxETH); the frxETH ERC-20 path is the plain
36474
+ // 4626 `deposit`. Both are declared in the calldata-sdk
36475
+ // `fraxSfrxEth` accept-set.
36476
+ isNativeUnderlying: true,
36477
+ mintContract: "0xac3e018457b222d93114458476f3e3416abbe38f",
36478
+ mintInputAsset: "0x5e8422345238f34275888049021821e8e08caa1f",
36479
+ withdrawalMode: "instant-or-queued",
36480
+ yieldFetcher: sfrxEthFetcher,
36481
+ yieldKey: "SFRXETH"
36482
+ },
36260
36483
  {
36261
36484
  address: "0xae78736cd615f374d3085123a210448e74fc6393",
36262
36485
  underlying: "0x0000000000000000000000000000000000000000",
@@ -37723,65 +37946,1418 @@ var hastraPrimeFetcher = {
37723
37946
  return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
37724
37947
  }
37725
37948
  };
37726
- var CHAIN_ID7 = "4663";
37727
- var VAULT2 = "0xde770c84fe66e063336b31737cfe9790f18c4087";
37728
- var SPARK_SAVINGS_USDG_KEY = "SPUSDG";
37729
37949
  var RAY3 = 10n ** 27n;
37730
- var WINDOW_BLOCKS6 = 400000n;
37731
- var MAX_RPC_TRIES6 = 3;
37732
- var CHI_ABI = [
37950
+ var YEAR_SECONDS4 = 31536e3;
37951
+ var SPARK_VAULTS_V2 = [
37952
+ {
37953
+ chainId: Chain.ETHEREUM_MAINNET,
37954
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
37955
+ symbol: "spUSDC",
37956
+ assetGroup: "Spark Savings USDC::SPUSDC"
37957
+ },
37958
+ {
37959
+ chainId: Chain.ETHEREUM_MAINNET,
37960
+ address: "0xe2e7a17dff93280dec073c995595155283e3c372",
37961
+ symbol: "spUSDT",
37962
+ assetGroup: "Spark Savings USDT::SPUSDT"
37963
+ },
37964
+ {
37965
+ chainId: Chain.ETHEREUM_MAINNET,
37966
+ address: "0xfe6eb3b609a7c8352a241f7f3a21cea4e9209b8f",
37967
+ symbol: "spETH",
37968
+ // NB: three unrelated tokens share the `SPETH` ticker in the list
37969
+ // (Spectrum ETH, Kroma Staked ETH) — only the full group is safe.
37970
+ assetGroup: "Spark Savings ETH::SPETH"
37971
+ },
37733
37972
  {
37734
- name: "chi",
37973
+ chainId: Chain.ETHEREUM_MAINNET,
37974
+ address: "0x80128dbb9f07b93dde62a6daeadb69ed14a7d354",
37975
+ symbol: "spPYUSD"
37976
+ },
37977
+ {
37978
+ chainId: Chain.AVALANCHE_C_CHAIN,
37979
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
37980
+ symbol: "spUSDC"
37981
+ },
37982
+ {
37983
+ chainId: Chain.ARBITRUM_ONE,
37984
+ address: "0x45d91340b3b7b96985a72b5c678f7d9e8d664b62",
37985
+ symbol: "spUSDT"
37986
+ },
37987
+ {
37988
+ chainId: Chain.X_LAYER_MAINNET,
37989
+ address: "0xc358c90d32375721cb3924320fdc2f8b694347ca",
37990
+ symbol: "spUSDT"
37991
+ },
37992
+ {
37993
+ chainId: Chain.ROBINHOOD_CHAIN,
37994
+ address: "0xde770c84fe66e063336b31737cfe9790f18c4087",
37995
+ symbol: "spUSDG"
37996
+ }
37997
+ ];
37998
+ var sparkVaultV2Key = (chainId, symbol) => `SPARK_V2::${chainId}::${symbol}`;
37999
+ var SPARK_SAVINGS_USDG_KEY = sparkVaultV2Key(
38000
+ Chain.ROBINHOOD_CHAIN,
38001
+ "spUSDG"
38002
+ );
38003
+ var SPARK_SUSDC_KEY = "SPARK_V1::sUSDC";
38004
+ var SPARK_SUSDC_GROUP_KEY = "Spark USDC Vault::sUSDC";
38005
+ var SPARK_SUSDC_LEGACY_GROUP_KEY = "Spark USDC::SUSDC";
38006
+ var SKY_SSR_SOURCE = "0xa3931d71877c0e7a3148cb7eb4463524fec27fbd";
38007
+ var VSR_ABI = [
38008
+ {
38009
+ name: "vsr",
37735
38010
  type: "function",
37736
38011
  stateMutability: "view",
37737
38012
  inputs: [],
37738
38013
  outputs: [{ type: "uint256" }]
37739
38014
  }
37740
38015
  ];
37741
- var readChiAt = (client, blockNumber) => client.readContract({
37742
- address: VAULT2,
37743
- abi: CHI_ABI,
37744
- functionName: "chi",
37745
- ...blockNumber !== void 0 ? { blockNumber } : {}
37746
- });
37747
- var computeApr7 = async () => {
37748
- let lastErr;
37749
- for (let rpcId = 0; rpcId < MAX_RPC_TRIES6; rpcId++) {
37750
- try {
37751
- const client = getEvmClient(CHAIN_ID7, rpcId);
37752
- const head = await client.getBlockNumber();
37753
- const pastBlock = head > WINDOW_BLOCKS6 ? head - WINDOW_BLOCKS6 : 0n;
37754
- const [chiNow, chiThen, headBlock, thenBlock] = await Promise.all([
37755
- readChiAt(client),
37756
- readChiAt(client, pastBlock),
37757
- client.getBlock({ blockNumber: head }),
37758
- client.getBlock({ blockNumber: pastBlock })
37759
- ]);
37760
- if (chiNow < RAY3 || chiThen < RAY3 || chiNow < chiThen) {
37761
- throw new Error(
37762
- `non-archival or invalid chi (now=${chiNow}, then=${chiThen})`
37763
- );
38016
+ var SSR_ABI = [
38017
+ {
38018
+ name: "ssr",
38019
+ type: "function",
38020
+ stateMutability: "view",
38021
+ inputs: [],
38022
+ outputs: [{ type: "uint256" }]
38023
+ }
38024
+ ];
38025
+ var aprFromVsr = (vsr) => {
38026
+ if (vsr <= RAY3) return 0;
38027
+ const perSecond = Number(vsr - RAY3) / 1e27;
38028
+ return perSecond * YEAR_SECONDS4 * 100;
38029
+ };
38030
+ var chainsOf = (vaults) => [
38031
+ ...new Set(vaults.map((v) => v.chainId))
38032
+ ];
38033
+ var fetchChain = async (chainId, vaults) => {
38034
+ const results = await multicallRetryUniversal({
38035
+ chain: chainId,
38036
+ abi: VSR_ABI,
38037
+ calls: vaults.map((v) => ({
38038
+ address: v.address,
38039
+ name: "vsr",
38040
+ params: []
38041
+ })),
38042
+ allowFailure: false
38043
+ });
38044
+ const out = {};
38045
+ vaults.forEach((v, i) => {
38046
+ const vsr = results[i];
38047
+ if (typeof vsr !== "bigint" || vsr < RAY3) return;
38048
+ const apr = aprFromVsr(vsr);
38049
+ out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
38050
+ if (v.assetGroup) out[v.assetGroup] = apr;
38051
+ });
38052
+ return out;
38053
+ };
38054
+ var fetchSusdcApr = async () => {
38055
+ const [ssr] = await multicallRetryUniversal({
38056
+ chain: Chain.ETHEREUM_MAINNET,
38057
+ abi: SSR_ABI,
38058
+ calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
38059
+ allowFailure: false
38060
+ });
38061
+ if (typeof ssr !== "bigint" || ssr < RAY3) {
38062
+ throw new Error("Spark sUSDC: unreadable ssr()");
38063
+ }
38064
+ const apr = aprFromVsr(ssr);
38065
+ return {
38066
+ [SPARK_SUSDC_KEY]: apr,
38067
+ [SPARK_SUSDC_GROUP_KEY]: apr,
38068
+ [SPARK_SUSDC_LEGACY_GROUP_KEY]: apr
38069
+ };
38070
+ };
38071
+ var sparkSavingsFetcher = {
38072
+ label: "SPARK_SAVINGS",
38073
+ fetch: async () => {
38074
+ const settled = await Promise.allSettled([
38075
+ ...chainsOf(SPARK_VAULTS_V2).map(
38076
+ (chainId) => fetchChain(
38077
+ chainId,
38078
+ SPARK_VAULTS_V2.filter((v) => v.chainId === chainId)
38079
+ )
38080
+ ),
38081
+ fetchSusdcApr()
38082
+ ]);
38083
+ const out = {};
38084
+ for (const r of settled) {
38085
+ if (r.status === "fulfilled") Object.assign(out, r.value);
38086
+ }
38087
+ if (Object.keys(out).length === 0) {
38088
+ throw new Error("Spark: no chain returned a readable rate");
38089
+ }
38090
+ return out;
38091
+ }
38092
+ };
38093
+ var RATE_ABI = [
38094
+ {
38095
+ name: "rate",
38096
+ type: "function",
38097
+ stateMutability: "view",
38098
+ inputs: [],
38099
+ outputs: [{ type: "uint256" }]
38100
+ }
38101
+ ];
38102
+ var SUSDP_VAULTS = [
38103
+ {
38104
+ chain: Chain.AVALANCHE_C_CHAIN,
38105
+ address: "0x9d92c21205383651610f90722131655a5b8ed3e0"
38106
+ },
38107
+ {
38108
+ chain: Chain.HYPEREVM,
38109
+ address: "0x9b3a8f7cec208e247d97dee13313690977e24459"
38110
+ },
38111
+ {
38112
+ chain: Chain.ETHEREUM_MAINNET,
38113
+ address: "0x0d45b129dc868963025db79a9074ea9c9e32cae4"
38114
+ },
38115
+ {
38116
+ chain: Chain.BASE,
38117
+ address: "0x472ed57b376fe400259fb28e5c46eb53f0e3e7e7"
38118
+ }
38119
+ ];
38120
+ var YEAR_SECONDS5 = 31536e3;
38121
+ var BASE_27 = 1e27;
38122
+ var aprFromRate = (rate) => Number(rate) / BASE_27 * YEAR_SECONDS5 * 100;
38123
+ var SUSDP_KEY = "SUSDP";
38124
+ var SUSDP_GROUP_KEY = "Staked USDp::sUSDp";
38125
+ var parallelFetcher = {
38126
+ label: "PARALLEL_SUSDP",
38127
+ fetch: async () => {
38128
+ let apr = 0;
38129
+ for (const { chain, address } of SUSDP_VAULTS) {
38130
+ try {
38131
+ const [rate] = await multicallRetryUniversal({
38132
+ chain,
38133
+ abi: RATE_ABI,
38134
+ calls: [{ address, name: "rate", params: [] }],
38135
+ allowFailure: false
38136
+ });
38137
+ apr = aprFromRate(rate);
38138
+ break;
38139
+ } catch {
37764
38140
  }
37765
- const elapsed = Number(headBlock.timestamp - thenBlock.timestamp);
37766
- if (elapsed <= 0) throw new Error("non-positive elapsed window");
37767
- const apr = annualizeRateDeltaPercent(chiNow, chiThen, elapsed);
37768
- if (!Number.isFinite(apr) || apr < 0) throw new Error(`bad apr ${apr}`);
37769
- return apr;
37770
- } catch (e) {
37771
- lastErr = e;
37772
38141
  }
38142
+ return { [SUSDP_KEY]: apr, [SUSDP_GROUP_KEY]: apr };
38143
+ }
38144
+ };
38145
+
38146
+ // src/yields/intrinsic/fetchers/rwaFunds.ts
38147
+ var RWA_FUNDS = {
38148
+ // Circle (ex-Hashnote) USYC — $3.0B, the largest tokenized MMF.
38149
+ // Base's `US Yield Coin::USYC` (0xeee7af83…) is unverified → skipped.
38150
+ USYC: {
38151
+ pool: "7c0a89c7-70cf-460c-b62e-cb278bf97e8f",
38152
+ keys: ["Hashnote USYC::USYC", "Circle USYC::USYC"]
38153
+ },
38154
+ // BlackRock BUIDL — $2.0B. Rebasing (NAV $1, monthly dividend
38155
+ // distributions); the percent is still the holder's carry. Chain-1
38156
+ // group is the truncated variant.
38157
+ BUIDL: {
38158
+ pool: "b663ca59-c7e6-4435-ae4a-28d339ce6a15",
38159
+ keys: [
38160
+ "BlackRock USD Institutional Digital Liquidity Fund::BUIDL",
38161
+ "BlackRock USD Institutional Digital Liq::BUIDL"
38162
+ ]
38163
+ },
38164
+ // Superstate USTB — $740M short-duration govt securities.
38165
+ USTB: {
38166
+ pool: "1910847a-f8b5-40ce-a1ab-1dafdded5fbb",
38167
+ keys: ["Superstate Short Duration US Government Securities Fund::USTB"]
38168
+ },
38169
+ // Superstate USCC — crypto-carry fund (basis, not T-bills).
38170
+ USCC: {
38171
+ pool: "aff74ce8-4fe3-462b-af11-542cc16d24b2",
38172
+ keys: ["Superstate USCC::USCC", "Superstate Crypto Carry Fund::USCC"]
38173
+ },
38174
+ // VanEck VBILL (via Securitize) — $179M.
38175
+ VBILL: {
38176
+ pool: "5663e2ef-7e9c-4755-9701-9b59b90dbba3",
38177
+ keys: ["VanEck Treasury Fund::VBILL"]
38178
+ },
38179
+ // OpenEden TBILL — bare group on 1/42161. (THBILL is Theo's fund —
38180
+ // a different asset with its own fetcher.)
38181
+ TBILL: {
38182
+ pool: "e140f3b2-0327-46ea-93f5-88b17b0a0a16",
38183
+ keys: ["TBILL"]
38184
+ },
38185
+ // OpenEden cUSDO — compounding ERC-4626 wrapper over USDO; accrues
38186
+ // USDO's T-bill yield. The sweep's one full-vault graduate: it also
38187
+ // has savings-registry rows on 1/56/8453 (permissionless wrap —
38188
+ // `maxDeposit = uint256.max` verified) binding these same keys.
38189
+ CUSDO: {
38190
+ pool: "f083596e-032d-4d6b-a7a8-1836d3f99bcd",
38191
+ keys: [
38192
+ "Compounding Open Dollar::CUSDO",
38193
+ "Compounding Open Dollar::cUSDO",
38194
+ "Compounding OpenDollar::CUSDO"
38195
+ ]
38196
+ }
38197
+ };
38198
+ var rwaFundsFetcher = {
38199
+ label: "RWA_FUNDS",
38200
+ fetch: async () => {
38201
+ const out = {};
38202
+ await Promise.all(
38203
+ Object.entries(RWA_FUNDS).map(async ([label, fund]) => {
38204
+ try {
38205
+ const apr = apyToAprPercent(await fetchDefiLlamaApy(fund.pool));
38206
+ for (const key of fund.keys) out[key] = apr;
38207
+ } catch {
38208
+ }
38209
+ })
38210
+ );
38211
+ return out;
37773
38212
  }
37774
- throw new Error(
37775
- `spUSDG APR: no Robinhood RPC returned valid historical chi (${String(lastErr)})`
37776
- );
37777
38213
  };
37778
- var sparkSavingsUsdgFetcher = {
37779
- label: "SPARK_SAVINGS_USDG",
38214
+
38215
+ // src/yields/intrinsic/fetchers/reProtocol.ts
38216
+ var REUSD_KEY = "RE::reUSD";
38217
+ var REUSDE_KEY = "RE::reUSDe";
38218
+ var REUSD_GROUP_KEY = "Re Protocol reUSD::REUSD";
38219
+ var REUSDE_GROUP_KEY = "Re Protocol reUSDe::REUSDE";
38220
+ var REUSD_POOL = "1c312830-ee96-40c9-b55f-b0f209ca6ebd";
38221
+ var REUSDE_POOL = "145810df-dc01-43e7-8033-e0aa5dceb767";
38222
+ var reProtocolFetcher = {
38223
+ label: "RE_PROTOCOL",
37780
38224
  fetch: async () => {
37781
- const apr = await computeApr7();
37782
- return { [SPARK_SAVINGS_USDG_KEY]: apr };
38225
+ const [reusd, reusde] = await Promise.allSettled([
38226
+ fetchDefiLlamaApy(REUSD_POOL),
38227
+ fetchDefiLlamaApy(REUSDE_POOL)
38228
+ ]);
38229
+ const out = {};
38230
+ if (reusd.status === "fulfilled") {
38231
+ const apr = apyToAprPercent(reusd.value);
38232
+ out[REUSD_KEY] = apr;
38233
+ out[REUSD_GROUP_KEY] = apr;
38234
+ }
38235
+ if (reusde.status === "fulfilled") {
38236
+ const apr = apyToAprPercent(reusde.value);
38237
+ out[REUSDE_KEY] = apr;
38238
+ out[REUSDE_GROUP_KEY] = apr;
38239
+ }
38240
+ if (Object.keys(out).length === 0) {
38241
+ throw new Error("Re Protocol: DefiLlama returned no apy for either pool");
38242
+ }
38243
+ return out;
38244
+ }
38245
+ };
38246
+
38247
+ // src/yields/intrinsic/fetchers/nativeCreditPool.ts
38248
+ var nativeCreditPoolYieldKey = (chainId, underlying) => `${chainId}:${underlying.toLowerCase()}`;
38249
+ var POOL_IDS = {
38250
+ // Ethereum
38251
+ "1": {
38252
+ // wNLP-USDT — 2.92 % APY at pinning (2026-07-30)
38253
+ "0xdac17f958d2ee523a2206206994597c13d831ec7": "ea6b472d-82a2-47fa-9c55-78907deebe13",
38254
+ // wNLP-USDC — 2.58 %
38255
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": "8e92a8ea-0dbd-463e-bb0b-a7f419b20db5",
38256
+ // wNLP-WETH — 2.21 %
38257
+ "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": "76aa8b2e-c5cd-4ae5-8182-c74ee969d71d",
38258
+ // wNLP-WBTC — 0.43 %
38259
+ "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599": "8c603090-cda6-4a17-975a-69a08a7dcf5e",
38260
+ // wNLP-tGLD — 0 %
38261
+ "0x6a547b25534234bb79ce6961a23db13de154b6f4": "eb208601-24b8-5291-8c13-1327208ef2e9",
38262
+ // wNLP-STONEUSD — 0 %
38263
+ "0x6a6e3a4396993a4ec98a6f4a654cc0819538721e": "09f09cf1-915a-4b71-82eb-5f6c54f0cc68"
38264
+ },
38265
+ // BNB Chain
38266
+ "56": {
38267
+ // wNLP-Q3B (QQQB) — 36.42 % on a $4.2 M tokenized-equity pool
38268
+ "0x205812cdbed920aff76c6580abd681a46d11efc7": "a5bd33df-4410-5631-a44b-bab8214b1dc2",
38269
+ // wNLP-USDT — 3.40 %
38270
+ "0x55d398326f99059ff775485246999027b3197955": "14ca42f2-1d51-4093-b5c8-74effe4c5cf3",
38271
+ // wNLP-WBNB — 1.17 %
38272
+ "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c": "cd637956-e278-4462-a030-8d0d26a63a5c",
38273
+ // wNLP-P4B (PLTRB) — 0 %
38274
+ "0x0ca5d51d0277bd006fd9607d3e560785ebad8222": "a36f61e0-31d4-5bce-85c1-b7cfd57b2c21",
38275
+ // wNLP-S4B (SNDKB) — 0 %
38276
+ "0x3ee4df61bd4f867e349beae8bfe07bc31b4850fb": "06081a23-0157-4141-951b-eae858070214",
38277
+ // wNLP-T4B (TSLAB) — 0 %
38278
+ "0x5b1910eaad6450e50f816082aa078c41f10c292f": "44b167ce-b22c-4294-8877-4f71042bdd13",
38279
+ // wNLP-L4B (LITEB) — 0 %
38280
+ "0x64748bea17b6d19e242adf20425de2440c656142": "aa632ad9-f1e1-5b35-a76a-33006320aa1e",
38281
+ // wNLP-M5B (METAB) — 0 %
38282
+ "0x7425889fe94f9d693e8daefe88bcced6acfef4c0": "75edd0e5-82b9-5ff8-beba-4d9f07322990",
38283
+ // wNLP-M6B (MSFTB) — 0 %
38284
+ "0x80106cb3ead06659a5ad19df39d9b4733863b9b0": "8d6849a9-6bcb-550d-b916-38a0e792a097",
38285
+ // wNLP-C4B (CRCLB) — 0 %
38286
+ "0x80f3d493ebce97e343c53d29a137942416b4ffc0": "a1e52090-7faf-46e9-9e1e-174982f4cad9",
38287
+ // wNLP-USDC — 0 %
38288
+ "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": "0f76c834-6f24-4187-b7d5-6f3d641c3123",
38289
+ // wNLP-USD1 — 0 %
38290
+ "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d": "28211a21-46c4-4a0d-807a-f010b304c3d0",
38291
+ // wNLP-M2B (MUB) — 0 %
38292
+ "0xcdf2f3e0fa43c47a6662a91c9e4a7c5f69762699": "1687633e-61ff-49d4-9256-5734ba06e595"
38293
+ },
38294
+ // Arbitrum
38295
+ "42161": {
38296
+ // wNLP-USDT (USD₮0) — 2.57 %
38297
+ "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": "a6dc5af9-ff47-44f4-ad38-a0c6fc62278e",
38298
+ // wNLP-WETH — 0.88 %
38299
+ "0x82af49447d8a07e3bd95bd0d56f35241523fbab1": "1b7193de-1ddf-48b7-81d2-13f082a8cf3a"
38300
+ },
38301
+ // Base
38302
+ "8453": {
38303
+ // wNLP-USDC — 3.52 %
38304
+ "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": "a057d9d8-99d4-4017-bb59-b96f67366178",
38305
+ // wNLP-WETH — 1.98 %
38306
+ "0x4200000000000000000000000000000000000006": "9f1d3455-050c-482c-93e0-e1271d240cec"
37783
38307
  }
37784
38308
  };
38309
+ var buildChainFetcher = (chainId, pools) => ({
38310
+ label: `NATIVE_CREDIT_POOL_${chainId}`,
38311
+ fetch: async () => {
38312
+ const rows = Object.entries(pools);
38313
+ const settled = await Promise.allSettled(
38314
+ rows.map(([, poolId]) => fetchDefiLlamaApy(poolId))
38315
+ );
38316
+ const out = {};
38317
+ settled.forEach((res, i) => {
38318
+ if (res.status !== "fulfilled") return;
38319
+ if (!Number.isFinite(res.value)) return;
38320
+ out[nativeCreditPoolYieldKey(chainId, rows[i][0])] = apyToAprPercent(
38321
+ res.value
38322
+ );
38323
+ });
38324
+ return out;
38325
+ }
38326
+ });
38327
+ var FETCHERS = Object.fromEntries(
38328
+ Object.entries(POOL_IDS).map(([chainId, pools]) => [
38329
+ chainId,
38330
+ buildChainFetcher(chainId, pools)
38331
+ ])
38332
+ );
38333
+ var nativeCreditPoolFetcher = (chainId) => FETCHERS[chainId];
38334
+
38335
+ // src/vaults/savings/registryNative.ts
38336
+ var NATIVE_CREDIT_VAULT = {
38337
+ "1": "0xe3d41d19564922c9952f692c5dd0563030f5f2ef",
38338
+ // Ethereum
38339
+ "56": "0xba8db0caf781cac69b6acf6c848ac148264cc05d",
38340
+ // BNB Chain
38341
+ "42161": "0xba1cf8a63227b46575af823beb4d83d1025eff09",
38342
+ // Arbitrum
38343
+ "8453": "0x74a4cd023e5afb88369e3f22b02440f2614a1367",
38344
+ // Base
38345
+ "143": "0xcd1d2d602c3e7394515daae96e4ffe16de71e5b4",
38346
+ // Monad
38347
+ "196": "0x4df7557734b382eb542bea6c74786d398df4cc19",
38348
+ // X Layer
38349
+ "4663": "0x57b8f68ef57af2db70bc9aac891836661ca4cb51",
38350
+ // Robinhood Chain
38351
+ "2818": "0x4df7557734b382eb542bea6c74786d398df4cc19"
38352
+ // Morph
38353
+ };
38354
+ var NATIVE_WNLP_ROWS = {
38355
+ // Ethereum — 24 pools, 7 funded, 6 with a DefiLlama APR.
38356
+ "1": [
38357
+ [
38358
+ "wNLP-WETH",
38359
+ "0x50ecabe78ae99bb1adc292a94e535feb0ed29853",
38360
+ "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
38361
+ "0x79dcfeb6f52977ef899d92bece132e95c3d08b66",
38362
+ 18,
38363
+ 259200
38364
+ ],
38365
+ [
38366
+ "wNLP-WBTC",
38367
+ "0x9441f31ab75f466a8afdc67a0fa65241f7600f5a",
38368
+ "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
38369
+ "0x0a1a4d7cb85b231cc9223730d2ae0582ddad228a",
38370
+ 8,
38371
+ 259200
38372
+ ],
38373
+ [
38374
+ "wNLP-USDT",
38375
+ "0xc31daeeb822790e9ca730e7e34a9ef497fffc959",
38376
+ "0xdac17f958d2ee523a2206206994597c13d831ec7",
38377
+ "0xd1f2d929881abb26e5780d202d3c550df264791c",
38378
+ 6,
38379
+ 259200
38380
+ ],
38381
+ [
38382
+ "wNLP-USDC",
38383
+ "0x3c339289baa2eab3802c1f0c10e025b29bdbea1a",
38384
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
38385
+ "0x231c3946b3a4ea1163744f236a184f796a8e18a1",
38386
+ 6,
38387
+ 259200
38388
+ ],
38389
+ [
38390
+ "wNLP-STONEUSD",
38391
+ "0xb88791ef86d10037f7481b4e3fcbca5bb4162bfa",
38392
+ "0x6a6e3a4396993a4ec98a6f4a654cc0819538721e",
38393
+ "0x65dd5953ac28018207da0a309d0304cd53e5b734",
38394
+ 18,
38395
+ 28800
38396
+ ],
38397
+ // 8h queue, 0bips instant fee
38398
+ [
38399
+ "wNLP-CRCLon",
38400
+ "0xaeb7c9122d897a224180d2ca25bc86a16d12ae92",
38401
+ "0x3632dea96a953c11dac2f00b4a05a32cd1063fae",
38402
+ "0x5b2bc2d8ad715391aff2ffa0f3f19d3a4c6686ed",
38403
+ 18,
38404
+ 259200
38405
+ ],
38406
+ // unfunded, no APR feed
38407
+ [
38408
+ "wNLP-GOOGLon",
38409
+ "0x66924f881bd0cbfabded19838c5f5443867359d9",
38410
+ "0xba47214edd2bb43099611b208f75e4b42fdcfedc",
38411
+ "0x6285d06426eef9beef33ee92eab7f491f736da57",
38412
+ 18,
38413
+ 259200
38414
+ ],
38415
+ // unfunded, no APR feed
38416
+ [
38417
+ "wNLP-INTCon",
38418
+ "0xb5cebfa986dd20a674be725bacebabec458abc84",
38419
+ "0xfda09936dbd717368de0835ba441d9e62069d36f",
38420
+ "0x97c156ec88085e8a057955908d056e55fc0ac589",
38421
+ 18,
38422
+ 259200
38423
+ ],
38424
+ // unfunded, no APR feed
38425
+ [
38426
+ "wNLP-MRVLon",
38427
+ "0x3b1dbe5ca2d39fac168e3575d707b714a7eaa7e7",
38428
+ "0xf404e5f887dbd5508e16a1198fcdd5de1a4296b8",
38429
+ "0x7f24d9dc37483a50fcbabdb2274cf8748ae0907a",
38430
+ 18,
38431
+ 259200
38432
+ ],
38433
+ // unfunded, no APR feed
38434
+ [
38435
+ "wNLP-MUon",
38436
+ "0x1e42d39df3e927c0765f258a8b7f75726350f41b",
38437
+ "0x050362ab1072cb2ce74d74770e22a3203ad04ee5",
38438
+ "0x3ee49a51a5efa599ff544fd37f197bbf15536e04",
38439
+ 18,
38440
+ 259200
38441
+ ],
38442
+ // unfunded, no APR feed
38443
+ [
38444
+ "wNLP-NVDAon",
38445
+ "0xe74ee33a50a9eab6f62cb22f44b1e72e5579894c",
38446
+ "0x2d1f7226bd1f780af6b9a49dcc0ae00e8df4bdee",
38447
+ "0x3f527be145afa0e808c41ec9060513dbb82afe0c",
38448
+ 18,
38449
+ 259200
38450
+ ],
38451
+ // unfunded, no APR feed
38452
+ [
38453
+ "wNLP-QQQon",
38454
+ "0xe05f1635756b6f5046e53f8e911a14794a73a4e7",
38455
+ "0x0e397938c1aa0680954093495b70a9f5e2249aba",
38456
+ "0x9d2f7e285557c65416fb2bbb268d509e9e2eb2b3",
38457
+ 18,
38458
+ 259200
38459
+ ],
38460
+ // unfunded, no APR feed
38461
+ [
38462
+ "wNLP-SPCXon",
38463
+ "0xbffaaa25d2b8fe6e3e8c2c790673fa0c28c64bd4",
38464
+ "0xc9eef266834730340a55b6cc24621b31baf55581",
38465
+ "0xe66430ce224b1e65100d1b9a15381aa59e17e4b4",
38466
+ 18,
38467
+ 259200
38468
+ ],
38469
+ // unfunded, no APR feed
38470
+ [
38471
+ "wNLP-TSLAon",
38472
+ "0x0183d055c77310af03dcb397efaa7e9cfb6db59b",
38473
+ "0xf6b1117ec07684d3958cad8beb1b302bfd21103f",
38474
+ "0x0cb46d89ed4ae005160b3270fafe453c43bba664",
38475
+ 18,
38476
+ 259200
38477
+ ],
38478
+ // no APR feed
38479
+ [
38480
+ "wNLP-CRCLx",
38481
+ "0x2ba837484e8969da87d237effedea7badd294dd9",
38482
+ "0xfebded1b0986a8ee107f5ab1a1c5a813491deceb",
38483
+ "0x149d45c599203e06d727b7d10bb00f7035023932",
38484
+ 18,
38485
+ 259200
38486
+ ],
38487
+ // unfunded, no APR feed
38488
+ [
38489
+ "wNLP-GOOGLx",
38490
+ "0x8425b76b81008d6b8f0ed468d72a2098fc13b2d2",
38491
+ "0xe92f673ca36c5e2efd2de7628f815f84807e803f",
38492
+ "0x8cbbace186e3411b61d57b897c916b912a36991a",
38493
+ 18,
38494
+ 259200
38495
+ ],
38496
+ // unfunded, no APR feed
38497
+ [
38498
+ "wNLP-NVDAx",
38499
+ "0x2014e669ab74e114aa155c6b9c162bb26a5b9972",
38500
+ "0xc845b2894dbddd03858fd2d643b4ef725fe0849d",
38501
+ "0x6540c6b85ade3601f9bdf5b2d8712615dbd7730b",
38502
+ 18,
38503
+ 259200
38504
+ ],
38505
+ // unfunded, no APR feed
38506
+ [
38507
+ "wNLP-QQQx",
38508
+ "0x12a81e5b0721e62d907ae5527031fb29f9eef323",
38509
+ "0xa753a7395cae905cd615da0b82a53e0560f250af",
38510
+ "0xe004a1ff7633a53530e697eec8e9de952d792abb",
38511
+ 18,
38512
+ 259200
38513
+ ],
38514
+ // unfunded, no APR feed
38515
+ [
38516
+ "wNLP-SPCXx",
38517
+ "0x405a559b5c0fcb207ddd60dd2b87e9f6b5798564",
38518
+ "0x68fa48b1c2fe52b3d776e1953e0e782b5044ce28",
38519
+ "0x17beb26401a50d139e167d80e22494e17df040cd",
38520
+ 18,
38521
+ 259200
38522
+ ],
38523
+ // unfunded, no APR feed
38524
+ [
38525
+ "wNLP-TSLAx",
38526
+ "0x95603e6d7753833b1ad9feba5f4e7213ba5b1d8a",
38527
+ "0x8ad3c73f833d3f9a523ab01476625f269aeb7cf0",
38528
+ "0x8f8ce39752ef02916a13422568aea6a4cc178d16",
38529
+ 18,
38530
+ 259200
38531
+ ],
38532
+ // unfunded, no APR feed
38533
+ [
38534
+ "wNLP-PAXG",
38535
+ "0xa15100ee8c648dd9d01271424bface4891aa2e8f",
38536
+ "0x45804880de22913dafe09f4980848ece6ecbaf78",
38537
+ "0xc6e39e6ffc712708d229685fa7ca1abca4309377",
38538
+ 18,
38539
+ 259200
38540
+ ],
38541
+ // unfunded, no APR feed
38542
+ [
38543
+ "wNLP-XAUt",
38544
+ "0x894e71b1cdf9fb8775d54dd911d60d5bd2a0e256",
38545
+ "0x68749665ff8d2d112fa859aa293f07a622782f38",
38546
+ "0x63b102f73c19e6fb0cb3545182d97371dbab62fc",
38547
+ 6,
38548
+ 259200
38549
+ ],
38550
+ // unfunded, no APR feed
38551
+ [
38552
+ "wNLP-tGLD",
38553
+ "0x72bc5907f4bd6963a145cad7fe6538927062bec4",
38554
+ "0x6a547b25534234bb79ce6961a23db13de154b6f4",
38555
+ "0xecff722c6a57c097b12d5e6a77bd8ad15bae4f0f",
38556
+ 18,
38557
+ 259200
38558
+ ],
38559
+ [
38560
+ "wNLP-DRAMon",
38561
+ "0x4aa3d1cca957ee0c21333b7465fc94feab45037a",
38562
+ "0xdb5a8f5b4c17f2ee2e7192a150687e48eb3c415d",
38563
+ "0x6b5ce3319e47f3c59a27564b5f49ae1926322633",
38564
+ 18,
38565
+ 259200
38566
+ ]
38567
+ // unfunded, no APR feed
38568
+ ],
38569
+ // BNB Chain — 49 pools, 19 funded, 13 with a DefiLlama APR.
38570
+ "56": [
38571
+ [
38572
+ "wNLP-WBNB",
38573
+ "0x85f08a266758ea0c98b15deae71ca6ee84392afa",
38574
+ "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
38575
+ "0x9e0de0b11cd3b50370ddabf3926553c4fc3cb956",
38576
+ 18,
38577
+ 259200
38578
+ ],
38579
+ [
38580
+ "wNLP-ETH",
38581
+ "0xfafae0cdec65cdd601ffc39f472dd4f5c7bd0721",
38582
+ "0x2170ed0880ac9a755fd29b2688956bd959f933f8",
38583
+ "0x3906f7078b25b3d4a568438da7be5c0abbe481a8",
38584
+ 18,
38585
+ 259200
38586
+ ],
38587
+ // unfunded, no APR feed
38588
+ [
38589
+ "wNLP-USDT",
38590
+ "0xea5ff211ef700dccc521a1e6501c9fe1b95d8ee7",
38591
+ "0x55d398326f99059ff775485246999027b3197955",
38592
+ "0xb88791ef86d10037f7481b4e3fcbca5bb4162bfa",
38593
+ 18,
38594
+ 259200
38595
+ ],
38596
+ [
38597
+ "wNLP-USDC",
38598
+ "0x8592ffff658310150befd83c3c5de326e9bf6f0d",
38599
+ "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d",
38600
+ "0x38eda6dd1def97aaa07d5fa781395221305bc3f1",
38601
+ 18,
38602
+ 259200
38603
+ ],
38604
+ [
38605
+ "wNLP-USD1",
38606
+ "0x2f6f303924f0fdc559c57a14cb73dd9a4d611bd8",
38607
+ "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d",
38608
+ "0x92903262eff424cae02d6f7b7b0a486e4c7ef24b",
38609
+ 18,
38610
+ 28800
38611
+ ],
38612
+ // 8h queue, 0bips instant fee
38613
+ [
38614
+ "wNLP-STONEUSD",
38615
+ "0xa1cc671f9b975d0a548c436175b99891db961934",
38616
+ "0x8b4e28607bdcacbf937f81f29e3dafe7bc1d7c0b",
38617
+ "0x5b8382383c7d5bb5341cc3dc97cb09d5b5a5e798",
38618
+ 18,
38619
+ 28800
38620
+ ],
38621
+ // unfunded, no APR feed, 8h queue, 0bips instant fee
38622
+ [
38623
+ "wNLP-CRCLon",
38624
+ "0x50fbc992085b065a404fb007e344d49c558047b2",
38625
+ "0x992879cd8ce0c312d98648875b5a8d6d042cbf34",
38626
+ "0x8a3d397caddd88e725e012af97bb1af3fee3f250",
38627
+ 18,
38628
+ 259200
38629
+ ],
38630
+ // no APR feed
38631
+ [
38632
+ "wNLP-GOOGLon",
38633
+ "0x14e13011121fa293d20a4d9a7037814f3c932860",
38634
+ "0x091fc7778e6932d4009b087b191d1ee3bac5729a",
38635
+ "0x0335ab1c86aaea2c442d10fec9e54261a4e0cc90",
38636
+ 18,
38637
+ 259200
38638
+ ],
38639
+ // unfunded, no APR feed
38640
+ [
38641
+ "wNLP-INTCon",
38642
+ "0x6b3de4f43d20c7b29bca9850dfbf6bf94824e67e",
38643
+ "0xa528caaa2f96090e379d43f90834c75df54d6e74",
38644
+ "0x7facfe33b3a0de1ef8cdf15d8717439e9f60cc24",
38645
+ 18,
38646
+ 259200
38647
+ ],
38648
+ // unfunded, no APR feed
38649
+ [
38650
+ "wNLP-MRVLon",
38651
+ "0x0d8de51813ef9b8634d3b91086884d3045a5f3e8",
38652
+ "0x1501ec83ffef405b4331cc4f73277a40fb0c627d",
38653
+ "0x2ac5c050b88a00e395a12b0d724f38a1f32050ad",
38654
+ 18,
38655
+ 259200
38656
+ ],
38657
+ // unfunded, no APR feed
38658
+ [
38659
+ "wNLP-MUon",
38660
+ "0x3a18cde8a81060bdc7cace60ecbc2f01765f6008",
38661
+ "0x8b6acf6041a81567f012ff6a4c6d96d5818d74bf",
38662
+ "0x542c912b0e20895eeba104503d221683e1ceddc9",
38663
+ 18,
38664
+ 259200
38665
+ ],
38666
+ // unfunded, no APR feed
38667
+ [
38668
+ "wNLP-NVDAon",
38669
+ "0x493fb39c8e37726539d3fb074c333a1eab58e36b",
38670
+ "0xa9ee28c80f960b889dfbd1902055218cba016f75",
38671
+ "0x912ce4b093fc7ce0de3cc64e9cd626706da838b7",
38672
+ 18,
38673
+ 259200
38674
+ ],
38675
+ // unfunded, no APR feed
38676
+ [
38677
+ "wNLP-QQQon",
38678
+ "0x03e7dce34eed4adc4b228d00a28deba2b7941266",
38679
+ "0x0cde6936d305d5b34667fc46425e852efd73559a",
38680
+ "0x83ae22182fab9e75f7b85745693fc55100d18ca0",
38681
+ 18,
38682
+ 259200
38683
+ ],
38684
+ // unfunded, no APR feed
38685
+ [
38686
+ "wNLP-SPCXon",
38687
+ "0xb810dc8f7ffc2318931b4af211592eac5e1d0190",
38688
+ "0xd0a58bc9d88d3ff48c0294cb7e45937d0e41a928",
38689
+ "0xcbd0d2627cb03da58dd8ee5bc62c964cb61d4734",
38690
+ 18,
38691
+ 259200
38692
+ ],
38693
+ // unfunded, no APR feed
38694
+ [
38695
+ "wNLP-TSLAon",
38696
+ "0x73be73e7570fbcbd3d83de1e32ae5594c3963fe1",
38697
+ "0x2494b603319d4d9f9715c9f4496d9e0364b59d93",
38698
+ "0xbf9640dd79e916f386e2c89566654b6fe16b0f65",
38699
+ 18,
38700
+ 259200
38701
+ ],
38702
+ // unfunded, no APR feed
38703
+ [
38704
+ "wNLP-DRAMon",
38705
+ "0x90cc94befe6c6437de7c6ded32a4dc25ebbee3d2",
38706
+ "0x087b5761b161429013d41ea54cd2fb6022a21564",
38707
+ "0x8ccb472112d0fe00ba7f8b8b9fc407e68d78f62b",
38708
+ 18,
38709
+ 259200
38710
+ ],
38711
+ // unfunded, no APR feed
38712
+ [
38713
+ "wNLP-CRCLx",
38714
+ "0xddfe8d98a0b459a2a2906e02ab3dd5a5bbc303c8",
38715
+ "0xfebded1b0986a8ee107f5ab1a1c5a813491deceb",
38716
+ "0x4d722dc923510a9ec4cfb3c41c414b15cbce4df0",
38717
+ 18,
38718
+ 259200
38719
+ ],
38720
+ // unfunded, no APR feed
38721
+ [
38722
+ "wNLP-GOOGLx",
38723
+ "0xa8d9eb043d4bc05e4b0dac89cd5837cf40fb3bc5",
38724
+ "0xe92f673ca36c5e2efd2de7628f815f84807e803f",
38725
+ "0x2db1571c7c7954e546c8f0870cfa16b244b7f6ff",
38726
+ 18,
38727
+ 259200
38728
+ ],
38729
+ // unfunded, no APR feed
38730
+ [
38731
+ "wNLP-NVDAx",
38732
+ "0x358100ed7ecdd6c608d9d5e642e34b1a2ba152b7",
38733
+ "0xc845b2894dbddd03858fd2d643b4ef725fe0849d",
38734
+ "0xef435b99c2108d0309211d0cc05b70d202c0b5df",
38735
+ 18,
38736
+ 259200
38737
+ ],
38738
+ // unfunded, no APR feed
38739
+ [
38740
+ "wNLP-QQQx",
38741
+ "0x427fb58709c47fb8794771bd2e17784c0cda845a",
38742
+ "0xa753a7395cae905cd615da0b82a53e0560f250af",
38743
+ "0x7768aa6322ab912bee159191ec3380df13f6db37",
38744
+ 18,
38745
+ 259200
38746
+ ],
38747
+ // unfunded, no APR feed
38748
+ [
38749
+ "wNLP-SPCXx",
38750
+ "0x335d144f211c3f4dedb3ef1fe003cbc7dd9c24a9",
38751
+ "0x68fa48b1c2fe52b3d776e1953e0e782b5044ce28",
38752
+ "0xee880bf2050a23bb84dd4734dd7413d9d9793500",
38753
+ 18,
38754
+ 259200
38755
+ ],
38756
+ // unfunded, no APR feed
38757
+ [
38758
+ "wNLP-TSLAx",
38759
+ "0xbcac5180fc867d741d06e1aafde15d65ca16d3f3",
38760
+ "0x8ad3c73f833d3f9a523ab01476625f269aeb7cf0",
38761
+ "0x826d54e624c59a01fe2917cda2429d3058880099",
38762
+ 18,
38763
+ 259200
38764
+ ],
38765
+ // unfunded, no APR feed
38766
+ [
38767
+ "wNLP-A4B",
38768
+ "0xd8a25f5e864534bb2324f2eff6f5c3dd58693b8b",
38769
+ "0x75fd4cf6f8392e41e70391d60c90c0d5211603a1",
38770
+ "0xf4166b08dc7eea43101066ef8f52fb95d994d62c",
38771
+ 18,
38772
+ 259200
38773
+ ],
38774
+ // no APR feed
38775
+ [
38776
+ "wNLP-COINB",
38777
+ "0x16ccbca076c24d1c174cddc8ce30389097bf8982",
38778
+ "0x585bde7c54abb5ccd7791f923d6c2187635f3952",
38779
+ "0xe7290a875d32f676b715283e1eafdfcece97110b",
38780
+ 18,
38781
+ 259200
38782
+ ],
38783
+ // unfunded, no APR feed
38784
+ [
38785
+ "wNLP-C4B",
38786
+ "0xe05f1635756b6f5046e53f8e911a14794a73a4e7",
38787
+ "0x80f3d493ebce97e343c53d29a137942416b4ffc0",
38788
+ "0x9d2f7e285557c65416fb2bbb268d509e9e2eb2b3",
38789
+ 18,
38790
+ 259200
38791
+ ],
38792
+ [
38793
+ "wNLP-DRAMB",
38794
+ "0x52207f4c347631abb40484e30c71fa66660581a7",
38795
+ "0x93862d63fd9fd488b1328e9b47717d75e994a84b",
38796
+ "0xd805265e8e1c003c65d7e2565149289459b2911f",
38797
+ 18,
38798
+ 259200
38799
+ ],
38800
+ // unfunded, no APR feed
38801
+ [
38802
+ "wNLP-E3B",
38803
+ "0x3dac466a0190ce1dd7a062290ce48310206b4bca",
38804
+ "0xbe82f76637dba2c114c41df856c2c51e522e2cb8",
38805
+ "0x50b91e72b7a4a5eaf926931e4a6b3357c26235b2",
38806
+ 18,
38807
+ 259200
38808
+ ],
38809
+ // no APR feed
38810
+ [
38811
+ "wNLP-GLWB",
38812
+ "0xfc6fdde35860a327be88f54bf35993f72de91a87",
38813
+ "0x740e075cbbea22a082b9d6679e65e82767875b6a",
38814
+ "0xbe38df1755e942e11241c2a39e029f9359a483e3",
38815
+ 18,
38816
+ 259200
38817
+ ],
38818
+ // unfunded, no APR feed
38819
+ [
38820
+ "wNLP-GOOGLB",
38821
+ "0x38982f1604d2459f317ca9ff03808b17d4d9754b",
38822
+ "0x3f53de71c126bdabae20f9cd64848d317f6c3238",
38823
+ "0x7de2d4edc91dbef780f0c4f59828e752a9f43bac",
38824
+ 18,
38825
+ 259200
38826
+ ],
38827
+ // unfunded, no APR feed
38828
+ [
38829
+ "wNLP-I4B",
38830
+ "0x737b83b17156348b84157d528e02bd9acec4163a",
38831
+ "0xe614e2fc6c787035ff51f452e8e826bfd32d5283",
38832
+ "0xe31013938457f086958c32a921a6ec17f468902d",
38833
+ 18,
38834
+ 259200
38835
+ ],
38836
+ // no APR feed
38837
+ [
38838
+ "wNLP-L4B",
38839
+ "0xcf76092d538e4df7a1e8dc3eb8c21be1d462a5da",
38840
+ "0x64748bea17b6d19e242adf20425de2440c656142",
38841
+ "0xa97aea8e9d81771d4566cd1a636b58b600a1e3e8",
38842
+ 18,
38843
+ 259200
38844
+ ],
38845
+ [
38846
+ "wNLP-M5B",
38847
+ "0x25fe9180e6c95da24b7a3fcff8bf2dbca1fb171a",
38848
+ "0x7425889fe94f9d693e8daefe88bcced6acfef4c0",
38849
+ "0x4c234c7575f762066b59670d52478c12a1d2c0ff",
38850
+ 18,
38851
+ 259200
38852
+ ],
38853
+ [
38854
+ "wNLP-M6B",
38855
+ "0x19bbae8f804b0ea4c7c4351f722fd39efe37c2b2",
38856
+ "0x80106cb3ead06659a5ad19df39d9b4733863b9b0",
38857
+ "0x94cd73e04503537da2aa129832a0e3580d8f76a3",
38858
+ 18,
38859
+ 259200
38860
+ ],
38861
+ [
38862
+ "wNLP-M4B",
38863
+ "0xafcd64ebfc83d57ddf5716f3814019f5543d7c46",
38864
+ "0xe87afb3076aeb0f9b14e368de8145ae6a2826a14",
38865
+ "0x8729f978393fe4a71a819c392822f80a0600f260",
38866
+ 18,
38867
+ 259200
38868
+ ],
38869
+ // no APR feed
38870
+ [
38871
+ "wNLP-M2B",
38872
+ "0x66924f881bd0cbfabded19838c5f5443867359d9",
38873
+ "0xcdf2f3e0fa43c47a6662a91c9e4a7c5f69762699",
38874
+ "0x6285d06426eef9beef33ee92eab7f491f736da57",
38875
+ 18,
38876
+ 259200
38877
+ ],
38878
+ [
38879
+ "wNLP-NBISB",
38880
+ "0x4d45a527b03551821c8d7d8974b939ed6a2824ec",
38881
+ "0xe256bc2a4f5297f8ba6f043f180a46300ecbcbb1",
38882
+ "0x1bbdd8da349ba112b51e644f10bab6598db4330b",
38883
+ 18,
38884
+ 259200
38885
+ ],
38886
+ // unfunded, no APR feed
38887
+ [
38888
+ "wNLP-N4B",
38889
+ "0x2ba837484e8969da87d237effedea7badd294dd9",
38890
+ "0x02fca66c1d1afb4e2a7884261eb00f63598a7436",
38891
+ "0x149d45c599203e06d727b7d10bb00f7035023932",
38892
+ 18,
38893
+ 259200
38894
+ ],
38895
+ // unfunded, no APR feed
38896
+ [
38897
+ "wNLP-P4B",
38898
+ "0x93da79355ae801a673e4d3b656a4152330646ee4",
38899
+ "0x0ca5d51d0277bd006fd9607d3e560785ebad8222",
38900
+ "0xe5ed3ae9fca303126526d4084481fd0b9f589a97",
38901
+ 18,
38902
+ 259200
38903
+ ],
38904
+ [
38905
+ "wNLP-QCOMB",
38906
+ "0xdfa34465d1c6c044304b798fa4a147eac579b66b",
38907
+ "0x5f7a56e877b9130608bf8be962621011182fefe1",
38908
+ "0x8618171d00f972b6b40a7c20dd9f9b3d6efdb673",
38909
+ 18,
38910
+ 259200
38911
+ ],
38912
+ // unfunded, no APR feed
38913
+ [
38914
+ "wNLP-Q3B",
38915
+ "0x564d609b363b902148af559c18aa1bc84bf29a5b",
38916
+ "0x205812cdbed920aff76c6580abd681a46d11efc7",
38917
+ "0xbb389a0ae36d5dc04967b1866c8f9835eca9f895",
38918
+ 18,
38919
+ 259200
38920
+ ],
38921
+ [
38922
+ "wNLP-S4B",
38923
+ "0x2014e669ab74e114aa155c6b9c162bb26a5b9972",
38924
+ "0x3ee4df61bd4f867e349beae8bfe07bc31b4850fb",
38925
+ "0x6540c6b85ade3601f9bdf5b2d8712615dbd7730b",
38926
+ 18,
38927
+ 259200
38928
+ ],
38929
+ [
38930
+ "wNLP-SOXLB",
38931
+ "0xcd1c23eaec3bbdef5f945f2b352b188c8a3b14d3",
38932
+ "0xd97d097a89113fa59b76c572e5b2eb647e8eefaf",
38933
+ "0x7ee63c39be8f868991830f47b167c21c0c1bf23c",
38934
+ 18,
38935
+ 259200
38936
+ ],
38937
+ // unfunded, no APR feed
38938
+ [
38939
+ "wNLP-S5B",
38940
+ "0xf27760f7b431ad8caee0f4e3062e6140b14e0ebc",
38941
+ "0xbe9d156892e55e7154bcd3cb0fea677f9d3103e1",
38942
+ "0x8386c857577fced92537aea6e5112f38da46212a",
38943
+ 18,
38944
+ 259200
38945
+ ],
38946
+ // no APR feed
38947
+ [
38948
+ "wNLP-SPYB",
38949
+ "0x5c53355123a51bd800934e0fa1f8eb8c9f3a848b",
38950
+ "0x7138b48df7d98d7e3cc221bfe7192d0a178182d8",
38951
+ "0x1535fa32cd0bcf66309da5209dbfca4f4c466ce1",
38952
+ 18,
38953
+ 259200
38954
+ ],
38955
+ // unfunded, no APR feed
38956
+ [
38957
+ "wNLP-T4B",
38958
+ "0xaeb7c9122d897a224180d2ca25bc86a16d12ae92",
38959
+ "0x5b1910eaad6450e50f816082aa078c41f10c292f",
38960
+ "0x5b2bc2d8ad715391aff2ffa0f3f19d3a4c6686ed",
38961
+ 18,
38962
+ 259200
38963
+ ],
38964
+ [
38965
+ "wNLP-WDCB",
38966
+ "0x3bdd26cf07bd97baa5f2a588cb6a67b83c7a60a5",
38967
+ "0xebe29695f8047c13d36e7a790ca8c1b239ffad1c",
38968
+ "0x22e87beb7307dcac4ab20b4a23080a3b7a078ff5",
38969
+ 18,
38970
+ 259200
38971
+ ],
38972
+ // unfunded, no APR feed
38973
+ [
38974
+ "wNLP-CANP",
38975
+ "0x63689d5fe0d8f766fc11296c694634cd6f14ee6e",
38976
+ "0xdc22f0a9a60eee3697e925414bdb4580d1c35f91",
38977
+ "0xed2f65b5889f9889ad45b97108cc1d449ddef6ff",
38978
+ 6,
38979
+ 259200
38980
+ ],
38981
+ // unfunded, no APR feed
38982
+ [
38983
+ "wNLP-CBRSB",
38984
+ "0x01246b4a5e22bba113108606451db0817a7d20f1",
38985
+ "0xe81c6bb0266cd68b4f17278531dd03ea1f12da4e",
38986
+ "0xb25861953cc45c6a0a572f892eb671e00198cfc7",
38987
+ 18,
38988
+ 259200
38989
+ ],
38990
+ // unfunded, no APR feed
38991
+ [
38992
+ "wNLP-SK4B",
38993
+ "0x31ac519953055b7c356228658e6836d1c7b4fa36",
38994
+ "0xca750ef65f295bbecd685abf54e82caf297bdb61",
38995
+ "0x5e043dc607c23b94b964c8553722932b9eaf54cb",
38996
+ 18,
38997
+ 259200
38998
+ ]
38999
+ // unfunded, no APR feed
39000
+ ],
39001
+ // Arbitrum — 4 pools, 3 funded, 2 with a DefiLlama APR.
39002
+ "42161": [
39003
+ [
39004
+ "wNLP-WETH",
39005
+ "0x9db777ca39e1f1144d564cb5f593d629d2debe46",
39006
+ "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
39007
+ "0x7f1bcc60ed3c80da906fd91a2ec63ec71442430a",
39008
+ 18,
39009
+ 259200
39010
+ ],
39011
+ [
39012
+ "wNLP-USDT",
39013
+ "0xe83ce032108f539c5a5b1c6029a89ff412d9e27f",
39014
+ "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",
39015
+ "0xa6734c9588c458f4f6bd450a62245d76303fb9a3",
39016
+ 6,
39017
+ 259200
39018
+ ],
39019
+ [
39020
+ "wNLP-USDC",
39021
+ "0xb873363be6e4c99c1f4e6ffd6526c7c03a7a07ad",
39022
+ "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
39023
+ "0x73a8df5258fb736eb1aeb198b72b73d6eb457bf8",
39024
+ 6,
39025
+ 259200
39026
+ ],
39027
+ // no APR feed
39028
+ [
39029
+ "wNLP-WBTC",
39030
+ "0xd8865923465463002bc2ccc522e5a21f8d06adfa",
39031
+ "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
39032
+ "0xb043e07edf8cf2ddc2fa22bb087697a721af1058",
39033
+ 8,
39034
+ 259200
39035
+ ]
39036
+ // unfunded, no APR feed
39037
+ ],
39038
+ // Base — 4 pools, 3 funded, 2 with a DefiLlama APR.
39039
+ "8453": [
39040
+ [
39041
+ "wNLP-WETH",
39042
+ "0xc750fe788a828dc960cd08e8bbe1ddd3bffc03bf",
39043
+ "0x4200000000000000000000000000000000000006",
39044
+ "0x9af2f3c0cd35283e13f7087e2b34b1444b57a44c",
39045
+ 18,
39046
+ 259200
39047
+ ],
39048
+ [
39049
+ "wNLP-USDC",
39050
+ "0xe745b0565cecb4612a41eae78319bf3ca8063e6f",
39051
+ "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
39052
+ "0xe7d6b7689bd2cea0af533dd3ad79df6968acb53e",
39053
+ 6,
39054
+ 259200
39055
+ ],
39056
+ [
39057
+ "wNLP-USDT",
39058
+ "0x0872c63c9b1f55ea4166752ba3b890a444b59e9e",
39059
+ "0xfde4c96c8593536e31f229ea8f37b2ada2699bb2",
39060
+ "0x337ec533b568957af458e10cbfbcbf3d59c935b1",
39061
+ 6,
39062
+ 259200
39063
+ ],
39064
+ // no APR feed
39065
+ [
39066
+ "wNLP-cbBTC",
39067
+ "0x90256c018d2acadda2da0b4fd61449e956fd59b6",
39068
+ "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf",
39069
+ "0xa2efe8e37f247cb51c2a48692301335292ccb630",
39070
+ 8,
39071
+ 259200
39072
+ ]
39073
+ // unfunded, no APR feed
39074
+ ],
39075
+ // Monad — 6 pools, 4 funded, 0 with a DefiLlama APR.
39076
+ "143": [
39077
+ [
39078
+ "wNLP-WMON",
39079
+ "0x0166f153e26f572dfac570ccc351ba84ac7a2a72",
39080
+ "0x3bd359c1119da7da1d913d1c4d2b7c461115433a",
39081
+ "0x277ad957898ce34fd959cbfd28ab5962de613b85",
39082
+ 18,
39083
+ 259200
39084
+ ],
39085
+ // no APR feed
39086
+ [
39087
+ "wNLP-USDC",
39088
+ "0xf3d44492f11a2dc234acba80a9e377ab5732b09d",
39089
+ "0x754704bc059f8c67012fed69bc8a327a5aafb603",
39090
+ "0xefadd9a8342bd4ae4d55aed2d748dc006149186a",
39091
+ 6,
39092
+ 259200
39093
+ ],
39094
+ // no APR feed
39095
+ [
39096
+ "wNLP-USDT0",
39097
+ "0x3b1dbe5ca2d39fac168e3575d707b714a7eaa7e7",
39098
+ "0xe7cd86e13ac4309349f30b3435a9d337750fc82d",
39099
+ "0x4cbf9530d653d862a8ece9ed46af6c2f136e2e80",
39100
+ 6,
39101
+ 259200
39102
+ ],
39103
+ // unfunded, no APR feed
39104
+ [
39105
+ "wNLP-WETH",
39106
+ "0x01135c821a87154de3f338f1978811f2648e9570",
39107
+ "0xee8c0e9f1bffb4eb878d8f15f368a02a35481242",
39108
+ "0x92e6d5cdf9c01473adf7089cc416bb934f702cfd",
39109
+ 18,
39110
+ 259200
39111
+ ],
39112
+ // no APR feed
39113
+ [
39114
+ "wNLP-cbBTC",
39115
+ "0x72c486886d199984bdbcf278ba68358365b0f8b7",
39116
+ "0xd18b7ec58cdf4876f6afebd3ed1730e4ce10414b",
39117
+ "0x339808a8be84f74bdcd570c546e2efbd0e780296",
39118
+ 8,
39119
+ 259200
39120
+ ],
39121
+ // no APR feed
39122
+ [
39123
+ "wNLP-AUSD",
39124
+ "0x70dd4db19f75dfea083ce50e77f9b53b55d8558a",
39125
+ "0x00000000efe302beaa2b3e6e1b18d08d69a9012a",
39126
+ "0x4ee1c93eb1ca08f566211fb18a8dc5c1c6d04939",
39127
+ 6,
39128
+ 28800
39129
+ ]
39130
+ // unfunded, no APR feed, 8h queue
39131
+ ],
39132
+ // X Layer — 9 pools, 2 funded, 0 with a DefiLlama APR.
39133
+ "196": [
39134
+ [
39135
+ "wNLP-WETH",
39136
+ "0xde540eabdb4ee3a2680394a4346dbfd76bb78e83",
39137
+ "0x5a77f1443d16ee5761d310e38b62f77f726bc71c",
39138
+ "0x79292d171531673ff97035315fda568189c3c8a5",
39139
+ 18,
39140
+ 259200
39141
+ ],
39142
+ // no APR feed
39143
+ [
39144
+ "wNLP-USD\u20AE0",
39145
+ "0x0b28888e8f0755809c679e01f67591d1ed5ae9b9",
39146
+ "0x779ded0c9e1022225f8e0630b35a9b54be713736",
39147
+ "0x4af9206a885e4708ad3be482611d224239efe173",
39148
+ 6,
39149
+ 259200
39150
+ ],
39151
+ // unfunded, no APR feed
39152
+ [
39153
+ "wNLP-USDG",
39154
+ "0x6285d06426eef9beef33ee92eab7f491f736da57",
39155
+ "0x4ae46a509f6b1d9056937ba4500cb143933d2dc8",
39156
+ "0x92e6d5cdf9c01473adf7089cc416bb934f702cfd",
39157
+ 6,
39158
+ 259200
39159
+ ],
39160
+ // no APR feed
39161
+ [
39162
+ "wNLP-NVDAx",
39163
+ "0x7fde95f8ca333f87677e89e42d09cb4b156f8921",
39164
+ "0xc845b2894dbddd03858fd2d643b4ef725fe0849d",
39165
+ "0x06ab0323c1e3759fe3df946068825fe572db1254",
39166
+ 18,
39167
+ 259200
39168
+ ],
39169
+ // unfunded, no APR feed
39170
+ [
39171
+ "wNLP-TSLAx",
39172
+ "0x78901dd5e09434c6d8c4caa651c012280324af59",
39173
+ "0x8ad3c73f833d3f9a523ab01476625f269aeb7cf0",
39174
+ "0x9dc27e2b3cc52533c159567a9e45243014ef3c0d",
39175
+ 18,
39176
+ 259200
39177
+ ],
39178
+ // unfunded, no APR feed
39179
+ [
39180
+ "wNLP-CRCLx",
39181
+ "0xe1e4bcb64121fff9cfa4d4f5bc31759f035992ad",
39182
+ "0xfebded1b0986a8ee107f5ab1a1c5a813491deceb",
39183
+ "0xf3d44492f11a2dc234acba80a9e377ab5732b09d",
39184
+ 18,
39185
+ 259200
39186
+ ],
39187
+ // unfunded, no APR feed
39188
+ [
39189
+ "wNLP-GOOGLx",
39190
+ "0x1d2831785db72d0809d493a4cfcc90fee47927ad",
39191
+ "0xe92f673ca36c5e2efd2de7628f815f84807e803f",
39192
+ "0xc9be6db8797f44455e578cac759cd209a1fd126d",
39193
+ 18,
39194
+ 259200
39195
+ ],
39196
+ // unfunded, no APR feed
39197
+ [
39198
+ "wNLP-QQQx",
39199
+ "0x4fb706eb3e3784da4fc5aa824886f6129a65fb2e",
39200
+ "0xa753a7395cae905cd615da0b82a53e0560f250af",
39201
+ "0x4f53c62a940748dd572d5ac790d3628e9b39ca8e",
39202
+ 18,
39203
+ 259200
39204
+ ],
39205
+ // unfunded, no APR feed
39206
+ [
39207
+ "wNLP-SPCXx",
39208
+ "0x6540c6b85ade3601f9bdf5b2d8712615dbd7730b",
39209
+ "0x68fa48b1c2fe52b3d776e1953e0e782b5044ce28",
39210
+ "0x277ac2538df35713f196d75058e6a661a058cd6f",
39211
+ 18,
39212
+ 259200
39213
+ ]
39214
+ // unfunded, no APR feed
39215
+ ],
39216
+ // Robinhood Chain — 10 pools, 2 funded, 0 with a DefiLlama APR.
39217
+ "4663": [
39218
+ [
39219
+ "wNLP-WETH",
39220
+ "0x7ce2c710c132f68a74dbb186644ec1eb86dfaf4e",
39221
+ "0x0bd7d308f8e1639fab988df18a8011f41eacad73",
39222
+ "0x70f167a4fed2c68d68760a4b0b6e93d919cfa935",
39223
+ 18,
39224
+ 259200
39225
+ ],
39226
+ // no APR feed
39227
+ [
39228
+ "wNLP-USDG",
39229
+ "0xbb761ba477de2e887968d6c01073a477a9f9815b",
39230
+ "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
39231
+ "0x855a737dbaf7143574cfe869b0849f929d8ba222",
39232
+ 6,
39233
+ 259200
39234
+ ],
39235
+ // no APR feed
39236
+ [
39237
+ "wNLP-AMD",
39238
+ "0x1eda0a1353c57113ff41c32f38ca4b8d0cfec562",
39239
+ "0x86923f96303d656e4aa86d9d42d1e57ad2023fdc",
39240
+ "0x24417d45dfe01841b5f28c05c1d44abf4c321ae6",
39241
+ 18,
39242
+ 259200
39243
+ ],
39244
+ // unfunded, no APR feed
39245
+ [
39246
+ "wNLP-CRCL",
39247
+ "0x965cfe674859cb223ffdc0f72722ad5619f7d90f",
39248
+ "0xdf0992e440dd0be65bd8439b609d6d4366bf1cb5",
39249
+ "0x3581a66d36e307b41b11402cf858f3f83e31d859",
39250
+ 18,
39251
+ 259200
39252
+ ],
39253
+ // unfunded, no APR feed
39254
+ [
39255
+ "wNLP-MSFT",
39256
+ "0xa43ab4c0539ad04b41203fc0544d859540088613",
39257
+ "0xe93237c50d904957cf27e7b1133b510c669c2e74",
39258
+ "0xa81bfbe0994e0b49d66f2273c52d5d447ea71038",
39259
+ 18,
39260
+ 259200
39261
+ ],
39262
+ // unfunded, no APR feed
39263
+ [
39264
+ "wNLP-MU",
39265
+ "0xb05b806fc5bdce389b734dce50400fa27ae54942",
39266
+ "0xff080c8ce2e5feadaca0da81314ae59d232d4afd",
39267
+ "0x48cf773961339cea5284f62bcc9a4a342be42adc",
39268
+ 18,
39269
+ 259200
39270
+ ],
39271
+ // unfunded, no APR feed
39272
+ [
39273
+ "wNLP-NVDA",
39274
+ "0x001660ed89e93c7c9b348e247934fa1ebc3a2625",
39275
+ "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec",
39276
+ "0x6422b1130526d842f74a9340a0d244c289534dd9",
39277
+ 18,
39278
+ 259200
39279
+ ],
39280
+ // unfunded, no APR feed
39281
+ [
39282
+ "wNLP-SNDK",
39283
+ "0xbd254986706115081d84b7a71f3aa1f07d748a5b",
39284
+ "0xb90a19ff0af67f7779aff50a882a9cff42446400",
39285
+ "0x45ee33d6c6d399aa6fa14e25c5462bfd7f0ffea9",
39286
+ 18,
39287
+ 259200
39288
+ ],
39289
+ // unfunded, no APR feed
39290
+ [
39291
+ "wNLP-SPCX",
39292
+ "0x68722297b35760ff16b873c4c89187f4e1d5dbe6",
39293
+ "0x4a0e65a3eccec6dbe60ae065f2e7bb85fae35eea",
39294
+ "0x2933c9c18ba62fe494b4ac75d32060594c9c28bc",
39295
+ 18,
39296
+ 259200
39297
+ ],
39298
+ // unfunded, no APR feed
39299
+ [
39300
+ "wNLP-TSLA",
39301
+ "0xf54b421461d41203e4babdc59d1259d7de886a73",
39302
+ "0x322f0929c4625ed5bad873c95208d54e1c003b2d",
39303
+ "0x0945712145b562ec6ba6631293fb917feb6b262a",
39304
+ 18,
39305
+ 259200
39306
+ ]
39307
+ // unfunded, no APR feed
39308
+ ],
39309
+ // Morph — 2 pools, 2 funded, 0 with a DefiLlama APR.
39310
+ "2818": [
39311
+ [
39312
+ "wNLP-USDC",
39313
+ "0xcf7b55c544b579a09b54f5a4da3e1ba476c04364",
39314
+ "0xcfb1186f4e93d60e60a8bdd997427d1f33bc372b",
39315
+ "0x26ff7df6d9e1feead7786a6ba82618aafd7c8ea7",
39316
+ 6,
39317
+ 259200
39318
+ ],
39319
+ // no APR feed
39320
+ [
39321
+ "wNLP-BGBTC",
39322
+ "0xca0f3fb46eb413abefa10d91aa2a6fd49eab60eb",
39323
+ "0x31011317764e097b28d159a8145b92bfa453f606",
39324
+ "0x0d8de51813ef9b8634d3b91086884d3045a5f3e8",
39325
+ 8,
39326
+ 259200
39327
+ ]
39328
+ // no APR feed
39329
+ ]
39330
+ };
39331
+ var NATIVE_WNLP_ENTRIES = Object.fromEntries(
39332
+ Object.entries(NATIVE_WNLP_ROWS).map(([chainId, rows]) => [
39333
+ chainId,
39334
+ rows.map(
39335
+ ([
39336
+ symbol,
39337
+ address,
39338
+ underlying,
39339
+ withdrawQueue,
39340
+ decimals,
39341
+ withdrawalWindowSeconds
39342
+ ]) => ({
39343
+ address,
39344
+ underlying,
39345
+ symbol,
39346
+ brand: "Native",
39347
+ decimals,
39348
+ isRebasing: false,
39349
+ isMintable: true,
39350
+ withdrawalMode: "fee-or-queued",
39351
+ withdrawalCooldownSeconds: withdrawalWindowSeconds,
39352
+ reader: "native-wnlp",
39353
+ withdrawQueue,
39354
+ inventoryContract: NATIVE_CREDIT_VAULT[chainId],
39355
+ yieldFetcher: nativeCreditPoolFetcher(chainId),
39356
+ yieldKey: nativeCreditPoolYieldKey(chainId, underlying)
39357
+ })
39358
+ )
39359
+ ])
39360
+ );
37785
39361
 
37786
39362
  // src/vaults/savings/registry.ts
37787
39363
  var stUsdGroup = {
@@ -37877,11 +39453,183 @@ var yUsdGroup = {
37877
39453
  // confirmed on Basescan.
37878
39454
  }
37879
39455
  };
39456
+ var sUsdcGroup = {
39457
+ base: {
39458
+ reader: "erc4626-idle",
39459
+ symbol: "sUSDC",
39460
+ brand: "Spark",
39461
+ decimals: 18,
39462
+ underlyingDecimals: 6,
39463
+ isRebasing: false,
39464
+ isMintable: true,
39465
+ withdrawalMode: "instant-capped",
39466
+ yieldFetcher: sparkSavingsFetcher,
39467
+ yieldKey: SPARK_SUSDC_KEY
39468
+ },
39469
+ chains: {
39470
+ "1": {
39471
+ address: "0xbc65ad17c5c0a2a4d159fa5a503f4992c7b545fe",
39472
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
39473
+ // Mainnet PSM keeps a dedicated pocket contract.
39474
+ inventoryContract: "0x37305b1cd40574e4c5ce33f8e8306be057fd7341"
39475
+ },
39476
+ "8453": {
39477
+ address: "0x3128a0f7f0ea68e7b7c9b00afa7e41045828e858",
39478
+ underlying: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
39479
+ // L2 PSM3s custody the pocket themselves (`pocket() == psm`).
39480
+ inventoryContract: "0x1601843c5e9bc251a3272907010afa41fa18347e"
39481
+ },
39482
+ "42161": {
39483
+ address: "0x940098b108fb7d0a7e374f6eded7760787464609",
39484
+ underlying: "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
39485
+ inventoryContract: "0x2b05f8e1cacc6974fd79a673a341fe1f58d27266"
39486
+ },
39487
+ "10": {
39488
+ address: "0xcf9326e24ebffbef22ce1050007a43a3c0b6db55",
39489
+ underlying: "0x0b2c639c533813f4aa9d7837caf62653d097ff85",
39490
+ inventoryContract: "0xe0f9978b907853f354d79188a3defbd41978af62"
39491
+ },
39492
+ "130": {
39493
+ address: "0x14d9143becc348920b68d123687045db49a016c6",
39494
+ underlying: "0x078d782b760474a361dda0af3839290b0ef57ad6",
39495
+ inventoryContract: "0x7b42ed932f26509465f7ce3faf76ffce1275312f"
39496
+ }
39497
+ }
39498
+ };
39499
+ var reUsdGroup = {
39500
+ base: {
39501
+ reader: "nav-oracle",
39502
+ symbol: "reUSD",
39503
+ brand: "Re Protocol",
39504
+ decimals: 18,
39505
+ underlyingDecimals: 6,
39506
+ isRebasing: false,
39507
+ isMintable: false,
39508
+ withdrawalMode: "request-based",
39509
+ // Quarterly queue — the documented worst case, and the live case
39510
+ // wherever the buffer sits under 1 % of supply.
39511
+ withdrawalCooldownSeconds: 90 * 86400,
39512
+ yieldFetcher: reProtocolFetcher,
39513
+ yieldKey: REUSD_KEY
39514
+ },
39515
+ chains: {
39516
+ "1": {
39517
+ address: "0x5086bf358635b81d8c47c66d1c8b9e567db70c72",
39518
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
39519
+ // USDC
39520
+ priceOracle: "0x72b5760cfbe437dd01409f44055fdfb8f8121b46",
39521
+ mintContract: "0x4691c475be804fa85f91c2d6d0adf03114de3093",
39522
+ // ICL
39523
+ withdrawQueue: "0x5c454f5526e41fbe917b63475cd8ca7e4631b147"
39524
+ },
39525
+ "8453": {
39526
+ address: "0x7d214438d0f27afccc23b3d1e1a53906ace5cfea",
39527
+ underlying: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
39528
+ priceOracle: "0x67a3226e69a1a8316ef1807a44f077af80071926",
39529
+ // On Base the ICL is the token itself.
39530
+ mintContract: "0x7d214438d0f27afccc23b3d1e1a53906ace5cfea",
39531
+ withdrawQueue: "0x9ab62aebabe738ab233c447eedce88d1d0a61fe3"
39532
+ },
39533
+ "42161": {
39534
+ address: "0x76ce01f0ef25aa66cc5f1e546a005e4a63b25609",
39535
+ underlying: "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
39536
+ priceOracle: "0x48abcc5a711ac23d3730bf627415dc898cbc5967",
39537
+ mintContract: "0x802edbb1ec20548a4388abc337e4011718eb0291",
39538
+ withdrawQueue: "0xfd4016ea13ca8acc04a11a99702df076a4d3b852"
39539
+ },
39540
+ "43114": {
39541
+ address: "0x180af87b47bf272b2df59dccf2d76a6eafa625bf",
39542
+ underlying: "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
39543
+ priceOracle: "0x4c558694f16484e5c7a4a52bd210d471860ce7bc",
39544
+ mintContract: "0xb22a8533e6cd81598f82514a42f0b3161745fbe1",
39545
+ withdrawQueue: "0xe13292f97e38da0c64398de5e0bfc95180de9d23"
39546
+ }
39547
+ // NB: our token list also carries reUSD on BNB (0xba9425ec…) and Ink
39548
+ // (0x5bcf6b00…), but Re publishes no NAV oracle for either, so there
39549
+ // is no price source and they are deliberately NOT registered.
39550
+ }
39551
+ };
39552
+ var sUsdpGroup = {
39553
+ base: {
39554
+ symbol: "sUSDp",
39555
+ brand: "Parallel",
39556
+ decimals: 18,
39557
+ isRebasing: false,
39558
+ isMintable: true,
39559
+ withdrawalMode: "instant",
39560
+ yieldFetcher: parallelFetcher,
39561
+ yieldKey: SUSDP_KEY
39562
+ },
39563
+ chains: {
39564
+ "43114": {
39565
+ address: "0x9d92c21205383651610f90722131655a5b8ed3e0",
39566
+ underlying: "0x9ee1963f05553ef838604dd39403be21cef26aa4"
39567
+ // USDp
39568
+ },
39569
+ "999": {
39570
+ address: "0x9b3a8f7cec208e247d97dee13313690977e24459",
39571
+ underlying: "0xbe65f0f410a72bec163dc65d46c83699e957d588"
39572
+ },
39573
+ "1": {
39574
+ address: "0x0d45b129dc868963025db79a9074ea9c9e32cae4",
39575
+ // Yes, the HyperEVM sUSDp address — see the address-reuse trap
39576
+ // in the group comment.
39577
+ underlying: "0x9b3a8f7cec208e247d97dee13313690977e24459"
39578
+ },
39579
+ "8453": {
39580
+ address: "0x472ed57b376fe400259fb28e5c46eb53f0e3e7e7",
39581
+ underlying: "0x76a9a0062ec6712b99b4f63bd2b4270185759dd5"
39582
+ }
39583
+ }
39584
+ };
39585
+ var cUsdoGroup = {
39586
+ base: {
39587
+ symbol: "cUSDO",
39588
+ brand: "OpenEden",
39589
+ decimals: 18,
39590
+ isRebasing: false,
39591
+ isMintable: true,
39592
+ withdrawalMode: "instant",
39593
+ yieldFetcher: rwaFundsFetcher,
39594
+ yieldKey: "Compounding Open Dollar::CUSDO"
39595
+ },
39596
+ chains: {
39597
+ "1": {
39598
+ address: "0xad55aebc9b8c03fc43cd9f62260391c13c23e7c0",
39599
+ underlying: "0x8238884ec9668ef77b90c6dff4d1a9f4f4823bfe"
39600
+ // USDO
39601
+ },
39602
+ "56": {
39603
+ address: "0x64748ea3e31d0b7916f0ff91b017b9f404ded8ef",
39604
+ underlying: "0x302e52aff9815b9d1682473dbfb9c74f9b750aa8"
39605
+ },
39606
+ "8453": {
39607
+ address: "0x83db73ef5192de4b6a4c92bd0141ba1a0dc87c65",
39608
+ underlying: "0xad55aebc9b8c03fc43cd9f62260391c13c23e7c0"
39609
+ }
39610
+ }
39611
+ };
37880
39612
  var MULTI_CHAIN_GROUPS = [
37881
39613
  stUsdGroup,
37882
39614
  stEurGroup,
37883
- yUsdGroup
39615
+ yUsdGroup,
39616
+ sUsdcGroup,
39617
+ reUsdGroup,
39618
+ sUsdpGroup,
39619
+ cUsdoGroup
37884
39620
  ];
39621
+ var sparkV2Base = (symbol, decimals) => ({
39622
+ reader: "erc4626-idle",
39623
+ symbol,
39624
+ brand: "Spark",
39625
+ decimals,
39626
+ underlyingDecimals: decimals,
39627
+ isRebasing: false,
39628
+ isMintable: true,
39629
+ withdrawalMode: "instant-capped",
39630
+ yieldFetcher: sparkSavingsFetcher
39631
+ });
39632
+ var SPARK_V2_WITHDRAW_INTENTS = "0x592b7db9906e6f8924c4d74c2a0ab86ce44fdddf";
37885
39633
  var SINGLE_CHAIN_ENTRIES = {
37886
39634
  "1": [
37887
39635
  {
@@ -37940,6 +39688,40 @@ var SINGLE_CHAIN_ENTRIES = {
37940
39688
  yieldFetcher: susdsFetcher,
37941
39689
  yieldKey: "Staked USDS::stUSDS"
37942
39690
  },
39691
+ {
39692
+ // Frax sfrxUSD — `LinearRewardsErc4626` over frxUSD. Plain
39693
+ // instant 4626 exit; the rate is set by the vault's
39694
+ // `maxDistributionPerSecondPerAsset` cap rather than by
39695
+ // utilisation (see the frax fetcher for the exact maths).
39696
+ address: "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6",
39697
+ underlying: "0xcacd6fd266af91b8aed52accc382b4e165586e29",
39698
+ // frxUSD
39699
+ symbol: "sfrxUSD",
39700
+ brand: "Frax",
39701
+ decimals: 18,
39702
+ isRebasing: false,
39703
+ isMintable: true,
39704
+ withdrawalMode: "instant",
39705
+ yieldFetcher: fraxSavingsFetcher,
39706
+ yieldKey: "SFRXUSD"
39707
+ },
39708
+ {
39709
+ // Frax sFRAX — the pre-rename sibling of sfrxUSD, over legacy
39710
+ // FRAX. Still live and roughly 2x sfrxUSD's size, so it stays a
39711
+ // first-class row rather than an alias. Same contract family, so
39712
+ // it shares `fraxSavingsFetcher` (one multicall covers both).
39713
+ address: "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32",
39714
+ underlying: "0x853d955acef822db058eb8505911ed77f175b99e",
39715
+ // FRAX
39716
+ symbol: "sFRAX",
39717
+ brand: "Frax",
39718
+ decimals: 18,
39719
+ isRebasing: false,
39720
+ isMintable: true,
39721
+ withdrawalMode: "instant",
39722
+ yieldFetcher: fraxSavingsFetcher,
39723
+ yieldKey: "SFRAX"
39724
+ },
37943
39725
  {
37944
39726
  address: "0x83f20f44975d03b1b09e64809b757c47f942beea",
37945
39727
  underlying: "0x6b175474e89094c44da98b954eedeac495271d0f",
@@ -38064,6 +39846,91 @@ var SINGLE_CHAIN_ENTRIES = {
38064
39846
  withdrawalMode: "request-based",
38065
39847
  yieldFetcher: hastraPrimeFetcher,
38066
39848
  yieldKey: "Hastra PRIME::PRIME"
39849
+ },
39850
+ {
39851
+ // Spark Vaults V2 — the mainnet book, and by far the largest of
39852
+ // the family. Only the Ethereum rows carry the intents contract as
39853
+ // `withdrawQueue`; the other chains have no deployment of it.
39854
+ ...sparkV2Base("spUSDC", 6),
39855
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
39856
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
39857
+ // USDC
39858
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39859
+ yieldKey: sparkVaultV2Key("1", "spUSDC")
39860
+ },
39861
+ {
39862
+ ...sparkV2Base("spUSDT", 6),
39863
+ address: "0xe2e7a17dff93280dec073c995595155283e3c372",
39864
+ underlying: "0xdac17f958d2ee523a2206206994597c13d831ec7",
39865
+ // USDT
39866
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39867
+ yieldKey: sparkVaultV2Key("1", "spUSDT")
39868
+ },
39869
+ {
39870
+ // The only non-stable in the family — underlying is WETH, so
39871
+ // share and underlying are both 18-decimal.
39872
+ ...sparkV2Base("spETH", 18),
39873
+ address: "0xfe6eb3b609a7c8352a241f7f3a21cea4e9209b8f",
39874
+ underlying: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
39875
+ // WETH
39876
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39877
+ yieldKey: sparkVaultV2Key("1", "spETH")
39878
+ },
39879
+ {
39880
+ // Seeded but live (~$30k) — real contract, real `vsr`, so it is
39881
+ // carried rather than special-cased. Expect it to grow.
39882
+ ...sparkV2Base("spPYUSD", 6),
39883
+ address: "0x80128dbb9f07b93dde62a6daeadb69ed14a7d354",
39884
+ underlying: "0x6c3ea9036406852006290770bedfcaba0e23a0e8",
39885
+ // PYUSD
39886
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39887
+ yieldKey: sparkVaultV2Key("1", "spPYUSD")
39888
+ },
39889
+ {
39890
+ // Re Protocol reUSDe — the JUNIOR tranche of the same reinsurance
39891
+ // capital stack as reUSD (see `reUsdGroup` for the model, the
39892
+ // liquidity caveat and why `isMintable` is false). Ethereum only,
39893
+ // ~$18.8M, and it earns roughly double reUSD's rate precisely
39894
+ // because it absorbs losses first. Underlying is USDe, so unlike
39895
+ // reUSD the share and underlying decimals align at 18.
39896
+ reader: "nav-oracle",
39897
+ address: "0xddc0f880ff6e4e22e4b74632fbb43ce4df6ccc5a",
39898
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
39899
+ // USDe
39900
+ priceOracle: "0x7844441f13c61cbd3d297f5d2d7fcabf17f0b843",
39901
+ mintContract: "0xe1886be2ba8b2496c2044a77516f63a734193082",
39902
+ // ICL
39903
+ symbol: "reUSDe",
39904
+ brand: "Re Protocol",
39905
+ decimals: 18,
39906
+ underlyingDecimals: 18,
39907
+ isRebasing: false,
39908
+ isMintable: false,
39909
+ withdrawalMode: "request-based",
39910
+ withdrawalCooldownSeconds: 90 * 86400,
39911
+ yieldFetcher: reProtocolFetcher,
39912
+ yieldKey: REUSDE_KEY
39913
+ }
39914
+ ],
39915
+ "42161": [
39916
+ {
39917
+ // Same CREATE2 family as mainnet spUSDT but an independent vault
39918
+ // with its own `vsr`. Seeded (~$1k) at time of writing.
39919
+ ...sparkV2Base("spUSDT", 6),
39920
+ address: "0x45d91340b3b7b96985a72b5c678f7d9e8d664b62",
39921
+ underlying: "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",
39922
+ // USDT
39923
+ yieldKey: sparkVaultV2Key("42161", "spUSDT")
39924
+ }
39925
+ ],
39926
+ "196": [
39927
+ {
39928
+ // X Layer spUSDT — seeded only. Underlying is the bridged USDT
39929
+ // (`USDT0`-style) deployment, not mainnet USDT.
39930
+ ...sparkV2Base("spUSDT", 6),
39931
+ address: "0xc358c90d32375721cb3924320fdc2f8b694347ca",
39932
+ underlying: "0x779ded0c9e1022225f8e0630b35a9b54be713736",
39933
+ yieldKey: sparkVaultV2Key("196", "spUSDT")
38067
39934
  }
38068
39935
  ],
38069
39936
  "8453": [
@@ -38108,24 +39975,28 @@ var SINGLE_CHAIN_ENTRIES = {
38108
39975
  withdrawalCooldownSeconds: 86400,
38109
39976
  yieldFetcher: savbtcFetcher,
38110
39977
  yieldKey: "Staked avBTC::savBTC"
39978
+ },
39979
+ {
39980
+ // Spark Vaults V2 spUSDC on Avalanche — same CREATE2 address as
39981
+ // the mainnet vault, independent deployment and `vsr`.
39982
+ ...sparkV2Base("spUSDC", 6),
39983
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
39984
+ underlying: "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
39985
+ // USDC
39986
+ yieldKey: sparkVaultV2Key("43114", "spUSDC")
38111
39987
  }
38112
39988
  ],
38113
39989
  "4663": [
38114
39990
  {
38115
- // Spark Savings USDG on Robinhood Chain — Sky/Spark savings token
38116
- // over USDG. ERC-4626 share price accrues via a `chi()` rate
38117
- // accumulator; `ssr()` is not readable so APR comes from the
38118
- // chi-delta fetcher. Standard permissionless 4626 redeem.
39991
+ // Spark Vaults V2 spUSDG on Robinhood Chain — the first V2 vault
39992
+ // we carried. Its APR now comes from `vsr()` like every other V2
39993
+ // vault (the old chi-delta fetcher assumed no readable rate; the
39994
+ // getter is `vsr`, not `ssr`), and its exit is idle-capped like
39995
+ // the rest of the family rather than unconditionally instant.
39996
+ ...sparkV2Base("spUSDG", 6),
38119
39997
  address: "0xde770c84fe66e063336b31737cfe9790f18c4087",
38120
39998
  underlying: "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
38121
39999
  // USDG
38122
- symbol: "spUSDG",
38123
- brand: "Spark",
38124
- decimals: 6,
38125
- isRebasing: false,
38126
- isMintable: true,
38127
- withdrawalMode: "instant",
38128
- yieldFetcher: sparkSavingsUsdgFetcher,
38129
40000
  yieldKey: SPARK_SAVINGS_USDG_KEY
38130
40001
  }
38131
40002
  ]
@@ -38141,6 +40012,10 @@ var SAVINGS_REGISTRY = (() => {
38141
40012
  out[chainId].push({ ...group.base, ...addrs });
38142
40013
  }
38143
40014
  }
40015
+ for (const [chainId, entries] of Object.entries(NATIVE_WNLP_ENTRIES)) {
40016
+ if (!out[chainId]) out[chainId] = [];
40017
+ out[chainId].push(...entries);
40018
+ }
38144
40019
  return out;
38145
40020
  })();
38146
40021
  var getSavingsRegistry = (chainId) => SAVINGS_REGISTRY[chainId] ?? [];
@@ -38543,6 +40418,10 @@ var usdaiFetcher = {
38543
40418
 
38544
40419
  // src/yields/intrinsic/fetchers/ondo.ts
38545
40420
  var ONDO_BASE_URL = "https://app.ondo.finance/api/v2/assets";
40421
+ var OUSG_KEY = "OUSG";
40422
+ var OUSG_GROUP_KEY = "Ondo Short-Term US Government Treasuries::OUSG";
40423
+ var USDY_KEY = "USDY";
40424
+ var USDY_GROUP_KEY = "Ondo US Dollar Yield::USDY";
38546
40425
  var ondoFetcher = {
38547
40426
  label: "ONDO",
38548
40427
  fetch: async () => {
@@ -38550,9 +40429,13 @@ var ondoFetcher = {
38550
40429
  fetch(`${ONDO_BASE_URL}/ousg/info`).then((r) => r.json()),
38551
40430
  fetch(`${ONDO_BASE_URL}/usdy/info`).then((r) => r.json())
38552
40431
  ]);
40432
+ const ousg = apyToAprPercent(Number(ousgRes?.primaryMarket?.apy ?? 0));
40433
+ const usdy = apyToAprPercent(Number(usdyRes?.primaryMarket?.apy ?? 0));
38553
40434
  return {
38554
- OUSG: apyToAprPercent(Number(ousgRes?.primaryMarket?.apy ?? 0)),
38555
- USDY: apyToAprPercent(Number(usdyRes?.primaryMarket?.apy ?? 0))
40435
+ [OUSG_KEY]: ousg,
40436
+ [OUSG_GROUP_KEY]: ousg,
40437
+ [USDY_KEY]: usdy,
40438
+ [USDY_GROUP_KEY]: usdy
38556
40439
  };
38557
40440
  }
38558
40441
  };
@@ -38571,38 +40454,78 @@ var syzusdFetcher = {
38571
40454
  // src/yields/intrinsic/fetchers/midas.ts
38572
40455
  var MIDAS_APY_URL = "https://api-prod.midas.app/api/data/apys";
38573
40456
  var MIDAS_TOKENS = [
38574
- { apyKey: "mtbill", assetGroup: "Midas mTBILL::MTBILL" },
38575
- { apyKey: "mbasis", assetGroup: "Midas mBASIS::MBASIS" },
38576
- { apyKey: "mbtc", assetGroup: "Midas mBTC::MBTC" },
38577
- { apyKey: "medge", assetGroup: "Midas mEDGE::MEDGE" },
38578
- { apyKey: "mre7", assetGroup: "Midas mRe7YIELD::MRE7YIELD" },
38579
- { apyKey: "mre7sol", assetGroup: "Midas mRe7SOL::MRE7SOL" },
38580
- { apyKey: "mmev", assetGroup: "Midas mMEV::MMEV" },
38581
- { apyKey: "mfone", assetGroup: "Midas Fasanara ONE::mF-ONE" },
38582
- { apyKey: "mhyper", assetGroup: "Midas Hyperithm::mHYPER" },
38583
- { apyKey: "mapollo", assetGroup: "Midas mAPOLLO::MAPOLLO" },
38584
- { apyKey: "mevbtc", assetGroup: "Midas mevBTC::MEVBTC" },
38585
- { apyKey: "mfarm", assetGroup: "Midas mFARM::MFARM" },
38586
- { apyKey: "msyrupusd", assetGroup: "Midas msyrupUSD::MSYRUPUSD" },
38587
- { apyKey: "msyrupusdp", assetGroup: "Midas msyrupUSDp::MSYRUPUSDP" },
38588
- { apyKey: "mre7btc", assetGroup: "Midas mRe7BTC::MRE7BTC" },
38589
- { apyKey: "mxrp", assetGroup: "Midas XRP::mXRP" },
38590
- { apyKey: "mevusd", assetGroup: "Midas Everstake USD::MEVUSD" },
38591
- { apyKey: "mhypereth", assetGroup: "Midas Hyperithm ETH::mHyperETH" },
38592
- { apyKey: "mhyperbtc", assetGroup: "Midas Hyperithm BTC::mHyperBTC" },
38593
- { apyKey: "mm1usd", assetGroup: "Midas M1 USD Market Neutral::mM1-USD" }
40457
+ { apyKey: "mtbill", keys: ["Midas mTBILL::MTBILL"] },
40458
+ {
40459
+ apyKey: "mbasis",
40460
+ keys: ["Midas mBASIS::MBASIS", "Midas mBASIS::mBASIS"]
40461
+ },
40462
+ {
40463
+ apyKey: "mbtc",
40464
+ keys: ["Midas mBTC::MBTC", "Midas BTC Yield Token::mBTC"]
40465
+ },
40466
+ { apyKey: "medge", keys: ["Midas mEDGE::MEDGE", "Midas mEDGE::mEDGE"] },
40467
+ {
40468
+ apyKey: "mre7",
40469
+ keys: ["Midas mRe7YIELD::MRE7YIELD", "Midas Re7 Yield::mRe7YIELD"]
40470
+ },
40471
+ { apyKey: "mre7sol", keys: ["Midas mRe7SOL::MRE7SOL"] },
40472
+ { apyKey: "mre7eth", keys: ["Midas Re7 Ethereum::mRe7ETH"] },
40473
+ { apyKey: "mmev", keys: ["Midas mMEV::MMEV"] },
40474
+ { apyKey: "mfone", keys: ["Midas Fasanara ONE::mF-ONE"] },
40475
+ {
40476
+ apyKey: "mhyper",
40477
+ keys: ["Midas Hyperithm::mHYPER", "mHYPER::Midas Hyperithm"]
40478
+ },
40479
+ { apyKey: "mapollo", keys: ["Midas mAPOLLO::MAPOLLO"] },
40480
+ // NB Avalanche carries a `MEV BTC::mevBTC` row (0x1f8e769b…) that MAY be
40481
+ // this asset, but the issuer is unverifiable (Midas's docs/API are
40482
+ // Cloudflare-walled) — deliberately not keyed, same rule as bondusd.
40483
+ { apyKey: "mevbtc", keys: ["Midas mevBTC::MEVBTC"] },
40484
+ { apyKey: "mfarm", keys: ["Midas mFARM::MFARM"] },
40485
+ { apyKey: "msyrupusd", keys: ["Midas msyrupUSD::MSYRUPUSD"] },
40486
+ { apyKey: "msyrupusdp", keys: ["Midas msyrupUSDp::MSYRUPUSDP"] },
40487
+ { apyKey: "mre7btc", keys: ["Midas mRe7BTC::MRE7BTC"] },
40488
+ { apyKey: "mxrp", keys: ["Midas XRP::mXRP"] },
40489
+ { apyKey: "mevusd", keys: ["Midas Everstake USD::MEVUSD"] },
40490
+ { apyKey: "mhypereth", keys: ["Midas Hyperithm ETH::mHyperETH"] },
40491
+ {
40492
+ apyKey: "mhyperbtc",
40493
+ keys: ["Midas Hyperithm BTC::mHyperBTC", "Midas Hyperithm BTC::MHYPERBTC"]
40494
+ },
40495
+ { apyKey: "mm1usd", keys: ["Midas M1 USD Market Neutral::mM1-USD"] },
40496
+ // 2026-08 sweep additions
40497
+ { apyKey: "mrox", keys: ["Midas Rockaway Market Neutral::MROX"] },
40498
+ { apyKey: "mglobal", keys: ["Midas Fasanara Global::MGLOBAL"] },
40499
+ { apyKey: "mglo", keys: ["Midas Fasanara Global Open::MGLO"] },
40500
+ { apyKey: "weeur", keys: ["Liquid Euro::weEUR"] },
40501
+ { apyKey: "plusd", keys: ["Plasma USD::plUSD"] },
40502
+ { apyKey: "splusd", keys: ["Staked Plasma USD::splUSD"] }
38594
40503
  ];
40504
+ var MAX_DECIMAL_APY = 5;
38595
40505
  var midasFetcher = {
38596
40506
  label: "MIDAS",
38597
40507
  fetch: async () => {
38598
- const apys = await fetch(MIDAS_APY_URL).then(
38599
- (r) => r.json()
38600
- );
40508
+ const res = await fetch(MIDAS_APY_URL, {
40509
+ headers: {
40510
+ accept: "application/json",
40511
+ // WAF: bare fetches get 403 + `{}` — see header note.
40512
+ "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36",
40513
+ origin: "https://midas.app",
40514
+ referer: "https://midas.app/"
40515
+ },
40516
+ signal: AbortSignal.timeout(8e3)
40517
+ });
40518
+ if (!res.ok) throw new Error(`Midas APY HTTP ${res.status}`);
40519
+ const apys = await res.json();
40520
+ if (!apys || Object.keys(apys).length === 0) {
40521
+ throw new Error("Midas APY payload empty (WAF block?)");
40522
+ }
38601
40523
  const result = {};
38602
- for (const { apyKey, assetGroup } of MIDAS_TOKENS) {
40524
+ for (const { apyKey, keys } of MIDAS_TOKENS) {
38603
40525
  const apy = apys[apyKey];
38604
- if (apy && apy > 0) {
38605
- result[assetGroup] = apyToAprPercent(apy * 100);
40526
+ if (typeof apy === "number" && apy > 0 && apy <= MAX_DECIMAL_APY) {
40527
+ const apr = apyToAprPercent(apy * 100);
40528
+ for (const key of keys) result[key] = apr;
38606
40529
  }
38607
40530
  }
38608
40531
  return result;
@@ -38897,6 +40820,8 @@ var LENDING_ONLY_FETCHERS = [
38897
40820
  pendleFetcher,
38898
40821
  usdaiFetcher,
38899
40822
  ondoFetcher,
40823
+ // rwaFundsFetcher is NOT here: cUSDO's savings rows vault-wire it, so
40824
+ // it reaches the global map via `collectVaultFetchers` (disjointness rule).
38900
40825
  syzusdFetcher,
38901
40826
  midasFetcher,
38902
40827
  capFetcher,
@@ -38954,13 +40879,14 @@ async function fetchMerklOpportunities(protocolId, chainId) {
38954
40879
  while (true) {
38955
40880
  const params = new URLSearchParams({
38956
40881
  mainProtocolId: protocolId,
38957
- chainId,
38958
40882
  status: "LIVE",
38959
40883
  items: "100",
38960
40884
  page: String(page)
38961
40885
  });
40886
+ if (chainId) params.set("chainId", chainId);
38962
40887
  const res = await fetch(`${MERKL_API_BASE}/opportunities?${params}`);
38963
- if (!res.ok) throw new Error(`Merkl API ${res.status} for chain ${chainId}`);
40888
+ if (!res.ok)
40889
+ throw new Error(`Merkl API ${res.status} for chain ${chainId ?? "all"}`);
38964
40890
  const batch = await res.json();
38965
40891
  all.push(...batch);
38966
40892
  if (batch.length < 100) break;
@@ -39024,37 +40950,40 @@ function createMerklRewardFetcher(config) {
39024
40950
  label: `MERKL_${config.merklProtocolId.toUpperCase()}`,
39025
40951
  fetch: async () => {
39026
40952
  const result = {};
39027
- const chainResults = await Promise.all(
40953
+ const chainResults = config.chainIds ? await Promise.all(
39028
40954
  config.chainIds.map(async (chainId) => {
39029
40955
  try {
39030
- const opps = await fetchMerklOpportunities(
40956
+ return await fetchMerklOpportunities(
39031
40957
  config.merklProtocolId,
39032
40958
  chainId
39033
40959
  );
39034
- return { chainId, opps };
39035
40960
  } catch (e) {
39036
40961
  console.error(`Merkl: failed to fetch chain ${chainId}:`, e);
39037
- return { chainId, opps: [] };
40962
+ return [];
39038
40963
  }
39039
40964
  })
39040
- );
39041
- for (const { chainId, opps } of chainResults) {
40965
+ ) : [await fetchMerklOpportunities(config.merklProtocolId)];
40966
+ for (const opps of chainResults) {
39042
40967
  for (const opp of opps) {
39043
40968
  if (!opp.apr || opp.apr <= 0) continue;
39044
- const resolved2 = resolve(opp);
39045
- if (!resolved2) continue;
39046
- const bucket = resolved2.bucket ?? (opp.action === "LEND" ? "deposit" : opp.action === "BORROW" ? "borrow" : void 0);
39047
- if (!bucket) continue;
39048
- const lender = resolved2.lender ?? config.lenderKey;
39049
- const reward = ensureReward(result, chainId, lender, resolved2.asset);
39050
- const breakdowns = extractRewardBreakdowns(opp);
39051
- reward.link = getMerkleUrl(opp);
39052
- if (bucket === "deposit") {
39053
- reward.deposit += opp.apr;
39054
- reward.additionalDepositData.push(...breakdowns);
39055
- } else {
39056
- reward.borrow += opp.apr;
39057
- reward.additionalBorrowData.push(...breakdowns);
40969
+ const chainId = String(opp.chainId);
40970
+ const resolvedRaw = resolve(opp);
40971
+ if (!resolvedRaw) continue;
40972
+ const resolutions = (Array.isArray(resolvedRaw) ? resolvedRaw : [resolvedRaw]).filter((r) => Boolean(r?.asset));
40973
+ for (const resolved2 of resolutions) {
40974
+ const bucket = resolved2.bucket ?? (opp.action === "LEND" ? "deposit" : opp.action === "BORROW" ? "borrow" : void 0);
40975
+ if (!bucket) continue;
40976
+ const lender = resolved2.lender ?? config.lenderKey;
40977
+ const reward = ensureReward(result, chainId, lender, resolved2.asset);
40978
+ const breakdowns = extractRewardBreakdowns(opp);
40979
+ reward.link = getMerkleUrl(opp);
40980
+ if (bucket === "deposit") {
40981
+ reward.deposit += opp.apr;
40982
+ reward.additionalDepositData.push(...breakdowns);
40983
+ } else {
40984
+ reward.borrow += opp.apr;
40985
+ reward.additionalBorrowData.push(...breakdowns);
40986
+ }
39058
40987
  }
39059
40988
  }
39060
40989
  }
@@ -39062,81 +40991,39 @@ function createMerklRewardFetcher(config) {
39062
40991
  }
39063
40992
  };
39064
40993
  }
39065
- var AAVE_V3_MERKL_CHAINS = [
39066
- "1",
39067
- // Ethereum
39068
- "10",
39069
- // Optimism
39070
- "56",
39071
- // BSC
39072
- "100",
39073
- // Gnosis
39074
- "137",
39075
- // Polygon
39076
- "5000",
39077
- // Mantle
39078
- "8453",
39079
- // Base
39080
- "42161",
39081
- // Arbitrum
39082
- "42220",
39083
- // Celo
39084
- "43114",
39085
- // Avalanche
39086
- "59144",
39087
- // Linea
39088
- "534352"
39089
- // Scroll
39090
- ];
39091
40994
  var aaveMerklRewardFetcher = createMerklRewardFetcher({
39092
40995
  merklProtocolId: "aave",
39093
- lenderKey: "AAVE_V3",
39094
- chainIds: AAVE_V3_MERKL_CHAINS
40996
+ lenderKey: "AAVE_V3"
39095
40997
  });
39096
- var EULER_MERKL_CHAINS = [
39097
- "1",
39098
- // Ethereum
39099
- "10",
39100
- // Optimism
39101
- "56",
39102
- // BSC
39103
- "130",
39104
- // Unichain
39105
- "137",
39106
- // Polygon
39107
- "8453",
39108
- // Base
39109
- "42161",
39110
- // Arbitrum
39111
- "43114",
39112
- // Avalanche
39113
- "80094"
39114
- // Berachain
39115
- ];
40998
+ function parseEulerVaultFromUrl(depositUrl) {
40999
+ if (!depositUrl) return void 0;
41000
+ try {
41001
+ const url = new URL(depositUrl);
41002
+ const search = url.searchParams.get("search");
41003
+ if (search && /^0x[0-9a-fA-F]{40}$/.test(search))
41004
+ return search.toLowerCase();
41005
+ const positions = url.pathname.match(
41006
+ /\/positions\/0x[0-9a-fA-F]{40}\/(0x[0-9a-fA-F]{40})/
41007
+ );
41008
+ if (positions) return positions[1].toLowerCase();
41009
+ const vault = url.pathname.match(/\/vault\/(0x[0-9a-fA-F]{40})/);
41010
+ if (vault) return vault[1].toLowerCase();
41011
+ } catch {
41012
+ }
41013
+ return void 0;
41014
+ }
39116
41015
  var eulerMerklRewardFetcher = createMerklRewardFetcher({
39117
41016
  merklProtocolId: "euler",
39118
41017
  lenderKey: "EULER_V2",
39119
- chainIds: EULER_MERKL_CHAINS,
39120
41018
  resolveAsset: (opp) => {
39121
- const vault = opp.explorerAddress?.toLowerCase();
41019
+ if (opp.type === "MULTILENDBORROW") {
41020
+ return (opp.tokens ?? []).filter((t) => !t.symbol?.endsWith("-DEBT")).map((t) => ({ asset: t.address.toLowerCase() }));
41021
+ }
41022
+ const vault = (opp.action === "BORROW" ? parseEulerVaultFromUrl(opp.depositUrl) : void 0) ?? opp.explorerAddress?.toLowerCase();
39122
41023
  if (!vault) return void 0;
39123
41024
  return { asset: vault };
39124
41025
  }
39125
41026
  });
39126
- var MORPHO_MERKL_CHAINS = [
39127
- "1",
39128
- // Ethereum
39129
- "130",
39130
- // Unichain
39131
- "137",
39132
- // Polygon
39133
- "8453",
39134
- // Base
39135
- "42161",
39136
- // Arbitrum
39137
- "4663"
39138
- // Robinhood chain
39139
- ];
39140
41027
  function parseMorphoUniqueKey(depositUrl) {
39141
41028
  if (!depositUrl) return void 0;
39142
41029
  const m = depositUrl.match(/\/market\/(0x[0-9a-fA-F]{64})/);
@@ -39145,7 +41032,6 @@ function parseMorphoUniqueKey(depositUrl) {
39145
41032
  var morphoCollateralMerklRewardFetcher = createMerklRewardFetcher({
39146
41033
  merklProtocolId: "morpho",
39147
41034
  lenderKey: "MORPHO_BLUE",
39148
- chainIds: MORPHO_MERKL_CHAINS,
39149
41035
  resolveAsset: (opp) => {
39150
41036
  if (opp.type !== "MORPHOCOLLATERAL") return void 0;
39151
41037
  const uniqueKey = parseMorphoUniqueKey(opp.depositUrl);
@@ -45566,7 +47452,7 @@ var Erc4626PreviewRedeemAbi = [
45566
47452
  ];
45567
47453
 
45568
47454
  // src/vaults/lst/readers/shared.ts
45569
- var ONE_E186 = 10n ** 18n;
47455
+ var ONE_E187 = 10n ** 18n;
45570
47456
  var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
45571
47457
  var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
45572
47458
  var Multicall3BalanceAbi = [
@@ -45609,7 +47495,7 @@ var readerBeetsStS = (entry) => ({
45609
47495
  }
45610
47496
  const liquidity = toBigInt12(pool);
45611
47497
  return {
45612
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47498
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45613
47499
  totalSupply,
45614
47500
  exchangeRate,
45615
47501
  liquidity
@@ -45642,7 +47528,7 @@ var readerBenqiSavax = (entry) => ({
45642
47528
  {
45643
47529
  address: entry.address,
45644
47530
  name: "getPooledAvaxByShares",
45645
- params: [ONE_E186]
47531
+ params: [ONE_E187]
45646
47532
  },
45647
47533
  { address: entry.address, name: "totalPooledAvax", params: [] }
45648
47534
  ],
@@ -45653,7 +47539,7 @@ var readerBenqiSavax = (entry) => ({
45653
47539
  if (totalSupply === void 0 || exchangeRate === void 0) {
45654
47540
  return void 0;
45655
47541
  }
45656
- const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E186;
47542
+ const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E187;
45657
47543
  return {
45658
47544
  totalAssets,
45659
47545
  totalSupply,
@@ -45672,7 +47558,7 @@ var readerBgtWrapper1to1 = (entry) => ({
45672
47558
  return {
45673
47559
  totalAssets: totalSupply,
45674
47560
  totalSupply,
45675
- exchangeRate: ONE_E186
47561
+ exchangeRate: ONE_E187
45676
47562
  };
45677
47563
  }
45678
47564
  });
@@ -45702,7 +47588,7 @@ var readerDineroBeraEth = (entry) => ({
45702
47588
  return void 0;
45703
47589
  }
45704
47590
  return {
45705
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47591
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45706
47592
  totalSupply,
45707
47593
  exchangeRate
45708
47594
  };
@@ -45714,7 +47600,7 @@ var readerErc4626 = (entry) => ({
45714
47600
  calls: [
45715
47601
  { address: entry.address, name: "totalAssets", params: [] },
45716
47602
  { address: entry.address, name: "totalSupply", params: [] },
45717
- { address: entry.address, name: "convertToAssets", params: [ONE_E186] }
47603
+ { address: entry.address, name: "convertToAssets", params: [ONE_E187] }
45718
47604
  ],
45719
47605
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
45720
47606
  parse: ([assets, supply, rate]) => {
@@ -45731,7 +47617,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
45731
47617
  calls: [
45732
47618
  { address: entry.address, name: "totalAssets", params: [] },
45733
47619
  { address: entry.address, name: "totalSupply", params: [] },
45734
- { address: entry.address, name: "previewRedeem", params: [ONE_E186] }
47620
+ { address: entry.address, name: "previewRedeem", params: [ONE_E187] }
45735
47621
  ],
45736
47622
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
45737
47623
  parse: ([assets, supply, rate]) => {
@@ -45811,7 +47697,7 @@ var readerEtherFiWeEth = (entry) => {
45811
47697
  }
45812
47698
  }
45813
47699
  return {
45814
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47700
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45815
47701
  totalSupply,
45816
47702
  exchangeRate,
45817
47703
  liquidity
@@ -45844,7 +47730,7 @@ var readerHyperbeatBeHype = (entry) => {
45844
47730
  return {
45845
47731
  totalAssets: totalSupply,
45846
47732
  totalSupply,
45847
- exchangeRate: ONE_E186
47733
+ exchangeRate: ONE_E187
45848
47734
  };
45849
47735
  }
45850
47736
  };
@@ -45852,7 +47738,7 @@ var readerHyperbeatBeHype = (entry) => {
45852
47738
  return {
45853
47739
  calls: [
45854
47740
  { address: entry.address, name: "totalSupply", params: [] },
45855
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E186] }
47741
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E187] }
45856
47742
  ],
45857
47743
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
45858
47744
  parse: ([supply, rate]) => {
@@ -45862,7 +47748,7 @@ var readerHyperbeatBeHype = (entry) => {
45862
47748
  return void 0;
45863
47749
  }
45864
47750
  return {
45865
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47751
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45866
47752
  totalSupply,
45867
47753
  exchangeRate
45868
47754
  };
@@ -45894,7 +47780,7 @@ var readerKelpRsEth = (entry) => {
45894
47780
  return {
45895
47781
  totalAssets: totalSupply,
45896
47782
  totalSupply,
45897
- exchangeRate: ONE_E186
47783
+ exchangeRate: ONE_E187
45898
47784
  };
45899
47785
  }
45900
47786
  };
@@ -45912,7 +47798,7 @@ var readerKelpRsEth = (entry) => {
45912
47798
  return void 0;
45913
47799
  }
45914
47800
  return {
45915
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47801
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45916
47802
  totalSupply,
45917
47803
  exchangeRate
45918
47804
  };
@@ -45944,7 +47830,7 @@ var readerKinetiqKHype = (entry) => {
45944
47830
  return {
45945
47831
  totalAssets: totalSupply,
45946
47832
  totalSupply,
45947
- exchangeRate: ONE_E186
47833
+ exchangeRate: ONE_E187
45948
47834
  };
45949
47835
  }
45950
47836
  };
@@ -45952,7 +47838,7 @@ var readerKinetiqKHype = (entry) => {
45952
47838
  return {
45953
47839
  calls: [
45954
47840
  { address: entry.address, name: "totalSupply", params: [] },
45955
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E186] }
47841
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E187] }
45956
47842
  ],
45957
47843
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
45958
47844
  parse: ([supply, rate]) => {
@@ -45962,7 +47848,7 @@ var readerKinetiqKHype = (entry) => {
45962
47848
  return void 0;
45963
47849
  }
45964
47850
  return {
45965
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47851
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45966
47852
  totalSupply,
45967
47853
  exchangeRate
45968
47854
  };
@@ -46002,7 +47888,7 @@ var readerLairStKaia = (entry) => ({
46002
47888
  if (totalSupply === void 0 || exchangeRate === void 0) {
46003
47889
  return void 0;
46004
47890
  }
46005
- const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E186;
47891
+ const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E187;
46006
47892
  return {
46007
47893
  totalAssets,
46008
47894
  totalSupply,
@@ -46036,7 +47922,7 @@ var readerLidoWstEth = (entry) => ({
46036
47922
  return void 0;
46037
47923
  }
46038
47924
  return {
46039
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47925
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46040
47926
  totalSupply,
46041
47927
  exchangeRate
46042
47928
  };
@@ -46074,7 +47960,7 @@ var readerListaSlisBnb = (entry) => {
46074
47960
  return {
46075
47961
  totalAssets: totalSupply,
46076
47962
  totalSupply,
46077
- exchangeRate: ONE_E186
47963
+ exchangeRate: ONE_E187
46078
47964
  };
46079
47965
  }
46080
47966
  };
@@ -46082,7 +47968,7 @@ var readerListaSlisBnb = (entry) => {
46082
47968
  return {
46083
47969
  calls: [
46084
47970
  { address: entry.address, name: "totalSupply", params: [] },
46085
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E186] },
47971
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E187] },
46086
47972
  { address: manager, name: "getTotalPooledBnb", params: [] }
46087
47973
  ],
46088
47974
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -46093,7 +47979,7 @@ var readerListaSlisBnb = (entry) => {
46093
47979
  return void 0;
46094
47980
  }
46095
47981
  const pooledBnb = toBigInt12(pooled);
46096
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E186;
47982
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E187;
46097
47983
  return { totalAssets, totalSupply, exchangeRate };
46098
47984
  }
46099
47985
  };
@@ -46123,7 +48009,7 @@ var readerMantleMEth = (entry) => {
46123
48009
  return {
46124
48010
  totalAssets: totalSupply,
46125
48011
  totalSupply,
46126
- exchangeRate: ONE_E186
48012
+ exchangeRate: ONE_E187
46127
48013
  };
46128
48014
  }
46129
48015
  };
@@ -46131,7 +48017,7 @@ var readerMantleMEth = (entry) => {
46131
48017
  return {
46132
48018
  calls: [
46133
48019
  { address: entry.address, name: "totalSupply", params: [] },
46134
- { address: staking, name: "mETHToETH", params: [ONE_E186] }
48020
+ { address: staking, name: "mETHToETH", params: [ONE_E187] }
46135
48021
  ],
46136
48022
  abis: [TotalSupplyAbi, MantleStakingAbi],
46137
48023
  parse: ([supply, rate]) => {
@@ -46141,7 +48027,7 @@ var readerMantleMEth = (entry) => {
46141
48027
  return void 0;
46142
48028
  }
46143
48029
  return {
46144
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48030
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46145
48031
  totalSupply,
46146
48032
  exchangeRate
46147
48033
  };
@@ -46162,7 +48048,7 @@ var readerOffChain = (entry) => {
46162
48048
  return {
46163
48049
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
46164
48050
  totalSupply,
46165
- exchangeRate: ONE_E186
48051
+ exchangeRate: ONE_E187
46166
48052
  };
46167
48053
  }
46168
48054
  };
@@ -46196,7 +48082,7 @@ var readerRenzoEzEth = (entry) => {
46196
48082
  return {
46197
48083
  totalAssets: totalSupply,
46198
48084
  totalSupply,
46199
- exchangeRate: ONE_E186
48085
+ exchangeRate: ONE_E187
46200
48086
  };
46201
48087
  }
46202
48088
  };
@@ -46215,7 +48101,7 @@ var readerRenzoEzEth = (entry) => {
46215
48101
  return {
46216
48102
  totalAssets: totalTvl,
46217
48103
  totalSupply,
46218
- exchangeRate: totalTvl * ONE_E186 / totalSupply
48104
+ exchangeRate: totalTvl * ONE_E187 / totalSupply
46219
48105
  };
46220
48106
  }
46221
48107
  };
@@ -46271,7 +48157,7 @@ var readerRocketReth = (entry) => {
46271
48157
  }
46272
48158
  const liquidity = depositPool ? toBigInt12(slice[2]) : void 0;
46273
48159
  return {
46274
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48160
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46275
48161
  totalSupply,
46276
48162
  exchangeRate,
46277
48163
  liquidity
@@ -46313,7 +48199,7 @@ var readerStaderEthx = (entry) => {
46313
48199
  return {
46314
48200
  totalAssets: totalSupply,
46315
48201
  totalSupply,
46316
- exchangeRate: ONE_E186
48202
+ exchangeRate: ONE_E187
46317
48203
  };
46318
48204
  }
46319
48205
  };
@@ -46331,7 +48217,7 @@ var readerStaderEthx = (entry) => {
46331
48217
  return void 0;
46332
48218
  }
46333
48219
  return {
46334
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48220
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46335
48221
  totalSupply,
46336
48222
  exchangeRate
46337
48223
  };
@@ -46348,7 +48234,7 @@ var readerStaderMaticX = (entry) => {
46348
48234
  {
46349
48235
  address: rateAddress,
46350
48236
  name: "convertMaticXToMatic",
46351
- params: [ONE_E186],
48237
+ params: [ONE_E187],
46352
48238
  chainId: homeChainId
46353
48239
  }
46354
48240
  ],
@@ -46363,7 +48249,7 @@ var readerStaderMaticX = (entry) => {
46363
48249
  }
46364
48250
  const isCrossChain = homeContract !== void 0;
46365
48251
  return {
46366
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E186 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E186,
48252
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E187 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E187,
46367
48253
  totalSupply,
46368
48254
  exchangeRate: amountInMatic
46369
48255
  };
@@ -46395,7 +48281,7 @@ var readerStakeWiseOsEth = (entry) => {
46395
48281
  return {
46396
48282
  totalAssets: totalSupply,
46397
48283
  totalSupply,
46398
- exchangeRate: ONE_E186
48284
+ exchangeRate: ONE_E187
46399
48285
  };
46400
48286
  }
46401
48287
  };
@@ -46403,7 +48289,7 @@ var readerStakeWiseOsEth = (entry) => {
46403
48289
  return {
46404
48290
  calls: [
46405
48291
  { address: entry.address, name: "totalSupply", params: [] },
46406
- { address: controller, name: "convertToAssets", params: [ONE_E186] }
48292
+ { address: controller, name: "convertToAssets", params: [ONE_E187] }
46407
48293
  ],
46408
48294
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
46409
48295
  parse: ([supply, rate]) => {
@@ -46413,7 +48299,7 @@ var readerStakeWiseOsEth = (entry) => {
46413
48299
  return void 0;
46414
48300
  }
46415
48301
  return {
46416
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48302
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46417
48303
  totalSupply,
46418
48304
  exchangeRate
46419
48305
  };
@@ -46445,7 +48331,7 @@ var readerStCelo = (entry) => {
46445
48331
  return {
46446
48332
  totalAssets: totalSupply,
46447
48333
  totalSupply,
46448
- exchangeRate: ONE_E186
48334
+ exchangeRate: ONE_E187
46449
48335
  };
46450
48336
  }
46451
48337
  };
@@ -46453,7 +48339,7 @@ var readerStCelo = (entry) => {
46453
48339
  return {
46454
48340
  calls: [
46455
48341
  { address: entry.address, name: "totalSupply", params: [] },
46456
- { address: manager, name: "toCelo", params: [ONE_E186] }
48342
+ { address: manager, name: "toCelo", params: [ONE_E187] }
46457
48343
  ],
46458
48344
  abis: [TotalSupplyAbi, StCeloManagerAbi],
46459
48345
  parse: ([supply, rate]) => {
@@ -46463,7 +48349,7 @@ var readerStCelo = (entry) => {
46463
48349
  return void 0;
46464
48350
  }
46465
48351
  return {
46466
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48352
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46467
48353
  totalSupply,
46468
48354
  exchangeRate
46469
48355
  };
@@ -46496,7 +48382,7 @@ var readerSwellGetRate = (entry) => ({
46496
48382
  return void 0;
46497
48383
  }
46498
48384
  return {
46499
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48385
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46500
48386
  totalSupply,
46501
48387
  exchangeRate
46502
48388
  };
@@ -46527,7 +48413,7 @@ var readerValantisWstHype = (entry) => {
46527
48413
  return {
46528
48414
  totalAssets: totalSupply,
46529
48415
  totalSupply,
46530
- exchangeRate: ONE_E186
48416
+ exchangeRate: ONE_E187
46531
48417
  };
46532
48418
  }
46533
48419
  };
@@ -46545,7 +48431,7 @@ var readerValantisWstHype = (entry) => {
46545
48431
  return void 0;
46546
48432
  }
46547
48433
  return {
46548
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48434
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46549
48435
  totalSupply,
46550
48436
  exchangeRate
46551
48437
  };
@@ -46579,7 +48465,7 @@ var readerVedaAccountant = (entry) => {
46579
48465
  return {
46580
48466
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
46581
48467
  totalSupply,
46582
- exchangeRate: ONE_E186
48468
+ exchangeRate: ONE_E187
46583
48469
  };
46584
48470
  }
46585
48471
  };
@@ -46598,7 +48484,7 @@ var readerVedaAccountant = (entry) => {
46598
48484
  const exchangeRate = rawRate * scale;
46599
48485
  return {
46600
48486
  totalAssets: rescaleDecimals(
46601
- totalSupply * exchangeRate / ONE_E186,
48487
+ totalSupply * exchangeRate / ONE_E187,
46602
48488
  shareDec,
46603
48489
  underlyingDec
46604
48490
  ),
@@ -46634,9 +48520,9 @@ var readerAnkrRatio = (entry) => ({
46634
48520
  return void 0;
46635
48521
  }
46636
48522
  return {
46637
- totalAssets: totalSupply * ONE_E186 / r,
48523
+ totalAssets: totalSupply * ONE_E187 / r,
46638
48524
  totalSupply,
46639
- exchangeRate: ONE_E186 * ONE_E186 / r
48525
+ exchangeRate: ONE_E187 * ONE_E187 / r
46640
48526
  };
46641
48527
  }
46642
48528
  });
@@ -46680,7 +48566,7 @@ var readerCoreEarnRate = (entry) => {
46680
48566
  return {
46681
48567
  totalAssets: totalSupply * r / CORE_RATE_DENOM,
46682
48568
  totalSupply,
46683
- exchangeRate: r * ONE_E186 / CORE_RATE_DENOM
48569
+ exchangeRate: r * ONE_E187 / CORE_RATE_DENOM
46684
48570
  };
46685
48571
  }
46686
48572
  };
@@ -46702,7 +48588,7 @@ var readerCoreStakedRatio = (entry) => {
46702
48588
  return {
46703
48589
  totalAssets: totalStaked,
46704
48590
  totalSupply,
46705
- exchangeRate: totalStaked * ONE_E186 / totalSupply
48591
+ exchangeRate: totalStaked * ONE_E187 / totalSupply
46706
48592
  };
46707
48593
  }
46708
48594
  };
@@ -46733,7 +48619,7 @@ var readerStellaStDot = (entry) => ({
46733
48619
  {
46734
48620
  address: entry.address,
46735
48621
  name: "getPooledTokenByShares",
46736
- params: [ONE_E186]
48622
+ params: [ONE_E187]
46737
48623
  },
46738
48624
  { address: entry.address, name: "getTotalPooledToken", params: [] }
46739
48625
  ],
@@ -46744,7 +48630,7 @@ var readerStellaStDot = (entry) => ({
46744
48630
  if (totalSupply === void 0 || exchangeRate === void 0) {
46745
48631
  return void 0;
46746
48632
  }
46747
- const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E186;
48633
+ const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E187;
46748
48634
  return {
46749
48635
  totalAssets,
46750
48636
  totalSupply,
@@ -46782,7 +48668,7 @@ var readerKintsuSMon = (entry) => ({
46782
48668
  const totalAssets = toBigInt12(pooled);
46783
48669
  const totalSupply = toBigInt12(shares);
46784
48670
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
46785
- const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E186 / totalSupply : ONE_E186;
48671
+ const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E187 / totalSupply : ONE_E187;
46786
48672
  return { totalAssets, totalSupply, exchangeRate };
46787
48673
  }
46788
48674
  });
@@ -47218,7 +49104,7 @@ var getLstValidators = async (chainId, shareToken) => {
47218
49104
  };
47219
49105
 
47220
49106
  // src/vaults/lst/fetchPublic.ts
47221
- var ONE_E187 = 10n ** 18n;
49107
+ var ONE_E188 = 10n ** 18n;
47222
49108
  var ERC20_BALANCE_ABI = parseAbi([
47223
49109
  "function balanceOf(address) view returns (uint256)"
47224
49110
  ]);
@@ -47333,8 +49219,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
47333
49219
  const underlyingUnit = 10n ** BigInt(underlyingDec);
47334
49220
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
47335
49221
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
47336
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E187;
47337
- const convertToShares = state.exchangeRate > 0n ? ONE_E187 * shareUnit / state.exchangeRate : 0n;
49222
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E188;
49223
+ const convertToShares = state.exchangeRate > 0n ? ONE_E188 * shareUnit / state.exchangeRate : 0n;
47338
49224
  let liquidityRaw;
47339
49225
  if (state.liquidity !== void 0) {
47340
49226
  liquidityRaw = state.liquidity;
@@ -50349,6 +52235,15 @@ var TotalSupplyAbi2 = [
50349
52235
  outputs: [{ type: "uint256" }]
50350
52236
  }
50351
52237
  ];
52238
+ var BalanceOfAbi = [
52239
+ {
52240
+ name: "balanceOf",
52241
+ type: "function",
52242
+ stateMutability: "view",
52243
+ inputs: [{ type: "address", name: "account" }],
52244
+ outputs: [{ type: "uint256" }]
52245
+ }
52246
+ ];
50352
52247
  var Erc4626ReadAbi2 = [
50353
52248
  {
50354
52249
  name: "totalAssets",
@@ -50365,9 +52260,24 @@ var Erc4626ReadAbi2 = [
50365
52260
  outputs: [{ type: "uint256", name: "assets" }]
50366
52261
  }
50367
52262
  ];
52263
+ var NavOracleReadAbi = [
52264
+ {
52265
+ name: "latestRoundData",
52266
+ type: "function",
52267
+ stateMutability: "view",
52268
+ inputs: [],
52269
+ outputs: [
52270
+ { name: "roundId", type: "uint80" },
52271
+ { name: "answer", type: "int256" },
52272
+ { name: "startedAt", type: "uint256" },
52273
+ { name: "updatedAt", type: "uint256" },
52274
+ { name: "answeredInRound", type: "uint80" }
52275
+ ]
52276
+ }
52277
+ ];
50368
52278
 
50369
52279
  // src/vaults/savings/readers/shared.ts
50370
- var ONE_E188 = 10n ** 18n;
52280
+ var ONE_E189 = 10n ** 18n;
50371
52281
  var toBigInt14 = (v) => {
50372
52282
  if (v === void 0 || v === null) return void 0;
50373
52283
  if (typeof v === "bigint") return v;
@@ -50408,20 +52318,221 @@ var readerErc46262 = (entry) => {
50408
52318
  return {
50409
52319
  totalAssets,
50410
52320
  totalSupply,
50411
- exchangeRate: convertToAssetsRaw * ONE_E188 / underlyingUnit
52321
+ exchangeRate: convertToAssetsRaw * ONE_E189 / underlyingUnit
52322
+ };
52323
+ }
52324
+ };
52325
+ };
52326
+
52327
+ // src/vaults/savings/abis/native.ts
52328
+ var NativeWnlpReadAbi = [
52329
+ {
52330
+ // 1e18-scaled underlying-per-share, independent of token decimals:
52331
+ // `getNlpByWnlp(1e18) / 1e18` is the exchange rate (per Native docs).
52332
+ name: "getNlpByWnlp",
52333
+ type: "function",
52334
+ stateMutability: "view",
52335
+ inputs: [{ type: "uint256", name: "wnlpAmount" }],
52336
+ outputs: [{ type: "uint256" }]
52337
+ },
52338
+ {
52339
+ /** Instant-redeem haircut in basis points (0.1 %–2 %, default 1 %). */
52340
+ name: "instantRedeemFeeBips",
52341
+ type: "function",
52342
+ stateMutability: "view",
52343
+ inputs: [],
52344
+ outputs: [{ type: "uint256" }]
52345
+ },
52346
+ {
52347
+ /** Some assets disable the instant leg entirely — queue only. */
52348
+ name: "instantRedeemEnabled",
52349
+ type: "function",
52350
+ stateMutability: "view",
52351
+ inputs: [],
52352
+ outputs: [{ type: "bool" }]
52353
+ },
52354
+ {
52355
+ /** Per-wNLP WithdrawQueue contract (the delayed-redeem leg). */
52356
+ name: "withdrawQueue",
52357
+ type: "function",
52358
+ stateMutability: "view",
52359
+ inputs: [],
52360
+ outputs: [{ type: "address" }]
52361
+ },
52362
+ {
52363
+ /** The rebasing NTLP pool share this wNLP wraps. */
52364
+ name: "nlp",
52365
+ type: "function",
52366
+ stateMutability: "view",
52367
+ inputs: [],
52368
+ outputs: [{ type: "address" }]
52369
+ },
52370
+ {
52371
+ name: "underlying",
52372
+ type: "function",
52373
+ stateMutability: "view",
52374
+ inputs: [],
52375
+ outputs: [{ type: "address" }]
52376
+ }
52377
+ ];
52378
+ var NativeWithdrawQueueReadAbi = [
52379
+ {
52380
+ /** Seconds between `requestWithdrawal` and `claimWithdrawal`
52381
+ * (1–8 days depending on the asset; 3 days is the common value). */
52382
+ name: "withdrawalWindow",
52383
+ type: "function",
52384
+ stateMutability: "view",
52385
+ inputs: [],
52386
+ outputs: [{ type: "uint256" }]
52387
+ }
52388
+ ];
52389
+
52390
+ // src/vaults/savings/readers/erc4626Idle.ts
52391
+ var readerErc4626Idle = (entry) => {
52392
+ const shareUnit = 10n ** BigInt(entry.decimals);
52393
+ const underlyingUnit = 10n ** BigInt(entry.underlyingDecimals ?? entry.decimals);
52394
+ const inventory = entry.inventoryContract ?? entry.address;
52395
+ return {
52396
+ calls: [
52397
+ { address: entry.address, name: "totalAssets", params: [] },
52398
+ { address: entry.address, name: "totalSupply", params: [] },
52399
+ {
52400
+ address: entry.address,
52401
+ name: "convertToAssets",
52402
+ params: [shareUnit]
52403
+ },
52404
+ { address: entry.underlying, name: "balanceOf", params: [inventory] }
52405
+ ],
52406
+ abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2, BalanceOfAbi],
52407
+ parse: ([assets, supply, rate, inventoryBalance]) => {
52408
+ const totalAssets = toBigInt14(assets);
52409
+ const totalSupply = toBigInt14(supply);
52410
+ const convertToAssetsRaw = toBigInt14(rate);
52411
+ if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
52412
+ return void 0;
52413
+ }
52414
+ const capacity = toBigInt14(inventoryBalance);
52415
+ return {
52416
+ totalAssets,
52417
+ totalSupply,
52418
+ exchangeRate: convertToAssetsRaw * ONE_E189 / underlyingUnit,
52419
+ ...capacity !== void 0 ? {
52420
+ instantRedeemCapacity: capacity,
52421
+ instantRedeemEnabled: true,
52422
+ withdrawFeeBps: 0
52423
+ } : {},
52424
+ ...entry.withdrawQueue ? { withdrawQueue: entry.withdrawQueue } : {}
52425
+ };
52426
+ }
52427
+ };
52428
+ };
52429
+
52430
+ // src/vaults/savings/readers/navOracle.ts
52431
+ var readerNavOracle = (entry) => {
52432
+ const shareUnit = 10n ** BigInt(entry.decimals);
52433
+ const underlyingUnit = 10n ** BigInt(entry.underlyingDecimals ?? entry.decimals);
52434
+ return {
52435
+ calls: [
52436
+ { address: entry.address, name: "totalSupply", params: [] },
52437
+ {
52438
+ address: entry.priceOracle ?? entry.address,
52439
+ name: "latestRoundData",
52440
+ params: []
52441
+ }
52442
+ ],
52443
+ abis: [TotalSupplyAbi2, NavOracleReadAbi],
52444
+ parse: ([supply, round]) => {
52445
+ const totalSupply = toBigInt14(supply);
52446
+ if (totalSupply === void 0) return void 0;
52447
+ const raw = Array.isArray(round) ? round[1] : round?.answer;
52448
+ const exchangeRate = toBigInt14(raw);
52449
+ if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
52450
+ return {
52451
+ totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E189 * shareUnit),
52452
+ totalSupply,
52453
+ exchangeRate
52454
+ };
52455
+ }
52456
+ };
52457
+ };
52458
+
52459
+ // src/vaults/savings/readers/nativeWnlp.ts
52460
+ var readerNativeWnlp = (entry) => {
52461
+ const { address, underlying, inventoryContract, withdrawQueue } = entry;
52462
+ return {
52463
+ calls: [
52464
+ { address, name: "totalSupply", params: [] },
52465
+ { address, name: "getNlpByWnlp", params: [ONE_E189] },
52466
+ { address, name: "instantRedeemFeeBips", params: [] },
52467
+ { address, name: "instantRedeemEnabled", params: [] },
52468
+ // Falls back to the vault itself when no CreditVault is pinned —
52469
+ // yields a 0 capacity rather than a malformed call.
52470
+ {
52471
+ address: underlying,
52472
+ name: "balanceOf",
52473
+ params: [inventoryContract ?? address]
52474
+ },
52475
+ {
52476
+ address: withdrawQueue ?? address,
52477
+ name: "withdrawalWindow",
52478
+ params: []
52479
+ }
52480
+ ],
52481
+ abis: [
52482
+ TotalSupplyAbi2,
52483
+ NativeWnlpReadAbi,
52484
+ NativeWnlpReadAbi,
52485
+ NativeWnlpReadAbi,
52486
+ BalanceOfAbi,
52487
+ NativeWithdrawQueueReadAbi
52488
+ ],
52489
+ parse: ([supply, rate, feeBips, instantEnabled, inventory, window]) => {
52490
+ const totalSupply = toBigInt14(supply);
52491
+ const exchangeRate = toBigInt14(rate);
52492
+ if (totalSupply === void 0 || exchangeRate === void 0) {
52493
+ return void 0;
52494
+ }
52495
+ const capacity = toBigInt14(inventory);
52496
+ const windowSeconds = toBigInt14(window);
52497
+ const bips = toBigInt14(feeBips);
52498
+ return {
52499
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
52500
+ totalSupply,
52501
+ exchangeRate,
52502
+ // `instantRedeemFeeBips` on-chain is already basis points, so it
52503
+ // maps 1:1 onto the cross-provider `withdrawFeeBps`.
52504
+ withdrawFeeBps: bips !== void 0 ? Number(bips) : void 0,
52505
+ // `instantRedeemEnabled` is a bool; a reverted call reads as
52506
+ // undefined, which we treat as "unknown" rather than "disabled".
52507
+ instantRedeemEnabled: typeof instantEnabled === "boolean" ? instantEnabled : void 0,
52508
+ instantRedeemCapacity: capacity,
52509
+ withdrawalCooldownSeconds: windowSeconds !== void 0 ? Number(windowSeconds) : void 0,
52510
+ withdrawQueue: withdrawQueue?.toLowerCase()
50412
52511
  };
50413
52512
  }
50414
52513
  };
50415
52514
  };
50416
52515
 
50417
52516
  // src/vaults/savings/readers/index.ts
50418
- var buildReader2 = (entry) => readerErc46262(entry);
52517
+ var buildReader2 = (entry) => {
52518
+ switch (entry.reader) {
52519
+ case "native-wnlp":
52520
+ return readerNativeWnlp(entry);
52521
+ case "nav-oracle":
52522
+ return readerNavOracle(entry);
52523
+ case "erc4626-idle":
52524
+ return readerErc4626Idle(entry);
52525
+ case "erc4626":
52526
+ case void 0:
52527
+ return readerErc46262(entry);
52528
+ }
52529
+ };
50419
52530
 
50420
52531
  // src/vaults/savings/yieldBinding.ts
50421
52532
  var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
50422
52533
 
50423
52534
  // src/vaults/savings/fetchPublic.ts
50424
- var ONE_E189 = 10n ** 18n;
52535
+ var ONE_E1810 = 10n ** 18n;
50425
52536
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
50426
52537
  const entries = getSavingsRegistry(chainId);
50427
52538
  if (entries.length === 0) return {};
@@ -50459,11 +52570,19 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
50459
52570
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
50460
52571
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
50461
52572
  const isInstant = entry.withdrawalMode === "instant";
50462
- const liquidityRaw = isInstant ? state.totalAssets.toString() : "0";
50463
- const liquidityFormatted = isInstant ? totalAssetsFormatted : 0;
50464
- const liquidityUsd = isInstant ? totalAssetsUsd : 0;
50465
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E189;
50466
- const convertToShares = state.exchangeRate > 0n ? ONE_E189 * shareUnit / state.exchangeRate : 0n;
52573
+ let liquidityAmount = isInstant ? state.totalAssets : 0n;
52574
+ if (!isInstant && state.instantRedeemCapacity !== void 0) {
52575
+ liquidityAmount = state.instantRedeemEnabled === false ? 0n : state.instantRedeemCapacity < state.totalAssets ? state.instantRedeemCapacity : state.totalAssets;
52576
+ }
52577
+ const liquidityRaw = liquidityAmount.toString();
52578
+ const liquidityFormatted = Number(liquidityAmount) / 10 ** underlyingDec;
52579
+ const liquidityUsd = priceUsd !== void 0 ? liquidityFormatted * priceUsd : 0;
52580
+ const instantLiquidityRatio = state.totalAssets > 0n ? Math.min(
52581
+ 1,
52582
+ Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
52583
+ ) : 1;
52584
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
52585
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
50467
52586
  const displayName = composeVaultDisplayName(
50468
52587
  entry.brand,
50469
52588
  entry.brand,
@@ -50491,19 +52610,32 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
50491
52610
  supplyRate,
50492
52611
  rewardsRate,
50493
52612
  depositRate,
50494
- isErc4626: true,
52613
+ // Opt-IN, not opt-out: a new bespoke reader exists precisely
52614
+ // because its token is not a conforming vault, so the default for
52615
+ // an unlisted reader must be `false`. `erc4626-idle` is the plain
52616
+ // 4626 surface plus an inventory read, so it counts; Native's wNLP
52617
+ // and Re's NAV-oracle tokens revert on `asset()`/`totalAssets()`/
52618
+ // `convertToAssets()` and do not.
52619
+ isErc4626: entry.reader === void 0 || entry.reader === "erc4626" || entry.reader === "erc4626-idle",
50495
52620
  isRebasing: entry.isRebasing,
50496
52621
  isMintable: entry.isMintable,
50497
52622
  mintContract: entry.mintContract?.toLowerCase() ?? addressLc,
50498
52623
  withdrawalMode: entry.withdrawalMode,
50499
- withdrawalCooldownSeconds: entry.withdrawalCooldownSeconds,
52624
+ // On-chain wins over the registry's pinned fallback — Native's
52625
+ // queue window is per-asset and governance-mutable.
52626
+ withdrawalCooldownSeconds: state.withdrawalCooldownSeconds ?? entry.withdrawalCooldownSeconds,
52627
+ withdrawFeeBps: state.withdrawFeeBps,
52628
+ instantRedeemEnabled: state.instantRedeemEnabled,
52629
+ inventoryContract: entry.inventoryContract?.toLowerCase(),
52630
+ withdrawQueue: state.withdrawQueue ?? entry.withdrawQueue?.toLowerCase(),
50500
52631
  asset,
50501
52632
  priceUsd,
50502
52633
  totalAssetsFormatted,
50503
52634
  totalAssetsUsd,
50504
52635
  liquidity: liquidityRaw,
50505
52636
  liquidityFormatted,
50506
- liquidityUsd
52637
+ liquidityUsd,
52638
+ instantLiquidityRatio
50507
52639
  };
50508
52640
  out[addressLc] = vault;
50509
52641
  }
@@ -52780,7 +54912,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
52780
54912
  };
52781
54913
 
52782
54914
  // src/vaults/yield/annualize.ts
52783
- var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
54915
+ var YEAR_SECONDS6 = 365 * 24 * 60 * 60;
52784
54916
  var SCALE = 10n ** 18n;
52785
54917
  var appendSnapshot = (points, snap, options) => {
52786
54918
  const maxPoints = options?.maxPoints ?? 90;
@@ -52809,7 +54941,7 @@ var computeVaultApr = (points, options) => {
52809
54941
  if (pThen === 0n) return void 0;
52810
54942
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
52811
54943
  const ratio = Number(ratioScaled) / 1e18;
52812
- const apr = (ratio - 1) * (YEAR_SECONDS3 / windowSeconds);
54944
+ const apr = (ratio - 1) * (YEAR_SECONDS6 / windowSeconds);
52813
54945
  return {
52814
54946
  apr,
52815
54947
  sharePriceNow: now.p,