@1delta/margin-fetcher 5.0.28 → 5.0.29

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
@@ -21931,7 +21931,7 @@ async function fetchTellerMarkets(chainId) {
21931
21931
  }
21932
21932
  return null;
21933
21933
  };
21934
- const num15 = (i) => {
21934
+ const num16 = (i) => {
21935
21935
  const b = big18(i);
21936
21936
  return b === null ? null : Number(b);
21937
21937
  };
@@ -21941,9 +21941,9 @@ async function fetchTellerMarkets(chainId) {
21941
21941
  config,
21942
21942
  available: big18(base),
21943
21943
  committed: big18(base + 1),
21944
- minRateBps: num15(base + 2),
21944
+ minRateBps: num16(base + 2),
21945
21945
  collateralPerPrincipal: big18(base + 3),
21946
- maxLoanDuration: num15(base + 4),
21946
+ maxLoanDuration: num16(base + 4),
21947
21947
  marketId: big18(base + 5),
21948
21948
  totalAssets: big18(base + 6)
21949
21949
  };
@@ -22906,20 +22906,20 @@ async function fetchInverseMarkets(lender, chainId) {
22906
22906
  if (Object.keys(byAddr).length > 0) {
22907
22907
  const rows = markets.map((market) => {
22908
22908
  const m = byAddr[market.address.toLowerCase()];
22909
- const num15 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
22909
+ const num16 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
22910
22910
  return {
22911
22911
  market,
22912
- totalDebt: num15(m?.totalDebt),
22913
- dolaLiquidity: num15(m?.dolaLiquidity),
22914
- leftToBorrow: num15(m?.leftToBorrow),
22915
- price: num15(m?.price),
22912
+ totalDebt: num16(m?.totalDebt),
22913
+ dolaLiquidity: num16(m?.dolaLiquidity),
22914
+ leftToBorrow: num16(m?.leftToBorrow),
22915
+ price: num16(m?.price),
22916
22916
  borrowPaused: typeof m?.borrowPaused === "boolean" ? m.borrowPaused : null,
22917
- dailyBorrows: num15(m?.dailyBorrows),
22917
+ dailyBorrows: num16(m?.dailyBorrows),
22918
22918
  // The API serves it as a DECIMAL (`replenishmentIncentive: 0.1`),
22919
22919
  // unlike the on-chain bps — normalize here, and fall back to the
22920
22920
  // curated metadata value when the field is missing.
22921
22921
  replenishmentIncentiveBps: (() => {
22922
- const dec2 = num15(m?.replenishmentIncentive);
22922
+ const dec2 = num16(m?.replenishmentIncentive);
22923
22923
  if (dec2 !== null) return Math.round(dec2 * 1e4);
22924
22924
  const meta = Number(market.replenishmentIncentiveBps);
22925
22925
  return Number.isFinite(meta) ? meta : null;
@@ -66281,8 +66281,6 @@ function splitUid(uid) {
66281
66281
  if (!venue || !chainId || !ref) return void 0;
66282
66282
  return { venue, chainId, ref };
66283
66283
  }
66284
-
66285
- // src/earn/labels.ts
66286
66284
  var VENUE_KIND_LABELS = {
66287
66285
  lending: "Lending markets",
66288
66286
  vault: "Vaults"
@@ -66350,38 +66348,40 @@ var RATE_SOURCE_LABELS = {
66350
66348
  oracle: "Oracle",
66351
66349
  realized: "Realized"
66352
66350
  };
66353
- var VENUE_BRANDS = {
66354
- MORPHO_BLUE: "Morpho Blue",
66355
- MORPHO_MIDNIGHT: "Morpho Midnight",
66356
- FLUID: "Fluid",
66357
- GEARBOX_V3: "Gearbox V3",
66358
- AAVE_V4: "Aave V4",
66359
- AAVE_V3: "Aave V3",
66360
- AAVE_V2: "Aave V2",
66361
- SKY: "Sky",
66362
- USDD: "USDD",
66363
- LIQUITY_V2: "Liquity V2",
66364
- SILO_V2: "Silo V2",
66365
- SILO_V3: "Silo V3",
66366
- EXACTLY: "Exactly",
66367
- TELLER: "Teller",
66368
- TERM_FINANCE: "Term Finance",
66369
- TERMMAX: "TermMax",
66370
- LLAMALEND: "LlamaLend",
66371
- CURVANCE: "Curvance",
66372
- INVERSE: "Inverse",
66373
- FRANKENCOIN: "Frankencoin",
66374
- RIVER: "River",
66375
- RESUPPLY: "Resupply",
66376
- TANGENT: "Tangent",
66377
- DOLOMITE: "Dolomite",
66351
+ var SYNTHETIC_FAMILIES = ["AAVE_V4", "COMPOUND_V3", "SWAYLEND"];
66352
+ var FAMILY_KEYS = [
66353
+ .../* @__PURE__ */ new Set([
66354
+ ...Object.values(Lender),
66355
+ ...SYNTHETIC_FAMILIES
66356
+ ])
66357
+ ].sort((a, b) => a.length - b.length || a.localeCompare(b));
66358
+ var BRAND_OVERRIDES = {
66378
66359
  LISTA_DAO: "Lista",
66379
66360
  FLUX_FINANCE: "Flux",
66380
- COMPOUND_V2: "Compound V2",
66381
- COMPOUND_V3: "Compound V3",
66382
- EULER_V2: "Euler V2",
66383
- INIT: "Init"
66384
- };
66361
+ TERMMAX: "TermMax",
66362
+ LLAMALEND: "LlamaLend",
66363
+ USDD: "USDD",
66364
+ USDAF: "USDaf",
66365
+ DTRINITY: "dTRINITY",
66366
+ DFORCE: "dForce",
66367
+ OVIX: "0VIX",
66368
+ WE_PIGGY: "WePiggy",
66369
+ ZEROLEND: "ZeroLend",
66370
+ HYPERLEND: "HyperLend",
66371
+ HYPURRFI: "HypurrFi",
66372
+ HYPERYIELD: "HyperYield",
66373
+ LAYERBANK_V3: "LayerBank V3",
66374
+ TAKOTAKO: "TakoTako",
66375
+ SWAYLEND: "Swaylend",
66376
+ BENQI: "BENQI",
66377
+ YLDR: "YLDR",
66378
+ YEI: "YEI",
66379
+ RMM: "RMM",
66380
+ PAC: "PAC"
66381
+ };
66382
+ function titleCaseKey(key3) {
66383
+ return key3.split(/[_-]/).filter(Boolean).map((s) => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase()).join(" ");
66384
+ }
66385
66385
  var VAULT_PROVIDER_BRANDS = {
66386
66386
  fluid: "Fluid",
66387
66387
  gearbox: "Gearbox",
@@ -66405,21 +66405,23 @@ function isInstanceSegment(seg) {
66405
66405
  if (/^0X[0-9A-F]+$/i.test(seg)) return true;
66406
66406
  return seg.length >= 8 && /^[0-9A-F]+$/i.test(seg);
66407
66407
  }
66408
- function venueBrand(venue) {
66409
- if (venue.startsWith("vault.")) {
66410
- const provider = venue.slice("vault.".length);
66411
- return VAULT_PROVIDER_BRANDS[provider] ?? provider;
66408
+ function venueBrandKey(venue) {
66409
+ if (venue.startsWith(VAULT_VENUE_PREFIX)) return venue;
66410
+ const key3 = venue.toUpperCase();
66411
+ for (const family of FAMILY_KEYS) {
66412
+ if (key3 === family || key3.startsWith(family + "_")) return family;
66412
66413
  }
66413
- const segments = venue.split("_");
66414
+ const segments = key3.split("_");
66414
66415
  const cut = segments.findIndex(isInstanceSegment);
66415
- const family = (cut > 0 ? segments.slice(0, cut) : segments).join("_");
66416
- if (VENUE_BRANDS[family]) return VENUE_BRANDS[family];
66417
- let best;
66418
- for (const key3 of Object.keys(VENUE_BRANDS)) {
66419
- if (family.startsWith(key3) && (!best || key3.length > best.length))
66420
- best = key3;
66416
+ return (cut > 0 ? segments.slice(0, cut) : segments).join("_");
66417
+ }
66418
+ function venueBrand(venue) {
66419
+ if (venue.startsWith(VAULT_VENUE_PREFIX)) {
66420
+ const provider = venue.slice(VAULT_VENUE_PREFIX.length);
66421
+ return VAULT_PROVIDER_BRANDS[provider] ?? titleCaseKey(provider);
66421
66422
  }
66422
- return best ? VENUE_BRANDS[best] : family;
66423
+ const family = venueBrandKey(venue);
66424
+ return BRAND_OVERRIDES[family] ?? titleCaseKey(family);
66423
66425
  }
66424
66426
  var EARN_LABELS = {
66425
66427
  venueKind: VENUE_KIND_LABELS,
@@ -66458,6 +66460,21 @@ function isIlliquid(input) {
66458
66460
  if (input.liquidityUsd === void 0) return false;
66459
66461
  return input.liquidityUsd <= 0;
66460
66462
  }
66463
+ var CATEGORY_PROVIDERS = /* @__PURE__ */ new Set(["savings", "lst"]);
66464
+ function resolveEarnIdentity(venue, brand) {
66465
+ const isVault = venue.startsWith(VAULT_VENUE_PREFIX);
66466
+ const provider = isVault ? venue.slice(VAULT_VENUE_PREFIX.length) : venue;
66467
+ const providerBrand = venueBrand(venue);
66468
+ const key3 = venueBrandKey(venue);
66469
+ if (isVault && CATEGORY_PROVIDERS.has(provider)) {
66470
+ return { protocol: { key: key3, name: brand?.trim() || providerBrand } };
66471
+ }
66472
+ const name = brand?.trim();
66473
+ if (!name || name.toLowerCase() === providerBrand.toLowerCase()) {
66474
+ return { protocol: { key: key3, name: providerBrand } };
66475
+ }
66476
+ return { protocol: { key: key3, name: providerBrand }, curator: { name } };
66477
+ }
66461
66478
 
66462
66479
  // src/earn/normalize.ts
66463
66480
  function num12(v) {
@@ -66604,6 +66621,15 @@ function earnMarketFromVault(row, chainId, opts = {}) {
66604
66621
  venueKind: "vault",
66605
66622
  // Curator first (it names the actual operator), then the provider brand.
66606
66623
  brand: str5(row.curatorName) ?? venueBrand(vaultVenue(provider)),
66624
+ // What the vault is BUILT ON, kept apart from who runs it — see
66625
+ // `resolveEarnIdentity` for why this is not simply provider-vs-brand.
66626
+ ...withCuratorEntity(
66627
+ resolveEarnIdentity(
66628
+ vaultVenue(provider),
66629
+ str5(row.curatorName)
66630
+ ),
66631
+ str5(row.curatorEntity)
66632
+ ),
66607
66633
  name: str5(info.name) ?? str5(row.displayName) ?? str5(row.name),
66608
66634
  ref: address,
66609
66635
  logoURI: str5(info.logoURI) ?? str5(row.underlyingInfo?.asset?.logoURI),
@@ -66739,6 +66765,10 @@ function amount(raw, formatted, usd, decimals) {
66739
66765
  usd: num12(usd)
66740
66766
  };
66741
66767
  }
66768
+ function withCuratorEntity(id, entity) {
66769
+ if (!id.curator || !entity) return id;
66770
+ return { ...id, curator: { ...id.curator, entity } };
66771
+ }
66742
66772
  function sum(a, b) {
66743
66773
  if (a === void 0 && b === void 0) return void 0;
66744
66774
  return (a ?? 0) + (b ?? 0);
@@ -69675,6 +69705,10 @@ function earnMarketFromPool(row, fallbackChainId) {
69675
69705
  // The family brand ('Morpho Blue'), not the per-market key. The specific
69676
69706
  // market identity survives on `name`.
69677
69707
  brand: venueBrand(venue),
69708
+ // Same resolver as the vault half, so `protocol.key` means one thing
69709
+ // across the listing: the STABLE family key, never the per-market venue.
69710
+ // No lender publishes a curator today, hence the undefined.
69711
+ ...resolveEarnIdentity(venue, void 0),
69678
69712
  name: str5(row.name),
69679
69713
  // Never re-derived — the uid's third segment as the origin minted it.
69680
69714
  ref: marketUid.split(":")[2],
@@ -69953,6 +69987,191 @@ function supportsCancel(provider, meta) {
69953
69987
  return typeof meta.withdrawQueue === "string" && meta.withdrawQueue.length > 0;
69954
69988
  }
69955
69989
 
69956
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EARN_DESCRIPTIONS, EARN_LABELS, EMPTY_BALANCE, EXACTLY_LENDER_KEY, FRACTION_RATE_PROVIDERS, 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, MULTICALL_FAILURE, MaxParamThresholds, PASSTHROUGH_RATE_EPSILON, PENDLE_ASSETS_URL, PENDLE_CHAIN_IDS, PENDLE_MARKETS_URL, SDK_FRACTION_RATE_PROVIDERS, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_PROVIDER_PROFILE, VAULT_PROVIDER_TRAITS, VAULT_SHARE_PRICE_PROBE, VAULT_VENUE_PREFIX, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultEarnUid, buildVaultLookup, buildVaultTermSheet, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, clearPendleMarketsCache, 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, convertDssMarketsToResponse, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertFraxlendPairsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnMarketLabel, earnUidFromMarketUid, earnVenueKind, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchFraxlendPairs, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendleApiAssets, fetchPendleApiMarkets, fetchPendlePrices, fetchPendlePtMarkets, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, formatRaw, frankencoinKeyParts, frankencoinLenderKey, fraxlendAssetPerCollateral, fraxlendKeyParts, fraxlendLenderKey, 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, hasPendleMarkets, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, inverseKeyParts, inverseLenderKey, isBoundNeed, isFailedCall, isIlliquid, isLiveMarket as isLivePendleMarket, isStablecoinSymbol, isVaultVenue, isYearnV3, keySegmentToIlk, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseEarnUid, parseMergedResult, parseMulticallRpcResponses, parseExpirySeconds as parsePendleExpirySeconds, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resolveVaultProfileId, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, stampVaultClassification, stampVaultTermSheets, supplyDescription, supplyFindings, supplyHeadline, swapRoutedProvidersArePriceConsistent, 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, toVaultTermInput, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultTermInputFromEarnMarket, vaultTermInputFromSourceRow, vaultTraits, vaultVenue, venueBrand };
69990
+ // src/earn/positions.ts
69991
+ function buildLendingPositionUid(lender, chainId) {
69992
+ if (!lender || !chainId) {
69993
+ throw new Error(
69994
+ `Invalid lending positionUid parameters: lender=${lender}, chainId=${chainId}`
69995
+ );
69996
+ }
69997
+ if (isVaultVenue(lender)) {
69998
+ throw new Error(
69999
+ `Lender '${lender}' uses the reserved vault venue namespace`
70000
+ );
70001
+ }
70002
+ return `${lender}:${chainId}`;
70003
+ }
70004
+ function isVaultPosition(p) {
70005
+ return p.venueKind === "vault";
70006
+ }
70007
+ function isLendingPosition(p) {
70008
+ return p.venueKind === "lending";
70009
+ }
70010
+ function legEarnUid(marketUid) {
70011
+ if (!marketUid) return void 0;
70012
+ const parts = marketUid.split(":");
70013
+ if (parts.length !== 3 || parts.some((p) => !p)) return void 0;
70014
+ if (isVaultVenue(parts[0])) return void 0;
70015
+ return marketUid;
70016
+ }
70017
+ function num15(v) {
70018
+ const n = typeof v === "number" ? v : Number(v);
70019
+ return Number.isFinite(n) ? n : 0;
70020
+ }
70021
+ function legAsset(pos) {
70022
+ const asset = pos.underlyingInfo?.asset ?? {};
70023
+ const address = typeof asset.address === "string" ? asset.address.toLowerCase() : (
70024
+ // Fall back to the uid's third segment, which IS the underlying for
70025
+ // the default-format lenders and merely a harmless label for the rest.
70026
+ pos.marketUid?.split(":")[2] ?? ""
70027
+ );
70028
+ const decimals = typeof asset.decimals === "number" ? asset.decimals : void 0;
70029
+ const symbol = typeof asset.symbol === "string" ? asset.symbol : void 0;
70030
+ return { address, symbol, decimals };
70031
+ }
70032
+ function toLeg(pos) {
70033
+ const depositsUsd = num15(pos.depositsUSD);
70034
+ const debtUsd = num15(pos.debtUSD) + num15(pos.debtStableUSD);
70035
+ const hasSupply = depositsUsd !== 0 || num15(pos.deposits) !== 0;
70036
+ const hasDebt = debtUsd !== 0 || num15(pos.debt) !== 0 || num15(pos.debtStable) !== 0;
70037
+ return {
70038
+ earnUid: legEarnUid(pos.marketUid),
70039
+ marketUid: pos.marketUid,
70040
+ ...pos.loanId ? { loanId: pos.loanId } : {},
70041
+ asset: legAsset(pos),
70042
+ side: hasSupply && hasDebt ? "both" : hasDebt ? "borrow" : "supply",
70043
+ deposits: pos.deposits ?? "0",
70044
+ depositsUsd,
70045
+ debt: pos.debt ?? "0",
70046
+ debtUsd,
70047
+ collateralEnabled: pos.collateralEnabled ?? false,
70048
+ ...pos.withdrawable !== void 0 ? { withdrawable: pos.withdrawable } : {}
70049
+ };
70050
+ }
70051
+ function isCountable(leg) {
70052
+ return leg.loanId === void 0;
70053
+ }
70054
+ function earnPositionFromLenderEntry(entry) {
70055
+ const subs = entry.data ?? [];
70056
+ const subAccounts = subs.map((sub) => {
70057
+ const legs = (sub.positions ?? []).map(toLeg);
70058
+ const counted = legs.filter(isCountable);
70059
+ const suppliedUsd2 = counted.reduce((a, l) => a + l.depositsUsd, 0);
70060
+ const borrowedUsd2 = counted.reduce((a, l) => a + l.debtUsd, 0);
70061
+ return {
70062
+ accountId: sub.accountId,
70063
+ health: sub.health ?? null,
70064
+ suppliedUsd: suppliedUsd2,
70065
+ borrowedUsd: borrowedUsd2,
70066
+ netUsd: suppliedUsd2 - borrowedUsd2,
70067
+ legs
70068
+ };
70069
+ });
70070
+ const active = subAccounts.filter((s) => s.legs.length > 0 || s.netUsd !== 0);
70071
+ const crossMargin = active.length <= 1;
70072
+ const suppliedUsd = num15(entry.balanceData?.deposits);
70073
+ const borrowedUsd = num15(entry.balanceData?.debt);
70074
+ return {
70075
+ positionUid: buildLendingPositionUid(entry.lender, entry.chainId),
70076
+ chainId: entry.chainId,
70077
+ venue: entry.lender,
70078
+ venueKind: "lending",
70079
+ lender: entry.lender,
70080
+ account: entry.account,
70081
+ brand: entry.lenderInfo?.name,
70082
+ name: entry.lenderInfo?.name,
70083
+ ...entry.lenderInfo?.logoUri ? { logoURI: entry.lenderInfo.logoUri } : {},
70084
+ suppliedUsd,
70085
+ borrowedUsd,
70086
+ netUsd: num15(entry.balanceData?.nav),
70087
+ apr: num15(entry.aprData?.apr),
70088
+ depositApr: num15(entry.aprData?.depositApr),
70089
+ borrowApr: num15(entry.aprData?.borrowApr),
70090
+ // Only a cross-margin account HAS one health factor. Publishing the first
70091
+ // sub-account's as the row's would be a number about a different position.
70092
+ health: crossMargin ? active[0]?.health ?? null : null,
70093
+ leverage: num15(entry.leverage),
70094
+ crossMargin,
70095
+ legs: subAccounts.flatMap((s) => s.legs),
70096
+ subAccounts: active,
70097
+ ...entry.incomplete ? { incomplete: true } : {},
70098
+ ...entry.stale ? { stale: true, staleAgeMs: entry.staleAgeMs } : {}
70099
+ };
70100
+ }
70101
+ function vaultSharesToAssets(sharesRaw, meta) {
70102
+ if (sharesRaw === 0n) return 0n;
70103
+ const totalSupply = BigInt(meta.totalSupply || "0");
70104
+ if (totalSupply === 0n) return 0n;
70105
+ return sharesRaw * BigInt(meta.totalAssets || "0") / totalSupply;
70106
+ }
70107
+ function earnPositionFromVaultBalance(meta, chainId, input, format) {
70108
+ const assetsRaw = vaultSharesToAssets(input.sharesRaw, meta);
70109
+ const assetDecimals = meta.assetDecimals ?? meta.decimals;
70110
+ const assets = format(assetsRaw, assetDecimals);
70111
+ const priceUsd = input.priceUsd ?? 0;
70112
+ const suppliedUsd = priceUsd * parseFloat(assets);
70113
+ const market = input.market;
70114
+ const uid = buildVaultEarnUid(meta.provider, chainId, meta.address);
70115
+ return {
70116
+ positionUid: uid,
70117
+ earnUid: uid,
70118
+ chainId,
70119
+ venue: `vault.${meta.provider}`,
70120
+ venueKind: "vault",
70121
+ provider: meta.provider,
70122
+ vault: meta.address,
70123
+ // The catalogue's identity resolution (curator, brand, branded icon) beats
70124
+ // the raw share-token name where it resolved.
70125
+ name: market?.name ?? meta.name,
70126
+ ...market?.brand ? { brand: market.brand } : {},
70127
+ ...market?.logoURI ?? meta.logoURI ? { logoURI: market?.logoURI ?? meta.logoURI } : {},
70128
+ asset: {
70129
+ address: meta.underlying,
70130
+ ...market?.asset.symbol ? { symbol: market.asset.symbol } : {},
70131
+ decimals: assetDecimals,
70132
+ priceUsd
70133
+ },
70134
+ sharesRaw: input.sharesRaw.toString(),
70135
+ shares: format(input.sharesRaw, meta.decimals),
70136
+ assetsRaw: assetsRaw.toString(),
70137
+ assets,
70138
+ shareDecimals: meta.decimals,
70139
+ suppliedUsd,
70140
+ // A vault share is a supply-only instrument — there is no borrow leg to
70141
+ // report, and `0` here is a fact rather than a missing read.
70142
+ borrowedUsd: 0,
70143
+ netUsd: suppliedUsd,
70144
+ // For a vault the position's APR IS the venue's rate — there is no borrow
70145
+ // leg to net off, so unlike the lending half the two never diverge.
70146
+ ...market?.rate?.total !== void 0 ? { apr: market.rate.total } : {},
70147
+ ...market?.rate ? { rate: market.rate } : {},
70148
+ ...market?.exit ? { exit: market.exit } : {},
70149
+ ...market?.availability ? { availability: market.availability } : {},
70150
+ ...market?.capabilities ? { capabilities: market.capabilities } : {},
70151
+ ...meta.yieldProfile ? { yieldProfile: meta.yieldProfile } : {},
70152
+ ...meta.denomination ? { denomination: meta.denomination } : {}
70153
+ };
70154
+ }
70155
+ function earnPositionTotals(items) {
70156
+ let suppliedUsd = 0;
70157
+ let borrowedUsd = 0;
70158
+ let lendingUsd = 0;
70159
+ let vaultUsd = 0;
70160
+ for (const it of items) {
70161
+ suppliedUsd += it.suppliedUsd;
70162
+ borrowedUsd += it.borrowedUsd;
70163
+ if (it.venueKind === "vault") vaultUsd += it.netUsd;
70164
+ else lendingUsd += it.netUsd;
70165
+ }
70166
+ return {
70167
+ suppliedUsd,
70168
+ borrowedUsd,
70169
+ netUsd: suppliedUsd - borrowedUsd,
70170
+ lendingUsd,
70171
+ vaultUsd
70172
+ };
70173
+ }
70174
+
70175
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EARN_DESCRIPTIONS, EARN_LABELS, EMPTY_BALANCE, EXACTLY_LENDER_KEY, FRACTION_RATE_PROVIDERS, 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, MULTICALL_FAILURE, MaxParamThresholds, PASSTHROUGH_RATE_EPSILON, PENDLE_ASSETS_URL, PENDLE_CHAIN_IDS, PENDLE_MARKETS_URL, SDK_FRACTION_RATE_PROVIDERS, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_PROVIDER_PROFILE, VAULT_PROVIDER_TRAITS, VAULT_SHARE_PRICE_PROBE, VAULT_VENUE_PREFIX, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLendingPositionUid, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultEarnUid, buildVaultLookup, buildVaultTermSheet, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, clearPendleMarketsCache, 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, convertDssMarketsToResponse, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertFraxlendPairsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnMarketLabel, earnPositionFromLenderEntry, earnPositionFromVaultBalance, earnPositionTotals, earnUidFromMarketUid, earnVenueKind, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchFraxlendPairs, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendleApiAssets, fetchPendleApiMarkets, fetchPendlePrices, fetchPendlePtMarkets, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, formatRaw, frankencoinKeyParts, frankencoinLenderKey, fraxlendAssetPerCollateral, fraxlendKeyParts, fraxlendLenderKey, 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, hasPendleMarkets, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, inverseKeyParts, inverseLenderKey, isBoundNeed, isFailedCall, isIlliquid, isLendingPosition, isLiveMarket as isLivePendleMarket, isStablecoinSymbol, isVaultPosition, isVaultVenue, isYearnV3, keySegmentToIlk, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseEarnUid, parseMergedResult, parseMulticallRpcResponses, parseExpirySeconds as parsePendleExpirySeconds, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveEarnIdentity, resolveStCeloDepositGroup, resolveVaultProfileId, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, stampVaultClassification, stampVaultTermSheets, supplyDescription, supplyFindings, supplyHeadline, swapRoutedProvidersArePriceConsistent, 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, toVaultTermInput, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultSharesToAssets, vaultTermInputFromEarnMarket, vaultTermInputFromSourceRow, vaultTraits, vaultVenue, venueBrand, venueBrandKey };
69957
70176
  //# sourceMappingURL=index.js.map
69958
70177
  //# sourceMappingURL=index.js.map