@1delta/margin-fetcher 0.0.342 → 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
@@ -1,11 +1,11 @@
1
1
  import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, pad, InvalidAddressError, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-Z3MGRQJR.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMidnight, isTerm, isExactly, isLiquityFamily, isRiver, isTeller, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
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';
@@ -11303,7 +11303,14 @@ var MORPHO_LENS = {
11303
11303
  [Chain.LISK]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
11304
11304
  [Chain.ABSTRACT]: "0x8e24cfc19c6c00c524353cb8816f5f1c2f33c201",
11305
11305
  [Chain.INK]: "0x0bd7473CbBf81d9dD936c61117eD230d95006CA2",
11306
- [Chain.KAIA_MAINNET]: "0x925716D57c842B50806884EDb295bA3E3A8EBdFE"
11306
+ [Chain.KAIA_MAINNET]: "0x925716D57c842B50806884EDb295bA3E3A8EBdFE",
11307
+ // blue-api does not index these three, so the lens is the ONLY way to read
11308
+ // their Morpho markets — see `lenderApiOnly` in fetchLenderAll.ts.
11309
+ [Chain.GNOSIS]: "0x98542B95B44a4732EffB1F4F01A696F1546236d3",
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"
11307
11314
  };
11308
11315
  var buildMorphoUserCallWithLens = (chainId, account, lender, marketsToQuery) => {
11309
11316
  const marketSlices = chunk(marketsToQuery, 100);
@@ -23956,6 +23963,9 @@ function lenderApiOnly(lender, chainId) {
23956
23963
  if (chainId === Chain.KAIA_MAINNET) return false;
23957
23964
  if (chainId === Chain.PHAROS_MAINNET) return false;
23958
23965
  if (chainId === "4114") return false;
23966
+ if (chainId === Chain.GNOSIS) return false;
23967
+ if (chainId === Chain.AVALANCHE_C_CHAIN) return false;
23968
+ if (chainId === Chain.MEGAETH_MAINNET) return false;
23959
23969
  return true;
23960
23970
  }
23961
23971
  if (isMidnight(lender)) return true;
@@ -24240,14 +24250,14 @@ var { isArray } = lodash;
24240
24250
  var maxRetries = 3;
24241
24251
  var MULTICALL_FAILURE = "0x";
24242
24252
  var isFailedCall = (value) => value === void 0 || value === null || value === MULTICALL_FAILURE;
24243
- var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient18, nextRpcId, batchSize, logs) => {
24253
+ var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient17, nextRpcId, batchSize, logs) => {
24244
24254
  const failedIdx = [];
24245
24255
  for (let i = 0; i < mapped.length; i++) {
24246
24256
  if (isFailedCall(mapped[i])) failedIdx.push(i);
24247
24257
  }
24248
24258
  if (failedIdx.length === 0) return mapped;
24249
24259
  try {
24250
- const provider = getEvmClient18(chainId, nextRpcId);
24260
+ const provider = getEvmClient17(chainId, nextRpcId);
24251
24261
  const returnData = await provider.multicall({
24252
24262
  allowFailure: true,
24253
24263
  batchSize,
@@ -24261,9 +24271,9 @@ var retryFailedSlots = async (chainId, contracts, mapped, getEvmClient18, nextRp
24261
24271
  }
24262
24272
  return mapped;
24263
24273
  };
24264
- 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) => {
24265
24275
  try {
24266
- const provider = getEvmClient18(chainId, providerId);
24276
+ const provider = getEvmClient17(chainId, providerId);
24267
24277
  const abiIsArray = isArray(abi[0]);
24268
24278
  const contracts = calls.map(({ address, name, params }, i) => ({
24269
24279
  abi: abiIsArray ? abi?.[i] : abi,
@@ -24285,7 +24295,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24285
24295
  chainId,
24286
24296
  contracts,
24287
24297
  res,
24288
- getEvmClient18,
24298
+ getEvmClient17,
24289
24299
  providerId + 1,
24290
24300
  batchSize,
24291
24301
  logs
@@ -24299,7 +24309,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24299
24309
  chainId,
24300
24310
  abi,
24301
24311
  calls,
24302
- getEvmClient18,
24312
+ getEvmClient17,
24303
24313
  retry,
24304
24314
  providerId,
24305
24315
  retries,
@@ -24310,13 +24320,13 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient18, retry =
24310
24320
  );
24311
24321
  }
24312
24322
  };
24313
- 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) => {
24314
24324
  if (poolSize <= 1) {
24315
24325
  return multicallViemAbiArray(
24316
24326
  chainId,
24317
24327
  abi,
24318
24328
  calls,
24319
- getEvmClient18,
24329
+ getEvmClient17,
24320
24330
  true,
24321
24331
  0,
24322
24332
  retries,
@@ -24341,7 +24351,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolS
24341
24351
  const results = new Array(contracts.length);
24342
24352
  const runBatch = async (batch, rpcId, attemptsLeft, size) => {
24343
24353
  try {
24344
- const provider = getEvmClient18(chainId, rpcId);
24354
+ const provider = getEvmClient17(chainId, rpcId);
24345
24355
  const returnData = await provider.multicall({
24346
24356
  allowFailure,
24347
24357
  batchSize: size,
@@ -24355,7 +24365,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient18, poolS
24355
24365
  chainId,
24356
24366
  batch.items,
24357
24367
  mapped,
24358
- getEvmClient18,
24368
+ getEvmClient17,
24359
24369
  rpcId + 1,
24360
24370
  size,
24361
24371
  logs
@@ -33193,7 +33203,7 @@ function unflattenLenderData(pools) {
33193
33203
  }
33194
33204
  return result;
33195
33205
  }
33196
- 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) => {
33197
33207
  const queries = organizeUserQueries(queriesRaw);
33198
33208
  const builtCalls = await Promise.all(
33199
33209
  queries.map(async (query3) => {
@@ -33203,7 +33213,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowF
33203
33213
  query3.lender,
33204
33214
  query3.account,
33205
33215
  query3.params,
33206
- getEvmClient18
33216
+ getEvmClient17
33207
33217
  );
33208
33218
  return callData.map((call) => ({ call, abi: call.abi ?? abi }));
33209
33219
  })
@@ -33213,7 +33223,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient18, allowF
33213
33223
  chainId,
33214
33224
  calls.map((call) => call.abi),
33215
33225
  calls.map((call) => call.call),
33216
- getEvmClient18,
33226
+ getEvmClient17,
33217
33227
  concurrency,
33218
33228
  retries,
33219
33229
  allowFailure,
@@ -36145,6 +36155,166 @@ var monadLstFetcher = {
36145
36155
  return out;
36146
36156
  }
36147
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
+ };
36148
36318
 
36149
36319
  // src/vaults/lst/registry.ts
36150
36320
  var LST_REGISTRY = {
@@ -36251,6 +36421,39 @@ var LST_REGISTRY = {
36251
36421
  yieldFetcher: wstethFetcher,
36252
36422
  yieldKey: "WSTETH"
36253
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
+ },
36254
36457
  {
36255
36458
  address: "0xae78736cd615f374d3085123a210448e74fc6393",
36256
36459
  underlying: "0x0000000000000000000000000000000000000000",
@@ -37717,65 +37920,1297 @@ var hastraPrimeFetcher = {
37717
37920
  return { [HASTRA_PRIME_KEY]: Math.max(0, apr) };
37718
37921
  }
37719
37922
  };
37720
- var CHAIN_ID7 = "4663";
37721
- var VAULT2 = "0xde770c84fe66e063336b31737cfe9790f18c4087";
37722
- var SPARK_SAVINGS_USDG_KEY = "SPUSDG";
37723
37923
  var RAY3 = 10n ** 27n;
37724
- var WINDOW_BLOCKS6 = 400000n;
37725
- var MAX_RPC_TRIES6 = 3;
37726
- var CHI_ABI = [
37924
+ var YEAR_SECONDS4 = 31536e3;
37925
+ var SPARK_VAULTS_V2 = [
37926
+ {
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
+ },
37727
37946
  {
37728
- name: "chi",
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",
37729
37984
  type: "function",
37730
37985
  stateMutability: "view",
37731
37986
  inputs: [],
37732
37987
  outputs: [{ type: "uint256" }]
37733
37988
  }
37734
37989
  ];
37735
- var readChiAt = (client, blockNumber) => client.readContract({
37736
- address: VAULT2,
37737
- abi: CHI_ABI,
37738
- functionName: "chi",
37739
- ...blockNumber !== void 0 ? { blockNumber } : {}
37740
- });
37741
- var computeApr7 = async () => {
37742
- let lastErr;
37743
- for (let rpcId = 0; rpcId < MAX_RPC_TRIES6; rpcId++) {
37744
- try {
37745
- const client = getEvmClient(CHAIN_ID7, rpcId);
37746
- const head = await client.getBlockNumber();
37747
- const pastBlock = head > WINDOW_BLOCKS6 ? head - WINDOW_BLOCKS6 : 0n;
37748
- const [chiNow, chiThen, headBlock, thenBlock] = await Promise.all([
37749
- readChiAt(client),
37750
- readChiAt(client, pastBlock),
37751
- client.getBlock({ blockNumber: head }),
37752
- client.getBlock({ blockNumber: pastBlock })
37753
- ]);
37754
- if (chiNow < RAY3 || chiThen < RAY3 || chiNow < chiThen) {
37755
- throw new Error(
37756
- `non-archival or invalid chi (now=${chiNow}, then=${chiThen})`
37757
- );
37758
- }
37759
- const elapsed = Number(headBlock.timestamp - thenBlock.timestamp);
37760
- if (elapsed <= 0) throw new Error("non-positive elapsed window");
37761
- const apr = annualizeRateDeltaPercent(chiNow, chiThen, elapsed);
37762
- if (!Number.isFinite(apr) || apr < 0) throw new Error(`bad apr ${apr}`);
37763
- return apr;
37764
- } catch (e) {
37765
- 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");
37766
38063
  }
38064
+ return out;
37767
38065
  }
37768
- throw new Error(
37769
- `spUSDG APR: no Robinhood RPC returned valid historical chi (${String(lastErr)})`
37770
- );
37771
38066
  };
37772
- var sparkSavingsUsdgFetcher = {
37773
- label: "SPARK_SAVINGS_USDG",
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",
37774
38077
  fetch: async () => {
37775
- const apr = await computeApr7();
37776
- return { [SPARK_SAVINGS_USDG_KEY]: apr };
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");
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"
37777
38160
  }
37778
38161
  };
38162
+ var buildChainFetcher = (chainId, pools) => ({
38163
+ label: `NATIVE_CREDIT_POOL_${chainId}`,
38164
+ fetch: async () => {
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;
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
+ ]
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
+ );
37779
39214
 
37780
39215
  // src/vaults/savings/registry.ts
37781
39216
  var stUsdGroup = {
@@ -37871,11 +39306,121 @@ var yUsdGroup = {
37871
39306
  // confirmed on Basescan.
37872
39307
  }
37873
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
+ };
37874
39405
  var MULTI_CHAIN_GROUPS = [
37875
39406
  stUsdGroup,
37876
39407
  stEurGroup,
37877
- yUsdGroup
39408
+ yUsdGroup,
39409
+ sUsdcGroup,
39410
+ reUsdGroup
37878
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";
37879
39424
  var SINGLE_CHAIN_ENTRIES = {
37880
39425
  "1": [
37881
39426
  {
@@ -37934,6 +39479,40 @@ var SINGLE_CHAIN_ENTRIES = {
37934
39479
  yieldFetcher: susdsFetcher,
37935
39480
  yieldKey: "Staked USDS::stUSDS"
37936
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
+ },
37937
39516
  {
37938
39517
  address: "0x83f20f44975d03b1b09e64809b757c47f942beea",
37939
39518
  underlying: "0x6b175474e89094c44da98b954eedeac495271d0f",
@@ -38058,6 +39637,91 @@ var SINGLE_CHAIN_ENTRIES = {
38058
39637
  withdrawalMode: "request-based",
38059
39638
  yieldFetcher: hastraPrimeFetcher,
38060
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")
38061
39725
  }
38062
39726
  ],
38063
39727
  "8453": [
@@ -38102,24 +39766,28 @@ var SINGLE_CHAIN_ENTRIES = {
38102
39766
  withdrawalCooldownSeconds: 86400,
38103
39767
  yieldFetcher: savbtcFetcher,
38104
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")
38105
39778
  }
38106
39779
  ],
38107
39780
  "4663": [
38108
39781
  {
38109
- // Spark Savings USDG on Robinhood Chain — Sky/Spark savings token
38110
- // over USDG. ERC-4626 share price accrues via a `chi()` rate
38111
- // accumulator; `ssr()` is not readable so APR comes from the
38112
- // 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),
38113
39788
  address: "0xde770c84fe66e063336b31737cfe9790f18c4087",
38114
39789
  underlying: "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
38115
39790
  // USDG
38116
- symbol: "spUSDG",
38117
- brand: "Spark",
38118
- decimals: 6,
38119
- isRebasing: false,
38120
- isMintable: true,
38121
- withdrawalMode: "instant",
38122
- yieldFetcher: sparkSavingsUsdgFetcher,
38123
39791
  yieldKey: SPARK_SAVINGS_USDG_KEY
38124
39792
  }
38125
39793
  ]
@@ -38135,6 +39803,10 @@ var SAVINGS_REGISTRY = (() => {
38135
39803
  out[chainId].push({ ...group.base, ...addrs });
38136
39804
  }
38137
39805
  }
39806
+ for (const [chainId, entries] of Object.entries(NATIVE_WNLP_ENTRIES)) {
39807
+ if (!out[chainId]) out[chainId] = [];
39808
+ out[chainId].push(...entries);
39809
+ }
38138
39810
  return out;
38139
39811
  })();
38140
39812
  var getSavingsRegistry = (chainId) => SAVINGS_REGISTRY[chainId] ?? [];
@@ -38948,13 +40620,14 @@ async function fetchMerklOpportunities(protocolId, chainId) {
38948
40620
  while (true) {
38949
40621
  const params = new URLSearchParams({
38950
40622
  mainProtocolId: protocolId,
38951
- chainId,
38952
40623
  status: "LIVE",
38953
40624
  items: "100",
38954
40625
  page: String(page)
38955
40626
  });
40627
+ if (chainId) params.set("chainId", chainId);
38956
40628
  const res = await fetch(`${MERKL_API_BASE}/opportunities?${params}`);
38957
- 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"}`);
38958
40631
  const batch = await res.json();
38959
40632
  all.push(...batch);
38960
40633
  if (batch.length < 100) break;
@@ -39018,37 +40691,40 @@ function createMerklRewardFetcher(config) {
39018
40691
  label: `MERKL_${config.merklProtocolId.toUpperCase()}`,
39019
40692
  fetch: async () => {
39020
40693
  const result = {};
39021
- const chainResults = await Promise.all(
40694
+ const chainResults = config.chainIds ? await Promise.all(
39022
40695
  config.chainIds.map(async (chainId) => {
39023
40696
  try {
39024
- const opps = await fetchMerklOpportunities(
40697
+ return await fetchMerklOpportunities(
39025
40698
  config.merklProtocolId,
39026
40699
  chainId
39027
40700
  );
39028
- return { chainId, opps };
39029
40701
  } catch (e) {
39030
40702
  console.error(`Merkl: failed to fetch chain ${chainId}:`, e);
39031
- return { chainId, opps: [] };
40703
+ return [];
39032
40704
  }
39033
40705
  })
39034
- );
39035
- for (const { chainId, opps } of chainResults) {
40706
+ ) : [await fetchMerklOpportunities(config.merklProtocolId)];
40707
+ for (const opps of chainResults) {
39036
40708
  for (const opp of opps) {
39037
40709
  if (!opp.apr || opp.apr <= 0) continue;
39038
- const resolved2 = resolve(opp);
39039
- if (!resolved2) continue;
39040
- const bucket = resolved2.bucket ?? (opp.action === "LEND" ? "deposit" : opp.action === "BORROW" ? "borrow" : void 0);
39041
- if (!bucket) continue;
39042
- const lender = resolved2.lender ?? config.lenderKey;
39043
- const reward = ensureReward(result, chainId, lender, resolved2.asset);
39044
- const breakdowns = extractRewardBreakdowns(opp);
39045
- reward.link = getMerkleUrl(opp);
39046
- if (bucket === "deposit") {
39047
- reward.deposit += opp.apr;
39048
- reward.additionalDepositData.push(...breakdowns);
39049
- } else {
39050
- reward.borrow += opp.apr;
39051
- 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
+ }
39052
40728
  }
39053
40729
  }
39054
40730
  }
@@ -39056,81 +40732,39 @@ function createMerklRewardFetcher(config) {
39056
40732
  }
39057
40733
  };
39058
40734
  }
39059
- var AAVE_V3_MERKL_CHAINS = [
39060
- "1",
39061
- // Ethereum
39062
- "10",
39063
- // Optimism
39064
- "56",
39065
- // BSC
39066
- "100",
39067
- // Gnosis
39068
- "137",
39069
- // Polygon
39070
- "5000",
39071
- // Mantle
39072
- "8453",
39073
- // Base
39074
- "42161",
39075
- // Arbitrum
39076
- "42220",
39077
- // Celo
39078
- "43114",
39079
- // Avalanche
39080
- "59144",
39081
- // Linea
39082
- "534352"
39083
- // Scroll
39084
- ];
39085
40735
  var aaveMerklRewardFetcher = createMerklRewardFetcher({
39086
40736
  merklProtocolId: "aave",
39087
- lenderKey: "AAVE_V3",
39088
- chainIds: AAVE_V3_MERKL_CHAINS
40737
+ lenderKey: "AAVE_V3"
39089
40738
  });
39090
- var EULER_MERKL_CHAINS = [
39091
- "1",
39092
- // Ethereum
39093
- "10",
39094
- // Optimism
39095
- "56",
39096
- // BSC
39097
- "130",
39098
- // Unichain
39099
- "137",
39100
- // Polygon
39101
- "8453",
39102
- // Base
39103
- "42161",
39104
- // Arbitrum
39105
- "43114",
39106
- // Avalanche
39107
- "80094"
39108
- // Berachain
39109
- ];
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
+ }
39110
40756
  var eulerMerklRewardFetcher = createMerklRewardFetcher({
39111
40757
  merklProtocolId: "euler",
39112
40758
  lenderKey: "EULER_V2",
39113
- chainIds: EULER_MERKL_CHAINS,
39114
40759
  resolveAsset: (opp) => {
39115
- 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();
39116
40764
  if (!vault) return void 0;
39117
40765
  return { asset: vault };
39118
40766
  }
39119
40767
  });
39120
- var MORPHO_MERKL_CHAINS = [
39121
- "1",
39122
- // Ethereum
39123
- "130",
39124
- // Unichain
39125
- "137",
39126
- // Polygon
39127
- "8453",
39128
- // Base
39129
- "42161",
39130
- // Arbitrum
39131
- "4663"
39132
- // Robinhood chain
39133
- ];
39134
40768
  function parseMorphoUniqueKey(depositUrl) {
39135
40769
  if (!depositUrl) return void 0;
39136
40770
  const m = depositUrl.match(/\/market\/(0x[0-9a-fA-F]{64})/);
@@ -39139,7 +40773,6 @@ function parseMorphoUniqueKey(depositUrl) {
39139
40773
  var morphoCollateralMerklRewardFetcher = createMerklRewardFetcher({
39140
40774
  merklProtocolId: "morpho",
39141
40775
  lenderKey: "MORPHO_BLUE",
39142
- chainIds: MORPHO_MERKL_CHAINS,
39143
40776
  resolveAsset: (opp) => {
39144
40777
  if (opp.type !== "MORPHOCOLLATERAL") return void 0;
39145
40778
  const uniqueKey = parseMorphoUniqueKey(opp.depositUrl);
@@ -39432,18 +41065,26 @@ var ProxyOracleAbi = [
39432
41065
  ];
39433
41066
 
39434
41067
  // src/prices/oracle-prices/fetchers/morpho.ts
41068
+ var MORPHO_API_CHAINS = /* @__PURE__ */ new Set([
41069
+ Chain.ETHEREUM_MAINNET,
41070
+ Chain.BASE,
41071
+ Chain.ARBITRUM_ONE,
41072
+ Chain.OP_MAINNET,
41073
+ Chain.POLYGON_MAINNET,
41074
+ Chain.UNICHAIN,
41075
+ Chain.KATANA,
41076
+ Chain.HYPEREVM,
41077
+ Chain.WORLD_CHAIN,
41078
+ Chain.MONAD_MAINNET,
41079
+ Chain.STABLE_MAINNET,
41080
+ Chain.ROBINHOOD_CHAIN,
41081
+ "4217",
41082
+ // Tempo — no chain-registry enum yet
41083
+ "5042"
41084
+ // Arc — no chain-registry enum yet
41085
+ ]);
39435
41086
  function morphoApiAvailable(chainId) {
39436
- if (chainId === Chain.SONEIUM) return false;
39437
- if (chainId === Chain.HEMI_NETWORK) return false;
39438
- if (chainId === Chain.BERACHAIN) return false;
39439
- if (chainId === Chain.SEI_NETWORK) return false;
39440
- if (chainId === Chain.CELO_MAINNET) return false;
39441
- if (chainId === Chain.CORN) return false;
39442
- if (chainId === Chain.ABSTRACT) return false;
39443
- if (chainId === Chain.PLUME_MAINNET) return false;
39444
- if (chainId === Chain.LISK) return false;
39445
- if (chainId === Chain.BNB_SMART_CHAIN_MAINNET) return false;
39446
- return true;
41087
+ return MORPHO_API_CHAINS.has(chainId);
39447
41088
  }
39448
41089
  var MORPHO_API_INCOMPLETE_CHAINS = /* @__PURE__ */ new Set([
39449
41090
  Chain.FLARE_MAINNET,
@@ -45552,7 +47193,7 @@ var Erc4626PreviewRedeemAbi = [
45552
47193
  ];
45553
47194
 
45554
47195
  // src/vaults/lst/readers/shared.ts
45555
- var ONE_E186 = 10n ** 18n;
47196
+ var ONE_E187 = 10n ** 18n;
45556
47197
  var rescaleDecimals = (v, fromDec, toDec) => toDec >= fromDec ? v * 10n ** BigInt(toDec - fromDec) : v / 10n ** BigInt(fromDec - toDec);
45557
47198
  var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
45558
47199
  var Multicall3BalanceAbi = [
@@ -45595,7 +47236,7 @@ var readerBeetsStS = (entry) => ({
45595
47236
  }
45596
47237
  const liquidity = toBigInt12(pool);
45597
47238
  return {
45598
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47239
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45599
47240
  totalSupply,
45600
47241
  exchangeRate,
45601
47242
  liquidity
@@ -45628,7 +47269,7 @@ var readerBenqiSavax = (entry) => ({
45628
47269
  {
45629
47270
  address: entry.address,
45630
47271
  name: "getPooledAvaxByShares",
45631
- params: [ONE_E186]
47272
+ params: [ONE_E187]
45632
47273
  },
45633
47274
  { address: entry.address, name: "totalPooledAvax", params: [] }
45634
47275
  ],
@@ -45639,7 +47280,7 @@ var readerBenqiSavax = (entry) => ({
45639
47280
  if (totalSupply === void 0 || exchangeRate === void 0) {
45640
47281
  return void 0;
45641
47282
  }
45642
- const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E186;
47283
+ const totalAssets = toBigInt12(totalPooled) ?? totalSupply * exchangeRate / ONE_E187;
45643
47284
  return {
45644
47285
  totalAssets,
45645
47286
  totalSupply,
@@ -45658,7 +47299,7 @@ var readerBgtWrapper1to1 = (entry) => ({
45658
47299
  return {
45659
47300
  totalAssets: totalSupply,
45660
47301
  totalSupply,
45661
- exchangeRate: ONE_E186
47302
+ exchangeRate: ONE_E187
45662
47303
  };
45663
47304
  }
45664
47305
  });
@@ -45688,7 +47329,7 @@ var readerDineroBeraEth = (entry) => ({
45688
47329
  return void 0;
45689
47330
  }
45690
47331
  return {
45691
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47332
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45692
47333
  totalSupply,
45693
47334
  exchangeRate
45694
47335
  };
@@ -45700,7 +47341,7 @@ var readerErc4626 = (entry) => ({
45700
47341
  calls: [
45701
47342
  { address: entry.address, name: "totalAssets", params: [] },
45702
47343
  { address: entry.address, name: "totalSupply", params: [] },
45703
- { address: entry.address, name: "convertToAssets", params: [ONE_E186] }
47344
+ { address: entry.address, name: "convertToAssets", params: [ONE_E187] }
45704
47345
  ],
45705
47346
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
45706
47347
  parse: ([assets, supply, rate]) => {
@@ -45717,7 +47358,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
45717
47358
  calls: [
45718
47359
  { address: entry.address, name: "totalAssets", params: [] },
45719
47360
  { address: entry.address, name: "totalSupply", params: [] },
45720
- { address: entry.address, name: "previewRedeem", params: [ONE_E186] }
47361
+ { address: entry.address, name: "previewRedeem", params: [ONE_E187] }
45721
47362
  ],
45722
47363
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
45723
47364
  parse: ([assets, supply, rate]) => {
@@ -45797,7 +47438,7 @@ var readerEtherFiWeEth = (entry) => {
45797
47438
  }
45798
47439
  }
45799
47440
  return {
45800
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47441
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45801
47442
  totalSupply,
45802
47443
  exchangeRate,
45803
47444
  liquidity
@@ -45830,7 +47471,7 @@ var readerHyperbeatBeHype = (entry) => {
45830
47471
  return {
45831
47472
  totalAssets: totalSupply,
45832
47473
  totalSupply,
45833
- exchangeRate: ONE_E186
47474
+ exchangeRate: ONE_E187
45834
47475
  };
45835
47476
  }
45836
47477
  };
@@ -45838,7 +47479,7 @@ var readerHyperbeatBeHype = (entry) => {
45838
47479
  return {
45839
47480
  calls: [
45840
47481
  { address: entry.address, name: "totalSupply", params: [] },
45841
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E186] }
47482
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E187] }
45842
47483
  ],
45843
47484
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
45844
47485
  parse: ([supply, rate]) => {
@@ -45848,7 +47489,7 @@ var readerHyperbeatBeHype = (entry) => {
45848
47489
  return void 0;
45849
47490
  }
45850
47491
  return {
45851
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47492
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45852
47493
  totalSupply,
45853
47494
  exchangeRate
45854
47495
  };
@@ -45880,7 +47521,7 @@ var readerKelpRsEth = (entry) => {
45880
47521
  return {
45881
47522
  totalAssets: totalSupply,
45882
47523
  totalSupply,
45883
- exchangeRate: ONE_E186
47524
+ exchangeRate: ONE_E187
45884
47525
  };
45885
47526
  }
45886
47527
  };
@@ -45898,7 +47539,7 @@ var readerKelpRsEth = (entry) => {
45898
47539
  return void 0;
45899
47540
  }
45900
47541
  return {
45901
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47542
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45902
47543
  totalSupply,
45903
47544
  exchangeRate
45904
47545
  };
@@ -45930,7 +47571,7 @@ var readerKinetiqKHype = (entry) => {
45930
47571
  return {
45931
47572
  totalAssets: totalSupply,
45932
47573
  totalSupply,
45933
- exchangeRate: ONE_E186
47574
+ exchangeRate: ONE_E187
45934
47575
  };
45935
47576
  }
45936
47577
  };
@@ -45938,7 +47579,7 @@ var readerKinetiqKHype = (entry) => {
45938
47579
  return {
45939
47580
  calls: [
45940
47581
  { address: entry.address, name: "totalSupply", params: [] },
45941
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E186] }
47582
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E187] }
45942
47583
  ],
45943
47584
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
45944
47585
  parse: ([supply, rate]) => {
@@ -45948,7 +47589,7 @@ var readerKinetiqKHype = (entry) => {
45948
47589
  return void 0;
45949
47590
  }
45950
47591
  return {
45951
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47592
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
45952
47593
  totalSupply,
45953
47594
  exchangeRate
45954
47595
  };
@@ -45988,7 +47629,7 @@ var readerLairStKaia = (entry) => ({
45988
47629
  if (totalSupply === void 0 || exchangeRate === void 0) {
45989
47630
  return void 0;
45990
47631
  }
45991
- const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E186;
47632
+ const totalAssets = toBigInt12(totalStaking) ?? totalSupply * exchangeRate / ONE_E187;
45992
47633
  return {
45993
47634
  totalAssets,
45994
47635
  totalSupply,
@@ -46022,7 +47663,7 @@ var readerLidoWstEth = (entry) => ({
46022
47663
  return void 0;
46023
47664
  }
46024
47665
  return {
46025
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47666
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46026
47667
  totalSupply,
46027
47668
  exchangeRate
46028
47669
  };
@@ -46060,7 +47701,7 @@ var readerListaSlisBnb = (entry) => {
46060
47701
  return {
46061
47702
  totalAssets: totalSupply,
46062
47703
  totalSupply,
46063
- exchangeRate: ONE_E186
47704
+ exchangeRate: ONE_E187
46064
47705
  };
46065
47706
  }
46066
47707
  };
@@ -46068,7 +47709,7 @@ var readerListaSlisBnb = (entry) => {
46068
47709
  return {
46069
47710
  calls: [
46070
47711
  { address: entry.address, name: "totalSupply", params: [] },
46071
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E186] },
47712
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E187] },
46072
47713
  { address: manager, name: "getTotalPooledBnb", params: [] }
46073
47714
  ],
46074
47715
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -46079,7 +47720,7 @@ var readerListaSlisBnb = (entry) => {
46079
47720
  return void 0;
46080
47721
  }
46081
47722
  const pooledBnb = toBigInt12(pooled);
46082
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E186;
47723
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E187;
46083
47724
  return { totalAssets, totalSupply, exchangeRate };
46084
47725
  }
46085
47726
  };
@@ -46109,7 +47750,7 @@ var readerMantleMEth = (entry) => {
46109
47750
  return {
46110
47751
  totalAssets: totalSupply,
46111
47752
  totalSupply,
46112
- exchangeRate: ONE_E186
47753
+ exchangeRate: ONE_E187
46113
47754
  };
46114
47755
  }
46115
47756
  };
@@ -46117,7 +47758,7 @@ var readerMantleMEth = (entry) => {
46117
47758
  return {
46118
47759
  calls: [
46119
47760
  { address: entry.address, name: "totalSupply", params: [] },
46120
- { address: staking, name: "mETHToETH", params: [ONE_E186] }
47761
+ { address: staking, name: "mETHToETH", params: [ONE_E187] }
46121
47762
  ],
46122
47763
  abis: [TotalSupplyAbi, MantleStakingAbi],
46123
47764
  parse: ([supply, rate]) => {
@@ -46127,7 +47768,7 @@ var readerMantleMEth = (entry) => {
46127
47768
  return void 0;
46128
47769
  }
46129
47770
  return {
46130
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47771
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46131
47772
  totalSupply,
46132
47773
  exchangeRate
46133
47774
  };
@@ -46148,7 +47789,7 @@ var readerOffChain = (entry) => {
46148
47789
  return {
46149
47790
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
46150
47791
  totalSupply,
46151
- exchangeRate: ONE_E186
47792
+ exchangeRate: ONE_E187
46152
47793
  };
46153
47794
  }
46154
47795
  };
@@ -46182,7 +47823,7 @@ var readerRenzoEzEth = (entry) => {
46182
47823
  return {
46183
47824
  totalAssets: totalSupply,
46184
47825
  totalSupply,
46185
- exchangeRate: ONE_E186
47826
+ exchangeRate: ONE_E187
46186
47827
  };
46187
47828
  }
46188
47829
  };
@@ -46201,7 +47842,7 @@ var readerRenzoEzEth = (entry) => {
46201
47842
  return {
46202
47843
  totalAssets: totalTvl,
46203
47844
  totalSupply,
46204
- exchangeRate: totalTvl * ONE_E186 / totalSupply
47845
+ exchangeRate: totalTvl * ONE_E187 / totalSupply
46205
47846
  };
46206
47847
  }
46207
47848
  };
@@ -46257,7 +47898,7 @@ var readerRocketReth = (entry) => {
46257
47898
  }
46258
47899
  const liquidity = depositPool ? toBigInt12(slice[2]) : void 0;
46259
47900
  return {
46260
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47901
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46261
47902
  totalSupply,
46262
47903
  exchangeRate,
46263
47904
  liquidity
@@ -46299,7 +47940,7 @@ var readerStaderEthx = (entry) => {
46299
47940
  return {
46300
47941
  totalAssets: totalSupply,
46301
47942
  totalSupply,
46302
- exchangeRate: ONE_E186
47943
+ exchangeRate: ONE_E187
46303
47944
  };
46304
47945
  }
46305
47946
  };
@@ -46317,7 +47958,7 @@ var readerStaderEthx = (entry) => {
46317
47958
  return void 0;
46318
47959
  }
46319
47960
  return {
46320
- totalAssets: totalSupply * exchangeRate / ONE_E186,
47961
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46321
47962
  totalSupply,
46322
47963
  exchangeRate
46323
47964
  };
@@ -46334,7 +47975,7 @@ var readerStaderMaticX = (entry) => {
46334
47975
  {
46335
47976
  address: rateAddress,
46336
47977
  name: "convertMaticXToMatic",
46337
- params: [ONE_E186],
47978
+ params: [ONE_E187],
46338
47979
  chainId: homeChainId
46339
47980
  }
46340
47981
  ],
@@ -46349,7 +47990,7 @@ var readerStaderMaticX = (entry) => {
46349
47990
  }
46350
47991
  const isCrossChain = homeContract !== void 0;
46351
47992
  return {
46352
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E186 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E186,
47993
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E187 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E187,
46353
47994
  totalSupply,
46354
47995
  exchangeRate: amountInMatic
46355
47996
  };
@@ -46381,7 +48022,7 @@ var readerStakeWiseOsEth = (entry) => {
46381
48022
  return {
46382
48023
  totalAssets: totalSupply,
46383
48024
  totalSupply,
46384
- exchangeRate: ONE_E186
48025
+ exchangeRate: ONE_E187
46385
48026
  };
46386
48027
  }
46387
48028
  };
@@ -46389,7 +48030,7 @@ var readerStakeWiseOsEth = (entry) => {
46389
48030
  return {
46390
48031
  calls: [
46391
48032
  { address: entry.address, name: "totalSupply", params: [] },
46392
- { address: controller, name: "convertToAssets", params: [ONE_E186] }
48033
+ { address: controller, name: "convertToAssets", params: [ONE_E187] }
46393
48034
  ],
46394
48035
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
46395
48036
  parse: ([supply, rate]) => {
@@ -46399,7 +48040,7 @@ var readerStakeWiseOsEth = (entry) => {
46399
48040
  return void 0;
46400
48041
  }
46401
48042
  return {
46402
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48043
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46403
48044
  totalSupply,
46404
48045
  exchangeRate
46405
48046
  };
@@ -46431,7 +48072,7 @@ var readerStCelo = (entry) => {
46431
48072
  return {
46432
48073
  totalAssets: totalSupply,
46433
48074
  totalSupply,
46434
- exchangeRate: ONE_E186
48075
+ exchangeRate: ONE_E187
46435
48076
  };
46436
48077
  }
46437
48078
  };
@@ -46439,7 +48080,7 @@ var readerStCelo = (entry) => {
46439
48080
  return {
46440
48081
  calls: [
46441
48082
  { address: entry.address, name: "totalSupply", params: [] },
46442
- { address: manager, name: "toCelo", params: [ONE_E186] }
48083
+ { address: manager, name: "toCelo", params: [ONE_E187] }
46443
48084
  ],
46444
48085
  abis: [TotalSupplyAbi, StCeloManagerAbi],
46445
48086
  parse: ([supply, rate]) => {
@@ -46449,7 +48090,7 @@ var readerStCelo = (entry) => {
46449
48090
  return void 0;
46450
48091
  }
46451
48092
  return {
46452
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48093
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46453
48094
  totalSupply,
46454
48095
  exchangeRate
46455
48096
  };
@@ -46482,7 +48123,7 @@ var readerSwellGetRate = (entry) => ({
46482
48123
  return void 0;
46483
48124
  }
46484
48125
  return {
46485
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48126
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46486
48127
  totalSupply,
46487
48128
  exchangeRate
46488
48129
  };
@@ -46513,7 +48154,7 @@ var readerValantisWstHype = (entry) => {
46513
48154
  return {
46514
48155
  totalAssets: totalSupply,
46515
48156
  totalSupply,
46516
- exchangeRate: ONE_E186
48157
+ exchangeRate: ONE_E187
46517
48158
  };
46518
48159
  }
46519
48160
  };
@@ -46531,7 +48172,7 @@ var readerValantisWstHype = (entry) => {
46531
48172
  return void 0;
46532
48173
  }
46533
48174
  return {
46534
- totalAssets: totalSupply * exchangeRate / ONE_E186,
48175
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
46535
48176
  totalSupply,
46536
48177
  exchangeRate
46537
48178
  };
@@ -46565,7 +48206,7 @@ var readerVedaAccountant = (entry) => {
46565
48206
  return {
46566
48207
  totalAssets: rescaleDecimals(totalSupply, shareDec, underlyingDec),
46567
48208
  totalSupply,
46568
- exchangeRate: ONE_E186
48209
+ exchangeRate: ONE_E187
46569
48210
  };
46570
48211
  }
46571
48212
  };
@@ -46584,7 +48225,7 @@ var readerVedaAccountant = (entry) => {
46584
48225
  const exchangeRate = rawRate * scale;
46585
48226
  return {
46586
48227
  totalAssets: rescaleDecimals(
46587
- totalSupply * exchangeRate / ONE_E186,
48228
+ totalSupply * exchangeRate / ONE_E187,
46588
48229
  shareDec,
46589
48230
  underlyingDec
46590
48231
  ),
@@ -46620,9 +48261,9 @@ var readerAnkrRatio = (entry) => ({
46620
48261
  return void 0;
46621
48262
  }
46622
48263
  return {
46623
- totalAssets: totalSupply * ONE_E186 / r,
48264
+ totalAssets: totalSupply * ONE_E187 / r,
46624
48265
  totalSupply,
46625
- exchangeRate: ONE_E186 * ONE_E186 / r
48266
+ exchangeRate: ONE_E187 * ONE_E187 / r
46626
48267
  };
46627
48268
  }
46628
48269
  });
@@ -46666,7 +48307,7 @@ var readerCoreEarnRate = (entry) => {
46666
48307
  return {
46667
48308
  totalAssets: totalSupply * r / CORE_RATE_DENOM,
46668
48309
  totalSupply,
46669
- exchangeRate: r * ONE_E186 / CORE_RATE_DENOM
48310
+ exchangeRate: r * ONE_E187 / CORE_RATE_DENOM
46670
48311
  };
46671
48312
  }
46672
48313
  };
@@ -46688,7 +48329,7 @@ var readerCoreStakedRatio = (entry) => {
46688
48329
  return {
46689
48330
  totalAssets: totalStaked,
46690
48331
  totalSupply,
46691
- exchangeRate: totalStaked * ONE_E186 / totalSupply
48332
+ exchangeRate: totalStaked * ONE_E187 / totalSupply
46692
48333
  };
46693
48334
  }
46694
48335
  };
@@ -46719,7 +48360,7 @@ var readerStellaStDot = (entry) => ({
46719
48360
  {
46720
48361
  address: entry.address,
46721
48362
  name: "getPooledTokenByShares",
46722
- params: [ONE_E186]
48363
+ params: [ONE_E187]
46723
48364
  },
46724
48365
  { address: entry.address, name: "getTotalPooledToken", params: [] }
46725
48366
  ],
@@ -46730,7 +48371,7 @@ var readerStellaStDot = (entry) => ({
46730
48371
  if (totalSupply === void 0 || exchangeRate === void 0) {
46731
48372
  return void 0;
46732
48373
  }
46733
- const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E186;
48374
+ const totalAssets = toBigInt12(pooled) ?? totalSupply * exchangeRate / ONE_E187;
46734
48375
  return {
46735
48376
  totalAssets,
46736
48377
  totalSupply,
@@ -46768,7 +48409,7 @@ var readerKintsuSMon = (entry) => ({
46768
48409
  const totalAssets = toBigInt12(pooled);
46769
48410
  const totalSupply = toBigInt12(shares);
46770
48411
  if (totalAssets === void 0 || totalSupply === void 0) return void 0;
46771
- const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E186 / totalSupply : ONE_E186;
48412
+ const exchangeRate = totalSupply > 0n ? totalAssets * ONE_E187 / totalSupply : ONE_E187;
46772
48413
  return { totalAssets, totalSupply, exchangeRate };
46773
48414
  }
46774
48415
  });
@@ -47204,7 +48845,7 @@ var getLstValidators = async (chainId, shareToken) => {
47204
48845
  };
47205
48846
 
47206
48847
  // src/vaults/lst/fetchPublic.ts
47207
- var ONE_E187 = 10n ** 18n;
48848
+ var ONE_E188 = 10n ** 18n;
47208
48849
  var ERC20_BALANCE_ABI = parseAbi([
47209
48850
  "function balanceOf(address) view returns (uint256)"
47210
48851
  ]);
@@ -47319,8 +48960,8 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
47319
48960
  const underlyingUnit = 10n ** BigInt(underlyingDec);
47320
48961
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
47321
48962
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
47322
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E187;
47323
- 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;
47324
48965
  let liquidityRaw;
47325
48966
  if (state.liquidity !== void 0) {
47326
48967
  liquidityRaw = state.liquidity;
@@ -50335,6 +51976,15 @@ var TotalSupplyAbi2 = [
50335
51976
  outputs: [{ type: "uint256" }]
50336
51977
  }
50337
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
+ ];
50338
51988
  var Erc4626ReadAbi2 = [
50339
51989
  {
50340
51990
  name: "totalAssets",
@@ -50351,9 +52001,24 @@ var Erc4626ReadAbi2 = [
50351
52001
  outputs: [{ type: "uint256", name: "assets" }]
50352
52002
  }
50353
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
+ ];
50354
52019
 
50355
52020
  // src/vaults/savings/readers/shared.ts
50356
- var ONE_E188 = 10n ** 18n;
52021
+ var ONE_E189 = 10n ** 18n;
50357
52022
  var toBigInt14 = (v) => {
50358
52023
  if (v === void 0 || v === null) return void 0;
50359
52024
  if (typeof v === "bigint") return v;
@@ -50394,20 +52059,221 @@ var readerErc46262 = (entry) => {
50394
52059
  return {
50395
52060
  totalAssets,
50396
52061
  totalSupply,
50397
- 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()
50398
52252
  };
50399
52253
  }
50400
52254
  };
50401
52255
  };
50402
52256
 
50403
52257
  // src/vaults/savings/readers/index.ts
50404
- 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
+ };
50405
52271
 
50406
52272
  // src/vaults/savings/yieldBinding.ts
50407
52273
  var resolveYieldApr2 = async (entries) => (await resolveEntryApr(entries)).apr;
50408
52274
 
50409
52275
  // src/vaults/savings/fetchPublic.ts
50410
- var ONE_E189 = 10n ** 18n;
52276
+ var ONE_E1810 = 10n ** 18n;
50411
52277
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
50412
52278
  const entries = getSavingsRegistry(chainId);
50413
52279
  if (entries.length === 0) return {};
@@ -50445,11 +52311,19 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
50445
52311
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
50446
52312
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
50447
52313
  const isInstant = entry.withdrawalMode === "instant";
50448
- const liquidityRaw = isInstant ? state.totalAssets.toString() : "0";
50449
- const liquidityFormatted = isInstant ? totalAssetsFormatted : 0;
50450
- const liquidityUsd = isInstant ? totalAssetsUsd : 0;
50451
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E189;
50452
- 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;
50453
52327
  const displayName = composeVaultDisplayName(
50454
52328
  entry.brand,
50455
52329
  entry.brand,
@@ -50477,19 +52351,32 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
50477
52351
  supplyRate,
50478
52352
  rewardsRate,
50479
52353
  depositRate,
50480
- 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",
50481
52361
  isRebasing: entry.isRebasing,
50482
52362
  isMintable: entry.isMintable,
50483
52363
  mintContract: entry.mintContract?.toLowerCase() ?? addressLc,
50484
52364
  withdrawalMode: entry.withdrawalMode,
50485
- 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(),
50486
52372
  asset,
50487
52373
  priceUsd,
50488
52374
  totalAssetsFormatted,
50489
52375
  totalAssetsUsd,
50490
52376
  liquidity: liquidityRaw,
50491
52377
  liquidityFormatted,
50492
- liquidityUsd
52378
+ liquidityUsd,
52379
+ instantLiquidityRatio
50493
52380
  };
50494
52381
  out[addressLc] = vault;
50495
52382
  }
@@ -52766,7 +54653,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
52766
54653
  };
52767
54654
 
52768
54655
  // src/vaults/yield/annualize.ts
52769
- var YEAR_SECONDS3 = 365 * 24 * 60 * 60;
54656
+ var YEAR_SECONDS5 = 365 * 24 * 60 * 60;
52770
54657
  var SCALE = 10n ** 18n;
52771
54658
  var appendSnapshot = (points, snap, options) => {
52772
54659
  const maxPoints = options?.maxPoints ?? 90;
@@ -52795,7 +54682,7 @@ var computeVaultApr = (points, options) => {
52795
54682
  if (pThen === 0n) return void 0;
52796
54683
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
52797
54684
  const ratio = Number(ratioScaled) / 1e18;
52798
- const apr = (ratio - 1) * (YEAR_SECONDS3 / windowSeconds);
54685
+ const apr = (ratio - 1) * (YEAR_SECONDS5 / windowSeconds);
52799
54686
  return {
52800
54687
  apr,
52801
54688
  sharePriceNow: now.p,
@@ -53585,6 +55472,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
53585
55472
  return parseTokenBalanceResult(rawResult, prepared.query);
53586
55473
  }
53587
55474
 
53588
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, positivePart2 as positivePart, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats };
55475
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_STALE_REJECT_SECONDS, EMPTY_BALANCE, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, detectInterfaceKinds, encodeBalanceFetcherCalldata, exactlyLenderKey, exactlyMarketFromLenderKey, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, getVaultWithdrawalRequests, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, positivePart2 as positivePart, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveDerivation, resolveStCeloDepositGroup, riverKeyParts, riverLenderKey, selectAssetGroupPrices, stampVaultClassification, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, tickToAprNumber, tickToPrice, unflattenLenderData, updateFeedStats };
53589
55476
  //# sourceMappingURL=index.js.map
53590
55477
  //# sourceMappingURL=index.js.map