@1delta/margin-fetcher 0.0.305 → 0.0.307

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
@@ -11413,7 +11413,9 @@ function createBaseTypeUserState(payload, lenderData, totalDeposits24h = 0, tota
11413
11413
  collateralAllActive += (userConfigForAsset?.collateralFactor ?? 1) * depositsUSDOracle;
11414
11414
  }
11415
11415
  depositInterest += depositRate * depositsUSD;
11416
- borrowInterest += debtStableUSD * stableBorrowRate + debtUSD * variableBorrowRate;
11416
+ const posStableRate = Number(pos.stableBorrowRate);
11417
+ const effStableBorrowRate = Number.isFinite(posStableRate) && posStableRate > 0 ? posStableRate : stableBorrowRate;
11418
+ borrowInterest += debtStableUSD * effStableBorrowRate + debtUSD * variableBorrowRate;
11417
11419
  }
11418
11420
  const nav = deposits - debt;
11419
11421
  const balanceData2 = {
@@ -23177,10 +23179,12 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
23177
23179
  };
23178
23180
  };
23179
23181
  let sumFixedRaw = 0n;
23182
+ let weightedAprNumerator = 0;
23180
23183
  for (const loan of brokerData.fixedLoans) {
23181
23184
  const trancheRaw = BigInt(loan.outstanding) + BigInt(loan.accruedInterest);
23182
23185
  sumFixedRaw += trancheRaw;
23183
23186
  const trancheToken = parseRawAmount(trancheRaw.toString(), loanDecimals);
23187
+ weightedAprNumerator += Number(trancheToken) * loan.apr;
23184
23188
  mkTermPosition(`${loanMarketUid}#${loan.posId}`, trancheToken, {
23185
23189
  loanId: loan.posId,
23186
23190
  termId: loan.termId,
@@ -23203,12 +23207,18 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
23203
23207
  dataForLoanAsset.debtStable = fixedToken;
23204
23208
  dataForLoanAsset.debtStableUSD = Number(fixedToken) * priceLoan;
23205
23209
  dataForLoanAsset.debtStableUSDOracle = Number(fixedToken) * oraclePriceLoan;
23210
+ const fixedTokenNum = Number(fixedToken);
23211
+ dataForLoanAsset.stableBorrowRate = fixedTokenNum > 0 ? (weightedAprNumerator / fixedTokenNum).toString() : "0";
23206
23212
  aggregateDebtToken = parseRawAmount(totalRaw.toString(), loanDecimals);
23207
23213
  if (dynRaw > 0n) {
23208
23214
  mkTermPosition(`${loanMarketUid}#dynamic`, dynToken, {
23209
23215
  loanId: LISTA_DYNAMIC_LOAN_ID,
23210
23216
  isDynamic: true,
23211
- debt: dynToken
23217
+ debt: dynToken,
23218
+ // the flexible loan accrues at the underlying Moolah market's variable borrow rate
23219
+ // (PERCENT). Expired fixed positions refinance into this dynamic loan, so without
23220
+ // this the migrated debt would (incorrectly) report a 0% borrow rate.
23221
+ apr: loanAssetMeta?.variableBorrowRate ?? 0
23212
23222
  });
23213
23223
  }
23214
23224
  }
@@ -38153,7 +38163,7 @@ function computeWeightedSupplyApy(strategies, totalAssetsRaw, feePercent, evkInd
38153
38163
  }
38154
38164
  if (weightedRay === ZERO) return 0;
38155
38165
  const apyRayPerAsset = weightedRay / totalAssets;
38156
- const grossPercent = Number(apyRayPerAsset) / RAY_TO_PERCENT3;
38166
+ const grossPercent = apyToAprPercent(Number(apyRayPerAsset) / RAY_TO_PERCENT3);
38157
38167
  const netPercent = grossPercent * (1 - feePercent / 100);
38158
38168
  return Number.isFinite(netPercent) ? netPercent : 0;
38159
38169
  }
@@ -38327,18 +38337,6 @@ async function fetchEulerEarnVaultsFromSubgraph(chainId, prices = {}, tokenList
38327
38337
  var EULER_DATA_API_BASE2 = "https://v3.euler.finance/v3";
38328
38338
  var API_TIMEOUT_MS = 1e4;
38329
38339
  var DETAIL_CONCURRENCY = 8;
38330
- var BLOCK_TIME_SEC = {
38331
- "1": 12,
38332
- "56": 0.75,
38333
- "130": 1,
38334
- "146": 0.5,
38335
- "8453": 2,
38336
- "1923": 2,
38337
- "42161": 0.25,
38338
- "43114": 2
38339
- };
38340
- var DEFAULT_BLOCK_TIME_SEC = 2;
38341
- var MAX_LAG_SECONDS = 30 * 60;
38342
38340
  function safeBigInt2(v) {
38343
38341
  if (v == null || v === "") return 0n;
38344
38342
  try {
@@ -38366,37 +38364,6 @@ async function getJson(url) {
38366
38364
  clearTimeout(timer);
38367
38365
  }
38368
38366
  }
38369
- async function isEulerEarnSubgraphStale(chainId, subgraphUrl) {
38370
- const [subHead, chainHead] = await Promise.all([
38371
- fetchSubgraphHead(subgraphUrl),
38372
- getEvmClientUniversal({ chain: chainId, rpcId: 0 }).getBlockNumber().then((b) => Number(b)).catch(() => null)
38373
- ]);
38374
- if (subHead == null || chainHead == null) return true;
38375
- const lagBlocks = chainHead - subHead;
38376
- if (lagBlocks <= 0) return false;
38377
- const lagSeconds = lagBlocks * (BLOCK_TIME_SEC[chainId] ?? DEFAULT_BLOCK_TIME_SEC);
38378
- return lagSeconds > MAX_LAG_SECONDS;
38379
- }
38380
- async function fetchSubgraphHead(subgraphUrl) {
38381
- const controller = new AbortController();
38382
- const timer = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
38383
- try {
38384
- const res = await fetch(subgraphUrl, {
38385
- method: "POST",
38386
- headers: { "Content-Type": "application/json" },
38387
- body: JSON.stringify({ query: "{ _meta { block { number } } }" }),
38388
- signal: controller.signal
38389
- });
38390
- if (!res.ok) return null;
38391
- const json = await res.json();
38392
- const n = json?.data?._meta?.block?.number;
38393
- return typeof n === "number" ? n : null;
38394
- } catch {
38395
- return null;
38396
- } finally {
38397
- clearTimeout(timer);
38398
- }
38399
- }
38400
38367
  function mapApiDetail(d, chainId, prices, tokenList) {
38401
38368
  const address = (d.address ?? "").toLowerCase();
38402
38369
  const underlying = (d.asset?.address ?? "").toLowerCase();
@@ -38498,20 +38465,21 @@ async function fetchEulerEarnVaultsFromApi(chainId, prices = {}, tokenList = {})
38498
38465
  // src/vaults/euler-earn/fetchPublic.ts
38499
38466
  var isNonEmpty = (v) => !!v && Object.keys(v).length > 0;
38500
38467
  var fetchEulerEarnVaults = async (chainId, prices = {}, tokenList = {}, multicallRetry) => {
38501
- const subgraphUrl = getEulerEarnSubgraphUrl(chainId);
38502
- if (!subgraphUrl) {
38503
- return await fetchEulerEarnVaultsFromApi(chainId, prices, tokenList) ?? {};
38504
- }
38505
- const [stale, subgraph] = await Promise.all([
38506
- isEulerEarnSubgraphStale(chainId, subgraphUrl).catch(() => false),
38507
- fetchEulerEarnVaultsFromSubgraph(chainId, prices, tokenList, multicallRetry).then((r) => ({ ok: true, data: r })).catch(() => ({ ok: false, data: void 0 }))
38508
- ]);
38509
- if (!stale && subgraph.ok && isNonEmpty(subgraph.data)) {
38510
- return subgraph.data;
38511
- }
38512
- const fromApi = await fetchEulerEarnVaultsFromApi(chainId, prices, tokenList);
38468
+ const fromApi = await fetchEulerEarnVaultsFromApi(
38469
+ chainId,
38470
+ prices,
38471
+ tokenList
38472
+ ).catch(() => void 0);
38513
38473
  if (isNonEmpty(fromApi)) return fromApi;
38514
- return subgraph.ok && subgraph.data ? subgraph.data : {};
38474
+ const subgraphUrl = getEulerEarnSubgraphUrl(chainId);
38475
+ if (!subgraphUrl) return fromApi ?? {};
38476
+ const fromSubgraph = await fetchEulerEarnVaultsFromSubgraph(
38477
+ chainId,
38478
+ prices,
38479
+ tokenList,
38480
+ multicallRetry
38481
+ ).catch(() => void 0);
38482
+ return isNonEmpty(fromSubgraph) ? fromSubgraph : fromApi ?? {};
38515
38483
  };
38516
38484
  var CHAIN_ID4 = "1";
38517
38485
  var SWBTC = "0x8db2350d78abc13f5673a411d4700bcf87864dde";