@1delta/margin-fetcher 0.0.400 → 0.0.402

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';
@@ -11304,10 +11304,13 @@ var MORPHO_LENS = {
11304
11304
  [Chain.ABSTRACT]: "0x8e24cfc19c6c00c524353cb8816f5f1c2f33c201",
11305
11305
  [Chain.INK]: "0x0bd7473CbBf81d9dD936c61117eD230d95006CA2",
11306
11306
  [Chain.KAIA_MAINNET]: "0x925716D57c842B50806884EDb295bA3E3A8EBdFE",
11307
- // blue-api does not index these two, so the lens is the ONLY way to read
11307
+ // blue-api does not index these three, so the lens is the ONLY way to read
11308
11308
  // their Morpho markets — see `lenderApiOnly` in fetchLenderAll.ts.
11309
11309
  [Chain.GNOSIS]: "0x98542B95B44a4732EffB1F4F01A696F1546236d3",
11310
- [Chain.AVALANCHE_C_CHAIN]: "0x2eA75bBBc5615651efc9401FBc9Db4d03B055CA6"
11310
+ [Chain.AVALANCHE_C_CHAIN]: "0x2eA75bBBc5615651efc9401FBc9Db4d03B055CA6",
11311
+ // Same address as HyperEVM — same deployer + nonce, so CREATE lands
11312
+ // identically on both chains.
11313
+ [Chain.MEGAETH_MAINNET]: "0x6Bc6aCB905c1216B0119C87Bf9E178ce298310FA"
11311
11314
  };
11312
11315
  var buildMorphoUserCallWithLens = (chainId, account, lender, marketsToQuery) => {
11313
11316
  const marketSlices = chunk(marketsToQuery, 100);
@@ -23962,6 +23965,7 @@ function lenderApiOnly(lender, chainId) {
23962
23965
  if (chainId === "4114") return false;
23963
23966
  if (chainId === Chain.GNOSIS) return false;
23964
23967
  if (chainId === Chain.AVALANCHE_C_CHAIN) return false;
23968
+ if (chainId === Chain.MEGAETH_MAINNET) return false;
23965
23969
  return true;
23966
23970
  }
23967
23971
  if (isMidnight(lender)) return true;
@@ -24246,14 +24250,14 @@ var { isArray } = lodash;
24246
24250
  var maxRetries = 3;
24247
24251
  var MULTICALL_FAILURE = "0x";
24248
24252
  var isFailedCall = (value) => value === void 0 || value === null || value === MULTICALL_FAILURE;
24249
- var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient18, nextRpcId, batchSize, logs) => {
24253
+ var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient17, nextRpcId, batchSize, logs) => {
24250
24254
  const failedIdx = [];
24251
24255
  for (let i = 0; i < mapped.length; i++) {
24252
24256
  if (isFailedCall(mapped[i])) failedIdx.push(i);
24253
24257
  }
24254
24258
  if (failedIdx.length === 0) return mapped;
24255
24259
  try {
24256
- const provider = getEvmClient18(chainId, nextRpcId);
24260
+ const provider = getEvmClient17(chainId, nextRpcId);
24257
24261
  const returnData = await provider.multicall({
24258
24262
  allowFailure: true,
24259
24263
  batchSize,
@@ -24267,9 +24271,9 @@ var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient18, nextRp
24267
24271
  }
24268
24272
  return mapped;
24269
24273
  };
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) => {
24274
+ 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
24275
  try {
24272
- const provider = getEvmClient18(chainId, providerId);
24276
+ const provider = getEvmClient17(chainId, providerId);
24273
24277
  const abiIsArray = isArray(abi[0]);
24274
24278
  const contracts = calls.map(({ address, name, params }, i) => ({
24275
24279
  abi: abiIsArray ? abi?.[i] : abi,
@@ -24291,7 +24295,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24291
24295
  chainId,
24292
24296
  contracts,
24293
24297
  res,
24294
- getEvmClient18,
24298
+ getEvmClient17,
24295
24299
  providerId + 1,
24296
24300
  batchSize,
24297
24301
  logs
@@ -24305,7 +24309,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24305
24309
  chainId,
24306
24310
  abi,
24307
24311
  calls,
24308
- getEvmClient18,
24312
+ getEvmClient17,
24309
24313
  retry,
24310
24314
  providerId,
24311
24315
  retries,
@@ -24316,13 +24320,13 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24316
24320
  );
24317
24321
  }
24318
24322
  };
24319
- var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false) => {
24323
+ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient17, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false, retryFailed = false) => {
24320
24324
  if (poolSize <= 1) {
24321
24325
  return multicallViemAbiArray(
24322
24326
  chainId,
24323
24327
  abi,
24324
24328
  calls,
24325
- getEvmClient18,
24329
+ getEvmClient17,
24326
24330
  true,
24327
24331
  0,
24328
24332
  retries,
@@ -24347,7 +24351,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolS
24347
24351
  const results = new Array(contracts.length);
24348
24352
  const runBatch = async (batch, rpcId, attemptsLeft, size) => {
24349
24353
  try {
24350
- const provider = getEvmClient18(chainId, rpcId);
24354
+ const provider = getEvmClient17(chainId, rpcId);
24351
24355
  const returnData = await provider.multicall({
24352
24356
  allowFailure,
24353
24357
  batchSize: size,
@@ -24361,7 +24365,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolS
24361
24365
  chainId,
24362
24366
  batch.items,
24363
24367
  mapped,
24364
- getEvmClient18,
24368
+ getEvmClient17,
24365
24369
  rpcId + 1,
24366
24370
  size,
24367
24371
  logs
@@ -33199,7 +33203,7 @@ function unflattenLenderData(pools) {
33199
33203
  }
33200
33204
  return result;
33201
33205
  }
33202
- var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, concurrency = 1) => {
33206
+ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient17, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, concurrency = 1) => {
33203
33207
  const queries = organizeUserQueries(queriesRaw);
33204
33208
  const builtCalls = await Promise.all(
33205
33209
  queries.map(async (query3) => {
@@ -33209,7 +33213,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowF
33209
33213
  query3.lender,
33210
33214
  query3.account,
33211
33215
  query3.params,
33212
- getEvmClient18
33216
+ getEvmClient17
33213
33217
  );
33214
33218
  return callData.map((call) => ({ call, abi: call.abi ?? abi }));
33215
33219
  })
@@ -33219,7 +33223,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowF
33219
33223
  chainId,
33220
33224
  calls.map((call) => call.abi),
33221
33225
  calls.map((call) => call.call),
33222
- getEvmClient18,
33226
+ getEvmClient17,
33223
33227
  concurrency,
33224
33228
  retries,
33225
33229
  allowFailure,
@@ -36151,6 +36155,166 @@ var monadLstFetcher = {
36151
36155
  return out;
36152
36156
  }
36153
36157
  };
36158
+ var CHAIN_ID7 = Chain.ETHEREUM_MAINNET;
36159
+ var FRXETH_SUMMARY_URL = "https://api.frax.finance/v2/frxeth/summary/latest";
36160
+ var SFRXETH = "0xac3e018457b222d93114458476f3e3416abbe38f";
36161
+ var SFRXUSD = "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6";
36162
+ var SFRAX = "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32";
36163
+ var YEAR_SECONDS3 = 31536000n;
36164
+ var ONE_E186 = 10n ** 18n;
36165
+ var SFRXETH_KEY = "SFRXETH";
36166
+ var SFRXUSD_KEY = "SFRXUSD";
36167
+ var SFRXUSD_GROUP_KEY = "Staked Frax USD::sfrxUSD";
36168
+ var SFRAX_KEY = "SFRAX";
36169
+ var SFRAX_GROUP_KEY = "Staked FRAX::SFRAX";
36170
+ var XERC4626_ABI = [
36171
+ {
36172
+ name: "rewardsCycleEnd",
36173
+ type: "function",
36174
+ stateMutability: "view",
36175
+ inputs: [],
36176
+ outputs: [{ type: "uint32" }]
36177
+ },
36178
+ {
36179
+ name: "lastSync",
36180
+ type: "function",
36181
+ stateMutability: "view",
36182
+ inputs: [],
36183
+ outputs: [{ type: "uint32" }]
36184
+ },
36185
+ {
36186
+ name: "lastRewardAmount",
36187
+ type: "function",
36188
+ stateMutability: "view",
36189
+ inputs: [],
36190
+ outputs: [{ type: "uint192" }]
36191
+ },
36192
+ {
36193
+ name: "totalAssets",
36194
+ type: "function",
36195
+ stateMutability: "view",
36196
+ inputs: [],
36197
+ outputs: [{ type: "uint256" }]
36198
+ }
36199
+ ];
36200
+ var LINEAR_REWARDS_ABI = [
36201
+ {
36202
+ name: "rewardsCycleData",
36203
+ type: "function",
36204
+ stateMutability: "view",
36205
+ inputs: [],
36206
+ outputs: [
36207
+ { type: "uint40", name: "cycleEnd" },
36208
+ { type: "uint40", name: "lastSync" },
36209
+ { type: "uint216", name: "rewardCycleAmount" }
36210
+ ]
36211
+ },
36212
+ {
36213
+ name: "maxDistributionPerSecondPerAsset",
36214
+ type: "function",
36215
+ stateMutability: "view",
36216
+ inputs: [],
36217
+ outputs: [{ type: "uint256" }]
36218
+ },
36219
+ {
36220
+ name: "storedTotalAssets",
36221
+ type: "function",
36222
+ stateMutability: "view",
36223
+ inputs: [],
36224
+ outputs: [{ type: "uint256" }]
36225
+ }
36226
+ ];
36227
+ var robustFetchJson2 = async (url, { timeoutMs = 5e3, attempts = 3 } = {}) => {
36228
+ let lastErr;
36229
+ for (let i = 0; i < attempts; i++) {
36230
+ try {
36231
+ const res = await fetch(url, {
36232
+ headers: {
36233
+ accept: "application/json",
36234
+ "user-agent": "1delta-margin-fetcher"
36235
+ },
36236
+ signal: AbortSignal.timeout(timeoutMs)
36237
+ });
36238
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
36239
+ return await res.json();
36240
+ } catch (e) {
36241
+ lastErr = e;
36242
+ if (i < attempts - 1)
36243
+ await new Promise((r) => setTimeout(r, 250 * (i + 1)));
36244
+ }
36245
+ }
36246
+ throw lastErr;
36247
+ };
36248
+ var fetchSfrxEthAprOnChain = async () => {
36249
+ const [cycleEnd, lastSync, lastRewardAmount, totalAssets] = await multicallRetryUniversal({
36250
+ chain: CHAIN_ID7,
36251
+ abi: XERC4626_ABI,
36252
+ calls: [
36253
+ { address: SFRXETH, name: "rewardsCycleEnd", params: [] },
36254
+ { address: SFRXETH, name: "lastSync", params: [] },
36255
+ { address: SFRXETH, name: "lastRewardAmount", params: [] },
36256
+ { address: SFRXETH, name: "totalAssets", params: [] }
36257
+ ],
36258
+ allowFailure: false
36259
+ });
36260
+ const window = BigInt(cycleEnd) - BigInt(lastSync);
36261
+ if (window <= 0n || totalAssets === 0n) return 0;
36262
+ const perSecond = lastRewardAmount / window;
36263
+ return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / totalAssets) / 1e16;
36264
+ };
36265
+ var fetchSfrxEthApr = async () => {
36266
+ try {
36267
+ const res = await robustFetchJson2(FRXETH_SUMMARY_URL);
36268
+ const apr = Number(res?.sfrxethApr);
36269
+ if (Number.isFinite(apr) && apr >= 0) return apr;
36270
+ throw new Error("sfrxethApr missing or non-numeric");
36271
+ } catch {
36272
+ return fetchSfrxEthAprOnChain();
36273
+ }
36274
+ };
36275
+ var fetchFraxSavingsAprs = async () => {
36276
+ const results = await multicallRetryUniversal({
36277
+ chain: CHAIN_ID7,
36278
+ abi: LINEAR_REWARDS_ABI,
36279
+ calls: [SFRXUSD, SFRAX].flatMap((address) => [
36280
+ { address, name: "rewardsCycleData", params: [] },
36281
+ { address, name: "maxDistributionPerSecondPerAsset", params: [] },
36282
+ { address, name: "storedTotalAssets", params: [] }
36283
+ ]),
36284
+ allowFailure: false
36285
+ });
36286
+ const aprAt = (offset) => {
36287
+ const [cycleEnd, lastSync, rewardCycleAmount] = results[offset];
36288
+ const maxPerSecondPerAsset = results[offset + 1];
36289
+ const storedTotalAssets = results[offset + 2];
36290
+ if (storedTotalAssets === 0n) return 0;
36291
+ const window = BigInt(cycleEnd) - BigInt(lastSync);
36292
+ const uncapped = window > 0n ? rewardCycleAmount / window : 0n;
36293
+ const cap = maxPerSecondPerAsset * storedTotalAssets / ONE_E186;
36294
+ const perSecond = uncapped < cap ? uncapped : cap;
36295
+ return Number(perSecond * YEAR_SECONDS3 * ONE_E186 / storedTotalAssets) / 1e16;
36296
+ };
36297
+ return { sfrxUsd: aprAt(0), sfrax: aprAt(3) };
36298
+ };
36299
+ var sfrxEthFetcher = {
36300
+ label: "SFRXETH",
36301
+ fetch: async () => {
36302
+ const apr = await fetchSfrxEthApr();
36303
+ return { [SFRXETH_KEY]: apr };
36304
+ }
36305
+ };
36306
+ var fraxSavingsFetcher = {
36307
+ label: "SFRXUSD_SFRAX",
36308
+ fetch: async () => {
36309
+ const { sfrxUsd, sfrax: sfrax2 } = await fetchFraxSavingsAprs();
36310
+ return {
36311
+ [SFRXUSD_KEY]: sfrxUsd,
36312
+ [SFRXUSD_GROUP_KEY]: sfrxUsd,
36313
+ [SFRAX_KEY]: sfrax2,
36314
+ [SFRAX_GROUP_KEY]: sfrax2
36315
+ };
36316
+ }
36317
+ };
36154
36318
 
36155
36319
  // src/vaults/lst/registry.ts
36156
36320
  var LST_REGISTRY = {
@@ -36257,6 +36421,39 @@ var LST_REGISTRY = {
36257
36421
  yieldFetcher: wstethFetcher,
36258
36422
  yieldKey: "WSTETH"
36259
36423
  },
36424
+ {
36425
+ // Frax sfrxETH — a plain ERC-4626 over **frxETH**, not over ETH:
36426
+ // `asset()` is frxETH and `convertToAssets` is denominated in it,
36427
+ // so `underlying` is frxETH rather than the native sentinel.
36428
+ //
36429
+ // Two exits, and they behave differently. sfrxETH → frxETH is an
36430
+ // unconditional same-block `redeem` (the vault holds the whole
36431
+ // frxETH float), which is what `withdrawalMode` describes. frxETH
36432
+ // → ETH has **no protocol redemption at all** — the frxETHMinter
36433
+ // is one-way — so that leg is DEX-only (Curve frxETH/ETH). Modeled
36434
+ // as `instant-or-queued` because the *listed underlying* is always
36435
+ // instantly redeemable; see LST_DEPOSIT_INTERFACES.md.
36436
+ address: "0xac3e018457b222d93114458476f3e3416abbe38f",
36437
+ underlying: "0x5e8422345238f34275888049021821e8e08caa1f",
36438
+ // frxETH
36439
+ symbol: "sfrxETH",
36440
+ brand: "Frax",
36441
+ decimals: 18,
36442
+ reader: "erc4626",
36443
+ isErc4626: true,
36444
+ isRebasing: false,
36445
+ isMintable: true,
36446
+ // Native ETH mints in one call via `frxETHMinter.submitAndDeposit`
36447
+ // (ETH → frxETH → sfrxETH); the frxETH ERC-20 path is the plain
36448
+ // 4626 `deposit`. Both are declared in the calldata-sdk
36449
+ // `fraxSfrxEth` accept-set.
36450
+ isNativeUnderlying: true,
36451
+ mintContract: "0xac3e018457b222d93114458476f3e3416abbe38f",
36452
+ mintInputAsset: "0x5e8422345238f34275888049021821e8e08caa1f",
36453
+ withdrawalMode: "instant-or-queued",
36454
+ yieldFetcher: sfrxEthFetcher,
36455
+ yieldKey: "SFRXETH"
36456
+ },
36260
36457
  {
36261
36458
  address: "0xae78736cd615f374d3085123a210448e74fc6393",
36262
36459
  underlying: "0x0000000000000000000000000000000000000000",
@@ -37723,65 +37920,1297 @@ var hastraPrimeFetcher = {
37723
37920
  return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
37724
37921
  }
37725
37922
  };
37726
- var CHAIN_ID7 = "4663";
37727
- var VAULT2 = "0xde770c84fe66e063336b31737cfe9790f18c4087";
37728
- var SPARK_SAVINGS_USDG_KEY = "SPUSDG";
37729
37923
  var RAY3 = 10n ** 27n;
37730
- var WINDOW_BLOCKS6 = 400000n;
37731
- var MAX_RPC_TRIES6 = 3;
37732
- var CHI_ABI = [
37924
+ var YEAR_SECONDS4 = 31536e3;
37925
+ var SPARK_VAULTS_V2 = [
37733
37926
  {
37734
- name: "chi",
37927
+ chainId: Chain.ETHEREUM_MAINNET,
37928
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
37929
+ symbol: "spUSDC",
37930
+ assetGroup: "Spark Savings USDC::SPUSDC"
37931
+ },
37932
+ {
37933
+ chainId: Chain.ETHEREUM_MAINNET,
37934
+ address: "0xe2e7a17dff93280dec073c995595155283e3c372",
37935
+ symbol: "spUSDT",
37936
+ assetGroup: "Spark Savings USDT::SPUSDT"
37937
+ },
37938
+ {
37939
+ chainId: Chain.ETHEREUM_MAINNET,
37940
+ address: "0xfe6eb3b609a7c8352a241f7f3a21cea4e9209b8f",
37941
+ symbol: "spETH",
37942
+ // NB: three unrelated tokens share the `SPETH` ticker in the list
37943
+ // (Spectrum ETH, Kroma Staked ETH) — only the full group is safe.
37944
+ assetGroup: "Spark Savings ETH::SPETH"
37945
+ },
37946
+ {
37947
+ chainId: Chain.ETHEREUM_MAINNET,
37948
+ address: "0x80128dbb9f07b93dde62a6daeadb69ed14a7d354",
37949
+ symbol: "spPYUSD"
37950
+ },
37951
+ {
37952
+ chainId: Chain.AVALANCHE_C_CHAIN,
37953
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
37954
+ symbol: "spUSDC"
37955
+ },
37956
+ {
37957
+ chainId: Chain.ARBITRUM_ONE,
37958
+ address: "0x45d91340b3b7b96985a72b5c678f7d9e8d664b62",
37959
+ symbol: "spUSDT"
37960
+ },
37961
+ {
37962
+ chainId: Chain.X_LAYER_MAINNET,
37963
+ address: "0xc358c90d32375721cb3924320fdc2f8b694347ca",
37964
+ symbol: "spUSDT"
37965
+ },
37966
+ {
37967
+ chainId: Chain.ROBINHOOD_CHAIN,
37968
+ address: "0xde770c84fe66e063336b31737cfe9790f18c4087",
37969
+ symbol: "spUSDG"
37970
+ }
37971
+ ];
37972
+ var sparkVaultV2Key = (chainId, symbol) => `SPARK_V2::${chainId}::${symbol}`;
37973
+ var SPARK_SAVINGS_USDG_KEY = sparkVaultV2Key(
37974
+ Chain.ROBINHOOD_CHAIN,
37975
+ "spUSDG"
37976
+ );
37977
+ var SPARK_SUSDC_KEY = "SPARK_V1::sUSDC";
37978
+ var SPARK_SUSDC_GROUP_KEY = "Spark USDC Vault::sUSDC";
37979
+ var SPARK_SUSDC_LEGACY_GROUP_KEY = "Spark USDC::SUSDC";
37980
+ var SKY_SSR_SOURCE = "0xa3931d71877c0e7a3148cb7eb4463524fec27fbd";
37981
+ var VSR_ABI = [
37982
+ {
37983
+ name: "vsr",
37735
37984
  type: "function",
37736
37985
  stateMutability: "view",
37737
37986
  inputs: [],
37738
37987
  outputs: [{ type: "uint256" }]
37739
37988
  }
37740
37989
  ];
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
- );
37764
- }
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;
37990
+ var SSR_ABI = [
37991
+ {
37992
+ name: "ssr",
37993
+ type: "function",
37994
+ stateMutability: "view",
37995
+ inputs: [],
37996
+ outputs: [{ type: "uint256" }]
37997
+ }
37998
+ ];
37999
+ var aprFromVsr = (vsr) => {
38000
+ if (vsr <= RAY3) return 0;
38001
+ const perSecond = Number(vsr - RAY3) / 1e27;
38002
+ return perSecond * YEAR_SECONDS4 * 100;
38003
+ };
38004
+ var chainsOf = (vaults) => [
38005
+ ...new Set(vaults.map((v) => v.chainId))
38006
+ ];
38007
+ var fetchChain = async (chainId, vaults) => {
38008
+ const results = await multicallRetryUniversal({
38009
+ chain: chainId,
38010
+ abi: VSR_ABI,
38011
+ calls: vaults.map((v) => ({
38012
+ address: v.address,
38013
+ name: "vsr",
38014
+ params: []
38015
+ })),
38016
+ allowFailure: false
38017
+ });
38018
+ const out = {};
38019
+ vaults.forEach((v, i) => {
38020
+ const vsr = results[i];
38021
+ if (typeof vsr !== "bigint" || vsr < RAY3) return;
38022
+ const apr = aprFromVsr(vsr);
38023
+ out[sparkVaultV2Key(v.chainId, v.symbol)] = apr;
38024
+ if (v.assetGroup) out[v.assetGroup] = apr;
38025
+ });
38026
+ return out;
38027
+ };
38028
+ var fetchSusdcApr = async () => {
38029
+ const [ssr] = await multicallRetryUniversal({
38030
+ chain: Chain.ETHEREUM_MAINNET,
38031
+ abi: SSR_ABI,
38032
+ calls: [{ address: SKY_SSR_SOURCE, name: "ssr", params: [] }],
38033
+ allowFailure: false
38034
+ });
38035
+ if (typeof ssr !== "bigint" || ssr < RAY3) {
38036
+ throw new Error("Spark sUSDC: unreadable ssr()");
38037
+ }
38038
+ const apr = aprFromVsr(ssr);
38039
+ return {
38040
+ [SPARK_SUSDC_KEY]: apr,
38041
+ [SPARK_SUSDC_GROUP_KEY]: apr,
38042
+ [SPARK_SUSDC_LEGACY_GROUP_KEY]: apr
38043
+ };
38044
+ };
38045
+ var sparkSavingsFetcher = {
38046
+ label: "SPARK_SAVINGS",
38047
+ fetch: async () => {
38048
+ const settled = await Promise.allSettled([
38049
+ ...chainsOf(SPARK_VAULTS_V2).map(
38050
+ (chainId) => fetchChain(
38051
+ chainId,
38052
+ SPARK_VAULTS_V2.filter((v) => v.chainId === chainId)
38053
+ )
38054
+ ),
38055
+ fetchSusdcApr()
38056
+ ]);
38057
+ const out = {};
38058
+ for (const r of settled) {
38059
+ if (r.status === "fulfilled") Object.assign(out, r.value);
38060
+ }
38061
+ if (Object.keys(out).length === 0) {
38062
+ throw new Error("Spark: no chain returned a readable rate");
38063
+ }
38064
+ return out;
38065
+ }
38066
+ };
38067
+
38068
+ // src/yields/intrinsic/fetchers/reProtocol.ts
38069
+ var REUSD_KEY = "RE::reUSD";
38070
+ var REUSDE_KEY = "RE::reUSDe";
38071
+ var REUSD_GROUP_KEY = "Re Protocol reUSD::REUSD";
38072
+ var REUSDE_GROUP_KEY = "Re Protocol reUSDe::REUSDE";
38073
+ var REUSD_POOL = "1c312830-ee96-40c9-b55f-b0f209ca6ebd";
38074
+ var REUSDE_POOL = "145810df-dc01-43e7-8033-e0aa5dceb767";
38075
+ var reProtocolFetcher = {
38076
+ label: "RE_PROTOCOL",
38077
+ fetch: async () => {
38078
+ const [reusd, reusde] = await Promise.allSettled([
38079
+ fetchDefiLlamaApy(REUSD_POOL),
38080
+ fetchDefiLlamaApy(REUSDE_POOL)
38081
+ ]);
38082
+ const out = {};
38083
+ if (reusd.status === "fulfilled") {
38084
+ const apr = apyToAprPercent(reusd.value);
38085
+ out[REUSD_KEY] = apr;
38086
+ out[REUSD_GROUP_KEY] = apr;
38087
+ }
38088
+ if (reusde.status === "fulfilled") {
38089
+ const apr = apyToAprPercent(reusde.value);
38090
+ out[REUSDE_KEY] = apr;
38091
+ out[REUSDE_GROUP_KEY] = apr;
38092
+ }
38093
+ if (Object.keys(out).length === 0) {
38094
+ throw new Error("Re Protocol: DefiLlama returned no apy for either pool");
37772
38095
  }
38096
+ return out;
38097
+ }
38098
+ };
38099
+
38100
+ // src/yields/intrinsic/fetchers/nativeCreditPool.ts
38101
+ var nativeCreditPoolYieldKey = (chainId, underlying) => `${chainId}:${underlying.toLowerCase()}`;
38102
+ var POOL_IDS = {
38103
+ // Ethereum
38104
+ "1": {
38105
+ // wNLP-USDT — 2.92 % APY at pinning (2026-07-30)
38106
+ "0xdac17f958d2ee523a2206206994597c13d831ec7": "ea6b472d-82a2-47fa-9c55-78907deebe13",
38107
+ // wNLP-USDC — 2.58 %
38108
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": "8e92a8ea-0dbd-463e-bb0b-a7f419b20db5",
38109
+ // wNLP-WETH — 2.21 %
38110
+ "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": "76aa8b2e-c5cd-4ae5-8182-c74ee969d71d",
38111
+ // wNLP-WBTC — 0.43 %
38112
+ "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599": "8c603090-cda6-4a17-975a-69a08a7dcf5e",
38113
+ // wNLP-tGLD — 0 %
38114
+ "0x6a547b25534234bb79ce6961a23db13de154b6f4": "eb208601-24b8-5291-8c13-1327208ef2e9",
38115
+ // wNLP-STONEUSD — 0 %
38116
+ "0x6a6e3a4396993a4ec98a6f4a654cc0819538721e": "09f09cf1-915a-4b71-82eb-5f6c54f0cc68"
38117
+ },
38118
+ // BNB Chain
38119
+ "56": {
38120
+ // wNLP-Q3B (QQQB) — 36.42 % on a $4.2 M tokenized-equity pool
38121
+ "0x205812cdbed920aff76c6580abd681a46d11efc7": "a5bd33df-4410-5631-a44b-bab8214b1dc2",
38122
+ // wNLP-USDT — 3.40 %
38123
+ "0x55d398326f99059ff775485246999027b3197955": "14ca42f2-1d51-4093-b5c8-74effe4c5cf3",
38124
+ // wNLP-WBNB — 1.17 %
38125
+ "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c": "cd637956-e278-4462-a030-8d0d26a63a5c",
38126
+ // wNLP-P4B (PLTRB) — 0 %
38127
+ "0x0ca5d51d0277bd006fd9607d3e560785ebad8222": "a36f61e0-31d4-5bce-85c1-b7cfd57b2c21",
38128
+ // wNLP-S4B (SNDKB) — 0 %
38129
+ "0x3ee4df61bd4f867e349beae8bfe07bc31b4850fb": "06081a23-0157-4141-951b-eae858070214",
38130
+ // wNLP-T4B (TSLAB) — 0 %
38131
+ "0x5b1910eaad6450e50f816082aa078c41f10c292f": "44b167ce-b22c-4294-8877-4f71042bdd13",
38132
+ // wNLP-L4B (LITEB) — 0 %
38133
+ "0x64748bea17b6d19e242adf20425de2440c656142": "aa632ad9-f1e1-5b35-a76a-33006320aa1e",
38134
+ // wNLP-M5B (METAB) — 0 %
38135
+ "0x7425889fe94f9d693e8daefe88bcced6acfef4c0": "75edd0e5-82b9-5ff8-beba-4d9f07322990",
38136
+ // wNLP-M6B (MSFTB) — 0 %
38137
+ "0x80106cb3ead06659a5ad19df39d9b4733863b9b0": "8d6849a9-6bcb-550d-b916-38a0e792a097",
38138
+ // wNLP-C4B (CRCLB) — 0 %
38139
+ "0x80f3d493ebce97e343c53d29a137942416b4ffc0": "a1e52090-7faf-46e9-9e1e-174982f4cad9",
38140
+ // wNLP-USDC — 0 %
38141
+ "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d": "0f76c834-6f24-4187-b7d5-6f3d641c3123",
38142
+ // wNLP-USD1 — 0 %
38143
+ "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d": "28211a21-46c4-4a0d-807a-f010b304c3d0",
38144
+ // wNLP-M2B (MUB) — 0 %
38145
+ "0xcdf2f3e0fa43c47a6662a91c9e4a7c5f69762699": "1687633e-61ff-49d4-9256-5734ba06e595"
38146
+ },
38147
+ // Arbitrum
38148
+ "42161": {
38149
+ // wNLP-USDT (USD₮0) — 2.57 %
38150
+ "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": "a6dc5af9-ff47-44f4-ad38-a0c6fc62278e",
38151
+ // wNLP-WETH — 0.88 %
38152
+ "0x82af49447d8a07e3bd95bd0d56f35241523fbab1": "1b7193de-1ddf-48b7-81d2-13f082a8cf3a"
38153
+ },
38154
+ // Base
38155
+ "8453": {
38156
+ // wNLP-USDC — 3.52 %
38157
+ "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": "a057d9d8-99d4-4017-bb59-b96f67366178",
38158
+ // wNLP-WETH — 1.98 %
38159
+ "0x4200000000000000000000000000000000000006": "9f1d3455-050c-482c-93e0-e1271d240cec"
37773
38160
  }
37774
- throw new Error(
37775
- `spUSDG APR: no Robinhood RPC returned valid historical chi (${String(lastErr)})`
37776
- );
37777
38161
  };
37778
- var sparkSavingsUsdgFetcher = {
37779
- label: "SPARK_SAVINGS_USDG",
38162
+ var buildChainFetcher = (chainId, pools) => ({
38163
+ label: `NATIVE_CREDIT_POOL_${chainId}`,
37780
38164
  fetch: async () => {
37781
- const apr = await computeApr7();
37782
- return { [SPARK_SAVINGS_USDG_KEY]: apr };
38165
+ const rows = Object.entries(pools);
38166
+ const settled = await Promise.allSettled(
38167
+ rows.map(([, poolId]) => fetchDefiLlamaApy(poolId))
38168
+ );
38169
+ const out = {};
38170
+ settled.forEach((res, i) => {
38171
+ if (res.status !== "fulfilled") return;
38172
+ if (!Number.isFinite(res.value)) return;
38173
+ out[nativeCreditPoolYieldKey(chainId, rows[i][0])] = apyToAprPercent(
38174
+ res.value
38175
+ );
38176
+ });
38177
+ return out;
37783
38178
  }
38179
+ });
38180
+ var FETCHERS = Object.fromEntries(
38181
+ Object.entries(POOL_IDS).map(([chainId, pools]) => [
38182
+ chainId,
38183
+ buildChainFetcher(chainId, pools)
38184
+ ])
38185
+ );
38186
+ var nativeCreditPoolFetcher = (chainId) => FETCHERS[chainId];
38187
+
38188
+ // src/vaults/savings/registryNative.ts
38189
+ var NATIVE_CREDIT_VAULT = {
38190
+ "1": "0xe3d41d19564922c9952f692c5dd0563030f5f2ef",
38191
+ // Ethereum
38192
+ "56": "0xba8db0caf781cac69b6acf6c848ac148264cc05d",
38193
+ // BNB Chain
38194
+ "42161": "0xba1cf8a63227b46575af823beb4d83d1025eff09",
38195
+ // Arbitrum
38196
+ "8453": "0x74a4cd023e5afb88369e3f22b02440f2614a1367",
38197
+ // Base
38198
+ "143": "0xcd1d2d602c3e7394515daae96e4ffe16de71e5b4",
38199
+ // Monad
38200
+ "196": "0x4df7557734b382eb542bea6c74786d398df4cc19",
38201
+ // X Layer
38202
+ "4663": "0x57b8f68ef57af2db70bc9aac891836661ca4cb51",
38203
+ // Robinhood Chain
38204
+ "2818": "0x4df7557734b382eb542bea6c74786d398df4cc19"
38205
+ // Morph
38206
+ };
38207
+ var NATIVE_WNLP_ROWS = {
38208
+ // Ethereum — 24 pools, 7 funded, 6 with a DefiLlama APR.
38209
+ "1": [
38210
+ [
38211
+ "wNLP-WETH",
38212
+ "0x50ecabe78ae99bb1adc292a94e535feb0ed29853",
38213
+ "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
38214
+ "0x79dcfeb6f52977ef899d92bece132e95c3d08b66",
38215
+ 18,
38216
+ 259200
38217
+ ],
38218
+ [
38219
+ "wNLP-WBTC",
38220
+ "0x9441f31ab75f466a8afdc67a0fa65241f7600f5a",
38221
+ "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
38222
+ "0x0a1a4d7cb85b231cc9223730d2ae0582ddad228a",
38223
+ 8,
38224
+ 259200
38225
+ ],
38226
+ [
38227
+ "wNLP-USDT",
38228
+ "0xc31daeeb822790e9ca730e7e34a9ef497fffc959",
38229
+ "0xdac17f958d2ee523a2206206994597c13d831ec7",
38230
+ "0xd1f2d929881abb26e5780d202d3c550df264791c",
38231
+ 6,
38232
+ 259200
38233
+ ],
38234
+ [
38235
+ "wNLP-USDC",
38236
+ "0x3c339289baa2eab3802c1f0c10e025b29bdbea1a",
38237
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
38238
+ "0x231c3946b3a4ea1163744f236a184f796a8e18a1",
38239
+ 6,
38240
+ 259200
38241
+ ],
38242
+ [
38243
+ "wNLP-STONEUSD",
38244
+ "0xb88791ef86d10037f7481b4e3fcbca5bb4162bfa",
38245
+ "0x6a6e3a4396993a4ec98a6f4a654cc0819538721e",
38246
+ "0x65dd5953ac28018207da0a309d0304cd53e5b734",
38247
+ 18,
38248
+ 28800
38249
+ ],
38250
+ // 8h queue, 0bips instant fee
38251
+ [
38252
+ "wNLP-CRCLon",
38253
+ "0xaeb7c9122d897a224180d2ca25bc86a16d12ae92",
38254
+ "0x3632dea96a953c11dac2f00b4a05a32cd1063fae",
38255
+ "0x5b2bc2d8ad715391aff2ffa0f3f19d3a4c6686ed",
38256
+ 18,
38257
+ 259200
38258
+ ],
38259
+ // unfunded, no APR feed
38260
+ [
38261
+ "wNLP-GOOGLon",
38262
+ "0x66924f881bd0cbfabded19838c5f5443867359d9",
38263
+ "0xba47214edd2bb43099611b208f75e4b42fdcfedc",
38264
+ "0x6285d06426eef9beef33ee92eab7f491f736da57",
38265
+ 18,
38266
+ 259200
38267
+ ],
38268
+ // unfunded, no APR feed
38269
+ [
38270
+ "wNLP-INTCon",
38271
+ "0xb5cebfa986dd20a674be725bacebabec458abc84",
38272
+ "0xfda09936dbd717368de0835ba441d9e62069d36f",
38273
+ "0x97c156ec88085e8a057955908d056e55fc0ac589",
38274
+ 18,
38275
+ 259200
38276
+ ],
38277
+ // unfunded, no APR feed
38278
+ [
38279
+ "wNLP-MRVLon",
38280
+ "0x3b1dbe5ca2d39fac168e3575d707b714a7eaa7e7",
38281
+ "0xf404e5f887dbd5508e16a1198fcdd5de1a4296b8",
38282
+ "0x7f24d9dc37483a50fcbabdb2274cf8748ae0907a",
38283
+ 18,
38284
+ 259200
38285
+ ],
38286
+ // unfunded, no APR feed
38287
+ [
38288
+ "wNLP-MUon",
38289
+ "0x1e42d39df3e927c0765f258a8b7f75726350f41b",
38290
+ "0x050362ab1072cb2ce74d74770e22a3203ad04ee5",
38291
+ "0x3ee49a51a5efa599ff544fd37f197bbf15536e04",
38292
+ 18,
38293
+ 259200
38294
+ ],
38295
+ // unfunded, no APR feed
38296
+ [
38297
+ "wNLP-NVDAon",
38298
+ "0xe74ee33a50a9eab6f62cb22f44b1e72e5579894c",
38299
+ "0x2d1f7226bd1f780af6b9a49dcc0ae00e8df4bdee",
38300
+ "0x3f527be145afa0e808c41ec9060513dbb82afe0c",
38301
+ 18,
38302
+ 259200
38303
+ ],
38304
+ // unfunded, no APR feed
38305
+ [
38306
+ "wNLP-QQQon",
38307
+ "0xe05f1635756b6f5046e53f8e911a14794a73a4e7",
38308
+ "0x0e397938c1aa0680954093495b70a9f5e2249aba",
38309
+ "0x9d2f7e285557c65416fb2bbb268d509e9e2eb2b3",
38310
+ 18,
38311
+ 259200
38312
+ ],
38313
+ // unfunded, no APR feed
38314
+ [
38315
+ "wNLP-SPCXon",
38316
+ "0xbffaaa25d2b8fe6e3e8c2c790673fa0c28c64bd4",
38317
+ "0xc9eef266834730340a55b6cc24621b31baf55581",
38318
+ "0xe66430ce224b1e65100d1b9a15381aa59e17e4b4",
38319
+ 18,
38320
+ 259200
38321
+ ],
38322
+ // unfunded, no APR feed
38323
+ [
38324
+ "wNLP-TSLAon",
38325
+ "0x0183d055c77310af03dcb397efaa7e9cfb6db59b",
38326
+ "0xf6b1117ec07684d3958cad8beb1b302bfd21103f",
38327
+ "0x0cb46d89ed4ae005160b3270fafe453c43bba664",
38328
+ 18,
38329
+ 259200
38330
+ ],
38331
+ // no APR feed
38332
+ [
38333
+ "wNLP-CRCLx",
38334
+ "0x2ba837484e8969da87d237effedea7badd294dd9",
38335
+ "0xfebded1b0986a8ee107f5ab1a1c5a813491deceb",
38336
+ "0x149d45c599203e06d727b7d10bb00f7035023932",
38337
+ 18,
38338
+ 259200
38339
+ ],
38340
+ // unfunded, no APR feed
38341
+ [
38342
+ "wNLP-GOOGLx",
38343
+ "0x8425b76b81008d6b8f0ed468d72a2098fc13b2d2",
38344
+ "0xe92f673ca36c5e2efd2de7628f815f84807e803f",
38345
+ "0x8cbbace186e3411b61d57b897c916b912a36991a",
38346
+ 18,
38347
+ 259200
38348
+ ],
38349
+ // unfunded, no APR feed
38350
+ [
38351
+ "wNLP-NVDAx",
38352
+ "0x2014e669ab74e114aa155c6b9c162bb26a5b9972",
38353
+ "0xc845b2894dbddd03858fd2d643b4ef725fe0849d",
38354
+ "0x6540c6b85ade3601f9bdf5b2d8712615dbd7730b",
38355
+ 18,
38356
+ 259200
38357
+ ],
38358
+ // unfunded, no APR feed
38359
+ [
38360
+ "wNLP-QQQx",
38361
+ "0x12a81e5b0721e62d907ae5527031fb29f9eef323",
38362
+ "0xa753a7395cae905cd615da0b82a53e0560f250af",
38363
+ "0xe004a1ff7633a53530e697eec8e9de952d792abb",
38364
+ 18,
38365
+ 259200
38366
+ ],
38367
+ // unfunded, no APR feed
38368
+ [
38369
+ "wNLP-SPCXx",
38370
+ "0x405a559b5c0fcb207ddd60dd2b87e9f6b5798564",
38371
+ "0x68fa48b1c2fe52b3d776e1953e0e782b5044ce28",
38372
+ "0x17beb26401a50d139e167d80e22494e17df040cd",
38373
+ 18,
38374
+ 259200
38375
+ ],
38376
+ // unfunded, no APR feed
38377
+ [
38378
+ "wNLP-TSLAx",
38379
+ "0x95603e6d7753833b1ad9feba5f4e7213ba5b1d8a",
38380
+ "0x8ad3c73f833d3f9a523ab01476625f269aeb7cf0",
38381
+ "0x8f8ce39752ef02916a13422568aea6a4cc178d16",
38382
+ 18,
38383
+ 259200
38384
+ ],
38385
+ // unfunded, no APR feed
38386
+ [
38387
+ "wNLP-PAXG",
38388
+ "0xa15100ee8c648dd9d01271424bface4891aa2e8f",
38389
+ "0x45804880de22913dafe09f4980848ece6ecbaf78",
38390
+ "0xc6e39e6ffc712708d229685fa7ca1abca4309377",
38391
+ 18,
38392
+ 259200
38393
+ ],
38394
+ // unfunded, no APR feed
38395
+ [
38396
+ "wNLP-XAUt",
38397
+ "0x894e71b1cdf9fb8775d54dd911d60d5bd2a0e256",
38398
+ "0x68749665ff8d2d112fa859aa293f07a622782f38",
38399
+ "0x63b102f73c19e6fb0cb3545182d97371dbab62fc",
38400
+ 6,
38401
+ 259200
38402
+ ],
38403
+ // unfunded, no APR feed
38404
+ [
38405
+ "wNLP-tGLD",
38406
+ "0x72bc5907f4bd6963a145cad7fe6538927062bec4",
38407
+ "0x6a547b25534234bb79ce6961a23db13de154b6f4",
38408
+ "0xecff722c6a57c097b12d5e6a77bd8ad15bae4f0f",
38409
+ 18,
38410
+ 259200
38411
+ ],
38412
+ [
38413
+ "wNLP-DRAMon",
38414
+ "0x4aa3d1cca957ee0c21333b7465fc94feab45037a",
38415
+ "0xdb5a8f5b4c17f2ee2e7192a150687e48eb3c415d",
38416
+ "0x6b5ce3319e47f3c59a27564b5f49ae1926322633",
38417
+ 18,
38418
+ 259200
38419
+ ]
38420
+ // unfunded, no APR feed
38421
+ ],
38422
+ // BNB Chain — 49 pools, 19 funded, 13 with a DefiLlama APR.
38423
+ "56": [
38424
+ [
38425
+ "wNLP-WBNB",
38426
+ "0x85f08a266758ea0c98b15deae71ca6ee84392afa",
38427
+ "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
38428
+ "0x9e0de0b11cd3b50370ddabf3926553c4fc3cb956",
38429
+ 18,
38430
+ 259200
38431
+ ],
38432
+ [
38433
+ "wNLP-ETH",
38434
+ "0xfafae0cdec65cdd601ffc39f472dd4f5c7bd0721",
38435
+ "0x2170ed0880ac9a755fd29b2688956bd959f933f8",
38436
+ "0x3906f7078b25b3d4a568438da7be5c0abbe481a8",
38437
+ 18,
38438
+ 259200
38439
+ ],
38440
+ // unfunded, no APR feed
38441
+ [
38442
+ "wNLP-USDT",
38443
+ "0xea5ff211ef700dccc521a1e6501c9fe1b95d8ee7",
38444
+ "0x55d398326f99059ff775485246999027b3197955",
38445
+ "0xb88791ef86d10037f7481b4e3fcbca5bb4162bfa",
38446
+ 18,
38447
+ 259200
38448
+ ],
38449
+ [
38450
+ "wNLP-USDC",
38451
+ "0x8592ffff658310150befd83c3c5de326e9bf6f0d",
38452
+ "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d",
38453
+ "0x38eda6dd1def97aaa07d5fa781395221305bc3f1",
38454
+ 18,
38455
+ 259200
38456
+ ],
38457
+ [
38458
+ "wNLP-USD1",
38459
+ "0x2f6f303924f0fdc559c57a14cb73dd9a4d611bd8",
38460
+ "0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d",
38461
+ "0x92903262eff424cae02d6f7b7b0a486e4c7ef24b",
38462
+ 18,
38463
+ 28800
38464
+ ],
38465
+ // 8h queue, 0bips instant fee
38466
+ [
38467
+ "wNLP-STONEUSD",
38468
+ "0xa1cc671f9b975d0a548c436175b99891db961934",
38469
+ "0x8b4e28607bdcacbf937f81f29e3dafe7bc1d7c0b",
38470
+ "0x5b8382383c7d5bb5341cc3dc97cb09d5b5a5e798",
38471
+ 18,
38472
+ 28800
38473
+ ],
38474
+ // unfunded, no APR feed, 8h queue, 0bips instant fee
38475
+ [
38476
+ "wNLP-CRCLon",
38477
+ "0x50fbc992085b065a404fb007e344d49c558047b2",
38478
+ "0x992879cd8ce0c312d98648875b5a8d6d042cbf34",
38479
+ "0x8a3d397caddd88e725e012af97bb1af3fee3f250",
38480
+ 18,
38481
+ 259200
38482
+ ],
38483
+ // no APR feed
38484
+ [
38485
+ "wNLP-GOOGLon",
38486
+ "0x14e13011121fa293d20a4d9a7037814f3c932860",
38487
+ "0x091fc7778e6932d4009b087b191d1ee3bac5729a",
38488
+ "0x0335ab1c86aaea2c442d10fec9e54261a4e0cc90",
38489
+ 18,
38490
+ 259200
38491
+ ],
38492
+ // unfunded, no APR feed
38493
+ [
38494
+ "wNLP-INTCon",
38495
+ "0x6b3de4f43d20c7b29bca9850dfbf6bf94824e67e",
38496
+ "0xa528caaa2f96090e379d43f90834c75df54d6e74",
38497
+ "0x7facfe33b3a0de1ef8cdf15d8717439e9f60cc24",
38498
+ 18,
38499
+ 259200
38500
+ ],
38501
+ // unfunded, no APR feed
38502
+ [
38503
+ "wNLP-MRVLon",
38504
+ "0x0d8de51813ef9b8634d3b91086884d3045a5f3e8",
38505
+ "0x1501ec83ffef405b4331cc4f73277a40fb0c627d",
38506
+ "0x2ac5c050b88a00e395a12b0d724f38a1f32050ad",
38507
+ 18,
38508
+ 259200
38509
+ ],
38510
+ // unfunded, no APR feed
38511
+ [
38512
+ "wNLP-MUon",
38513
+ "0x3a18cde8a81060bdc7cace60ecbc2f01765f6008",
38514
+ "0x8b6acf6041a81567f012ff6a4c6d96d5818d74bf",
38515
+ "0x542c912b0e20895eeba104503d221683e1ceddc9",
38516
+ 18,
38517
+ 259200
38518
+ ],
38519
+ // unfunded, no APR feed
38520
+ [
38521
+ "wNLP-NVDAon",
38522
+ "0x493fb39c8e37726539d3fb074c333a1eab58e36b",
38523
+ "0xa9ee28c80f960b889dfbd1902055218cba016f75",
38524
+ "0x912ce4b093fc7ce0de3cc64e9cd626706da838b7",
38525
+ 18,
38526
+ 259200
38527
+ ],
38528
+ // unfunded, no APR feed
38529
+ [
38530
+ "wNLP-QQQon",
38531
+ "0x03e7dce34eed4adc4b228d00a28deba2b7941266",
38532
+ "0x0cde6936d305d5b34667fc46425e852efd73559a",
38533
+ "0x83ae22182fab9e75f7b85745693fc55100d18ca0",
38534
+ 18,
38535
+ 259200
38536
+ ],
38537
+ // unfunded, no APR feed
38538
+ [
38539
+ "wNLP-SPCXon",
38540
+ "0xb810dc8f7ffc2318931b4af211592eac5e1d0190",
38541
+ "0xd0a58bc9d88d3ff48c0294cb7e45937d0e41a928",
38542
+ "0xcbd0d2627cb03da58dd8ee5bc62c964cb61d4734",
38543
+ 18,
38544
+ 259200
38545
+ ],
38546
+ // unfunded, no APR feed
38547
+ [
38548
+ "wNLP-TSLAon",
38549
+ "0x73be73e7570fbcbd3d83de1e32ae5594c3963fe1",
38550
+ "0x2494b603319d4d9f9715c9f4496d9e0364b59d93",
38551
+ "0xbf9640dd79e916f386e2c89566654b6fe16b0f65",
38552
+ 18,
38553
+ 259200
38554
+ ],
38555
+ // unfunded, no APR feed
38556
+ [
38557
+ "wNLP-DRAMon",
38558
+ "0x90cc94befe6c6437de7c6ded32a4dc25ebbee3d2",
38559
+ "0x087b5761b161429013d41ea54cd2fb6022a21564",
38560
+ "0x8ccb472112d0fe00ba7f8b8b9fc407e68d78f62b",
38561
+ 18,
38562
+ 259200
38563
+ ],
38564
+ // unfunded, no APR feed
38565
+ [
38566
+ "wNLP-CRCLx",
38567
+ "0xddfe8d98a0b459a2a2906e02ab3dd5a5bbc303c8",
38568
+ "0xfebded1b0986a8ee107f5ab1a1c5a813491deceb",
38569
+ "0x4d722dc923510a9ec4cfb3c41c414b15cbce4df0",
38570
+ 18,
38571
+ 259200
38572
+ ],
38573
+ // unfunded, no APR feed
38574
+ [
38575
+ "wNLP-GOOGLx",
38576
+ "0xa8d9eb043d4bc05e4b0dac89cd5837cf40fb3bc5",
38577
+ "0xe92f673ca36c5e2efd2de7628f815f84807e803f",
38578
+ "0x2db1571c7c7954e546c8f0870cfa16b244b7f6ff",
38579
+ 18,
38580
+ 259200
38581
+ ],
38582
+ // unfunded, no APR feed
38583
+ [
38584
+ "wNLP-NVDAx",
38585
+ "0x358100ed7ecdd6c608d9d5e642e34b1a2ba152b7",
38586
+ "0xc845b2894dbddd03858fd2d643b4ef725fe0849d",
38587
+ "0xef435b99c2108d0309211d0cc05b70d202c0b5df",
38588
+ 18,
38589
+ 259200
38590
+ ],
38591
+ // unfunded, no APR feed
38592
+ [
38593
+ "wNLP-QQQx",
38594
+ "0x427fb58709c47fb8794771bd2e17784c0cda845a",
38595
+ "0xa753a7395cae905cd615da0b82a53e0560f250af",
38596
+ "0x7768aa6322ab912bee159191ec3380df13f6db37",
38597
+ 18,
38598
+ 259200
38599
+ ],
38600
+ // unfunded, no APR feed
38601
+ [
38602
+ "wNLP-SPCXx",
38603
+ "0x335d144f211c3f4dedb3ef1fe003cbc7dd9c24a9",
38604
+ "0x68fa48b1c2fe52b3d776e1953e0e782b5044ce28",
38605
+ "0xee880bf2050a23bb84dd4734dd7413d9d9793500",
38606
+ 18,
38607
+ 259200
38608
+ ],
38609
+ // unfunded, no APR feed
38610
+ [
38611
+ "wNLP-TSLAx",
38612
+ "0xbcac5180fc867d741d06e1aafde15d65ca16d3f3",
38613
+ "0x8ad3c73f833d3f9a523ab01476625f269aeb7cf0",
38614
+ "0x826d54e624c59a01fe2917cda2429d3058880099",
38615
+ 18,
38616
+ 259200
38617
+ ],
38618
+ // unfunded, no APR feed
38619
+ [
38620
+ "wNLP-A4B",
38621
+ "0xd8a25f5e864534bb2324f2eff6f5c3dd58693b8b",
38622
+ "0x75fd4cf6f8392e41e70391d60c90c0d5211603a1",
38623
+ "0xf4166b08dc7eea43101066ef8f52fb95d994d62c",
38624
+ 18,
38625
+ 259200
38626
+ ],
38627
+ // no APR feed
38628
+ [
38629
+ "wNLP-COINB",
38630
+ "0x16ccbca076c24d1c174cddc8ce30389097bf8982",
38631
+ "0x585bde7c54abb5ccd7791f923d6c2187635f3952",
38632
+ "0xe7290a875d32f676b715283e1eafdfcece97110b",
38633
+ 18,
38634
+ 259200
38635
+ ],
38636
+ // unfunded, no APR feed
38637
+ [
38638
+ "wNLP-C4B",
38639
+ "0xe05f1635756b6f5046e53f8e911a14794a73a4e7",
38640
+ "0x80f3d493ebce97e343c53d29a137942416b4ffc0",
38641
+ "0x9d2f7e285557c65416fb2bbb268d509e9e2eb2b3",
38642
+ 18,
38643
+ 259200
38644
+ ],
38645
+ [
38646
+ "wNLP-DRAMB",
38647
+ "0x52207f4c347631abb40484e30c71fa66660581a7",
38648
+ "0x93862d63fd9fd488b1328e9b47717d75e994a84b",
38649
+ "0xd805265e8e1c003c65d7e2565149289459b2911f",
38650
+ 18,
38651
+ 259200
38652
+ ],
38653
+ // unfunded, no APR feed
38654
+ [
38655
+ "wNLP-E3B",
38656
+ "0x3dac466a0190ce1dd7a062290ce48310206b4bca",
38657
+ "0xbe82f76637dba2c114c41df856c2c51e522e2cb8",
38658
+ "0x50b91e72b7a4a5eaf926931e4a6b3357c26235b2",
38659
+ 18,
38660
+ 259200
38661
+ ],
38662
+ // no APR feed
38663
+ [
38664
+ "wNLP-GLWB",
38665
+ "0xfc6fdde35860a327be88f54bf35993f72de91a87",
38666
+ "0x740e075cbbea22a082b9d6679e65e82767875b6a",
38667
+ "0xbe38df1755e942e11241c2a39e029f9359a483e3",
38668
+ 18,
38669
+ 259200
38670
+ ],
38671
+ // unfunded, no APR feed
38672
+ [
38673
+ "wNLP-GOOGLB",
38674
+ "0x38982f1604d2459f317ca9ff03808b17d4d9754b",
38675
+ "0x3f53de71c126bdabae20f9cd64848d317f6c3238",
38676
+ "0x7de2d4edc91dbef780f0c4f59828e752a9f43bac",
38677
+ 18,
38678
+ 259200
38679
+ ],
38680
+ // unfunded, no APR feed
38681
+ [
38682
+ "wNLP-I4B",
38683
+ "0x737b83b17156348b84157d528e02bd9acec4163a",
38684
+ "0xe614e2fc6c787035ff51f452e8e826bfd32d5283",
38685
+ "0xe31013938457f086958c32a921a6ec17f468902d",
38686
+ 18,
38687
+ 259200
38688
+ ],
38689
+ // no APR feed
38690
+ [
38691
+ "wNLP-L4B",
38692
+ "0xcf76092d538e4df7a1e8dc3eb8c21be1d462a5da",
38693
+ "0x64748bea17b6d19e242adf20425de2440c656142",
38694
+ "0xa97aea8e9d81771d4566cd1a636b58b600a1e3e8",
38695
+ 18,
38696
+ 259200
38697
+ ],
38698
+ [
38699
+ "wNLP-M5B",
38700
+ "0x25fe9180e6c95da24b7a3fcff8bf2dbca1fb171a",
38701
+ "0x7425889fe94f9d693e8daefe88bcced6acfef4c0",
38702
+ "0x4c234c7575f762066b59670d52478c12a1d2c0ff",
38703
+ 18,
38704
+ 259200
38705
+ ],
38706
+ [
38707
+ "wNLP-M6B",
38708
+ "0x19bbae8f804b0ea4c7c4351f722fd39efe37c2b2",
38709
+ "0x80106cb3ead06659a5ad19df39d9b4733863b9b0",
38710
+ "0x94cd73e04503537da2aa129832a0e3580d8f76a3",
38711
+ 18,
38712
+ 259200
38713
+ ],
38714
+ [
38715
+ "wNLP-M4B",
38716
+ "0xafcd64ebfc83d57ddf5716f3814019f5543d7c46",
38717
+ "0xe87afb3076aeb0f9b14e368de8145ae6a2826a14",
38718
+ "0x8729f978393fe4a71a819c392822f80a0600f260",
38719
+ 18,
38720
+ 259200
38721
+ ],
38722
+ // no APR feed
38723
+ [
38724
+ "wNLP-M2B",
38725
+ "0x66924f881bd0cbfabded19838c5f5443867359d9",
38726
+ "0xcdf2f3e0fa43c47a6662a91c9e4a7c5f69762699",
38727
+ "0x6285d06426eef9beef33ee92eab7f491f736da57",
38728
+ 18,
38729
+ 259200
38730
+ ],
38731
+ [
38732
+ "wNLP-NBISB",
38733
+ "0x4d45a527b03551821c8d7d8974b939ed6a2824ec",
38734
+ "0xe256bc2a4f5297f8ba6f043f180a46300ecbcbb1",
38735
+ "0x1bbdd8da349ba112b51e644f10bab6598db4330b",
38736
+ 18,
38737
+ 259200
38738
+ ],
38739
+ // unfunded, no APR feed
38740
+ [
38741
+ "wNLP-N4B",
38742
+ "0x2ba837484e8969da87d237effedea7badd294dd9",
38743
+ "0x02fca66c1d1afb4e2a7884261eb00f63598a7436",
38744
+ "0x149d45c599203e06d727b7d10bb00f7035023932",
38745
+ 18,
38746
+ 259200
38747
+ ],
38748
+ // unfunded, no APR feed
38749
+ [
38750
+ "wNLP-P4B",
38751
+ "0x93da79355ae801a673e4d3b656a4152330646ee4",
38752
+ "0x0ca5d51d0277bd006fd9607d3e560785ebad8222",
38753
+ "0xe5ed3ae9fca303126526d4084481fd0b9f589a97",
38754
+ 18,
38755
+ 259200
38756
+ ],
38757
+ [
38758
+ "wNLP-QCOMB",
38759
+ "0xdfa34465d1c6c044304b798fa4a147eac579b66b",
38760
+ "0x5f7a56e877b9130608bf8be962621011182fefe1",
38761
+ "0x8618171d00f972b6b40a7c20dd9f9b3d6efdb673",
38762
+ 18,
38763
+ 259200
38764
+ ],
38765
+ // unfunded, no APR feed
38766
+ [
38767
+ "wNLP-Q3B",
38768
+ "0x564d609b363b902148af559c18aa1bc84bf29a5b",
38769
+ "0x205812cdbed920aff76c6580abd681a46d11efc7",
38770
+ "0xbb389a0ae36d5dc04967b1866c8f9835eca9f895",
38771
+ 18,
38772
+ 259200
38773
+ ],
38774
+ [
38775
+ "wNLP-S4B",
38776
+ "0x2014e669ab74e114aa155c6b9c162bb26a5b9972",
38777
+ "0x3ee4df61bd4f867e349beae8bfe07bc31b4850fb",
38778
+ "0x6540c6b85ade3601f9bdf5b2d8712615dbd7730b",
38779
+ 18,
38780
+ 259200
38781
+ ],
38782
+ [
38783
+ "wNLP-SOXLB",
38784
+ "0xcd1c23eaec3bbdef5f945f2b352b188c8a3b14d3",
38785
+ "0xd97d097a89113fa59b76c572e5b2eb647e8eefaf",
38786
+ "0x7ee63c39be8f868991830f47b167c21c0c1bf23c",
38787
+ 18,
38788
+ 259200
38789
+ ],
38790
+ // unfunded, no APR feed
38791
+ [
38792
+ "wNLP-S5B",
38793
+ "0xf27760f7b431ad8caee0f4e3062e6140b14e0ebc",
38794
+ "0xbe9d156892e55e7154bcd3cb0fea677f9d3103e1",
38795
+ "0x8386c857577fced92537aea6e5112f38da46212a",
38796
+ 18,
38797
+ 259200
38798
+ ],
38799
+ // no APR feed
38800
+ [
38801
+ "wNLP-SPYB",
38802
+ "0x5c53355123a51bd800934e0fa1f8eb8c9f3a848b",
38803
+ "0x7138b48df7d98d7e3cc221bfe7192d0a178182d8",
38804
+ "0x1535fa32cd0bcf66309da5209dbfca4f4c466ce1",
38805
+ 18,
38806
+ 259200
38807
+ ],
38808
+ // unfunded, no APR feed
38809
+ [
38810
+ "wNLP-T4B",
38811
+ "0xaeb7c9122d897a224180d2ca25bc86a16d12ae92",
38812
+ "0x5b1910eaad6450e50f816082aa078c41f10c292f",
38813
+ "0x5b2bc2d8ad715391aff2ffa0f3f19d3a4c6686ed",
38814
+ 18,
38815
+ 259200
38816
+ ],
38817
+ [
38818
+ "wNLP-WDCB",
38819
+ "0x3bdd26cf07bd97baa5f2a588cb6a67b83c7a60a5",
38820
+ "0xebe29695f8047c13d36e7a790ca8c1b239ffad1c",
38821
+ "0x22e87beb7307dcac4ab20b4a23080a3b7a078ff5",
38822
+ 18,
38823
+ 259200
38824
+ ],
38825
+ // unfunded, no APR feed
38826
+ [
38827
+ "wNLP-CANP",
38828
+ "0x63689d5fe0d8f766fc11296c694634cd6f14ee6e",
38829
+ "0xdc22f0a9a60eee3697e925414bdb4580d1c35f91",
38830
+ "0xed2f65b5889f9889ad45b97108cc1d449ddef6ff",
38831
+ 6,
38832
+ 259200
38833
+ ],
38834
+ // unfunded, no APR feed
38835
+ [
38836
+ "wNLP-CBRSB",
38837
+ "0x01246b4a5e22bba113108606451db0817a7d20f1",
38838
+ "0xe81c6bb0266cd68b4f17278531dd03ea1f12da4e",
38839
+ "0xb25861953cc45c6a0a572f892eb671e00198cfc7",
38840
+ 18,
38841
+ 259200
38842
+ ],
38843
+ // unfunded, no APR feed
38844
+ [
38845
+ "wNLP-SK4B",
38846
+ "0x31ac519953055b7c356228658e6836d1c7b4fa36",
38847
+ "0xca750ef65f295bbecd685abf54e82caf297bdb61",
38848
+ "0x5e043dc607c23b94b964c8553722932b9eaf54cb",
38849
+ 18,
38850
+ 259200
38851
+ ]
38852
+ // unfunded, no APR feed
38853
+ ],
38854
+ // Arbitrum — 4 pools, 3 funded, 2 with a DefiLlama APR.
38855
+ "42161": [
38856
+ [
38857
+ "wNLP-WETH",
38858
+ "0x9db777ca39e1f1144d564cb5f593d629d2debe46",
38859
+ "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
38860
+ "0x7f1bcc60ed3c80da906fd91a2ec63ec71442430a",
38861
+ 18,
38862
+ 259200
38863
+ ],
38864
+ [
38865
+ "wNLP-USDT",
38866
+ "0xe83ce032108f539c5a5b1c6029a89ff412d9e27f",
38867
+ "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",
38868
+ "0xa6734c9588c458f4f6bd450a62245d76303fb9a3",
38869
+ 6,
38870
+ 259200
38871
+ ],
38872
+ [
38873
+ "wNLP-USDC",
38874
+ "0xb873363be6e4c99c1f4e6ffd6526c7c03a7a07ad",
38875
+ "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
38876
+ "0x73a8df5258fb736eb1aeb198b72b73d6eb457bf8",
38877
+ 6,
38878
+ 259200
38879
+ ],
38880
+ // no APR feed
38881
+ [
38882
+ "wNLP-WBTC",
38883
+ "0xd8865923465463002bc2ccc522e5a21f8d06adfa",
38884
+ "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f",
38885
+ "0xb043e07edf8cf2ddc2fa22bb087697a721af1058",
38886
+ 8,
38887
+ 259200
38888
+ ]
38889
+ // unfunded, no APR feed
38890
+ ],
38891
+ // Base — 4 pools, 3 funded, 2 with a DefiLlama APR.
38892
+ "8453": [
38893
+ [
38894
+ "wNLP-WETH",
38895
+ "0xc750fe788a828dc960cd08e8bbe1ddd3bffc03bf",
38896
+ "0x4200000000000000000000000000000000000006",
38897
+ "0x9af2f3c0cd35283e13f7087e2b34b1444b57a44c",
38898
+ 18,
38899
+ 259200
38900
+ ],
38901
+ [
38902
+ "wNLP-USDC",
38903
+ "0xe745b0565cecb4612a41eae78319bf3ca8063e6f",
38904
+ "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
38905
+ "0xe7d6b7689bd2cea0af533dd3ad79df6968acb53e",
38906
+ 6,
38907
+ 259200
38908
+ ],
38909
+ [
38910
+ "wNLP-USDT",
38911
+ "0x0872c63c9b1f55ea4166752ba3b890a444b59e9e",
38912
+ "0xfde4c96c8593536e31f229ea8f37b2ada2699bb2",
38913
+ "0x337ec533b568957af458e10cbfbcbf3d59c935b1",
38914
+ 6,
38915
+ 259200
38916
+ ],
38917
+ // no APR feed
38918
+ [
38919
+ "wNLP-cbBTC",
38920
+ "0x90256c018d2acadda2da0b4fd61449e956fd59b6",
38921
+ "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf",
38922
+ "0xa2efe8e37f247cb51c2a48692301335292ccb630",
38923
+ 8,
38924
+ 259200
38925
+ ]
38926
+ // unfunded, no APR feed
38927
+ ],
38928
+ // Monad — 6 pools, 4 funded, 0 with a DefiLlama APR.
38929
+ "143": [
38930
+ [
38931
+ "wNLP-WMON",
38932
+ "0x0166f153e26f572dfac570ccc351ba84ac7a2a72",
38933
+ "0x3bd359c1119da7da1d913d1c4d2b7c461115433a",
38934
+ "0x277ad957898ce34fd959cbfd28ab5962de613b85",
38935
+ 18,
38936
+ 259200
38937
+ ],
38938
+ // no APR feed
38939
+ [
38940
+ "wNLP-USDC",
38941
+ "0xf3d44492f11a2dc234acba80a9e377ab5732b09d",
38942
+ "0x754704bc059f8c67012fed69bc8a327a5aafb603",
38943
+ "0xefadd9a8342bd4ae4d55aed2d748dc006149186a",
38944
+ 6,
38945
+ 259200
38946
+ ],
38947
+ // no APR feed
38948
+ [
38949
+ "wNLP-USDT0",
38950
+ "0x3b1dbe5ca2d39fac168e3575d707b714a7eaa7e7",
38951
+ "0xe7cd86e13ac4309349f30b3435a9d337750fc82d",
38952
+ "0x4cbf9530d653d862a8ece9ed46af6c2f136e2e80",
38953
+ 6,
38954
+ 259200
38955
+ ],
38956
+ // unfunded, no APR feed
38957
+ [
38958
+ "wNLP-WETH",
38959
+ "0x01135c821a87154de3f338f1978811f2648e9570",
38960
+ "0xee8c0e9f1bffb4eb878d8f15f368a02a35481242",
38961
+ "0x92e6d5cdf9c01473adf7089cc416bb934f702cfd",
38962
+ 18,
38963
+ 259200
38964
+ ],
38965
+ // no APR feed
38966
+ [
38967
+ "wNLP-cbBTC",
38968
+ "0x72c486886d199984bdbcf278ba68358365b0f8b7",
38969
+ "0xd18b7ec58cdf4876f6afebd3ed1730e4ce10414b",
38970
+ "0x339808a8be84f74bdcd570c546e2efbd0e780296",
38971
+ 8,
38972
+ 259200
38973
+ ],
38974
+ // no APR feed
38975
+ [
38976
+ "wNLP-AUSD",
38977
+ "0x70dd4db19f75dfea083ce50e77f9b53b55d8558a",
38978
+ "0x00000000efe302beaa2b3e6e1b18d08d69a9012a",
38979
+ "0x4ee1c93eb1ca08f566211fb18a8dc5c1c6d04939",
38980
+ 6,
38981
+ 28800
38982
+ ]
38983
+ // unfunded, no APR feed, 8h queue
38984
+ ],
38985
+ // X Layer — 9 pools, 2 funded, 0 with a DefiLlama APR.
38986
+ "196": [
38987
+ [
38988
+ "wNLP-WETH",
38989
+ "0xde540eabdb4ee3a2680394a4346dbfd76bb78e83",
38990
+ "0x5a77f1443d16ee5761d310e38b62f77f726bc71c",
38991
+ "0x79292d171531673ff97035315fda568189c3c8a5",
38992
+ 18,
38993
+ 259200
38994
+ ],
38995
+ // no APR feed
38996
+ [
38997
+ "wNLP-USD\u20AE0",
38998
+ "0x0b28888e8f0755809c679e01f67591d1ed5ae9b9",
38999
+ "0x779ded0c9e1022225f8e0630b35a9b54be713736",
39000
+ "0x4af9206a885e4708ad3be482611d224239efe173",
39001
+ 6,
39002
+ 259200
39003
+ ],
39004
+ // unfunded, no APR feed
39005
+ [
39006
+ "wNLP-USDG",
39007
+ "0x6285d06426eef9beef33ee92eab7f491f736da57",
39008
+ "0x4ae46a509f6b1d9056937ba4500cb143933d2dc8",
39009
+ "0x92e6d5cdf9c01473adf7089cc416bb934f702cfd",
39010
+ 6,
39011
+ 259200
39012
+ ],
39013
+ // no APR feed
39014
+ [
39015
+ "wNLP-NVDAx",
39016
+ "0x7fde95f8ca333f87677e89e42d09cb4b156f8921",
39017
+ "0xc845b2894dbddd03858fd2d643b4ef725fe0849d",
39018
+ "0x06ab0323c1e3759fe3df946068825fe572db1254",
39019
+ 18,
39020
+ 259200
39021
+ ],
39022
+ // unfunded, no APR feed
39023
+ [
39024
+ "wNLP-TSLAx",
39025
+ "0x78901dd5e09434c6d8c4caa651c012280324af59",
39026
+ "0x8ad3c73f833d3f9a523ab01476625f269aeb7cf0",
39027
+ "0x9dc27e2b3cc52533c159567a9e45243014ef3c0d",
39028
+ 18,
39029
+ 259200
39030
+ ],
39031
+ // unfunded, no APR feed
39032
+ [
39033
+ "wNLP-CRCLx",
39034
+ "0xe1e4bcb64121fff9cfa4d4f5bc31759f035992ad",
39035
+ "0xfebded1b0986a8ee107f5ab1a1c5a813491deceb",
39036
+ "0xf3d44492f11a2dc234acba80a9e377ab5732b09d",
39037
+ 18,
39038
+ 259200
39039
+ ],
39040
+ // unfunded, no APR feed
39041
+ [
39042
+ "wNLP-GOOGLx",
39043
+ "0x1d2831785db72d0809d493a4cfcc90fee47927ad",
39044
+ "0xe92f673ca36c5e2efd2de7628f815f84807e803f",
39045
+ "0xc9be6db8797f44455e578cac759cd209a1fd126d",
39046
+ 18,
39047
+ 259200
39048
+ ],
39049
+ // unfunded, no APR feed
39050
+ [
39051
+ "wNLP-QQQx",
39052
+ "0x4fb706eb3e3784da4fc5aa824886f6129a65fb2e",
39053
+ "0xa753a7395cae905cd615da0b82a53e0560f250af",
39054
+ "0x4f53c62a940748dd572d5ac790d3628e9b39ca8e",
39055
+ 18,
39056
+ 259200
39057
+ ],
39058
+ // unfunded, no APR feed
39059
+ [
39060
+ "wNLP-SPCXx",
39061
+ "0x6540c6b85ade3601f9bdf5b2d8712615dbd7730b",
39062
+ "0x68fa48b1c2fe52b3d776e1953e0e782b5044ce28",
39063
+ "0x277ac2538df35713f196d75058e6a661a058cd6f",
39064
+ 18,
39065
+ 259200
39066
+ ]
39067
+ // unfunded, no APR feed
39068
+ ],
39069
+ // Robinhood Chain — 10 pools, 2 funded, 0 with a DefiLlama APR.
39070
+ "4663": [
39071
+ [
39072
+ "wNLP-WETH",
39073
+ "0x7ce2c710c132f68a74dbb186644ec1eb86dfaf4e",
39074
+ "0x0bd7d308f8e1639fab988df18a8011f41eacad73",
39075
+ "0x70f167a4fed2c68d68760a4b0b6e93d919cfa935",
39076
+ 18,
39077
+ 259200
39078
+ ],
39079
+ // no APR feed
39080
+ [
39081
+ "wNLP-USDG",
39082
+ "0xbb761ba477de2e887968d6c01073a477a9f9815b",
39083
+ "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
39084
+ "0x855a737dbaf7143574cfe869b0849f929d8ba222",
39085
+ 6,
39086
+ 259200
39087
+ ],
39088
+ // no APR feed
39089
+ [
39090
+ "wNLP-AMD",
39091
+ "0x1eda0a1353c57113ff41c32f38ca4b8d0cfec562",
39092
+ "0x86923f96303d656e4aa86d9d42d1e57ad2023fdc",
39093
+ "0x24417d45dfe01841b5f28c05c1d44abf4c321ae6",
39094
+ 18,
39095
+ 259200
39096
+ ],
39097
+ // unfunded, no APR feed
39098
+ [
39099
+ "wNLP-CRCL",
39100
+ "0x965cfe674859cb223ffdc0f72722ad5619f7d90f",
39101
+ "0xdf0992e440dd0be65bd8439b609d6d4366bf1cb5",
39102
+ "0x3581a66d36e307b41b11402cf858f3f83e31d859",
39103
+ 18,
39104
+ 259200
39105
+ ],
39106
+ // unfunded, no APR feed
39107
+ [
39108
+ "wNLP-MSFT",
39109
+ "0xa43ab4c0539ad04b41203fc0544d859540088613",
39110
+ "0xe93237c50d904957cf27e7b1133b510c669c2e74",
39111
+ "0xa81bfbe0994e0b49d66f2273c52d5d447ea71038",
39112
+ 18,
39113
+ 259200
39114
+ ],
39115
+ // unfunded, no APR feed
39116
+ [
39117
+ "wNLP-MU",
39118
+ "0xb05b806fc5bdce389b734dce50400fa27ae54942",
39119
+ "0xff080c8ce2e5feadaca0da81314ae59d232d4afd",
39120
+ "0x48cf773961339cea5284f62bcc9a4a342be42adc",
39121
+ 18,
39122
+ 259200
39123
+ ],
39124
+ // unfunded, no APR feed
39125
+ [
39126
+ "wNLP-NVDA",
39127
+ "0x001660ed89e93c7c9b348e247934fa1ebc3a2625",
39128
+ "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec",
39129
+ "0x6422b1130526d842f74a9340a0d244c289534dd9",
39130
+ 18,
39131
+ 259200
39132
+ ],
39133
+ // unfunded, no APR feed
39134
+ [
39135
+ "wNLP-SNDK",
39136
+ "0xbd254986706115081d84b7a71f3aa1f07d748a5b",
39137
+ "0xb90a19ff0af67f7779aff50a882a9cff42446400",
39138
+ "0x45ee33d6c6d399aa6fa14e25c5462bfd7f0ffea9",
39139
+ 18,
39140
+ 259200
39141
+ ],
39142
+ // unfunded, no APR feed
39143
+ [
39144
+ "wNLP-SPCX",
39145
+ "0x68722297b35760ff16b873c4c89187f4e1d5dbe6",
39146
+ "0x4a0e65a3eccec6dbe60ae065f2e7bb85fae35eea",
39147
+ "0x2933c9c18ba62fe494b4ac75d32060594c9c28bc",
39148
+ 18,
39149
+ 259200
39150
+ ],
39151
+ // unfunded, no APR feed
39152
+ [
39153
+ "wNLP-TSLA",
39154
+ "0xf54b421461d41203e4babdc59d1259d7de886a73",
39155
+ "0x322f0929c4625ed5bad873c95208d54e1c003b2d",
39156
+ "0x0945712145b562ec6ba6631293fb917feb6b262a",
39157
+ 18,
39158
+ 259200
39159
+ ]
39160
+ // unfunded, no APR feed
39161
+ ],
39162
+ // Morph — 2 pools, 2 funded, 0 with a DefiLlama APR.
39163
+ "2818": [
39164
+ [
39165
+ "wNLP-USDC",
39166
+ "0xcf7b55c544b579a09b54f5a4da3e1ba476c04364",
39167
+ "0xcfb1186f4e93d60e60a8bdd997427d1f33bc372b",
39168
+ "0x26ff7df6d9e1feead7786a6ba82618aafd7c8ea7",
39169
+ 6,
39170
+ 259200
39171
+ ],
39172
+ // no APR feed
39173
+ [
39174
+ "wNLP-BGBTC",
39175
+ "0xca0f3fb46eb413abefa10d91aa2a6fd49eab60eb",
39176
+ "0x31011317764e097b28d159a8145b92bfa453f606",
39177
+ "0x0d8de51813ef9b8634d3b91086884d3045a5f3e8",
39178
+ 8,
39179
+ 259200
39180
+ ]
39181
+ // no APR feed
39182
+ ]
37784
39183
  };
39184
+ var NATIVE_WNLP_ENTRIES = Object.fromEntries(
39185
+ Object.entries(NATIVE_WNLP_ROWS).map(([chainId, rows]) => [
39186
+ chainId,
39187
+ rows.map(
39188
+ ([
39189
+ symbol,
39190
+ address,
39191
+ underlying,
39192
+ withdrawQueue,
39193
+ decimals,
39194
+ withdrawalWindowSeconds
39195
+ ]) => ({
39196
+ address,
39197
+ underlying,
39198
+ symbol,
39199
+ brand: "Native",
39200
+ decimals,
39201
+ isRebasing: false,
39202
+ isMintable: true,
39203
+ withdrawalMode: "fee-or-queued",
39204
+ withdrawalCooldownSeconds: withdrawalWindowSeconds,
39205
+ reader: "native-wnlp",
39206
+ withdrawQueue,
39207
+ inventoryContract: NATIVE_CREDIT_VAULT[chainId],
39208
+ yieldFetcher: nativeCreditPoolFetcher(chainId),
39209
+ yieldKey: nativeCreditPoolYieldKey(chainId, underlying)
39210
+ })
39211
+ )
39212
+ ])
39213
+ );
37785
39214
 
37786
39215
  // src/vaults/savings/registry.ts
37787
39216
  var stUsdGroup = {
@@ -37877,11 +39306,121 @@ var yUsdGroup = {
37877
39306
  // confirmed on Basescan.
37878
39307
  }
37879
39308
  };
39309
+ var sUsdcGroup = {
39310
+ base: {
39311
+ reader: "erc4626-idle",
39312
+ symbol: "sUSDC",
39313
+ brand: "Spark",
39314
+ decimals: 18,
39315
+ underlyingDecimals: 6,
39316
+ isRebasing: false,
39317
+ isMintable: true,
39318
+ withdrawalMode: "instant-capped",
39319
+ yieldFetcher: sparkSavingsFetcher,
39320
+ yieldKey: SPARK_SUSDC_KEY
39321
+ },
39322
+ chains: {
39323
+ "1": {
39324
+ address: "0xbc65ad17c5c0a2a4d159fa5a503f4992c7b545fe",
39325
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
39326
+ // Mainnet PSM keeps a dedicated pocket contract.
39327
+ inventoryContract: "0x37305b1cd40574e4c5ce33f8e8306be057fd7341"
39328
+ },
39329
+ "8453": {
39330
+ address: "0x3128a0f7f0ea68e7b7c9b00afa7e41045828e858",
39331
+ underlying: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
39332
+ // L2 PSM3s custody the pocket themselves (`pocket() == psm`).
39333
+ inventoryContract: "0x1601843c5e9bc251a3272907010afa41fa18347e"
39334
+ },
39335
+ "42161": {
39336
+ address: "0x940098b108fb7d0a7e374f6eded7760787464609",
39337
+ underlying: "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
39338
+ inventoryContract: "0x2b05f8e1cacc6974fd79a673a341fe1f58d27266"
39339
+ },
39340
+ "10": {
39341
+ address: "0xcf9326e24ebffbef22ce1050007a43a3c0b6db55",
39342
+ underlying: "0x0b2c639c533813f4aa9d7837caf62653d097ff85",
39343
+ inventoryContract: "0xe0f9978b907853f354d79188a3defbd41978af62"
39344
+ },
39345
+ "130": {
39346
+ address: "0x14d9143becc348920b68d123687045db49a016c6",
39347
+ underlying: "0x078d782b760474a361dda0af3839290b0ef57ad6",
39348
+ inventoryContract: "0x7b42ed932f26509465f7ce3faf76ffce1275312f"
39349
+ }
39350
+ }
39351
+ };
39352
+ var reUsdGroup = {
39353
+ base: {
39354
+ reader: "nav-oracle",
39355
+ symbol: "reUSD",
39356
+ brand: "Re Protocol",
39357
+ decimals: 18,
39358
+ underlyingDecimals: 6,
39359
+ isRebasing: false,
39360
+ isMintable: false,
39361
+ withdrawalMode: "request-based",
39362
+ // Quarterly queue — the documented worst case, and the live case
39363
+ // wherever the buffer sits under 1 % of supply.
39364
+ withdrawalCooldownSeconds: 90 * 86400,
39365
+ yieldFetcher: reProtocolFetcher,
39366
+ yieldKey: REUSD_KEY
39367
+ },
39368
+ chains: {
39369
+ "1": {
39370
+ address: "0x5086bf358635b81d8c47c66d1c8b9e567db70c72",
39371
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
39372
+ // USDC
39373
+ priceOracle: "0x72b5760cfbe437dd01409f44055fdfb8f8121b46",
39374
+ mintContract: "0x4691c475be804fa85f91c2d6d0adf03114de3093",
39375
+ // ICL
39376
+ withdrawQueue: "0x5c454f5526e41fbe917b63475cd8ca7e4631b147"
39377
+ },
39378
+ "8453": {
39379
+ address: "0x7d214438d0f27afccc23b3d1e1a53906ace5cfea",
39380
+ underlying: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
39381
+ priceOracle: "0x67a3226e69a1a8316ef1807a44f077af80071926",
39382
+ // On Base the ICL is the token itself.
39383
+ mintContract: "0x7d214438d0f27afccc23b3d1e1a53906ace5cfea",
39384
+ withdrawQueue: "0x9ab62aebabe738ab233c447eedce88d1d0a61fe3"
39385
+ },
39386
+ "42161": {
39387
+ address: "0x76ce01f0ef25aa66cc5f1e546a005e4a63b25609",
39388
+ underlying: "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
39389
+ priceOracle: "0x48abcc5a711ac23d3730bf627415dc898cbc5967",
39390
+ mintContract: "0x802edbb1ec20548a4388abc337e4011718eb0291",
39391
+ withdrawQueue: "0xfd4016ea13ca8acc04a11a99702df076a4d3b852"
39392
+ },
39393
+ "43114": {
39394
+ address: "0x180af87b47bf272b2df59dccf2d76a6eafa625bf",
39395
+ underlying: "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
39396
+ priceOracle: "0x4c558694f16484e5c7a4a52bd210d471860ce7bc",
39397
+ mintContract: "0xb22a8533e6cd81598f82514a42f0b3161745fbe1",
39398
+ withdrawQueue: "0xe13292f97e38da0c64398de5e0bfc95180de9d23"
39399
+ }
39400
+ // NB: our token list also carries reUSD on BNB (0xba9425ec…) and Ink
39401
+ // (0x5bcf6b00…), but Re publishes no NAV oracle for either, so there
39402
+ // is no price source and they are deliberately NOT registered.
39403
+ }
39404
+ };
37880
39405
  var MULTI_CHAIN_GROUPS = [
37881
39406
  stUsdGroup,
37882
39407
  stEurGroup,
37883
- yUsdGroup
39408
+ yUsdGroup,
39409
+ sUsdcGroup,
39410
+ reUsdGroup
37884
39411
  ];
39412
+ var sparkV2Base = (symbol, decimals) => ({
39413
+ reader: "erc4626-idle",
39414
+ symbol,
39415
+ brand: "Spark",
39416
+ decimals,
39417
+ underlyingDecimals: decimals,
39418
+ isRebasing: false,
39419
+ isMintable: true,
39420
+ withdrawalMode: "instant-capped",
39421
+ yieldFetcher: sparkSavingsFetcher
39422
+ });
39423
+ var SPARK_V2_WITHDRAW_INTENTS = "0x592b7db9906e6f8924c4d74c2a0ab86ce44fdddf";
37885
39424
  var SINGLE_CHAIN_ENTRIES = {
37886
39425
  "1": [
37887
39426
  {
@@ -37940,6 +39479,40 @@ var SINGLE_CHAIN_ENTRIES = {
37940
39479
  yieldFetcher: susdsFetcher,
37941
39480
  yieldKey: "Staked USDS::stUSDS"
37942
39481
  },
39482
+ {
39483
+ // Frax sfrxUSD — `LinearRewardsErc4626` over frxUSD. Plain
39484
+ // instant 4626 exit; the rate is set by the vault's
39485
+ // `maxDistributionPerSecondPerAsset` cap rather than by
39486
+ // utilisation (see the frax fetcher for the exact maths).
39487
+ address: "0xcf62f905562626cfcdd2261162a51fd02fc9c5b6",
39488
+ underlying: "0xcacd6fd266af91b8aed52accc382b4e165586e29",
39489
+ // frxUSD
39490
+ symbol: "sfrxUSD",
39491
+ brand: "Frax",
39492
+ decimals: 18,
39493
+ isRebasing: false,
39494
+ isMintable: true,
39495
+ withdrawalMode: "instant",
39496
+ yieldFetcher: fraxSavingsFetcher,
39497
+ yieldKey: "SFRXUSD"
39498
+ },
39499
+ {
39500
+ // Frax sFRAX — the pre-rename sibling of sfrxUSD, over legacy
39501
+ // FRAX. Still live and roughly 2x sfrxUSD's size, so it stays a
39502
+ // first-class row rather than an alias. Same contract family, so
39503
+ // it shares `fraxSavingsFetcher` (one multicall covers both).
39504
+ address: "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32",
39505
+ underlying: "0x853d955acef822db058eb8505911ed77f175b99e",
39506
+ // FRAX
39507
+ symbol: "sFRAX",
39508
+ brand: "Frax",
39509
+ decimals: 18,
39510
+ isRebasing: false,
39511
+ isMintable: true,
39512
+ withdrawalMode: "instant",
39513
+ yieldFetcher: fraxSavingsFetcher,
39514
+ yieldKey: "SFRAX"
39515
+ },
37943
39516
  {
37944
39517
  address: "0x83f20f44975d03b1b09e64809b757c47f942beea",
37945
39518
  underlying: "0x6b175474e89094c44da98b954eedeac495271d0f",
@@ -38064,6 +39637,91 @@ var SINGLE_CHAIN_ENTRIES = {
38064
39637
  withdrawalMode: "request-based",
38065
39638
  yieldFetcher: hastraPrimeFetcher,
38066
39639
  yieldKey: "Hastra PRIME::PRIME"
39640
+ },
39641
+ {
39642
+ // Spark Vaults V2 — the mainnet book, and by far the largest of
39643
+ // the family. Only the Ethereum rows carry the intents contract as
39644
+ // `withdrawQueue`; the other chains have no deployment of it.
39645
+ ...sparkV2Base("spUSDC", 6),
39646
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
39647
+ underlying: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
39648
+ // USDC
39649
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39650
+ yieldKey: sparkVaultV2Key("1", "spUSDC")
39651
+ },
39652
+ {
39653
+ ...sparkV2Base("spUSDT", 6),
39654
+ address: "0xe2e7a17dff93280dec073c995595155283e3c372",
39655
+ underlying: "0xdac17f958d2ee523a2206206994597c13d831ec7",
39656
+ // USDT
39657
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39658
+ yieldKey: sparkVaultV2Key("1", "spUSDT")
39659
+ },
39660
+ {
39661
+ // The only non-stable in the family — underlying is WETH, so
39662
+ // share and underlying are both 18-decimal.
39663
+ ...sparkV2Base("spETH", 18),
39664
+ address: "0xfe6eb3b609a7c8352a241f7f3a21cea4e9209b8f",
39665
+ underlying: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
39666
+ // WETH
39667
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39668
+ yieldKey: sparkVaultV2Key("1", "spETH")
39669
+ },
39670
+ {
39671
+ // Seeded but live (~$30k) — real contract, real `vsr`, so it is
39672
+ // carried rather than special-cased. Expect it to grow.
39673
+ ...sparkV2Base("spPYUSD", 6),
39674
+ address: "0x80128dbb9f07b93dde62a6daeadb69ed14a7d354",
39675
+ underlying: "0x6c3ea9036406852006290770bedfcaba0e23a0e8",
39676
+ // PYUSD
39677
+ withdrawQueue: SPARK_V2_WITHDRAW_INTENTS,
39678
+ yieldKey: sparkVaultV2Key("1", "spPYUSD")
39679
+ },
39680
+ {
39681
+ // Re Protocol reUSDe — the JUNIOR tranche of the same reinsurance
39682
+ // capital stack as reUSD (see `reUsdGroup` for the model, the
39683
+ // liquidity caveat and why `isMintable` is false). Ethereum only,
39684
+ // ~$18.8M, and it earns roughly double reUSD's rate precisely
39685
+ // because it absorbs losses first. Underlying is USDe, so unlike
39686
+ // reUSD the share and underlying decimals align at 18.
39687
+ reader: "nav-oracle",
39688
+ address: "0xddc0f880ff6e4e22e4b74632fbb43ce4df6ccc5a",
39689
+ underlying: "0x4c9edd5852cd905f086c759e8383e09bff1e68b3",
39690
+ // USDe
39691
+ priceOracle: "0x7844441f13c61cbd3d297f5d2d7fcabf17f0b843",
39692
+ mintContract: "0xe1886be2ba8b2496c2044a77516f63a734193082",
39693
+ // ICL
39694
+ symbol: "reUSDe",
39695
+ brand: "Re Protocol",
39696
+ decimals: 18,
39697
+ underlyingDecimals: 18,
39698
+ isRebasing: false,
39699
+ isMintable: false,
39700
+ withdrawalMode: "request-based",
39701
+ withdrawalCooldownSeconds: 90 * 86400,
39702
+ yieldFetcher: reProtocolFetcher,
39703
+ yieldKey: REUSDE_KEY
39704
+ }
39705
+ ],
39706
+ "42161": [
39707
+ {
39708
+ // Same CREATE2 family as mainnet spUSDT but an independent vault
39709
+ // with its own `vsr`. Seeded (~$1k) at time of writing.
39710
+ ...sparkV2Base("spUSDT", 6),
39711
+ address: "0x45d91340b3b7b96985a72b5c678f7d9e8d664b62",
39712
+ underlying: "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9",
39713
+ // USDT
39714
+ yieldKey: sparkVaultV2Key("42161", "spUSDT")
39715
+ }
39716
+ ],
39717
+ "196": [
39718
+ {
39719
+ // X Layer spUSDT — seeded only. Underlying is the bridged USDT
39720
+ // (`USDT0`-style) deployment, not mainnet USDT.
39721
+ ...sparkV2Base("spUSDT", 6),
39722
+ address: "0xc358c90d32375721cb3924320fdc2f8b694347ca",
39723
+ underlying: "0x779ded0c9e1022225f8e0630b35a9b54be713736",
39724
+ yieldKey: sparkVaultV2Key("196", "spUSDT")
38067
39725
  }
38068
39726
  ],
38069
39727
  "8453": [
@@ -38108,24 +39766,28 @@ var SINGLE_CHAIN_ENTRIES = {
38108
39766
  withdrawalCooldownSeconds: 86400,
38109
39767
  yieldFetcher: savbtcFetcher,
38110
39768
  yieldKey: "Staked avBTC::savBTC"
39769
+ },
39770
+ {
39771
+ // Spark Vaults V2 spUSDC on Avalanche — same CREATE2 address as
39772
+ // the mainnet vault, independent deployment and `vsr`.
39773
+ ...sparkV2Base("spUSDC", 6),
39774
+ address: "0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d",
39775
+ underlying: "0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e",
39776
+ // USDC
39777
+ yieldKey: sparkVaultV2Key("43114", "spUSDC")
38111
39778
  }
38112
39779
  ],
38113
39780
  "4663": [
38114
39781
  {
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.
39782
+ // Spark Vaults V2 spUSDG on Robinhood Chain — the first V2 vault
39783
+ // we carried. Its APR now comes from `vsr()` like every other V2
39784
+ // vault (the old chi-delta fetcher assumed no readable rate; the
39785
+ // getter is `vsr`, not `ssr`), and its exit is idle-capped like
39786
+ // the rest of the family rather than unconditionally instant.
39787
+ ...sparkV2Base("spUSDG", 6),
38119
39788
  address: "0xde770c84fe66e063336b31737cfe9790f18c4087",
38120
39789
  underlying: "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
38121
39790
  // USDG
38122
- symbol: "spUSDG",
38123
- brand: "Spark",
38124
- decimals: 6,
38125
- isRebasing: false,
38126
- isMintable: true,
38127
- withdrawalMode: "instant",
38128
- yieldFetcher: sparkSavingsUsdgFetcher,
38129
39791
  yieldKey: SPARK_SAVINGS_USDG_KEY
38130
39792
  }
38131
39793
  ]
@@ -38141,6 +39803,10 @@ var SAVINGS_REGISTRY = (() => {
38141
39803
  out[chainId].push({ ...group.base, ...addrs });
38142
39804
  }
38143
39805
  }
39806
+ for (const [chainId, entries] of Object.entries(NATIVE_WNLP_ENTRIES)) {
39807
+ if (!out[chainId]) out[chainId] = [];
39808
+ out[chainId].push(...entries);
39809
+ }
38144
39810
  return out;
38145
39811
  })();
38146
39812
  var getSavingsRegistry = (chainId) => SAVINGS_REGISTRY[chainId] ?? [];
@@ -38954,13 +40620,14 @@ async function fetchMerklOpportunities(protocolId, chainId) {
38954
40620
  while (true) {
38955
40621
  const params = new URLSearchParams({
38956
40622
  mainProtocolId: protocolId,
38957
- chainId,
38958
40623
  status: "LIVE",
38959
40624
  items: "100",
38960
40625
  page: String(page)
38961
40626
  });
40627
+ if (chainId) params.set("chainId", chainId);
38962
40628
  const res = await fetch(`${MERKL_API_BASE}/opportunities?${params}`);
38963
- if (!res.ok) throw new Error(`Merkl API ${res.status} for chain ${chainId}`);
40629
+ if (!res.ok)
40630
+ throw new Error(`Merkl API ${res.status} for chain ${chainId ?? "all"}`);
38964
40631
  const batch = await res.json();
38965
40632
  all.push(...batch);
38966
40633
  if (batch.length < 100) break;
@@ -39024,37 +40691,40 @@ function createMerklRewardFetcher(config) {
39024
40691
  label: `MERKL_${config.merklProtocolId.toUpperCase()}`,
39025
40692
  fetch: async () => {
39026
40693
  const result = {};
39027
- const chainResults = await Promise.all(
40694
+ const chainResults = config.chainIds ? await Promise.all(
39028
40695
  config.chainIds.map(async (chainId) => {
39029
40696
  try {
39030
- const opps = await fetchMerklOpportunities(
40697
+ return await fetchMerklOpportunities(
39031
40698
  config.merklProtocolId,
39032
40699
  chainId
39033
40700
  );
39034
- return { chainId, opps };
39035
40701
  } catch (e) {
39036
40702
  console.error(`Merkl: failed to fetch chain ${chainId}:`, e);
39037
- return { chainId, opps: [] };
40703
+ return [];
39038
40704
  }
39039
40705
  })
39040
- );
39041
- for (const { chainId, opps } of chainResults) {
40706
+ ) : [await fetchMerklOpportunities(config.merklProtocolId)];
40707
+ for (const opps of chainResults) {
39042
40708
  for (const opp of opps) {
39043
40709
  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);
40710
+ const chainId = String(opp.chainId);
40711
+ const resolvedRaw = resolve(opp);
40712
+ if (!resolvedRaw) continue;
40713
+ const resolutions = (Array.isArray(resolvedRaw) ? resolvedRaw : [resolvedRaw]).filter((r) => Boolean(r?.asset));
40714
+ for (const resolved2 of resolutions) {
40715
+ const bucket = resolved2.bucket ?? (opp.action === "LEND" ? "deposit" : opp.action === "BORROW" ? "borrow" : void 0);
40716
+ if (!bucket) continue;
40717
+ const lender = resolved2.lender ?? config.lenderKey;
40718
+ const reward = ensureReward(result, chainId, lender, resolved2.asset);
40719
+ const breakdowns = extractRewardBreakdowns(opp);
40720
+ reward.link = getMerkleUrl(opp);
40721
+ if (bucket === "deposit") {
40722
+ reward.deposit += opp.apr;
40723
+ reward.additionalDepositData.push(...breakdowns);
40724
+ } else {
40725
+ reward.borrow += opp.apr;
40726
+ reward.additionalBorrowData.push(...breakdowns);
40727
+ }
39058
40728
  }
39059
40729
  }
39060
40730
  }
@@ -39062,81 +40732,39 @@ function createMerklRewardFetcher(config) {
39062
40732
  }
39063
40733
  };
39064
40734
  }
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
40735
  var aaveMerklRewardFetcher = createMerklRewardFetcher({
39092
40736
  merklProtocolId: "aave",
39093
- lenderKey: "AAVE_V3",
39094
- chainIds: AAVE_V3_MERKL_CHAINS
40737
+ lenderKey: "AAVE_V3"
39095
40738
  });
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
- ];
40739
+ function parseEulerVaultFromUrl(depositUrl) {
40740
+ if (!depositUrl) return void 0;
40741
+ try {
40742
+ const url = new URL(depositUrl);
40743
+ const search = url.searchParams.get("search");
40744
+ if (search && /^0x[0-9a-fA-F]{40}$/.test(search))
40745
+ return search.toLowerCase();
40746
+ const positions = url.pathname.match(
40747
+ /\/positions\/0x[0-9a-fA-F]{40}\/(0x[0-9a-fA-F]{40})/
40748
+ );
40749
+ if (positions) return positions[1].toLowerCase();
40750
+ const vault = url.pathname.match(/\/vault\/(0x[0-9a-fA-F]{40})/);
40751
+ if (vault) return vault[1].toLowerCase();
40752
+ } catch {
40753
+ }
40754
+ return void 0;
40755
+ }
39116
40756
  var eulerMerklRewardFetcher = createMerklRewardFetcher({
39117
40757
  merklProtocolId: "euler",
39118
40758
  lenderKey: "EULER_V2",
39119
- chainIds: EULER_MERKL_CHAINS,
39120
40759
  resolveAsset: (opp) => {
39121
- const vault = opp.explorerAddress?.toLowerCase();
40760
+ if (opp.type === "MULTILENDBORROW") {
40761
+ return (opp.tokens ?? []).filter((t) => !t.symbol?.endsWith("-DEBT")).map((t) => ({ asset: t.address.toLowerCase() }));
40762
+ }
40763
+ const vault = (opp.action === "BORROW" ? parseEulerVaultFromUrl(opp.depositUrl) : void 0) ?? opp.explorerAddress?.toLowerCase();
39122
40764
  if (!vault) return void 0;
39123
40765
  return { asset: vault };
39124
40766
  }
39125
40767
  });
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
40768
  function parseMorphoUniqueKey(depositUrl) {
39141
40769
  if (!depositUrl) return void 0;
39142
40770
  const m = depositUrl.match(/\/market\/(0x[0-9a-fA-F]{64})/);
@@ -39145,7 +40773,6 @@ function parseMorphoUniqueKey(depositUrl) {
39145
40773
  var morphoCollateralMerklRewardFetcher = createMerklRewardFetcher({
39146
40774
  merklProtocolId: "morpho",
39147
40775
  lenderKey: "MORPHO_BLUE",
39148
- chainIds: MORPHO_MERKL_CHAINS,
39149
40776
  resolveAsset: (opp) => {
39150
40777
  if (opp.type !== "MORPHOCOLLATERAL") return void 0;
39151
40778
  const uniqueKey = parseMorphoUniqueKey(opp.depositUrl);
@@ -45566,7 +47193,7 @@ var Erc4626PreviewRedeemAbi = [
45566
47193
  ];
45567
47194
 
45568
47195
  // src/vaults/lst/readers/shared.ts
45569
- var ONE_E186 = 10n ** 18n;
47196
+ var ONE_E187 = 10n ** 18n;
45570
47197
  var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
45571
47198
  var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
45572
47199
  var Multicall3BalanceAbi = [
@@ -45609,7 +47236,7 @@ var readerBeetsStS = (entry) => ({
45609
47236
  }
45610
47237
  const liquidity = toBigInt12(pool);
45611
47238
  return {
45612
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47239
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45613
47240
  totalSupply,
45614
47241
  exchangeRate,
45615
47242
  liquidity
@@ -45642,7 +47269,7 @@ var readerBenqiSavax = (entry) => ({
45642
47269
  {
45643
47270
  address: entry.address,
45644
47271
  name: "getPooledAvaxByShares",
45645
- params: [ONE_E186]
47272
+ params: [ONE_E187]
45646
47273
  },
45647
47274
  { address: entry.address, name: "totalPooledAvax", params: [] }
45648
47275
  ],
@@ -45653,7 +47280,7 @@ var readerBenqiSavax = (entry) => ({
45653
47280
  if (totalSupply === void 0 || exchangeRate === void 0) {
45654
47281
  return void 0;
45655
47282
  }
45656
- const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E186;
47283
+ const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E187;
45657
47284
  return {
45658
47285
  totalAssets,
45659
47286
  totalSupply,
@@ -45672,7 +47299,7 @@ var readerBgtWrapper1to1 = (entry) => ({
45672
47299
  return {
45673
47300
  totalAssets: totalSupply,
45674
47301
  totalSupply,
45675
- exchangeRate: ONE_E186
47302
+ exchangeRate: ONE_E187
45676
47303
  };
45677
47304
  }
45678
47305
  });
@@ -45702,7 +47329,7 @@ var readerDineroBeraEth = (entry) => ({
45702
47329
  return void 0;
45703
47330
  }
45704
47331
  return {
45705
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47332
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45706
47333
  totalSupply,
45707
47334
  exchangeRate
45708
47335
  };
@@ -45714,7 +47341,7 @@ var readerErc4626 = (entry) => ({
45714
47341
  calls: [
45715
47342
  { address: entry.address, name: "totalAssets", params: [] },
45716
47343
  { address: entry.address, name: "totalSupply", params: [] },
45717
- { address: entry.address, name: "convertToAssets", params: [ONE_E186] }
47344
+ { address: entry.address, name: "convertToAssets", params: [ONE_E187] }
45718
47345
  ],
45719
47346
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
45720
47347
  parse: ([assets, supply, rate]) => {
@@ -45731,7 +47358,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
45731
47358
  calls: [
45732
47359
  { address: entry.address, name: "totalAssets", params: [] },
45733
47360
  { address: entry.address, name: "totalSupply", params: [] },
45734
- { address: entry.address, name: "previewRedeem", params: [ONE_E186] }
47361
+ { address: entry.address, name: "previewRedeem", params: [ONE_E187] }
45735
47362
  ],
45736
47363
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
45737
47364
  parse: ([assets, supply, rate]) => {
@@ -45811,7 +47438,7 @@ var readerEtherFiWeEth = (entry) => {
45811
47438
  }
45812
47439
  }
45813
47440
  return {
45814
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47441
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45815
47442
  totalSupply,
45816
47443
  exchangeRate,
45817
47444
  liquidity
@@ -45844,7 +47471,7 @@ var readerHyperbeatBeHype = (entry) => {
45844
47471
  return {
45845
47472
  totalAssets: totalSupply,
45846
47473
  totalSupply,
45847
- exchangeRate: ONE_E186
47474
+ exchangeRate: ONE_E187
45848
47475
  };
45849
47476
  }
45850
47477
  };
@@ -45852,7 +47479,7 @@ var readerHyperbeatBeHype = (entry) => {
45852
47479
  return {
45853
47480
  calls: [
45854
47481
  { address: entry.address, name: "totalSupply", params: [] },
45855
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E186] }
47482
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E187] }
45856
47483
  ],
45857
47484
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
45858
47485
  parse: ([supply, rate]) => {
@@ -45862,7 +47489,7 @@ var readerHyperbeatBeHype = (entry) => {
45862
47489
  return void 0;
45863
47490
  }
45864
47491
  return {
45865
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47492
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45866
47493
  totalSupply,
45867
47494
  exchangeRate
45868
47495
  };
@@ -45894,7 +47521,7 @@ var readerKelpRsEth = (entry) => {
45894
47521
  return {
45895
47522
  totalAssets: totalSupply,
45896
47523
  totalSupply,
45897
- exchangeRate: ONE_E186
47524
+ exchangeRate: ONE_E187
45898
47525
  };
45899
47526
  }
45900
47527
  };
@@ -45912,7 +47539,7 @@ var readerKelpRsEth = (entry) => {
45912
47539
  return void 0;
45913
47540
  }
45914
47541
  return {
45915
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47542
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45916
47543
  totalSupply,
45917
47544
  exchangeRate
45918
47545
  };
@@ -45944,7 +47571,7 @@ var readerKinetiqKHype = (entry) => {
45944
47571
  return {
45945
47572
  totalAssets: totalSupply,
45946
47573
  totalSupply,
45947
- exchangeRate: ONE_E186
47574
+ exchangeRate: ONE_E187
45948
47575
  };
45949
47576
  }
45950
47577
  };
@@ -45952,7 +47579,7 @@ var readerKinetiqKHype = (entry) => {
45952
47579
  return {
45953
47580
  calls: [
45954
47581
  { address: entry.address, name: "totalSupply", params: [] },
45955
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E186] }
47582
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E187] }
45956
47583
  ],
45957
47584
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
45958
47585
  parse: ([supply, rate]) => {
@@ -45962,7 +47589,7 @@ var readerKinetiqKHype = (entry) => {
45962
47589
  return void 0;
45963
47590
  }
45964
47591
  return {
45965
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47592
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45966
47593
  totalSupply,
45967
47594
  exchangeRate
45968
47595
  };
@@ -46002,7 +47629,7 @@ var readerLairStKaia = (entry) => ({
46002
47629
  if (totalSupply === void 0 || exchangeRate === void 0) {
46003
47630
  return void 0;
46004
47631
  }
46005
- const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E186;
47632
+ const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E187;
46006
47633
  return {
46007
47634
  totalAssets,
46008
47635
  totalSupply,
@@ -46036,7 +47663,7 @@ var readerLidoWstEth = (entry) => ({
46036
47663
  return void 0;
46037
47664
  }
46038
47665
  return {
46039
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47666
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46040
47667
  totalSupply,
46041
47668
  exchangeRate
46042
47669
  };
@@ -46074,7 +47701,7 @@ var readerListaSlisBnb = (entry) => {
46074
47701
  return {
46075
47702
  totalAssets: totalSupply,
46076
47703
  totalSupply,
46077
- exchangeRate: ONE_E186
47704
+ exchangeRate: ONE_E187
46078
47705
  };
46079
47706
  }
46080
47707
  };
@@ -46082,7 +47709,7 @@ var readerListaSlisBnb = (entry) => {
46082
47709
  return {
46083
47710
  calls: [
46084
47711
  { address: entry.address, name: "totalSupply", params: [] },
46085
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E186] },
47712
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E187] },
46086
47713
  { address: manager, name: "getTotalPooledBnb", params: [] }
46087
47714
  ],
46088
47715
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -46093,7 +47720,7 @@ var readerListaSlisBnb = (entry) => {
46093
47720
  return void 0;
46094
47721
  }
46095
47722
  const pooledBnb = toBigInt12(pooled);
46096
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E186;
47723
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E187;
46097
47724
  return { totalAssets, totalSupply, exchangeRate };
46098
47725
  }
46099
47726
  };
@@ -46123,7 +47750,7 @@ var readerMantleMEth = (entry) => {
46123
47750
  return {
46124
47751
  totalAssets: totalSupply,
46125
47752
  totalSupply,
46126
- exchangeRate: ONE_E186
47753
+ exchangeRate: ONE_E187
46127
47754
  };
46128
47755
  }
46129
47756
  };
@@ -46131,7 +47758,7 @@ var readerMantleMEth = (entry) => {
46131
47758
  return {
46132
47759
  calls: [
46133
47760
  { address: entry.address, name: "totalSupply", params: [] },
46134
- { address: staking, name: "mETHToETH", params: [ONE_E186] }
47761
+ { address: staking, name: "mETHToETH", params: [ONE_E187] }
46135
47762
  ],
46136
47763
  abis: [TotalSupplyAbi, MantleStakingAbi],
46137
47764
  parse: ([supply, rate]) => {
@@ -46141,7 +47768,7 @@ var readerMantleMEth = (entry) => {
46141
47768
  return void 0;
46142
47769
  }
46143
47770
  return {
46144
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47771
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46145
47772
  totalSupply,
46146
47773
  exchangeRate
46147
47774
  };
@@ -46162,7 +47789,7 @@ var readerOffChain = (entry) => {
46162
47789
  return {
46163
47790
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
46164
47791
  totalSupply,
46165
- exchangeRate: ONE_E186
47792
+ exchangeRate: ONE_E187
46166
47793
  };
46167
47794
  }
46168
47795
  };
@@ -46196,7 +47823,7 @@ var readerRenzoEzEth = (entry) => {
46196
47823
  return {
46197
47824
  totalAssets: totalSupply,
46198
47825
  totalSupply,
46199
- exchangeRate: ONE_E186
47826
+ exchangeRate: ONE_E187
46200
47827
  };
46201
47828
  }
46202
47829
  };
@@ -46215,7 +47842,7 @@ var readerRenzoEzEth = (entry) => {
46215
47842
  return {
46216
47843
  totalAssets: totalTvl,
46217
47844
  totalSupply,
46218
- exchangeRate: totalTvl * ONE_E186 / totalSupply
47845
+ exchangeRate: totalTvl * ONE_E187 / totalSupply
46219
47846
  };
46220
47847
  }
46221
47848
  };
@@ -46271,7 +47898,7 @@ var readerRocketReth = (entry) => {
46271
47898
  }
46272
47899
  const liquidity = depositPool ? toBigInt12(slice[2]) : void 0;
46273
47900
  return {
46274
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47901
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46275
47902
  totalSupply,
46276
47903
  exchangeRate,
46277
47904
  liquidity
@@ -46313,7 +47940,7 @@ var readerStaderEthx = (entry) => {
46313
47940
  return {
46314
47941
  totalAssets: totalSupply,
46315
47942
  totalSupply,
46316
- exchangeRate: ONE_E186
47943
+ exchangeRate: ONE_E187
46317
47944
  };
46318
47945
  }
46319
47946
  };
@@ -46331,7 +47958,7 @@ var readerStaderEthx = (entry) => {
46331
47958
  return void 0;
46332
47959
  }
46333
47960
  return {
46334
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47961
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46335
47962
  totalSupply,
46336
47963
  exchangeRate
46337
47964
  };
@@ -46348,7 +47975,7 @@ var readerStaderMaticX = (entry) => {
46348
47975
  {
46349
47976
  address: rateAddress,
46350
47977
  name: "convertMaticXToMatic",
46351
- params: [ONE_E186],
47978
+ params: [ONE_E187],
46352
47979
  chainId: homeChainId
46353
47980
  }
46354
47981
  ],
@@ -46363,7 +47990,7 @@ var readerStaderMaticX = (entry) => {
46363
47990
  }
46364
47991
  const isCrossChain = homeContract !== void 0;
46365
47992
  return {
46366
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E186 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E186,
47993
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E187 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E187,
46367
47994
  totalSupply,
46368
47995
  exchangeRate: amountInMatic
46369
47996
  };
@@ -46395,7 +48022,7 @@ var readerStakeWiseOsEth = (entry) => {
46395
48022
  return {
46396
48023
  totalAssets: totalSupply,
46397
48024
  totalSupply,
46398
- exchangeRate: ONE_E186
48025
+ exchangeRate: ONE_E187
46399
48026
  };
46400
48027
  }
46401
48028
  };
@@ -46403,7 +48030,7 @@ var readerStakeWiseOsEth = (entry) => {
46403
48030
  return {
46404
48031
  calls: [
46405
48032
  { address: entry.address, name: "totalSupply", params: [] },
46406
- { address: controller, name: "convertToAssets", params: [ONE_E186] }
48033
+ { address: controller, name: "convertToAssets", params: [ONE_E187] }
46407
48034
  ],
46408
48035
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
46409
48036
  parse: ([supply, rate]) => {
@@ -46413,7 +48040,7 @@ var readerStakeWiseOsEth = (entry) => {
46413
48040
  return void 0;
46414
48041
  }
46415
48042
  return {
46416
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48043
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46417
48044
  totalSupply,
46418
48045
  exchangeRate
46419
48046
  };
@@ -46445,7 +48072,7 @@ var readerStCelo = (entry) => {
46445
48072
  return {
46446
48073
  totalAssets: totalSupply,
46447
48074
  totalSupply,
46448
- exchangeRate: ONE_E186
48075
+ exchangeRate: ONE_E187
46449
48076
  };
46450
48077
  }
46451
48078
  };
@@ -46453,7 +48080,7 @@ var readerStCelo = (entry) => {
46453
48080
  return {
46454
48081
  calls: [
46455
48082
  { address: entry.address, name: "totalSupply", params: [] },
46456
- { address: manager, name: "toCelo", params: [ONE_E186] }
48083
+ { address: manager, name: "toCelo", params: [ONE_E187] }
46457
48084
  ],
46458
48085
  abis: [TotalSupplyAbi, StCeloManagerAbi],
46459
48086
  parse: ([supply, rate]) => {
@@ -46463,7 +48090,7 @@ var readerStCelo = (entry) => {
46463
48090
  return void 0;
46464
48091
  }
46465
48092
  return {
46466
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48093
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46467
48094
  totalSupply,
46468
48095
  exchangeRate
46469
48096
  };
@@ -46496,7 +48123,7 @@ var readerSwellGetRate = (entry) => ({
46496
48123
  return void 0;
46497
48124
  }
46498
48125
  return {
46499
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48126
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46500
48127
  totalSupply,
46501
48128
  exchangeRate
46502
48129
  };
@@ -46527,7 +48154,7 @@ var readerValantisWstHype = (entry) => {
46527
48154
  return {
46528
48155
  totalAssets: totalSupply,
46529
48156
  totalSupply,
46530
- exchangeRate: ONE_E186
48157
+ exchangeRate: ONE_E187
46531
48158
  };
46532
48159
  }
46533
48160
  };
@@ -46545,7 +48172,7 @@ var readerValantisWstHype = (entry) => {
46545
48172
  return void 0;
46546
48173
  }
46547
48174
  return {
46548
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48175
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46549
48176
  totalSupply,
46550
48177
  exchangeRate
46551
48178
  };
@@ -46579,7 +48206,7 @@ var readerVedaAccountant = (entry) => {
46579
48206
  return {
46580
48207
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
46581
48208
  totalSupply,
46582
- exchangeRate: ONE_E186
48209
+ exchangeRate: ONE_E187
46583
48210
  };
46584
48211
  }
46585
48212
  };
@@ -46598,7 +48225,7 @@ var readerVedaAccountant = (entry) => {
46598
48225
  const exchangeRate = rawRate * scale;
46599
48226
  return {
46600
48227
  totalAssets: rescaleDecimals(
46601
- totalSupply * exchangeRate / ONE_E186,
48228
+ totalSupply * exchangeRate / ONE_E187,
46602
48229
  shareDec,
46603
48230
  underlyingDec
46604
48231
  ),
@@ -46634,9 +48261,9 @@ var readerAnkrRatio = (entry) => ({
46634
48261
  return void 0;
46635
48262
  }
46636
48263
  return {
46637
- totalAssets: totalSupply * ONE_E186 / r,
48264
+ totalAssets: totalSupply * ONE_E187 / r,
46638
48265
  totalSupply,
46639
- exchangeRate: ONE_E186 * ONE_E186 / r
48266
+ exchangeRate: ONE_E187 * ONE_E187 / r
46640
48267
  };
46641
48268
  }
46642
48269
  });
@@ -46680,7 +48307,7 @@ var readerCoreEarnRate = (entry) => {
46680
48307
  return {
46681
48308
  totalAssets: totalSupply * r / CORE_RATE_DENOM,
46682
48309
  totalSupply,
46683
- exchangeRate: r * ONE_E186 / CORE_RATE_DENOM
48310
+ exchangeRate: r * ONE_E187 / CORE_RATE_DENOM
46684
48311
  };
46685
48312
  }
46686
48313
  };
@@ -46702,7 +48329,7 @@ var readerCoreStakedRatio = (entry) => {
46702
48329
  return {
46703
48330
  totalAssets: totalStaked,
46704
48331
  totalSupply,
46705
- exchangeRate: totalStaked * ONE_E186 / totalSupply
48332
+ exchangeRate: totalStaked * ONE_E187 / totalSupply
46706
48333
  };
46707
48334
  }
46708
48335
  };
@@ -46733,7 +48360,7 @@ var readerStellaStDot = (entry) => ({
46733
48360
  {
46734
48361
  address: entry.address,
46735
48362
  name: "getPooledTokenByShares",
46736
- params: [ONE_E186]
48363
+ params: [ONE_E187]
46737
48364
  },
46738
48365
  { address: entry.address, name: "getTotalPooledToken", params: [] }
46739
48366
  ],
@@ -46744,7 +48371,7 @@ var readerStellaStDot = (entry) => ({
46744
48371
  if (totalSupply === void 0 || exchangeRate === void 0) {
46745
48372
  return void 0;
46746
48373
  }
46747
- const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E186;
48374
+ const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E187;
46748
48375
  return {
46749
48376
  totalAssets,
46750
48377
  totalSupply,
@@ -46782,7 +48409,7 @@ var readerKintsuSMon = (entry) => ({
46782
48409
  const totalAssets = toBigInt12(pooled);
46783
48410
  const totalSupply = toBigInt12(shares);
46784
48411
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
46785
- const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E186 / totalSupply : ONE_E186;
48412
+ const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E187 / totalSupply : ONE_E187;
46786
48413
  return { totalAssets, totalSupply, exchangeRate };
46787
48414
  }
46788
48415
  });
@@ -47218,7 +48845,7 @@ var getLstValidators = async (chainId, shareToken) => {
47218
48845
  };
47219
48846
 
47220
48847
  // src/vaults/lst/fetchPublic.ts
47221
- var ONE_E187 = 10n ** 18n;
48848
+ var ONE_E188 = 10n ** 18n;
47222
48849
  var ERC20_BALANCE_ABI = parseAbi([
47223
48850
  "function balanceOf(address) view returns (uint256)"
47224
48851
  ]);
@@ -47333,8 +48960,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
47333
48960
  const underlyingUnit = 10n ** BigInt(underlyingDec);
47334
48961
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
47335
48962
  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;
48963
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E188;
48964
+ const convertToShares = state.exchangeRate > 0n ? ONE_E188 * shareUnit / state.exchangeRate : 0n;
47338
48965
  let liquidityRaw;
47339
48966
  if (state.liquidity !== void 0) {
47340
48967
  liquidityRaw = state.liquidity;
@@ -50349,6 +51976,15 @@ var TotalSupplyAbi2 = [
50349
51976
  outputs: [{ type: "uint256" }]
50350
51977
  }
50351
51978
  ];
51979
+ var BalanceOfAbi = [
51980
+ {
51981
+ name: "balanceOf",
51982
+ type: "function",
51983
+ stateMutability: "view",
51984
+ inputs: [{ type: "address", name: "account" }],
51985
+ outputs: [{ type: "uint256" }]
51986
+ }
51987
+ ];
50352
51988
  var Erc4626ReadAbi2 = [
50353
51989
  {
50354
51990
  name: "totalAssets",
@@ -50365,9 +52001,24 @@ var Erc4626ReadAbi2 = [
50365
52001
  outputs: [{ type: "uint256", name: "assets" }]
50366
52002
  }
50367
52003
  ];
52004
+ var NavOracleReadAbi = [
52005
+ {
52006
+ name: "latestRoundData",
52007
+ type: "function",
52008
+ stateMutability: "view",
52009
+ inputs: [],
52010
+ outputs: [
52011
+ { name: "roundId", type: "uint80" },
52012
+ { name: "answer", type: "int256" },
52013
+ { name: "startedAt", type: "uint256" },
52014
+ { name: "updatedAt", type: "uint256" },
52015
+ { name: "answeredInRound", type: "uint80" }
52016
+ ]
52017
+ }
52018
+ ];
50368
52019
 
50369
52020
  // src/vaults/savings/readers/shared.ts
50370
- var ONE_E188 = 10n ** 18n;
52021
+ var ONE_E189 = 10n ** 18n;
50371
52022
  var toBigInt14 = (v) => {
50372
52023
  if (v === void 0 || v === null) return void 0;
50373
52024
  if (typeof v === "bigint") return v;
@@ -50408,20 +52059,221 @@ var readerErc46262 = (entry) => {
50408
52059
  return {
50409
52060
  totalAssets,
50410
52061
  totalSupply,
50411
- exchangeRate: convertToAssetsRaw * ONE_E188 / underlyingUnit
52062
+ exchangeRate: convertToAssetsRaw * ONE_E189 / underlyingUnit
52063
+ };
52064
+ }
52065
+ };
52066
+ };
52067
+
52068
+ // src/vaults/savings/abis/native.ts
52069
+ var NativeWnlpReadAbi = [
52070
+ {
52071
+ // 1e18-scaled underlying-per-share, independent of token decimals:
52072
+ // `getNlpByWnlp(1e18) / 1e18` is the exchange rate (per Native docs).
52073
+ name: "getNlpByWnlp",
52074
+ type: "function",
52075
+ stateMutability: "view",
52076
+ inputs: [{ type: "uint256", name: "wnlpAmount" }],
52077
+ outputs: [{ type: "uint256" }]
52078
+ },
52079
+ {
52080
+ /** Instant-redeem haircut in basis points (0.1 %–2 %, default 1 %). */
52081
+ name: "instantRedeemFeeBips",
52082
+ type: "function",
52083
+ stateMutability: "view",
52084
+ inputs: [],
52085
+ outputs: [{ type: "uint256" }]
52086
+ },
52087
+ {
52088
+ /** Some assets disable the instant leg entirely — queue only. */
52089
+ name: "instantRedeemEnabled",
52090
+ type: "function",
52091
+ stateMutability: "view",
52092
+ inputs: [],
52093
+ outputs: [{ type: "bool" }]
52094
+ },
52095
+ {
52096
+ /** Per-wNLP WithdrawQueue contract (the delayed-redeem leg). */
52097
+ name: "withdrawQueue",
52098
+ type: "function",
52099
+ stateMutability: "view",
52100
+ inputs: [],
52101
+ outputs: [{ type: "address" }]
52102
+ },
52103
+ {
52104
+ /** The rebasing NTLP pool share this wNLP wraps. */
52105
+ name: "nlp",
52106
+ type: "function",
52107
+ stateMutability: "view",
52108
+ inputs: [],
52109
+ outputs: [{ type: "address" }]
52110
+ },
52111
+ {
52112
+ name: "underlying",
52113
+ type: "function",
52114
+ stateMutability: "view",
52115
+ inputs: [],
52116
+ outputs: [{ type: "address" }]
52117
+ }
52118
+ ];
52119
+ var NativeWithdrawQueueReadAbi = [
52120
+ {
52121
+ /** Seconds between `requestWithdrawal` and `claimWithdrawal`
52122
+ * (1–8 days depending on the asset; 3 days is the common value). */
52123
+ name: "withdrawalWindow",
52124
+ type: "function",
52125
+ stateMutability: "view",
52126
+ inputs: [],
52127
+ outputs: [{ type: "uint256" }]
52128
+ }
52129
+ ];
52130
+
52131
+ // src/vaults/savings/readers/erc4626Idle.ts
52132
+ var readerErc4626Idle = (entry) => {
52133
+ const shareUnit = 10n ** BigInt(entry.decimals);
52134
+ const underlyingUnit = 10n ** BigInt(entry.underlyingDecimals ?? entry.decimals);
52135
+ const inventory = entry.inventoryContract ?? entry.address;
52136
+ return {
52137
+ calls: [
52138
+ { address: entry.address, name: "totalAssets", params: [] },
52139
+ { address: entry.address, name: "totalSupply", params: [] },
52140
+ {
52141
+ address: entry.address,
52142
+ name: "convertToAssets",
52143
+ params: [shareUnit]
52144
+ },
52145
+ { address: entry.underlying, name: "balanceOf", params: [inventory] }
52146
+ ],
52147
+ abis: [Erc4626ReadAbi2, TotalSupplyAbi2, Erc4626ReadAbi2, BalanceOfAbi],
52148
+ parse: ([assets, supply, rate, inventoryBalance]) => {
52149
+ const totalAssets = toBigInt14(assets);
52150
+ const totalSupply = toBigInt14(supply);
52151
+ const convertToAssetsRaw = toBigInt14(rate);
52152
+ if (totalAssets === void 0 || totalSupply === void 0 || convertToAssetsRaw === void 0) {
52153
+ return void 0;
52154
+ }
52155
+ const capacity = toBigInt14(inventoryBalance);
52156
+ return {
52157
+ totalAssets,
52158
+ totalSupply,
52159
+ exchangeRate: convertToAssetsRaw * ONE_E189 / underlyingUnit,
52160
+ ...capacity !== void 0 ? {
52161
+ instantRedeemCapacity: capacity,
52162
+ instantRedeemEnabled: true,
52163
+ withdrawFeeBps: 0
52164
+ } : {},
52165
+ ...entry.withdrawQueue ? { withdrawQueue: entry.withdrawQueue } : {}
52166
+ };
52167
+ }
52168
+ };
52169
+ };
52170
+
52171
+ // src/vaults/savings/readers/navOracle.ts
52172
+ var readerNavOracle = (entry) => {
52173
+ const shareUnit = 10n ** BigInt(entry.decimals);
52174
+ const underlyingUnit = 10n ** BigInt(entry.underlyingDecimals ?? entry.decimals);
52175
+ return {
52176
+ calls: [
52177
+ { address: entry.address, name: "totalSupply", params: [] },
52178
+ {
52179
+ address: entry.priceOracle ?? entry.address,
52180
+ name: "latestRoundData",
52181
+ params: []
52182
+ }
52183
+ ],
52184
+ abis: [TotalSupplyAbi2, NavOracleReadAbi],
52185
+ parse: ([supply, round]) => {
52186
+ const totalSupply = toBigInt14(supply);
52187
+ if (totalSupply === void 0) return void 0;
52188
+ const raw = Array.isArray(round) ? round[1] : round?.answer;
52189
+ const exchangeRate = toBigInt14(raw);
52190
+ if (exchangeRate === void 0 || exchangeRate <= 0n) return void 0;
52191
+ return {
52192
+ totalAssets: totalSupply * exchangeRate * underlyingUnit / (ONE_E189 * shareUnit),
52193
+ totalSupply,
52194
+ exchangeRate
52195
+ };
52196
+ }
52197
+ };
52198
+ };
52199
+
52200
+ // src/vaults/savings/readers/nativeWnlp.ts
52201
+ var readerNativeWnlp = (entry) => {
52202
+ const { address, underlying, inventoryContract, withdrawQueue } = entry;
52203
+ return {
52204
+ calls: [
52205
+ { address, name: "totalSupply", params: [] },
52206
+ { address, name: "getNlpByWnlp", params: [ONE_E189] },
52207
+ { address, name: "instantRedeemFeeBips", params: [] },
52208
+ { address, name: "instantRedeemEnabled", params: [] },
52209
+ // Falls back to the vault itself when no CreditVault is pinned —
52210
+ // yields a 0 capacity rather than a malformed call.
52211
+ {
52212
+ address: underlying,
52213
+ name: "balanceOf",
52214
+ params: [inventoryContract ?? address]
52215
+ },
52216
+ {
52217
+ address: withdrawQueue ?? address,
52218
+ name: "withdrawalWindow",
52219
+ params: []
52220
+ }
52221
+ ],
52222
+ abis: [
52223
+ TotalSupplyAbi2,
52224
+ NativeWnlpReadAbi,
52225
+ NativeWnlpReadAbi,
52226
+ NativeWnlpReadAbi,
52227
+ BalanceOfAbi,
52228
+ NativeWithdrawQueueReadAbi
52229
+ ],
52230
+ parse: ([supply, rate, feeBips, instantEnabled, inventory, window]) => {
52231
+ const totalSupply = toBigInt14(supply);
52232
+ const exchangeRate = toBigInt14(rate);
52233
+ if (totalSupply === void 0 || exchangeRate === void 0) {
52234
+ return void 0;
52235
+ }
52236
+ const capacity = toBigInt14(inventory);
52237
+ const windowSeconds = toBigInt14(window);
52238
+ const bips = toBigInt14(feeBips);
52239
+ return {
52240
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
52241
+ totalSupply,
52242
+ exchangeRate,
52243
+ // `instantRedeemFeeBips` on-chain is already basis points, so it
52244
+ // maps 1:1 onto the cross-provider `withdrawFeeBps`.
52245
+ withdrawFeeBps: bips !== void 0 ? Number(bips) : void 0,
52246
+ // `instantRedeemEnabled` is a bool; a reverted call reads as
52247
+ // undefined, which we treat as "unknown" rather than "disabled".
52248
+ instantRedeemEnabled: typeof instantEnabled === "boolean" ? instantEnabled : void 0,
52249
+ instantRedeemCapacity: capacity,
52250
+ withdrawalCooldownSeconds: windowSeconds !== void 0 ? Number(windowSeconds) : void 0,
52251
+ withdrawQueue: withdrawQueue?.toLowerCase()
50412
52252
  };
50413
52253
  }
50414
52254
  };
50415
52255
  };
50416
52256
 
50417
52257
  // src/vaults/savings/readers/index.ts
50418
- var buildReader2 = (entry) => readerErc46262(entry);
52258
+ var buildReader2 = (entry) => {
52259
+ switch (entry.reader) {
52260
+ case "native-wnlp":
52261
+ return readerNativeWnlp(entry);
52262
+ case "nav-oracle":
52263
+ return readerNavOracle(entry);
52264
+ case "erc4626-idle":
52265
+ return readerErc4626Idle(entry);
52266
+ case "erc4626":
52267
+ case void 0:
52268
+ return readerErc46262(entry);
52269
+ }
52270
+ };
50419
52271
 
50420
52272
  // src/vaults/savings/yieldBinding.ts
50421
52273
  var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
50422
52274
 
50423
52275
  // src/vaults/savings/fetchPublic.ts
50424
- var ONE_E189 = 10n ** 18n;
52276
+ var ONE_E1810 = 10n ** 18n;
50425
52277
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
50426
52278
  const entries = getSavingsRegistry(chainId);
50427
52279
  if (entries.length === 0) return {};
@@ -50459,11 +52311,19 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
50459
52311
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
50460
52312
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
50461
52313
  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;
52314
+ let liquidityAmount = isInstant ? state.totalAssets : 0n;
52315
+ if (!isInstant && state.instantRedeemCapacity !== void 0) {
52316
+ liquidityAmount = state.instantRedeemEnabled === false ? 0n : state.instantRedeemCapacity < state.totalAssets ? state.instantRedeemCapacity : state.totalAssets;
52317
+ }
52318
+ const liquidityRaw = liquidityAmount.toString();
52319
+ const liquidityFormatted = Number(liquidityAmount) / 10 ** underlyingDec;
52320
+ const liquidityUsd = priceUsd !== void 0 ? liquidityFormatted * priceUsd : 0;
52321
+ const instantLiquidityRatio = state.totalAssets > 0n ? Math.min(
52322
+ 1,
52323
+ Number(liquidityAmount * 1000000n / state.totalAssets) / 1e6
52324
+ ) : 1;
52325
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
52326
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
50467
52327
  const displayName = composeVaultDisplayName(
50468
52328
  entry.brand,
50469
52329
  entry.brand,
@@ -50491,19 +52351,32 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
50491
52351
  supplyRate,
50492
52352
  rewardsRate,
50493
52353
  depositRate,
50494
- isErc4626: true,
52354
+ // Opt-IN, not opt-out: a new bespoke reader exists precisely
52355
+ // because its token is not a conforming vault, so the default for
52356
+ // an unlisted reader must be `false`. `erc4626-idle` is the plain
52357
+ // 4626 surface plus an inventory read, so it counts; Native's wNLP
52358
+ // and Re's NAV-oracle tokens revert on `asset()`/`totalAssets()`/
52359
+ // `convertToAssets()` and do not.
52360
+ isErc4626: entry.reader === void 0 || entry.reader === "erc4626" || entry.reader === "erc4626-idle",
50495
52361
  isRebasing: entry.isRebasing,
50496
52362
  isMintable: entry.isMintable,
50497
52363
  mintContract: entry.mintContract?.toLowerCase() ?? addressLc,
50498
52364
  withdrawalMode: entry.withdrawalMode,
50499
- withdrawalCooldownSeconds: entry.withdrawalCooldownSeconds,
52365
+ // On-chain wins over the registry's pinned fallback — Native's
52366
+ // queue window is per-asset and governance-mutable.
52367
+ withdrawalCooldownSeconds: state.withdrawalCooldownSeconds ?? entry.withdrawalCooldownSeconds,
52368
+ withdrawFeeBps: state.withdrawFeeBps,
52369
+ instantRedeemEnabled: state.instantRedeemEnabled,
52370
+ inventoryContract: entry.inventoryContract?.toLowerCase(),
52371
+ withdrawQueue: state.withdrawQueue ?? entry.withdrawQueue?.toLowerCase(),
50500
52372
  asset,
50501
52373
  priceUsd,
50502
52374
  totalAssetsFormatted,
50503
52375
  totalAssetsUsd,
50504
52376
  liquidity: liquidityRaw,
50505
52377
  liquidityFormatted,
50506
- liquidityUsd
52378
+ liquidityUsd,
52379
+ instantLiquidityRatio
50507
52380
  };
50508
52381
  out[addressLc] = vault;
50509
52382
  }
@@ -52780,7 +54653,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
52780
54653
  };
52781
54654
 
52782
54655
  // src/vaults/yield/annualize.ts
52783
- var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
54656
+ var YEAR_SECONDS5 = 365 * 24 * 60 * 60;
52784
54657
  var SCALE = 10n ** 18n;
52785
54658
  var appendSnapshot = (points, snap, options) => {
52786
54659
  const maxPoints = options?.maxPoints ?? 90;
@@ -52809,7 +54682,7 @@ var computeVaultApr = (points, options) => {
52809
54682
  if (pThen === 0n) return void 0;
52810
54683
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
52811
54684
  const ratio = Number(ratioScaled) / 1e18;
52812
- const apr = (ratio - 1) * (YEAR_SECONDS3 / windowSeconds);
54685
+ const apr = (ratio - 1) * (YEAR_SECONDS5 / windowSeconds);
52813
54686
  return {
52814
54687
  apr,
52815
54688
  sharePriceNow: now.p,