@1delta/margin-fetcher 5.0.11 → 5.0.12

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.d.ts CHANGED
@@ -4800,6 +4800,64 @@ type ListaMarketOverrides = {
4800
4800
  [chainId: string]: ListaMarketOverride[];
4801
4801
  };
4802
4802
 
4803
+ /**
4804
+ * Curve LlamaLend oracle fetcher — DERIVED (Pass 2).
4805
+ *
4806
+ * Each market's price feed is `price_oracle()` on its own LLAMMA. Three
4807
+ * properties of that read drive every decision in this file:
4808
+ *
4809
+ * 1. **It is always WAD**, regardless of either token's decimals. Verified
4810
+ * on-chain across the decimal spread: the 8-decimal WBTC / crvUSD market
4811
+ * returns `65042815002675129318680` (= 65,042.82) and the 18-decimal
4812
+ * sfrxUSD market returns `1205489834170667241` (= 1.2055). So this fetcher
4813
+ * divides by 1e18 and NEVER consults token decimals — unlike Morpho, whose
4814
+ * oracles scale by `10^(36 + loanDec - collDec)`.
4815
+ * 2. **It is denominated in the BORROWED token**, not USD. Hence Pass 2 with
4816
+ * `updatePrices=false`: `collateralUSD = ratio × borrowedUSD`, where the
4817
+ * borrowed token's direct USD price came from Pass 1. This is the
4818
+ * Morpho/Midnight/Teller shape, so the derivation class is `'derived'`.
4819
+ * It matters for real markets, not just in theory — 8 of ~99 markets
4820
+ * borrow something other than crvUSD (CRV, WETH, tBTC, ynETH, USDC,
4821
+ * wstETH), where treating the ratio as USD would be badly wrong.
4822
+ * 3. **It lives on the AMM, and only on the AMM.** A Curve
4823
+ * `price_oracle_contract` is a different contract exposing `price()`, and
4824
+ * the LLAMMA does NOT implement `price()`. That distinction is the whole
4825
+ * reason this fetcher exists: LlamaLend markets used to fall through a
4826
+ * catch-all `else` into the MORPHO override bucket, which called `price()`
4827
+ * on the LLAMMA — reverting, mapping to '0x', and dropping every market
4828
+ * silently. Had the address been a `price_oracle_contract` instead, the
4829
+ * call would have SUCCEEDED and been rescaled by 1e36, i.e. ~1e18 off.
4830
+ *
4831
+ * Markets are sourced exclusively from overrides (the database), like Morpho
4832
+ * and Lista. There is no on-chain market enumeration to fall back on.
4833
+ */
4834
+ /**
4835
+ * One LlamaLend market, as supplied by the caller's database.
4836
+ */
4837
+ interface LlamaLendMarketOverride {
4838
+ /**
4839
+ * The market's LLAMMA. `price_oracle()` is read from here — NOT from the
4840
+ * generic `oracle` column, which is written as the AMM but would silently
4841
+ * become unreadable if a `price_oracle_contract` were ever stored there.
4842
+ */
4843
+ amm: string;
4844
+ /** Borrowed token — the oracle's unit of account. */
4845
+ loanAsset: string;
4846
+ collateralAsset: string;
4847
+ /** Present for symmetry with the other override types; NOT used for scaling. */
4848
+ loanAssetDecimals?: number;
4849
+ /** Present for symmetry with the other override types; NOT used for scaling. */
4850
+ collateralAssetDecimals?: number;
4851
+ /**
4852
+ * Controller address, 0x-stripped and uppercased — the suffix of the
4853
+ * per-market lender key the lending converter emits.
4854
+ */
4855
+ marketId: string;
4856
+ }
4857
+ type LlamaLendMarketOverrides = {
4858
+ [chainId: string]: LlamaLendMarketOverride[];
4859
+ };
4860
+
4803
4861
  /**
4804
4862
  * Token list type expected by this function
4805
4863
  * Token decimals are read from list[chainId].list[address].decimals
@@ -4851,9 +4909,9 @@ interface FetchOraclePricesOptions {
4851
4909
  probeFeedStaleness?: boolean;
4852
4910
  /**
4853
4911
  * Only run these fetcher groups. Useful for debugging individual protocols.
4854
- * Values: 'aave', 'compoundV2', 'compoundV3', 'lista', 'eulerV2', 'aaveV4',
4855
- * 'morpho', 'midnight', 'exactly', 'term', 'liquity', 'river', 'teller',
4856
- * 'siloV2', 'siloV3', 'fluid'.
4912
+ * Values: 'aave', 'compoundV2', 'compoundV3', 'lista', 'llamalend',
4913
+ * 'eulerV2', 'aaveV4', 'morpho', 'midnight', 'exactly', 'term', 'liquity',
4914
+ * 'river', 'teller', 'siloV2', 'siloV3', 'fluid'.
4857
4915
  * If omitted, all fetchers run.
4858
4916
  */
4859
4917
  onlyFetchers?: string[];
@@ -4873,7 +4931,14 @@ declare function fetchOraclePrices(chainIds: string[], rpcOverrides?: {
4873
4931
  [chainId: string]: string[];
4874
4932
  }, lists?: TokenListInput, retries?: number, batchSize?: {
4875
4933
  [chainId: string]: number;
4876
- } | undefined, allowFailure?: boolean, basePrices?: USDPriceMap, morphoMarketOverrides?: MorphoMarketOverrides, listaMarketOverrides?: ListaMarketOverrides, stalenessThresholdSeconds?: number, onlyFetchers?: string[], probeFeedStaleness?: boolean): Promise<OraclePricesResult>;
4934
+ } | undefined, allowFailure?: boolean, basePrices?: USDPriceMap, morphoMarketOverrides?: MorphoMarketOverrides, listaMarketOverrides?: ListaMarketOverrides, stalenessThresholdSeconds?: number, onlyFetchers?: string[], probeFeedStaleness?: boolean,
4935
+ /**
4936
+ * Curve LlamaLend markets. Appended LAST rather than slotted next to the
4937
+ * other two override params on purpose — ~50 call sites already pass all 12
4938
+ * positional arguments, and inserting here would silently shift
4939
+ * `onlyFetchers` / `probeFeedStaleness` in every one of them.
4940
+ */
4941
+ llamaLendMarketOverrides?: LlamaLendMarketOverrides): Promise<OraclePricesResult>;
4877
4942
 
4878
4943
  /**
4879
4944
  * Self-calibrating per-feed quality stats.
@@ -6103,7 +6168,7 @@ type LstWithdrawalStatus =
6103
6168
  | 'expired';
6104
6169
  /** Withdrawal-reader implementation kind — drives which enumeration
6105
6170
  * function the user is queried against. */
6106
- type LstWithdrawalReaderKind = 'lidoQueue' | 'etherfiNft' | 'yieldNestNft' | 'staderEthxQueue' | 'staderMaticXQueue' | 'renzoQueue' | 'kelpQueue' | 'benqiSavaxQueue' | 'beetsStSQueue' | 'hyperbeatBeHype7540' | 'erc7540' | 'ethenaCooldown' | 'susd3Cooldown' | 'strataCooldown' | 'swellNft' | 'stakeWiseSubgraph' | 'mantleCallerSuppliedIds' | 'pufferCallerSuppliedIds' | 'trufinCallerSuppliedIds' | 'lairCallerSuppliedIds' | 'stceloAccountQueue' | 'kinetiqQueue' | 'beHypeQueue' | 'valantisBurnQueue' | 'listaQueue' | 'iberaQueue' | 'primeStakingQueue' | 'berapawRedeemQueue' | 'eventsOnly' | 'noQueue' | 'unverified';
6171
+ type LstWithdrawalReaderKind = 'lidoQueue' | 'etherfiNft' | 'yieldNestNft' | 'staderEthxQueue' | 'staderMaticXQueue' | 'renzoQueue' | 'kelpQueue' | 'benqiSavaxQueue' | 'beetsStSQueue' | 'hyperbeatBeHype7540' | 'erc7540' | 'binanceWbethQueue' | 'ethenaCooldown' | 'susd3Cooldown' | 'strataCooldown' | 'swellNft' | 'stakeWiseSubgraph' | 'mantleCallerSuppliedIds' | 'pufferCallerSuppliedIds' | 'trufinCallerSuppliedIds' | 'lairCallerSuppliedIds' | 'stceloAccountQueue' | 'kinetiqQueue' | 'beHypeQueue' | 'valantisBurnQueue' | 'listaQueue' | 'iberaQueue' | 'primeStakingQueue' | 'berapawRedeemQueue' | 'eventsOnly' | 'noQueue' | 'unverified';
6107
6172
  /** Map keyed by lowercased LST share-token address. The orchestrator
6108
6173
  * fetches all LSTs on a chain in parallel and returns this map
6109
6174
  * (possibly with empty arrays for LSTs the user has no requests
@@ -9838,4 +9903,4 @@ interface TermAdapter {
9838
9903
  declare const TERM_ADAPTERS: TermAdapter[];
9839
9904
  declare function resolveAdapter(lender: string): TermAdapter | undefined;
9840
9905
 
9841
- export { type AaveMetadata, type AaveV2Public, type AaveV2UserReserveResponse, type AaveV3Public, type AaveV3UserReserveResponse, type AdditionalYields, type AdminKind, ApiBookSource, type AprData, type AprPercent, type AssetQuality, type AssetRiskIndex, type AuctionWindow, type AvailabilityTerms, type BalanceData, type BaseLendingPosition, type BasicReserveResponse, type BorrowExitTerms, type BorrowTermSheet, type BuildTermSheetOptions, type ChainDiagnostic, type ChainLinkResponse, type ChainQuery, type ChainSummary, type CompoundV2Metadata, type CompoundV3Public, type CompoundV3UserReserveResponse, type ConfigEntry, type ConvertLenderUserDataOptions, type CoreValidators, type CounterpartyTerms, type CoverageInfo, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, type DeepPartial, type Denomination, type DepthMap, EMPTY_BALANCE, type EModeAssets, type EModeData, type EModeResult, EXACTLY_LENDER_KEY, type EndpointFailure, type EnrichmentIndex, type EulerEarnVault, type EulerEarnVaults, type EulerV2Metadata, type ExactlyFixedPool, type ExactlyFixedPosition, type ExactlyMarketAccount, type ExactlyMarketsRaw, type ExactlyUserFixedPosition, type ExposureEntry, type ExposureTerms, type ExtraValidationCall, type FeeTerm, type FeeWhen, type FeedObservation, type FeedStat, type FeedStatsMap, type FeedTimestampMap, type FetchListaVaultsFromChainOptions, type FetchMorphoVaultsFromChainOptions, type FetchOraclePricesOptions, type FetchTokenBalancesOptions, type FlattenPriorityConfig, type FluidFToken, type FluidFTokens, type FrankencoinMarketRaw, type FrankencoinMarketsRaw, type FrankencoinPositionInfo, type FullLenderRewardsMap, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, type GenericCurrency, type GenericTokenList, type GetVaultPublicDataAllOptions, type GmxExecutionFees, type GmxPendingDeposit, type GmxPendingWithdrawal, type GmxReadContracts, type GmxUserBalance, type GmxUserPositions, type GmxUserPositionsOptions, type GmxVault, type GmxVaultKind, type GmxVaults, type GmxVaultsFetchOptions, type GovernancePower, type GovernanceRow, type GovernanceTerms, type GroupAccumulator, HYPERCORE_VAULT_REGISTRY, type HypercoreLockStatus, type HypercoreUserPositionsOptions, type HypercoreVault, type HypercoreVaultPosition, type HypercoreVaultRegistryEntry, type HypercoreVaults, type HypercoreVaultsFetchOptions, IDLE_MARKET_ID, INTERFACE_IDS, type IncompleteLenderRead, type IncompleteReason, type InitMetadata, type InitPublic, type InitUserReserveResponse, type InterfaceKind, type InvariantViolation, type InverseMarketRaw, type InverseMarketsRaw, type InversePositionInfo, LAGOON_API_URL, LAGOON_CHAIN_IDS, type LagoonApiVault, type LagoonSyncMode, type LagoonVault, type LagoonVaults, type LenderConfigData, type LenderConfigMap, type LenderCrossPoolMeta, type LenderData, type LenderDataEntry, type LenderInfo, type LenderInfoMap, type LenderPublicBase, type LenderRewardsMap, type LenderSummary, type LenderToLenderCrossPoolMeta, type LenderTotalAmounts, type LenderUserQuery, type LenderUserResponse, type LenderYieldComplete, type LenderYields$1 as LenderYields, LendingMode, type LiquidationPenaltyTerm, type LiquidationTerms, type LiquityBranchRaw, type LiquityDiscoveredTrove, type LiquityDiscovery, type LiquityMarketsRaw, type LiquitySpInfo, type LiquityTroveInfo, type ListaMarketOverrides, type LlamaLendMarketRaw, type LlamaLendMarketsRaw, type LlamaLendPositionInfo, type LoopPostTradeMetrics, type LstDelegation, type LstDelegationKind, type LstValidator, type LstWithdrawalFetchOptions, type LstWithdrawalRegistryEntry, type LstWithdrawalRequest, type LstWithdrawalRequestsByLst, type LstWithdrawalStatus, MORPHO_LENS, MULTICALL_FAILURE, type MaturityTerms, MaxParamThresholds, type MergedUserData, type MidnightBook, type MidnightBookLevel, type MidnightBookSource, type ModeBase, type ModeVariant, type MorphoMarketOverrides, type MorphoSubgraphProxyConfig, type MorphoUserMarketBalance, type MorphoUserReserveResponse, type MorphoVault, type MorphoVaults, type MulticallEndpointOptions, type MulticallRpcBatch, type NumberMap, type Open, type OracleBand, type OracleDiagnostics, type OraclePriceEntry, type OraclePricesResult, type OracleRiskRow, type OracleTerms, type OutlierGuardConfig, type ParsedBalanceData, type ParsedResponse, type ParsedUserBalance, type PermissionKind, type PermissionParams, type PoolData, type PoolWithMeta, type PortfolioSummary, type PortfolioTotals, type PositionConstraints, type PostTradeMetrics, type PreparedCall, type PreparedMergedMulticallParams, type PreparedMergedRpcCalls, type PreparedTokenBalanceRpcCalls, type PreparedUserDataRpcCalls, type PriceDerivation, type PriceSelection, type ProtocolParams, type ProviderOptions, type RateKind, type RateMenuEntry, type RateTerms, type RawRpcBatch, type RawRpcCall, type RawRpcResponse, type ReadFailurePolicy, type RedemptionTerms, type ResupplyMarketsRaw, type ResupplyPairIdentity, type ResupplyPairRaw, type ResupplyPositionInfo, type ResupplyWrappedMarket, type RewardTerm, type RiverMarketRaw, type RiverMarketsRaw, type RiverPositionInfo, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, type SelectPricesOptions, type Severity, type SeverityFinding, type SiloVault, type SiloVaults, type StCeloValidatorGroup, type StaleFeedEntry, type StampOptions, type StructuredOraclePrices, type SubAccountSummary, type SumerPositionInput, type SummaryAprData, type SummaryBalanceData, type SupplyExitMode, type SupplyExitTerms, type SupplyTermSheet, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, type TellerDiscoveredBid, type TellerDiscovery, type TellerMarketsRaw, type TellerPoolRaw, type TermAdapter, type TermAssetRef, type TermAuctionOrder, type TermAuctionOrders, type TermBookSource, type TermBookTop, type TermInfo, type TermListing, type TermMarketRaw, TermMaxApiSource, type TermMaxBookTop, type TermMaxCurveSegment, type TermMaxDataSource, type TermMaxDiscovery, type TermMaxFeeConfig, type TermMaxMarketConfig, type TermMaxMarketRaw, type TermMaxOrderState, type TermProfile, type TermSheet, type TermSheetDigest, type TermSheetInput, type TermSheetViolation, TermSubgraphSource, type TermTag, type TokenApprovalMeta, type TokenApprovalParams, type TokenBalanceEntry, type TokenBalanceQuery, type TokenBalanceResult, type TokenEntry, type TokenList, type TokenListInput, type TrackerDiagnostic, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, type USDPriceMap, type UpshiftApiAsset, type UpshiftApiVault, type UpshiftVault, type UpshiftVaults, type UsddMarketRaw, type UsddMarketsRaw, type UsddPositionInfo, type UserApr, type UserConfig, type UserData, type UserDataResult, type UserLendingPosition, type UtilizationTerms, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, type ValidationResult, type VaultAprResult, type VaultClassification, type VaultClassificationFields, type VaultLookupEntry, type VaultMarketExposure, type VaultProvider, type VaultPublicDataAll, type VaultPublicDataResult, type VaultYieldSeries, type VaultYieldSnapshot, type YDaemonVault, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, type YearnVault, type YearnVaultKind, type YearnVaults, type YieldProfile, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, duration, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, frankencoinKeyParts, frankencoinLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getReadFailurePolicy, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isFailedCall, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, stampVaultClassification, supplyDescription, supplyFindings, supplyHeadline, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, toDigest, toTermSheetInput, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData };
9906
+ export { type AaveMetadata, type AaveV2Public, type AaveV2UserReserveResponse, type AaveV3Public, type AaveV3UserReserveResponse, type AdditionalYields, type AdminKind, ApiBookSource, type AprData, type AprPercent, type AssetQuality, type AssetRiskIndex, type AuctionWindow, type AvailabilityTerms, type BalanceData, type BaseLendingPosition, type BasicReserveResponse, type BorrowExitTerms, type BorrowTermSheet, type BuildTermSheetOptions, type ChainDiagnostic, type ChainLinkResponse, type ChainQuery, type ChainSummary, type CompoundV2Metadata, type CompoundV3Public, type CompoundV3UserReserveResponse, type ConfigEntry, type ConvertLenderUserDataOptions, type CoreValidators, type CounterpartyTerms, type CoverageInfo, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, type DeepPartial, type Denomination, type DepthMap, EMPTY_BALANCE, type EModeAssets, type EModeData, type EModeResult, EXACTLY_LENDER_KEY, type EndpointFailure, type EnrichmentIndex, type EulerEarnVault, type EulerEarnVaults, type EulerV2Metadata, type ExactlyFixedPool, type ExactlyFixedPosition, type ExactlyMarketAccount, type ExactlyMarketsRaw, type ExactlyUserFixedPosition, type ExposureEntry, type ExposureTerms, type ExtraValidationCall, type FeeTerm, type FeeWhen, type FeedObservation, type FeedStat, type FeedStatsMap, type FeedTimestampMap, type FetchListaVaultsFromChainOptions, type FetchMorphoVaultsFromChainOptions, type FetchOraclePricesOptions, type FetchTokenBalancesOptions, type FlattenPriorityConfig, type FluidFToken, type FluidFTokens, type FrankencoinMarketRaw, type FrankencoinMarketsRaw, type FrankencoinPositionInfo, type FullLenderRewardsMap, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, type GenericCurrency, type GenericTokenList, type GetVaultPublicDataAllOptions, type GmxExecutionFees, type GmxPendingDeposit, type GmxPendingWithdrawal, type GmxReadContracts, type GmxUserBalance, type GmxUserPositions, type GmxUserPositionsOptions, type GmxVault, type GmxVaultKind, type GmxVaults, type GmxVaultsFetchOptions, type GovernancePower, type GovernanceRow, type GovernanceTerms, type GroupAccumulator, HYPERCORE_VAULT_REGISTRY, type HypercoreLockStatus, type HypercoreUserPositionsOptions, type HypercoreVault, type HypercoreVaultPosition, type HypercoreVaultRegistryEntry, type HypercoreVaults, type HypercoreVaultsFetchOptions, IDLE_MARKET_ID, INTERFACE_IDS, type IncompleteLenderRead, type IncompleteReason, type InitMetadata, type InitPublic, type InitUserReserveResponse, type InterfaceKind, type InvariantViolation, type InverseMarketRaw, type InverseMarketsRaw, type InversePositionInfo, LAGOON_API_URL, LAGOON_CHAIN_IDS, type LagoonApiVault, type LagoonSyncMode, type LagoonVault, type LagoonVaults, type LenderConfigData, type LenderConfigMap, type LenderCrossPoolMeta, type LenderData, type LenderDataEntry, type LenderInfo, type LenderInfoMap, type LenderPublicBase, type LenderRewardsMap, type LenderSummary, type LenderToLenderCrossPoolMeta, type LenderTotalAmounts, type LenderUserQuery, type LenderUserResponse, type LenderYieldComplete, type LenderYields$1 as LenderYields, LendingMode, type LiquidationPenaltyTerm, type LiquidationTerms, type LiquityBranchRaw, type LiquityDiscoveredTrove, type LiquityDiscovery, type LiquityMarketsRaw, type LiquitySpInfo, type LiquityTroveInfo, type ListaMarketOverrides, type LlamaLendMarketOverride, type LlamaLendMarketOverrides, type LlamaLendMarketRaw, type LlamaLendMarketsRaw, type LlamaLendPositionInfo, type LoopPostTradeMetrics, type LstDelegation, type LstDelegationKind, type LstValidator, type LstWithdrawalFetchOptions, type LstWithdrawalRegistryEntry, type LstWithdrawalRequest, type LstWithdrawalRequestsByLst, type LstWithdrawalStatus, MORPHO_LENS, MULTICALL_FAILURE, type MaturityTerms, MaxParamThresholds, type MergedUserData, type MidnightBook, type MidnightBookLevel, type MidnightBookSource, type ModeBase, type ModeVariant, type MorphoMarketOverrides, type MorphoSubgraphProxyConfig, type MorphoUserMarketBalance, type MorphoUserReserveResponse, type MorphoVault, type MorphoVaults, type MulticallEndpointOptions, type MulticallRpcBatch, type NumberMap, type Open, type OracleBand, type OracleDiagnostics, type OraclePriceEntry, type OraclePricesResult, type OracleRiskRow, type OracleTerms, type OutlierGuardConfig, type ParsedBalanceData, type ParsedResponse, type ParsedUserBalance, type PermissionKind, type PermissionParams, type PoolData, type PoolWithMeta, type PortfolioSummary, type PortfolioTotals, type PositionConstraints, type PostTradeMetrics, type PreparedCall, type PreparedMergedMulticallParams, type PreparedMergedRpcCalls, type PreparedTokenBalanceRpcCalls, type PreparedUserDataRpcCalls, type PriceDerivation, type PriceSelection, type ProtocolParams, type ProviderOptions, type RateKind, type RateMenuEntry, type RateTerms, type RawRpcBatch, type RawRpcCall, type RawRpcResponse, type ReadFailurePolicy, type RedemptionTerms, type ResupplyMarketsRaw, type ResupplyPairIdentity, type ResupplyPairRaw, type ResupplyPositionInfo, type ResupplyWrappedMarket, type RewardTerm, type RiverMarketRaw, type RiverMarketsRaw, type RiverPositionInfo, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, type SelectPricesOptions, type Severity, type SeverityFinding, type SiloVault, type SiloVaults, type StCeloValidatorGroup, type StaleFeedEntry, type StampOptions, type StructuredOraclePrices, type SubAccountSummary, type SumerPositionInput, type SummaryAprData, type SummaryBalanceData, type SupplyExitMode, type SupplyExitTerms, type SupplyTermSheet, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, type TellerDiscoveredBid, type TellerDiscovery, type TellerMarketsRaw, type TellerPoolRaw, type TermAdapter, type TermAssetRef, type TermAuctionOrder, type TermAuctionOrders, type TermBookSource, type TermBookTop, type TermInfo, type TermListing, type TermMarketRaw, TermMaxApiSource, type TermMaxBookTop, type TermMaxCurveSegment, type TermMaxDataSource, type TermMaxDiscovery, type TermMaxFeeConfig, type TermMaxMarketConfig, type TermMaxMarketRaw, type TermMaxOrderState, type TermProfile, type TermSheet, type TermSheetDigest, type TermSheetInput, type TermSheetViolation, TermSubgraphSource, type TermTag, type TokenApprovalMeta, type TokenApprovalParams, type TokenBalanceEntry, type TokenBalanceQuery, type TokenBalanceResult, type TokenEntry, type TokenList, type TokenListInput, type TrackerDiagnostic, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, type USDPriceMap, type UpshiftApiAsset, type UpshiftApiVault, type UpshiftVault, type UpshiftVaults, type UsddMarketRaw, type UsddMarketsRaw, type UsddPositionInfo, type UserApr, type UserConfig, type UserData, type UserDataResult, type UserLendingPosition, type UtilizationTerms, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, type ValidationResult, type VaultAprResult, type VaultClassification, type VaultClassificationFields, type VaultLookupEntry, type VaultMarketExposure, type VaultProvider, type VaultPublicDataAll, type VaultPublicDataResult, type VaultYieldSeries, type VaultYieldSnapshot, type YDaemonVault, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, type YearnVault, type YearnVaultKind, type YearnVaults, type YieldProfile, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, duration, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, frankencoinKeyParts, frankencoinLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getReadFailurePolicy, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isFailedCall, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, stampVaultClassification, supplyDescription, supplyFindings, supplyHeadline, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, toDigest, toTermSheetInput, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData };
package/dist/index.js CHANGED
@@ -24326,7 +24326,19 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
24326
24326
  // this as a number gets NaN and can branch, where "0" would silently
24327
24327
  // become a zero LTV. The real curve is in `llamalend.bandLtv`.
24328
24328
  lltv: ltv !== null ? String(ltv) : "",
24329
- oracle: market.priceOracle ?? market.amm,
24329
+ /**
24330
+ * The AMM, deliberately — LlamaLend's price feed is `price_oracle()` on
24331
+ * the LLAMMA itself, so that is the only address a reader can call.
24332
+ *
24333
+ * This used to read `market.priceOracle ?? market.amm`, but
24334
+ * `priceOracle` was never assigned anywhere in this pipeline (the name
24335
+ * is used elsewhere for the price VALUE, not the contract), so the
24336
+ * fallback was doing all the work. Naming it directly removes the trap:
24337
+ * a Curve `price_oracle_contract` exposes `price()` and NOT
24338
+ * `price_oracle()`, so populating that field would have silently
24339
+ * pointed every oracle reader at an interface it cannot call.
24340
+ */
24341
+ oracle: market.amm,
24330
24342
  irm: market.monetaryPolicy ?? zeroAddress,
24331
24343
  collateralAddress: collAddr,
24332
24344
  loanAddress: loanAddr,
@@ -24382,7 +24394,6 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
24382
24394
  */
24383
24395
  amm: market.amm,
24384
24396
  monetaryPolicy: market.monetaryPolicy,
24385
- priceOracle: market.priceOracle,
24386
24397
  /**
24387
24398
  * Curve's deployed v1 leverage zaps and the aggregator routers
24388
24399
  * they are hard-wired to. We route leverage through these rather
@@ -40699,6 +40710,40 @@ var fraxSavingsFetcher = {
40699
40710
  }
40700
40711
  };
40701
40712
 
40713
+ // src/yields/intrinsic/fetchers/binance.ts
40714
+ var HISTORY_URL2 = "https://www.binance.com/bapi/earn/v1/public/pos/cftoken/project/exchange-rate/history";
40715
+ var WBETH = "Wrapped Binance Beacon ETH::wBETH";
40716
+ var LLAMA_POOL = "80b8bf92-b953-4c20-98ea-c9653ef2bb98";
40717
+ var DAY_MS = 864e5;
40718
+ var LOOKBACK_MS = 14 * DAY_MS;
40719
+ var TIMEOUT_MS2 = 8e3;
40720
+ var wbethFetcher = {
40721
+ label: "WBETH",
40722
+ fetch: async () => {
40723
+ const now = Date.now();
40724
+ const url = `${HISTORY_URL2}?startTime=${now - LOOKBACK_MS}&endTime=${now}`;
40725
+ try {
40726
+ const res = await fetch(url, {
40727
+ method: "GET",
40728
+ headers: { Accept: "application/json" },
40729
+ signal: AbortSignal.timeout(TIMEOUT_MS2)
40730
+ }).then((r) => r.json());
40731
+ const points = res.data ?? [];
40732
+ if (points.length > 0) {
40733
+ const latest = points.reduce(
40734
+ (a, b) => Number(b.calcDate) > Number(a.calcDate) ? b : a
40735
+ );
40736
+ const apr = Number(latest.apr) * 100;
40737
+ if (Number.isFinite(apr) && apr > 0) return { [WBETH]: apr };
40738
+ }
40739
+ } catch (e) {
40740
+ console.log("WBETH history failed, falling back to DefiLlama", e);
40741
+ }
40742
+ const apy = await fetchDefiLlamaApy(LLAMA_POOL);
40743
+ return { [WBETH]: apyToAprPercent(apy) };
40744
+ }
40745
+ };
40746
+
40702
40747
  // src/vaults/lst/registry.ts
40703
40748
  var LST_REGISTRY = {
40704
40749
  // Monad (143) — native-MON LSTs. shMON / aprMON are ERC-4626 over native
@@ -41101,6 +41146,46 @@ var LST_REGISTRY = {
41101
41146
  yieldFetcher: cbethFetcher,
41102
41147
  yieldKey: "CBETH"
41103
41148
  },
41149
+ {
41150
+ // Binance wBETH — the *other* exchange LST, and unlike cbETH above
41151
+ // it is genuinely permissionless on-chain in both directions:
41152
+ // mint `deposit(address referral)` payable, no allowlist
41153
+ // redeem `requestWithdrawEth(uint256)` → the UnwrapTokenV1ETH
41154
+ // queue at 0x79973d557CD9dd87eb61E250cc2572c990e20196
41155
+ // (both simulated against mainnet — `deposit` succeeds from an
41156
+ // arbitrary EOA, `requestWithdrawEth` reverts only on balance).
41157
+ //
41158
+ // A FiatTokenProxy (Circle's USDC codebase) + Binance's
41159
+ // StakedTokenV3 mixin, so it inherits USDC-style `blacklist(address)`
41160
+ // and `pause()` on BOTH the token and the unwrap queue — Binance can
41161
+ // freeze any holder. Same trust class as USDC; that is the live risk
41162
+ // for anything treating wBETH as collateral.
41163
+ //
41164
+ // The `queued` exit has two teeth that a plain cooldown does not:
41165
+ // * the ETH owed is FROZEN at request time (`ethAmount` is stored,
41166
+ // not recomputed), so the position stops earning for the whole
41167
+ // `lockTime()` — currently 864000s / 10 days, admin-settable down
41168
+ // to MIN_LOCK_TIME = 172800s / 2 days. Read it live.
41169
+ // * a request is only auto-allocated while
41170
+ // `availableAllocateAmount` covers it (~3 ETH on Ethereum today);
41171
+ // anything larger waits for Binance's operator to `allocate()`,
41172
+ // with no SLA.
41173
+ address: "0xa2e3356610840701bdf5611a53974510ae27e2e1",
41174
+ underlying: "0x0000000000000000000000000000000000000000",
41175
+ symbol: "wBETH",
41176
+ brand: "Binance",
41177
+ decimals: 18,
41178
+ reader: "binanceWbeth",
41179
+ isErc4626: false,
41180
+ isRebasing: false,
41181
+ isMintable: true,
41182
+ isNativeUnderlying: true,
41183
+ mintContract: "0xa2e3356610840701bdf5611a53974510ae27e2e1",
41184
+ mintInputAsset: "native",
41185
+ withdrawalMode: "queued",
41186
+ yieldFetcher: wbethFetcher,
41187
+ yieldKey: "Wrapped Binance Beacon ETH::wBETH"
41188
+ },
41104
41189
  {
41105
41190
  address: "0xa43a7c62d56df036c187e1966c03e2799d8987ed",
41106
41191
  // TruFin TruStake MATIC Vault uses the MATIC ERC-20 (not POL).
@@ -41667,6 +41752,37 @@ var LST_REGISTRY = {
41667
41752
  listaStakeManager: "0x1adb950d8bb3da4be104211d5ab038628e477fe6"
41668
41753
  }
41669
41754
  },
41755
+ {
41756
+ // Binance wBETH on BNB — SAME token address as Ethereum, but a
41757
+ // different implementation behind the proxy (`WrapTokenV2BSC` vs
41758
+ // `WrapTokenV3ETH`), so the mint leg is NOT portable:
41759
+ // Ethereum `deposit(address referral)` payable, native ETH
41760
+ // BNB `deposit(uint256 amount, address referral)` nonpayable,
41761
+ // pulls the Binance-pegged ETH ERC-20 below → needs approve
41762
+ // The read surface and the pushed rate ARE identical (one oracle
41763
+ // 0x81720695… writes both chains, and `exchangeRate()` returns the
41764
+ // same value), hence the shared reader and the shared `yieldKey`.
41765
+ //
41766
+ // Exit is the same UnwrapTokenV1 queue at the same address, with the
41767
+ // same frozen-amount / 10-day-lock / operator-allocation caveats as
41768
+ // the Ethereum entry — see there.
41769
+ address: "0xa2e3356610840701bdf5611a53974510ae27e2e1",
41770
+ // Binance-pegged ETH on BSC — the deposit input, not native BNB.
41771
+ underlying: "0x2170ed0880ac9a755fd29b2688956bd959f933f8",
41772
+ symbol: "wBETH",
41773
+ brand: "Binance",
41774
+ decimals: 18,
41775
+ reader: "binanceWbeth",
41776
+ isErc4626: false,
41777
+ isRebasing: false,
41778
+ isMintable: true,
41779
+ isNativeUnderlying: false,
41780
+ mintContract: "0xa2e3356610840701bdf5611a53974510ae27e2e1",
41781
+ mintInputAsset: "0x2170ed0880ac9a755fd29b2688956bd959f933f8",
41782
+ withdrawalMode: "queued",
41783
+ yieldFetcher: wbethFetcher,
41784
+ yieldKey: "Wrapped Binance Beacon ETH::wBETH"
41785
+ },
41670
41786
  {
41671
41787
  // YieldNest ynBNB — ERC-4626 vault over slisBNB (Lista), restaked
41672
41788
  // via Kernel. Redeems to slisBNB synchronously; the BNB unstake
@@ -48220,6 +48336,79 @@ var listaFetcher = {
48220
48336
  parse: parseListaResults,
48221
48337
  getAbi: getListaAbi
48222
48338
  };
48339
+ function generateLlamaLendLenderKey(marketId) {
48340
+ return `${Lender.LLAMALEND}_${marketId.replace(/^0x/i, "").toUpperCase()}`;
48341
+ }
48342
+ function getLlamaLendMarketsForChain(chainId, marketOverrides) {
48343
+ return marketOverrides?.[chainId] ?? [];
48344
+ }
48345
+ function getLlamaLendCalls(chainId, context) {
48346
+ const markets = getLlamaLendMarketsForChain(chainId, context?.marketOverrides);
48347
+ if (markets.length === 0) return [];
48348
+ return markets.map((market) => {
48349
+ const call = {
48350
+ address: market.amm,
48351
+ name: "price_oracle",
48352
+ params: []
48353
+ };
48354
+ return {
48355
+ calls: [call],
48356
+ meta: { markets: [market] },
48357
+ lender: generateLlamaLendLenderKey(market.marketId)
48358
+ };
48359
+ });
48360
+ }
48361
+ function parseLlamaLendResults(data, meta, context) {
48362
+ const { chainId, usdPrices, tokenList } = context;
48363
+ const entries = [];
48364
+ const rawPrice = data[0];
48365
+ if (rawPrice === void 0 || rawPrice === null || rawPrice === "0x") {
48366
+ return entries;
48367
+ }
48368
+ for (const market of meta.markets) {
48369
+ const loanAsset = market.loanAsset.toLowerCase();
48370
+ const collateralAsset = market.collateralAsset.toLowerCase();
48371
+ let collateralInLoan;
48372
+ try {
48373
+ collateralInLoan = Number(formatUnits(BigInt(rawPrice.toString()), 18));
48374
+ } catch {
48375
+ continue;
48376
+ }
48377
+ if (!Number.isFinite(collateralInLoan) || collateralInLoan === 0) continue;
48378
+ const loanOracleKey = tokenList?.[loanAsset]?.assetGroup ?? `${chainId}-${loanAsset}`;
48379
+ const loanAssetUSD = usdPrices[loanOracleKey] ?? usdPrices[loanAsset];
48380
+ if (!loanAssetUSD) continue;
48381
+ const lenderKey = generateLlamaLendLenderKey(market.marketId);
48382
+ entries.push({
48383
+ asset: loanAsset,
48384
+ price: 1,
48385
+ priceUSD: loanAssetUSD,
48386
+ marketUid: createMarketUid(chainId, lenderKey, loanAsset),
48387
+ targetLender: lenderKey,
48388
+ description: "LlamaLend borrowed asset",
48389
+ staticBase: true,
48390
+ baseAsset: loanAsset
48391
+ });
48392
+ entries.push({
48393
+ asset: collateralAsset,
48394
+ price: collateralInLoan,
48395
+ priceUSD: collateralInLoan * loanAssetUSD,
48396
+ marketUid: createMarketUid(chainId, lenderKey, collateralAsset),
48397
+ targetLender: lenderKey,
48398
+ description: "LlamaLend collateral (AMM EMA oracle)",
48399
+ baseAsset: loanAsset
48400
+ });
48401
+ }
48402
+ return entries;
48403
+ }
48404
+ function getLlamaLendAbi() {
48405
+ return LlamaLendAmmAbi;
48406
+ }
48407
+ var llamaLendFetcher = {
48408
+ getCalls: getLlamaLendCalls,
48409
+ parse: parseLlamaLendResults,
48410
+ getAbi: getLlamaLendAbi
48411
+ };
48223
48412
 
48224
48413
  // src/abis/euler/priceLens.ts
48225
48414
  var priceLensAbi = [
@@ -49580,7 +49769,7 @@ async function executeGroup(group, chainId, chainBatchSize, retries, allowFailur
49580
49769
  };
49581
49770
  }
49582
49771
  }
49583
- async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3, batchSize = void 0, allowFailure = true, basePrices = {}, morphoMarketOverrides, listaMarketOverrides, stalenessThresholdSeconds = 3600, onlyFetchers, probeFeedStaleness = true) {
49772
+ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3, batchSize = void 0, allowFailure = true, basePrices = {}, morphoMarketOverrides, listaMarketOverrides, stalenessThresholdSeconds = 3600, onlyFetchers, probeFeedStaleness = true, llamaLendMarketOverrides) {
49584
49773
  const totalStart = Date.now();
49585
49774
  const result = {};
49586
49775
  const chainPromises = chainIds.map(async (chainId) => {
@@ -49625,6 +49814,13 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
49625
49814
  }),
49626
49815
  getCallsErrors
49627
49816
  ) : [];
49817
+ const llamaLendResults = isActive("llamalend") ? safeGetCalls(
49818
+ "llamaLend",
49819
+ () => llamaLendFetcher.getCalls(chainId, {
49820
+ marketOverrides: llamaLendMarketOverrides
49821
+ }),
49822
+ getCallsErrors
49823
+ ) : [];
49628
49824
  const eulerResults = isActive("eulerv2") ? safeGetCalls(
49629
49825
  "eulerV2",
49630
49826
  () => eulerV2Fetcher.getCalls(chainId),
@@ -49745,6 +49941,13 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
49745
49941
  ProxyOracleAbi,
49746
49942
  "direct"
49747
49943
  );
49944
+ const llamaLendGroup = buildGroup(
49945
+ "llamaLend",
49946
+ llamaLendResults,
49947
+ llamaLendFetcher.parse,
49948
+ getLlamaLendAbi(),
49949
+ "derived"
49950
+ );
49748
49951
  const eulerGroup = buildGroup(
49749
49952
  "eulerV2",
49750
49953
  eulerResults,
@@ -49871,6 +50074,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
49871
50074
  compoundV2Group,
49872
50075
  compoundV3Group,
49873
50076
  listaGroup,
50077
+ llamaLendGroup,
49874
50078
  eulerGroup,
49875
50079
  aaveV4Group,
49876
50080
  morphoGroup,
@@ -49918,6 +50122,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
49918
50122
  compoundV2Data,
49919
50123
  compoundV3Data,
49920
50124
  listaData,
50125
+ llamaLendData,
49921
50126
  eulerData,
49922
50127
  aaveV4Data,
49923
50128
  fluidData,
@@ -49968,6 +50173,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
49968
50173
  allowFailure,
49969
50174
  rpcOverrides
49970
50175
  ),
50176
+ executeGroup(
50177
+ llamaLendGroup,
50178
+ chainId,
50179
+ chainBatchSize,
50180
+ retries,
50181
+ allowFailure,
50182
+ rpcOverrides
50183
+ ),
49971
50184
  executeGroup(
49972
50185
  eulerGroup,
49973
50186
  chainId,
@@ -50125,6 +50338,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50125
50338
  { group: compoundV2Group, data: compoundV2Data },
50126
50339
  { group: compoundV3Group, data: compoundV3Data },
50127
50340
  { group: listaGroup, data: listaData },
50341
+ { group: llamaLendGroup, data: llamaLendData },
50128
50342
  { group: eulerGroup, data: eulerData },
50129
50343
  { group: aaveV4Group, data: aaveV4Data },
50130
50344
  { group: fluidGroup, data: fluidData },
@@ -50317,6 +50531,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50317
50531
  }
50318
50532
  parseTrackers(midnightGroup, midnightData.results, false);
50319
50533
  parseTrackers(tellerGroup, tellerData.results, false);
50534
+ parseTrackers(llamaLendGroup, llamaLendData.results, false);
50320
50535
  if (stalenessThresholdSeconds > 0) {
50321
50536
  const feedTimestamps = await feedTimestampsPromise;
50322
50537
  for (const [lender, assetMap] of Object.entries(feedTimestamps)) {
@@ -54808,6 +55023,38 @@ var readerAnkrRatio = (entry) => ({
54808
55023
  }
54809
55024
  });
54810
55025
 
55026
+ // src/vaults/lst/abis/binance.ts
55027
+ var WbethExchangeRateAbi = [
55028
+ {
55029
+ name: "exchangeRate",
55030
+ type: "function",
55031
+ stateMutability: "view",
55032
+ inputs: [],
55033
+ outputs: [{ type: "uint256" }]
55034
+ }
55035
+ ];
55036
+
55037
+ // src/vaults/lst/readers/binance.ts
55038
+ var readerBinanceWbeth = (entry) => ({
55039
+ calls: [
55040
+ { address: entry.address, name: "totalSupply", params: [] },
55041
+ { address: entry.address, name: "exchangeRate", params: [] }
55042
+ ],
55043
+ abis: [TotalSupplyAbi, WbethExchangeRateAbi],
55044
+ parse: ([supply, rate]) => {
55045
+ const totalSupply = toBigInt13(supply);
55046
+ const exchangeRate = toBigInt13(rate);
55047
+ if (totalSupply === void 0 || exchangeRate === void 0) {
55048
+ return void 0;
55049
+ }
55050
+ return {
55051
+ totalAssets: totalSupply * exchangeRate / ONE_E189,
55052
+ totalSupply,
55053
+ exchangeRate
55054
+ };
55055
+ }
55056
+ });
55057
+
54811
55058
  // src/vaults/lst/abis/core.ts
54812
55059
  var CoreEarnRateAbi = [
54813
55060
  {
@@ -54930,6 +55177,8 @@ var buildReader = (entry) => {
54930
55177
  return readerKelpRsEth(entry);
54931
55178
  case "swellGetRate":
54932
55179
  return readerSwellGetRate(entry);
55180
+ case "binanceWbeth":
55181
+ return readerBinanceWbeth(entry);
54933
55182
  case "stakewiseOsEth":
54934
55183
  return readerStakeWiseOsEth(entry);
54935
55184
  case "staderEthx":
@@ -55827,6 +56076,96 @@ var readerBenqi = {
55827
56076
  }
55828
56077
  };
55829
56078
 
56079
+ // src/vaults/lst/withdrawals/abis/binance.ts
56080
+ var BinanceUnwrapQueueAbi = [
56081
+ {
56082
+ name: "getUserWithdrawRequests",
56083
+ type: "function",
56084
+ stateMutability: "view",
56085
+ inputs: [{ type: "address", name: "recipient" }],
56086
+ outputs: [
56087
+ {
56088
+ type: "tuple[]",
56089
+ components: [
56090
+ { type: "address", name: "recipient" },
56091
+ { type: "uint256", name: "wbethAmount" },
56092
+ { type: "uint256", name: "ethAmount" },
56093
+ { type: "uint256", name: "triggerTime" },
56094
+ { type: "uint256", name: "claimTime" },
56095
+ { type: "bool", name: "allocated" }
56096
+ ]
56097
+ }
56098
+ ]
56099
+ },
56100
+ {
56101
+ // Currently 864000 (10 days). Admin-settable down to
56102
+ // `MIN_LOCK_TIME` = 172800 (2 days) — always read it, never hardcode.
56103
+ name: "lockTime",
56104
+ type: "function",
56105
+ stateMutability: "view",
56106
+ inputs: [],
56107
+ outputs: [{ type: "uint256" }]
56108
+ },
56109
+ {
56110
+ name: "claimWithdraw",
56111
+ type: "function",
56112
+ stateMutability: "nonpayable",
56113
+ inputs: [{ type: "uint256", name: "index" }],
56114
+ outputs: [{ type: "uint256" }]
56115
+ }
56116
+ ];
56117
+
56118
+ // src/vaults/lst/withdrawals/readers/binance.ts
56119
+ var readerBinanceWbeth2 = {
56120
+ fetch: async (user, multicallRetry, chainId, entry) => {
56121
+ if (!entry.withdrawalContract) return [];
56122
+ const res = await multicallRetry({
56123
+ chain: chainId,
56124
+ calls: [
56125
+ {
56126
+ address: entry.withdrawalContract,
56127
+ name: "getUserWithdrawRequests",
56128
+ params: [user]
56129
+ },
56130
+ {
56131
+ address: entry.withdrawalContract,
56132
+ name: "lockTime",
56133
+ params: []
56134
+ }
56135
+ ],
56136
+ abi: [BinanceUnwrapQueueAbi, BinanceUnwrapQueueAbi]
56137
+ });
56138
+ const reqs = res[0];
56139
+ const lockTime = toNumber(res[1]);
56140
+ if (!Array.isArray(reqs) || lockTime === void 0) return [];
56141
+ const out = [];
56142
+ for (let i = 0; i < reqs.length; i++) {
56143
+ const r = reqs[i];
56144
+ const triggerTime = toNumber(r.triggerTime);
56145
+ const ethAmount = toBigInt14(r.ethAmount);
56146
+ const wbethAmount = toBigInt14(r.wbethAmount);
56147
+ if (triggerTime === void 0 || ethAmount === void 0) continue;
56148
+ const readyAt = triggerTime + lockTime;
56149
+ const claimed = (toNumber(r.claimTime) ?? 0) > 0;
56150
+ const allocated = r.allocated === true;
56151
+ out.push({
56152
+ lst: entry.lst,
56153
+ brand: entry.brand,
56154
+ symbol: entry.symbol,
56155
+ // Positional — see note 1 above.
56156
+ requestId: String(i),
56157
+ amountUnderlying: ethAmount.toString(),
56158
+ shares: wbethAmount?.toString(),
56159
+ // Claimed requests are popped from the array, so this branch is
56160
+ // defensive only.
56161
+ status: claimed ? "claimed" : allocated ? computeStatus(readyAt) : "pending",
56162
+ readyAt
56163
+ });
56164
+ }
56165
+ return out;
56166
+ }
56167
+ };
56168
+
55830
56169
  // src/vaults/lst/withdrawals/abis/berapaw.ts
55831
56170
  var BeraPawForgeWithdrawalAbi = [
55832
56171
  {
@@ -57968,6 +58307,8 @@ var readerYieldNest = {
57968
58307
  // src/vaults/lst/withdrawals/readers/index.ts
57969
58308
  var buildWithdrawalReader = (entry) => {
57970
58309
  switch (entry.reader) {
58310
+ case "binanceWbethQueue":
58311
+ return readerBinanceWbeth2;
57971
58312
  case "lidoQueue":
57972
58313
  return readerLido;
57973
58314
  case "etherfiNft":
@@ -58033,6 +58374,20 @@ var buildWithdrawalReader = (entry) => {
58033
58374
  // src/vaults/lst/withdrawals/registry.ts
58034
58375
  var LST_WITHDRAWAL_REGISTRY = {
58035
58376
  "1": [
58377
+ {
58378
+ // wBETH — Binance's UnwrapTokenV1 queue, the SAME contract address
58379
+ // on Ethereum and BNB. Entered via `wBETH.requestWithdrawEth`;
58380
+ // `getUserWithdrawRequests(user)` enumerates open requests, and
58381
+ // `claimWithdraw(index)` takes the user's ARRAY POSITION (swap-and-pop,
58382
+ // so ids shift on every claim — never cache them). `lockTime()` is
58383
+ // 10 days today but is admin-settable down to 2, and the ETH owed is
58384
+ // frozen at request time, so the position stops earning meanwhile.
58385
+ lst: "0xa2e3356610840701bdf5611a53974510ae27e2e1",
58386
+ brand: "Binance",
58387
+ symbol: "wBETH",
58388
+ reader: "binanceWbethQueue",
58389
+ withdrawalContract: "0x79973d557cd9dd87eb61e250cc2572c990e20196"
58390
+ },
58036
58391
  // Ankr ankrETH — Ankr unstake queue; reader not yet implemented.
58037
58392
  {
58038
58393
  lst: "0xe95a203b1a91a908f9b9ce46459d101078c2c3cb",
@@ -58405,6 +58760,20 @@ var LST_WITHDRAWAL_REGISTRY = {
58405
58760
  }
58406
58761
  ],
58407
58762
  "56": [
58763
+ {
58764
+ // wBETH — Binance's UnwrapTokenV1 queue, the SAME contract address
58765
+ // on Ethereum and BNB. Entered via `wBETH.requestWithdrawEth`;
58766
+ // `getUserWithdrawRequests(user)` enumerates open requests, and
58767
+ // `claimWithdraw(index)` takes the user's ARRAY POSITION (swap-and-pop,
58768
+ // so ids shift on every claim — never cache them). `lockTime()` is
58769
+ // 10 days today but is admin-settable down to 2, and the ETH owed is
58770
+ // frozen at request time, so the position stops earning meanwhile.
58771
+ lst: "0xa2e3356610840701bdf5611a53974510ae27e2e1",
58772
+ brand: "Binance",
58773
+ symbol: "wBETH",
58774
+ reader: "binanceWbethQueue",
58775
+ withdrawalContract: "0x79973d557cd9dd87eb61e250cc2572c990e20196"
58776
+ },
58408
58777
  // Ankr ankrBNB — Ankr unstake queue; reader not yet implemented.
58409
58778
  {
58410
58779
  lst: "0x52f24a5e03aee338da5fd9df68d2b6fae1178827",