@1delta/margin-fetcher 5.0.90 → 5.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, isAddress, stringToHex, pad, encodeFunctionData, formatUnits, getAddress, decodeFunctionResult, decodeAbiParameters, toBytes, slice, concat, AbiEncodingLengthMismatchError, concatHex, parseAbiParameters, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-JUYF2XLF.js';
1
+ import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, isAddress, stringToHex, pad, encodeFunctionData, decodeFunctionResult, decodeAbiParameters, formatUnits, getAddress, toBytes, slice, concat, AbiEncodingLengthMismatchError, concatHex, parseAbiParameters, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-JUYF2XLF.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
4
  import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isCooler, isDssType, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, isCurvance, isFlyingTulip, isTwyne, isFraxlend, isAaveV4Type, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isCompoundV2Type, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isMorphoType, isUsdd, isSky, hasCrossMarginRisk, isEulerType, isInit, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isMorphoBlue, isAaveV2Type, isAaveV32Type, isAaveV3Type, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
@@ -10656,6 +10656,7 @@ var brokerAbi = parseAbi([
10656
10656
  ]);
10657
10657
  var BROKER_CACHE = {};
10658
10658
  var FIXED_TERMS_CACHE = {};
10659
+ var brokerUserCacheKey = (chainId, account, blockNumber) => `${chainId}:${account.toLowerCase()}:${blockNumber === void 0 ? "head" : blockNumber.toString()}`;
10659
10660
  var BROKER_USER_CACHE = {};
10660
10661
  var FIXED_TERMS_INFLIGHT = {};
10661
10662
  function toBytes32MarketId(key3) {
@@ -10820,11 +10821,11 @@ async function fetchListaFixedTerms(chainId, marketKeys, multicallRetry) {
10820
10821
  function getCachedListaFixedTerms(chainId, marketKey2) {
10821
10822
  return FIXED_TERMS_CACHE[chainId]?.[toBytes32MarketId(marketKey2)];
10822
10823
  }
10823
- async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs = Math.floor(Date.now() / 1e3), getClient = getEvmClient) {
10824
+ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs = Math.floor(Date.now() / 1e3), getClient = getEvmClient, blockNumber) {
10824
10825
  const brokers = await resolveListaBrokers(chainId, marketKeys, getClient);
10825
10826
  const ids = Object.keys(brokers);
10826
10827
  const out = {};
10827
- const cacheKey7 = `${chainId}:${account.toLowerCase()}`;
10828
+ const cacheKey7 = brokerUserCacheKey(chainId, account, blockNumber);
10828
10829
  BROKER_USER_CACHE[cacheKey7] = out;
10829
10830
  if (ids.length === 0) return out;
10830
10831
  try {
@@ -10858,7 +10859,11 @@ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs =
10858
10859
  }
10859
10860
  ];
10860
10861
  });
10861
- const results = await client.multicall({ allowFailure: true, contracts });
10862
+ const results = await client.multicall({
10863
+ allowFailure: true,
10864
+ contracts,
10865
+ ...blockNumber === void 0 ? {} : { blockNumber }
10866
+ });
10862
10867
  const now = BigInt(nowSecs);
10863
10868
  ids.forEach((id, marketIdx) => {
10864
10869
  const base = marketIdx * 4;
@@ -10931,8 +10936,8 @@ async function fetchListaBrokerUserData(chainId, account, marketKeys, nowSecs =
10931
10936
  }
10932
10937
  return out;
10933
10938
  }
10934
- function getCachedListaBrokerUserData(chainId, account, marketKey2) {
10935
- return BROKER_USER_CACHE[`${chainId}:${account.toLowerCase()}`]?.[toBytes32MarketId(marketKey2)];
10939
+ function getCachedListaBrokerUserData(chainId, account, marketKey2, blockNumber) {
10940
+ return BROKER_USER_CACHE[brokerUserCacheKey(chainId, account, blockNumber)]?.[toBytes32MarketId(marketKey2)];
10936
10941
  }
10937
10942
  var { chunk } = lodash;
10938
10943
  var MORPHO_LENS = {
@@ -10996,22 +11001,17 @@ var buildMorphoUserCallWithLens = (chainId, account, lender, marketsToQuery) =>
10996
11001
  ]
10997
11002
  }));
10998
11003
  };
10999
- var buildMorphoTypeUserCallWithLens = (chainId, account, lender, marketsToQuery, getClient) => {
11000
- return lender === Lender.MORPHO_BLUE ? buildMorphoUserCallWithLens(chainId, account, lender, marketsToQuery) : buildListaUserCallWithLens(
11001
- chainId,
11002
- account,
11003
- lender,
11004
- marketsToQuery,
11005
- getClient
11006
- );
11004
+ var buildMorphoTypeUserCallWithLens = (chainId, account, lender, marketsToQuery, opts) => {
11005
+ return lender === Lender.MORPHO_BLUE ? buildMorphoUserCallWithLens(chainId, account, lender, marketsToQuery) : buildListaUserCallWithLens(chainId, account, lender, marketsToQuery, opts);
11007
11006
  };
11008
- var buildListaUserCallWithLens = async (chainId, account, lender, marketsToQuery, getClient) => {
11007
+ var buildListaUserCallWithLens = async (chainId, account, lender, marketsToQuery, opts) => {
11009
11008
  await fetchListaBrokerUserData(
11010
11009
  chainId,
11011
11010
  account,
11012
11011
  marketsToQuery,
11013
11012
  void 0,
11014
- getClient
11013
+ opts?.getClient,
11014
+ opts?.blockNumber
11015
11015
  ).catch(() => ({}));
11016
11016
  const marketSlices = chunk(marketsToQuery, 100);
11017
11017
  return marketSlices.flatMap((marketsInChunk) => ({
@@ -12018,7 +12018,7 @@ function createSumerUserState(payload, lenderData, totalDeposits24h = 0, totalDe
12018
12018
  }
12019
12019
 
12020
12020
  // src/lending/user-data/utils/createMultiAccountStyleUserState.ts
12021
- function createMultiAccountTypeUserState(payload, lenderData, histData) {
12021
+ function createMultiAccountTypeUserState(payload, lenderData, histData, accountAddresses) {
12022
12022
  const positionKeys = Object.keys(payload.lendingPositions ?? {});
12023
12023
  let marketUids2 = getMarketUidsFromMeta(lenderData);
12024
12024
  const { chainId, account } = payload;
@@ -12094,7 +12094,10 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
12094
12094
  rewardApr: safeDivide(rewardDepositAccrual + rewardBorrowAccrual, nav),
12095
12095
  rewardDepositApr: safeDivide(rewardDepositAccrual, deposits),
12096
12096
  rewardBorrowApr: safeDivide(rewardBorrowAccrual, debt),
12097
- intrinsicApr: safeDivide(stakingDepositAccrual - stakingBorrowAccrual, nav),
12097
+ intrinsicApr: safeDivide(
12098
+ stakingDepositAccrual - stakingBorrowAccrual,
12099
+ nav
12100
+ ),
12098
12101
  intrinsicDepositApr: safeDivide(stakingDepositAccrual, deposits),
12099
12102
  intrinsicBorrowApr: safeDivide(stakingBorrowAccrual, debt),
12100
12103
  rewards: {}
@@ -12117,10 +12120,14 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
12117
12120
  withdrawable = String(pos.deposits);
12118
12121
  } else {
12119
12122
  const withdrawableUSD = Math.max(creditLine / bcf, 0);
12120
- withdrawable = String(Math.min(withdrawableUSD / price2, Number(pos.deposits)));
12123
+ withdrawable = String(
12124
+ Math.min(withdrawableUSD / price2, Number(pos.deposits))
12125
+ );
12121
12126
  }
12122
12127
  if (withdrawLiquidity != null) {
12123
- withdrawable = String(Math.min(Number(withdrawable), withdrawLiquidity));
12128
+ withdrawable = String(
12129
+ Math.min(Number(withdrawable), withdrawLiquidity)
12130
+ );
12124
12131
  }
12125
12132
  let borrowable;
12126
12133
  if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
@@ -12134,7 +12141,9 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
12134
12141
  }
12135
12142
  pos.withdrawable = withdrawable;
12136
12143
  pos.borrowable = borrowable;
12137
- pos.underlyingInfo = buildUnderlyingInfo(lenderData[marketUid]);
12144
+ pos.underlyingInfo = buildUnderlyingInfo(
12145
+ lenderData[marketUid]
12146
+ );
12138
12147
  } else if ((deposits > 0 || debt > 0) && flags?.borrowingEnabled && !flags?.isFrozen && !config?.debtDisabled) {
12139
12148
  let borrowable = String(Math.max(creditLine / bf, 0) / price2);
12140
12149
  if (borrowLiquidity != null) {
@@ -12156,6 +12165,7 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
12156
12165
  }
12157
12166
  data.push({
12158
12167
  accountId: posId,
12168
+ ...accountAddresses?.[posId] ? { accountAddress: accountAddresses[posId] } : {},
12159
12169
  health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
12160
12170
  borrowCapacityUSD: creditLine,
12161
12171
  userConfig,
@@ -12173,6 +12183,27 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
12173
12183
  data
12174
12184
  };
12175
12185
  }
12186
+
12187
+ // src/lending/user-data/utils/readContext.ts
12188
+ var blockNumberFromTag = (blockTag) => {
12189
+ if (blockTag === void 0 || blockTag === null) return void 0;
12190
+ if (typeof blockTag === "bigint") return blockTag;
12191
+ if (typeof blockTag === "number")
12192
+ return Number.isInteger(blockTag) && blockTag >= 0 ? BigInt(blockTag) : void 0;
12193
+ const s = blockTag.trim();
12194
+ if (!/^(0x[0-9a-fA-F]+|\d+)$/.test(s)) return void 0;
12195
+ try {
12196
+ return BigInt(s);
12197
+ } catch {
12198
+ return void 0;
12199
+ }
12200
+ };
12201
+ var blockKey = (opts) => opts?.blockNumber === void 0 ? "head" : opts.blockNumber.toString();
12202
+ var discoveryMulticall = (params, opts) => multicallRetryUniversal({
12203
+ ...params,
12204
+ ...opts?.blockNumber === void 0 ? {} : { blockNumber: opts.blockNumber },
12205
+ ...opts?.rpcOverrides === void 0 ? {} : { overrides: opts.rpcOverrides }
12206
+ });
12176
12207
  var isFixedTermLender = (lender) => isMidnight(lender) || isTerm(lender) || isTermMax(lender) || isTeller(lender) || isExactly(lender);
12177
12208
  function positionUnitKind(lenderKey, p) {
12178
12209
  const hasShares = p.depositShares !== void 0 || p.debtShares !== void 0;
@@ -30471,6 +30502,166 @@ var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields,
30471
30502
  }
30472
30503
  return { ...onChainRes, ...apiRes };
30473
30504
  };
30505
+ var marketKeysOf = (params) => Array.isArray(params) ? params : void 0;
30506
+ var subAccountsOf = (params) => params === void 0 || Array.isArray(params) ? void 0 : params;
30507
+ function organizeUserQueries(queries) {
30508
+ const morphos = queries.filter((q) => isMorphoType(q.lender));
30509
+ const gearbox = queries.filter((q) => isGearboxV3(q.lender));
30510
+ const midnight = queries.filter((q) => isMidnight(q.lender));
30511
+ const term = queries.filter((q) => isTerm(q.lender));
30512
+ const exactly = queries.filter((q) => isExactly(q.lender));
30513
+ const liquity = queries.filter((q) => isLiquityFamily(q.lender));
30514
+ const river = queries.filter((q) => isRiver(q.lender));
30515
+ const teller = queries.filter((q) => isTeller(q.lender));
30516
+ const termMax = queries.filter((q) => isTermMax(q.lender));
30517
+ const usdd = queries.filter((q) => isUsdd(q.lender));
30518
+ const sky = queries.filter((q) => isSky(q.lender));
30519
+ const llamaLend = queries.filter((q) => isLlamaLend(q.lender));
30520
+ const siloV2 = queries.filter((q) => isSiloV2Type(q.lender));
30521
+ const siloV3 = queries.filter((q) => isSiloV3Type(q.lender));
30522
+ const frankencoin = queries.filter((q) => isFrankencoin(q.lender));
30523
+ if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0 && sky.length === 0 && frankencoin.length === 0 && llamaLend.length === 0 && siloV2.length === 0 && siloV3.length === 0)
30524
+ return queries;
30525
+ const others = queries.filter(
30526
+ (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isDssType(q.lender) && !isFrankencoin(q.lender) && !isLlamaLend(q.lender) && !isSiloV2Type(q.lender) && !isSiloV3Type(q.lender)
30527
+ );
30528
+ const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
30529
+ const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
30530
+ const result = [...others];
30531
+ if (morphoBlue.length > 0) {
30532
+ result.push({
30533
+ lender: Lender.MORPHO_BLUE,
30534
+ account: morphoBlue[0].account,
30535
+ params: morphoBlue.map((p) => p.lender),
30536
+ assets: void 0
30537
+ });
30538
+ }
30539
+ if (moolah.length > 0) {
30540
+ result.push({
30541
+ lender: Lender.LISTA_DAO,
30542
+ account: moolah[0].account,
30543
+ params: moolah.map((p) => p.lender),
30544
+ assets: void 0
30545
+ });
30546
+ }
30547
+ if (gearbox.length > 0) {
30548
+ result.push({
30549
+ lender: Lender.GEARBOX_V3,
30550
+ account: gearbox[0].account,
30551
+ params: gearbox.map((p) => p.lender),
30552
+ assets: void 0
30553
+ });
30554
+ }
30555
+ if (midnight.length > 0) {
30556
+ result.push({
30557
+ lender: Lender.MORPHO_MIDNIGHT,
30558
+ account: midnight[0].account,
30559
+ params: midnight.map((p) => p.lender),
30560
+ assets: void 0
30561
+ });
30562
+ }
30563
+ if (term.length > 0) {
30564
+ result.push({
30565
+ lender: Lender.TERM_FINANCE,
30566
+ account: term[0].account,
30567
+ params: term.map((p) => p.lender),
30568
+ assets: void 0
30569
+ });
30570
+ }
30571
+ if (exactly.length > 0) {
30572
+ result.push({
30573
+ lender: Lender.EXACTLY,
30574
+ account: exactly[0].account,
30575
+ params: exactly.map((p) => p.lender),
30576
+ assets: void 0
30577
+ });
30578
+ }
30579
+ if (river.length > 0) {
30580
+ result.push({
30581
+ lender: Lender.RIVER,
30582
+ account: river[0].account,
30583
+ params: river.map((p) => p.lender),
30584
+ assets: void 0
30585
+ });
30586
+ }
30587
+ if (frankencoin.length > 0) {
30588
+ result.push({
30589
+ lender: Lender.FRANKENCOIN,
30590
+ account: frankencoin[0].account,
30591
+ params: frankencoin.map((p) => p.lender),
30592
+ assets: void 0
30593
+ });
30594
+ }
30595
+ if (usdd.length > 0) {
30596
+ result.push({
30597
+ lender: Lender.USDD,
30598
+ account: usdd[0].account,
30599
+ params: usdd.map((p) => p.lender),
30600
+ assets: void 0
30601
+ });
30602
+ }
30603
+ if (sky.length > 0) {
30604
+ result.push({
30605
+ lender: Lender.SKY,
30606
+ account: sky[0].account,
30607
+ params: sky.map((p) => p.lender),
30608
+ assets: void 0
30609
+ });
30610
+ }
30611
+ if (siloV2.length > 0) {
30612
+ result.push({
30613
+ lender: "SILO_V2",
30614
+ account: siloV2[0].account,
30615
+ params: siloV2.map((p) => p.lender),
30616
+ assets: void 0
30617
+ });
30618
+ }
30619
+ if (siloV3.length > 0) {
30620
+ result.push({
30621
+ lender: "SILO_V3",
30622
+ account: siloV3[0].account,
30623
+ params: siloV3.map((p) => p.lender),
30624
+ assets: void 0
30625
+ });
30626
+ }
30627
+ if (llamaLend.length > 0) {
30628
+ result.push({
30629
+ lender: Lender.LLAMALEND,
30630
+ account: llamaLend[0].account,
30631
+ params: llamaLend.map((p) => p.lender),
30632
+ assets: void 0
30633
+ });
30634
+ }
30635
+ if (teller.length > 0) {
30636
+ result.push({
30637
+ lender: Lender.TELLER,
30638
+ account: teller[0].account,
30639
+ params: teller.map((p) => p.lender),
30640
+ assets: void 0
30641
+ });
30642
+ }
30643
+ if (termMax.length > 0) {
30644
+ result.push({
30645
+ lender: Lender.TERMMAX,
30646
+ account: termMax[0].account,
30647
+ params: termMax.map((p) => p.lender),
30648
+ assets: void 0
30649
+ });
30650
+ }
30651
+ if (liquity.length > 0) {
30652
+ for (const base of LIQUITY_FAMILY_LENDERS) {
30653
+ const members = liquity.filter((q) => q.lender.startsWith(base));
30654
+ if (members.length === 0) continue;
30655
+ result.push({
30656
+ lender: base,
30657
+ account: members[0].account,
30658
+ params: members.map((p) => p.lender),
30659
+ assets: void 0
30660
+ });
30661
+ }
30662
+ }
30663
+ return result;
30664
+ }
30474
30665
 
30475
30666
  // src/lending/user-data/aave-v2-type/userCallBuild.ts
30476
30667
  var getBaseAaveV2Calls = (chainId, account, lender, assetsToQuery) => {
@@ -31840,7 +32031,7 @@ var buildExactlyUserCall = (chainId, _lender, account) => {
31840
32031
  var OWNER_INDEX_PROBE_COUNT = 8;
31841
32032
  var CACHE_TTL_MS = 5 * 6e4;
31842
32033
  var discoveryCache = /* @__PURE__ */ new Map();
31843
- async function discoverViaLens(chainId, branches, zappers, account) {
32034
+ async function discoverViaLens(chainId, branches, zappers, account, opts) {
31844
32035
  const lens = getPositionLensFor(chainId, LENS_FAMILY.LIQUITY);
31845
32036
  if (!lens) return void 0;
31846
32037
  const payload = encodeAbiParameters(
@@ -31866,18 +32057,21 @@ async function discoverViaLens(chainId, branches, zappers, account) {
31866
32057
  );
31867
32058
  let blobs;
31868
32059
  try {
31869
- const res = await multicallRetryUniversal({
31870
- chain: chainId,
31871
- calls: [
31872
- {
31873
- address: lens,
31874
- name: "getUserData",
31875
- params: [[{ family: LENS_FAMILY.LIQUITY, payload }], account]
31876
- }
31877
- ],
31878
- abi: PositionLensAbi,
31879
- allowFailure: true
31880
- });
32060
+ const res = await discoveryMulticall(
32061
+ {
32062
+ chain: chainId,
32063
+ calls: [
32064
+ {
32065
+ address: lens,
32066
+ name: "getUserData",
32067
+ params: [[{ family: LENS_FAMILY.LIQUITY, payload }], account]
32068
+ }
32069
+ ],
32070
+ abi: PositionLensAbi,
32071
+ allowFailure: true
32072
+ },
32073
+ opts
32074
+ );
31881
32075
  blobs = res?.[0];
31882
32076
  } catch {
31883
32077
  return void 0;
@@ -31899,9 +32093,11 @@ async function discoverViaLens(chainId, branches, zappers, account) {
31899
32093
  }
31900
32094
  return perBranch;
31901
32095
  }
31902
- var cacheKey = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
31903
- var getCachedLiquityTroves = (chainId, lender, account) => {
31904
- const hit = discoveryCache.get(cacheKey(chainId, lender, account));
32096
+ var cacheKey = (chainId, lender, account, block = "head") => `${chainId}:${lender}:${account.toLowerCase()}:${block}`;
32097
+ var getCachedLiquityTroves = (chainId, lender, account, opts) => {
32098
+ const hit = discoveryCache.get(
32099
+ cacheKey(chainId, lender, account, blockKey(opts))
32100
+ );
31905
32101
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS) return void 0;
31906
32102
  return hit;
31907
32103
  };
@@ -31946,38 +32142,53 @@ function liquityCandidateTroveIds(account, zappers) {
31946
32142
  return ids;
31947
32143
  }
31948
32144
  var liquityBranchCallCount = (branch, troveCount) => troveCount * 2 + 4 + (branch.collSurplusPool ? 1 : 0);
31949
- var buildLiquityUserCall = async (chainId, lender, account) => {
32145
+ var buildLiquityUserCall = async (chainId, lender, account, opts) => {
31950
32146
  const cfg = liquityConfigFor(lender, chainId);
31951
32147
  const branches = liquityBranchesByChain(lender, chainId);
31952
32148
  if (!cfg || branches.length === 0) return [];
31953
32149
  const zappers = cfg.zappers ?? [];
31954
- let perBranch = await discoverViaLens(chainId, branches, zappers, account);
32150
+ let perBranch = await discoverViaLens(
32151
+ chainId,
32152
+ branches,
32153
+ zappers,
32154
+ account,
32155
+ opts
32156
+ );
31955
32157
  if (!perBranch) {
31956
- perBranch = await discoverByProbing(chainId, branches, zappers, account);
32158
+ perBranch = await discoverByProbing(
32159
+ chainId,
32160
+ branches,
32161
+ zappers,
32162
+ account,
32163
+ opts
32164
+ );
31957
32165
  if (!perBranch) return [];
31958
32166
  }
31959
- discoveryCache.set(cacheKey(chainId, lender, account), {
32167
+ discoveryCache.set(cacheKey(chainId, lender, account, blockKey(opts)), {
31960
32168
  perBranch,
31961
32169
  at: Date.now()
31962
32170
  });
31963
32171
  return buildDataPhaseCalls(branches, perBranch, account);
31964
32172
  };
31965
- async function discoverByProbing(chainId, branches, zappers, account) {
32173
+ async function discoverByProbing(chainId, branches, zappers, account, opts) {
31966
32174
  const candidates = liquityCandidateTroveIds(account, zappers);
31967
32175
  let statuses = [];
31968
32176
  try {
31969
- statuses = await multicallRetryUniversal({
31970
- chain: chainId,
31971
- calls: branches.flatMap(
31972
- (b) => candidates.map((id) => ({
31973
- address: b.troveManager,
31974
- name: "getTroveStatus",
31975
- params: [id]
31976
- }))
31977
- ),
31978
- abi: LiquityTroveManagerAbi,
31979
- allowFailure: true
31980
- });
32177
+ statuses = await discoveryMulticall(
32178
+ {
32179
+ chain: chainId,
32180
+ calls: branches.flatMap(
32181
+ (b) => candidates.map((id) => ({
32182
+ address: b.troveManager,
32183
+ name: "getTroveStatus",
32184
+ params: [id]
32185
+ }))
32186
+ ),
32187
+ abi: LiquityTroveManagerAbi,
32188
+ allowFailure: true
32189
+ },
32190
+ opts
32191
+ );
31981
32192
  } catch {
31982
32193
  return void 0;
31983
32194
  }
@@ -32289,19 +32500,22 @@ var DISCOVERY_TTL_MS = 6e4;
32289
32500
  var SNAPSHOT_CHUNK = 12;
32290
32501
  var rosterCache3 = /* @__PURE__ */ new Map();
32291
32502
  var discoveryCache2 = /* @__PURE__ */ new Map();
32292
- var rosterKey = (chainId, lender) => `${chainId}:${lender}`;
32293
- var discoveryKey = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
32294
- var getCachedResupplyDiscovery = (chainId, lender, account) => discoveryCache2.get(discoveryKey(chainId, lender, account));
32295
- var fetchRoster = async (chainId, lender, registry, allowlist2) => {
32296
- const cached = rosterCache3.get(rosterKey(chainId, lender));
32503
+ var rosterKey = (chainId, lender, block = "head") => `${chainId}:${lender}:${block}`;
32504
+ var discoveryKey = (chainId, lender, account, block = "head") => `${chainId}:${lender}:${account.toLowerCase()}:${block}`;
32505
+ var getCachedResupplyDiscovery = (chainId, lender, account, opts) => discoveryCache2.get(discoveryKey(chainId, lender, account, blockKey(opts)));
32506
+ var fetchRoster = async (chainId, lender, registry, allowlist2, opts) => {
32507
+ const cached = rosterCache3.get(rosterKey(chainId, lender, blockKey(opts)));
32297
32508
  if (cached && Date.now() - cached.at < ROSTER_TTL_MS) return cached;
32298
32509
  let addresses = [];
32299
- const [raw] = await multicallRetryUniversal({
32300
- chain: chainId,
32301
- calls: [{ address: registry, name: "getAllPairAddresses", params: [] }],
32302
- abi: ResupplyRegistryAbi,
32303
- allowFailure: true
32304
- });
32510
+ const [raw] = await discoveryMulticall(
32511
+ {
32512
+ chain: chainId,
32513
+ calls: [{ address: registry, name: "getAllPairAddresses", params: [] }],
32514
+ abi: ResupplyRegistryAbi,
32515
+ allowFailure: true
32516
+ },
32517
+ opts
32518
+ );
32305
32519
  if (Array.isArray(raw)) {
32306
32520
  addresses = raw.filter(
32307
32521
  (a) => typeof a === "string" && a.startsWith("0x")
@@ -32313,42 +32527,48 @@ var fetchRoster = async (chainId, lender, registry, allowlist2) => {
32313
32527
  }
32314
32528
  if (addresses.length === 0) {
32315
32529
  const empty = { pairs: [], at: Date.now() };
32316
- rosterCache3.set(rosterKey(chainId, lender), empty);
32530
+ rosterCache3.set(rosterKey(chainId, lender, blockKey(opts)), empty);
32317
32531
  return empty;
32318
32532
  }
32319
- const cols = await multicallRetryUniversal({
32320
- chain: chainId,
32321
- calls: addresses.map((pair) => ({
32322
- address: pair,
32323
- name: "collateral",
32324
- params: []
32325
- })),
32326
- abi: addresses.map(() => ResupplyPairAbi),
32327
- allowFailure: true
32328
- });
32533
+ const cols = await discoveryMulticall(
32534
+ {
32535
+ chain: chainId,
32536
+ calls: addresses.map((pair) => ({
32537
+ address: pair,
32538
+ name: "collateral",
32539
+ params: []
32540
+ })),
32541
+ abi: addresses.map(() => ResupplyPairAbi),
32542
+ allowFailure: true
32543
+ },
32544
+ opts
32545
+ );
32329
32546
  const pairs = addresses.map((pair, i) => ({ pair, collateral: cols[i] })).filter(
32330
32547
  (p) => typeof p.collateral === "string" && p.collateral.startsWith("0x")
32331
32548
  );
32332
32549
  const roster = { pairs, at: Date.now() };
32333
- rosterCache3.set(rosterKey(chainId, lender), roster);
32550
+ rosterCache3.set(rosterKey(chainId, lender, blockKey(opts)), roster);
32334
32551
  return roster;
32335
32552
  };
32336
- var discoverPositions = async (chainId, pairs, account) => {
32553
+ var discoverPositions = async (chainId, pairs, account, opts) => {
32337
32554
  const active = [];
32338
32555
  for (let i = 0; i < pairs.length; i += SNAPSHOT_CHUNK) {
32339
32556
  const slice2 = pairs.slice(i, i + SNAPSHOT_CHUNK);
32340
32557
  let res = [];
32341
32558
  try {
32342
- res = await multicallRetryUniversal({
32343
- chain: chainId,
32344
- calls: slice2.map((p) => ({
32345
- address: p.pair,
32346
- name: "getUserSnapshot",
32347
- params: [account]
32348
- })),
32349
- abi: slice2.map(() => ResupplyPairAbi),
32350
- allowFailure: true
32351
- });
32559
+ res = await discoveryMulticall(
32560
+ {
32561
+ chain: chainId,
32562
+ calls: slice2.map((p) => ({
32563
+ address: p.pair,
32564
+ name: "getUserSnapshot",
32565
+ params: [account]
32566
+ })),
32567
+ abi: slice2.map(() => ResupplyPairAbi),
32568
+ allowFailure: true
32569
+ },
32570
+ opts
32571
+ );
32352
32572
  } catch {
32353
32573
  continue;
32354
32574
  }
@@ -32363,9 +32583,9 @@ var discoverPositions = async (chainId, pairs, account) => {
32363
32583
  }
32364
32584
  return active;
32365
32585
  };
32366
- var buildResupplyUserCall = async (chainId, lender, account) => {
32586
+ var buildResupplyUserCall = async (chainId, lender, account, opts) => {
32367
32587
  const cfg = resupplyConfigFor(lender, chainId);
32368
- const key3 = discoveryKey(chainId, lender, account);
32588
+ const key3 = discoveryKey(chainId, lender, account, blockKey(opts));
32369
32589
  const stash = (positions2) => discoveryCache2.set(key3, { positions: positions2, at: Date.now() });
32370
32590
  if (!cfg?.registry) {
32371
32591
  stash([]);
@@ -32373,7 +32593,13 @@ var buildResupplyUserCall = async (chainId, lender, account) => {
32373
32593
  }
32374
32594
  let roster;
32375
32595
  try {
32376
- roster = await fetchRoster(chainId, lender, cfg.registry, cfg.pairAllowlist);
32596
+ roster = await fetchRoster(
32597
+ chainId,
32598
+ lender,
32599
+ cfg.registry,
32600
+ cfg.pairAllowlist,
32601
+ opts
32602
+ );
32377
32603
  } catch {
32378
32604
  return [];
32379
32605
  }
@@ -32382,7 +32608,7 @@ var buildResupplyUserCall = async (chainId, lender, account) => {
32382
32608
  return [];
32383
32609
  }
32384
32610
  const cachedDiscovery = discoveryCache2.get(key3);
32385
- const positions = cachedDiscovery && Date.now() - cachedDiscovery.at < DISCOVERY_TTL_MS ? cachedDiscovery.positions : await discoverPositions(chainId, roster.pairs, account);
32611
+ const positions = cachedDiscovery && Date.now() - cachedDiscovery.at < DISCOVERY_TTL_MS ? cachedDiscovery.positions : await discoverPositions(chainId, roster.pairs, account, opts);
32386
32612
  stash(positions);
32387
32613
  if (positions.length === 0) return [];
32388
32614
  return positions.flatMap(({ pair, collateral }) => [
@@ -32470,19 +32696,22 @@ var CURVANCE_MARKET_READS = 2;
32470
32696
  var CURVANCE_READS_PER_TOKEN = 4;
32471
32697
  var rosterCache4 = /* @__PURE__ */ new Map();
32472
32698
  var discoveryCache3 = /* @__PURE__ */ new Map();
32473
- var rosterKey2 = (chainId, lender) => `${chainId}:${lender}`;
32474
- var discoveryKey2 = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
32475
- var getCachedCurvanceDiscovery = (chainId, lender, account) => discoveryCache3.get(discoveryKey2(chainId, lender, account));
32476
- var fetchRoster2 = async (chainId, lender, centralRegistry, allowlist2) => {
32477
- const cached = rosterCache4.get(rosterKey2(chainId, lender));
32699
+ var rosterKey2 = (chainId, lender, block = "head") => `${chainId}:${lender}:${block}`;
32700
+ var discoveryKey2 = (chainId, lender, account, block = "head") => `${chainId}:${lender}:${account.toLowerCase()}:${block}`;
32701
+ var getCachedCurvanceDiscovery = (chainId, lender, account, opts) => discoveryCache3.get(discoveryKey2(chainId, lender, account, blockKey(opts)));
32702
+ var fetchRoster2 = async (chainId, lender, centralRegistry, allowlist2, opts) => {
32703
+ const cached = rosterCache4.get(rosterKey2(chainId, lender, blockKey(opts)));
32478
32704
  if (cached && Date.now() - cached.at < ROSTER_TTL_MS2) return cached;
32479
32705
  let managers = [];
32480
- const [raw] = await multicallRetryUniversal({
32481
- chain: chainId,
32482
- calls: [{ address: centralRegistry, name: "marketManagers", params: [] }],
32483
- abi: CurvanceCentralRegistryAbi,
32484
- allowFailure: true
32485
- });
32706
+ const [raw] = await discoveryMulticall(
32707
+ {
32708
+ chain: chainId,
32709
+ calls: [{ address: centralRegistry, name: "marketManagers", params: [] }],
32710
+ abi: CurvanceCentralRegistryAbi,
32711
+ allowFailure: true
32712
+ },
32713
+ opts
32714
+ );
32486
32715
  if (Array.isArray(raw)) {
32487
32716
  managers = raw.filter(
32488
32717
  (a) => typeof a === "string" && a.startsWith("0x")
@@ -32494,19 +32723,22 @@ var fetchRoster2 = async (chainId, lender, centralRegistry, allowlist2) => {
32494
32723
  }
32495
32724
  if (managers.length === 0) {
32496
32725
  const empty = { markets: [], at: Date.now() };
32497
- rosterCache4.set(rosterKey2(chainId, lender), empty);
32726
+ rosterCache4.set(rosterKey2(chainId, lender, blockKey(opts)), empty);
32498
32727
  return empty;
32499
32728
  }
32500
- const listed = await multicallRetryUniversal({
32501
- chain: chainId,
32502
- calls: managers.map((mm) => ({
32503
- address: mm,
32504
- name: "queryTokensListed",
32505
- params: []
32506
- })),
32507
- abi: managers.map(() => CurvanceMarketManagerAbi),
32508
- allowFailure: true
32509
- });
32729
+ const listed = await discoveryMulticall(
32730
+ {
32731
+ chain: chainId,
32732
+ calls: managers.map((mm) => ({
32733
+ address: mm,
32734
+ name: "queryTokensListed",
32735
+ params: []
32736
+ })),
32737
+ abi: managers.map(() => CurvanceMarketManagerAbi),
32738
+ allowFailure: true
32739
+ },
32740
+ opts
32741
+ );
32510
32742
  const withTokens = managers.map((marketManager, i) => ({
32511
32743
  marketManager,
32512
32744
  addresses: Array.isArray(listed[i]) ? listed[i].filter(
@@ -32518,16 +32750,19 @@ var fetchRoster2 = async (chainId, lender, centralRegistry, allowlist2) => {
32518
32750
  );
32519
32751
  let assets = [];
32520
32752
  try {
32521
- assets = await multicallRetryUniversal({
32522
- chain: chainId,
32523
- calls: flat.map((f) => ({
32524
- address: f.cToken,
32525
- name: "asset",
32526
- params: []
32527
- })),
32528
- abi: flat.map(() => CurvanceCTokenAbi),
32529
- allowFailure: true
32530
- });
32753
+ assets = await discoveryMulticall(
32754
+ {
32755
+ chain: chainId,
32756
+ calls: flat.map((f) => ({
32757
+ address: f.cToken,
32758
+ name: "asset",
32759
+ params: []
32760
+ })),
32761
+ abi: flat.map(() => CurvanceCTokenAbi),
32762
+ allowFailure: true
32763
+ },
32764
+ opts
32765
+ );
32531
32766
  } catch {
32532
32767
  assets = [];
32533
32768
  }
@@ -32546,26 +32781,29 @@ var fetchRoster2 = async (chainId, lender, centralRegistry, allowlist2) => {
32546
32781
  })).filter((t) => t.asset !== "")
32547
32782
  })).filter((m) => m.cTokens.length > 0);
32548
32783
  const roster = { markets, at: Date.now() };
32549
- rosterCache4.set(rosterKey2(chainId, lender), roster);
32784
+ rosterCache4.set(rosterKey2(chainId, lender, blockKey(opts)), roster);
32550
32785
  return roster;
32551
32786
  };
32552
- var discoverPositions2 = async (chainId, markets, account) => {
32787
+ var discoverPositions2 = async (chainId, markets, account, opts) => {
32553
32788
  const CHUNK = 15;
32554
32789
  const active = [];
32555
32790
  for (let i = 0; i < markets.length; i += CHUNK) {
32556
32791
  const slice2 = markets.slice(i, i + CHUNK);
32557
32792
  let res = [];
32558
32793
  try {
32559
- res = await multicallRetryUniversal({
32560
- chain: chainId,
32561
- calls: slice2.map((m) => ({
32562
- address: m.marketManager,
32563
- name: "assetsOf",
32564
- params: [account]
32565
- })),
32566
- abi: slice2.map(() => CurvanceMarketManagerAbi),
32567
- allowFailure: true
32568
- });
32794
+ res = await discoveryMulticall(
32795
+ {
32796
+ chain: chainId,
32797
+ calls: slice2.map((m) => ({
32798
+ address: m.marketManager,
32799
+ name: "assetsOf",
32800
+ params: [account]
32801
+ })),
32802
+ abi: slice2.map(() => CurvanceMarketManagerAbi),
32803
+ allowFailure: true
32804
+ },
32805
+ opts
32806
+ );
32569
32807
  } catch {
32570
32808
  continue;
32571
32809
  }
@@ -32584,9 +32822,9 @@ var discoverPositions2 = async (chainId, markets, account) => {
32584
32822
  }
32585
32823
  return active;
32586
32824
  };
32587
- var buildCurvanceUserCall = async (chainId, lender, account) => {
32825
+ var buildCurvanceUserCall = async (chainId, lender, account, opts) => {
32588
32826
  const cfg = curvanceConfigFor(lender, chainId);
32589
- const key3 = discoveryKey2(chainId, lender, account);
32827
+ const key3 = discoveryKey2(chainId, lender, account, blockKey(opts));
32590
32828
  const stash = (positions2) => discoveryCache3.set(key3, { positions: positions2, at: Date.now() });
32591
32829
  if (!cfg?.centralRegistry) {
32592
32830
  stash([]);
@@ -32598,7 +32836,8 @@ var buildCurvanceUserCall = async (chainId, lender, account) => {
32598
32836
  chainId,
32599
32837
  lender,
32600
32838
  cfg.centralRegistry,
32601
- cfg.marketAllowlist
32839
+ cfg.marketAllowlist,
32840
+ opts
32602
32841
  );
32603
32842
  } catch {
32604
32843
  return [];
@@ -32608,7 +32847,7 @@ var buildCurvanceUserCall = async (chainId, lender, account) => {
32608
32847
  return [];
32609
32848
  }
32610
32849
  const cached = discoveryCache3.get(key3);
32611
- const positions = cached && Date.now() - cached.at < DISCOVERY_TTL_MS2 ? cached.positions : await discoverPositions2(chainId, roster.markets, account);
32850
+ const positions = cached && Date.now() - cached.at < DISCOVERY_TTL_MS2 ? cached.positions : await discoverPositions2(chainId, roster.markets, account, opts);
32612
32851
  stash(positions);
32613
32852
  if (positions.length === 0) return [];
32614
32853
  return positions.flatMap((p) => [
@@ -32634,46 +32873,54 @@ var buildCurvanceUserCall = async (chainId, lender, account) => {
32634
32873
  var DISCOVERY_TTL_MS3 = 6e4;
32635
32874
  var TWYNE_READS_PER_VAULT = 7;
32636
32875
  var discoveryCache4 = /* @__PURE__ */ new Map();
32637
- var discoveryKey3 = (chainId, lender, account) => `${chainId}:${lender}:${account.toLowerCase()}`;
32638
- function getCachedTwyneDiscovery(chainId, lender, account) {
32639
- return discoveryCache4.get(discoveryKey3(chainId, lender, account));
32876
+ var discoveryKey3 = (chainId, lender, account, block = "head") => `${chainId}:${lender}:${account.toLowerCase()}:${block}`;
32877
+ function getCachedTwyneDiscovery(chainId, lender, account, opts) {
32878
+ return discoveryCache4.get(
32879
+ discoveryKey3(chainId, lender, account, blockKey(opts))
32880
+ );
32640
32881
  }
32641
32882
  var lower2 = (a) => String(a).toLowerCase();
32642
32883
  var isAddress4 = (v) => typeof v === "string" && /^0x[0-9a-fA-F]{40}$/.test(v);
32643
- async function discover(chainId, lender, account) {
32644
- const key3 = discoveryKey3(chainId, lender, account);
32884
+ async function discover(chainId, lender, account, opts) {
32885
+ const key3 = discoveryKey3(chainId, lender, account, blockKey(opts));
32645
32886
  const cached = discoveryCache4.get(key3);
32646
32887
  if (cached && Date.now() - cached.at < DISCOVERY_TTL_MS3) return cached;
32647
32888
  const cfg = twyneConfigFor(lender, chainId);
32648
32889
  const empty = { vaults: [], at: Date.now() };
32649
32890
  if (!cfg?.collateralVaultFactory) return empty;
32650
- const [listRaw] = await multicallRetryUniversal({
32651
- chain: chainId,
32652
- calls: [
32653
- {
32654
- address: cfg.collateralVaultFactory,
32655
- name: "getCollateralVaults",
32656
- args: [account]
32657
- }
32658
- ],
32659
- abi: TwyneCollateralVaultFactoryAbi,
32660
- allowFailure: true
32661
- });
32891
+ const [listRaw] = await discoveryMulticall(
32892
+ {
32893
+ chain: chainId,
32894
+ calls: [
32895
+ {
32896
+ address: cfg.collateralVaultFactory,
32897
+ name: "getCollateralVaults",
32898
+ args: [account]
32899
+ }
32900
+ ],
32901
+ abi: TwyneCollateralVaultFactoryAbi,
32902
+ allowFailure: true
32903
+ },
32904
+ opts
32905
+ );
32662
32906
  const created = Array.isArray(listRaw) ? listRaw.filter(isAddress4).map(lower2) : [];
32663
32907
  if (created.length === 0) {
32664
32908
  discoveryCache4.set(key3, empty);
32665
32909
  return empty;
32666
32910
  }
32667
- const refs = await multicallRetryUniversal({
32668
- chain: chainId,
32669
- calls: created.flatMap((v) => [
32670
- { address: v, name: "intermediateVault", args: [] },
32671
- { address: v, name: "targetAsset", args: [] },
32672
- { address: v, name: "borrower", args: [] }
32673
- ]),
32674
- abi: TwyneCollateralVaultAbi,
32675
- allowFailure: true
32676
- });
32911
+ const refs = await discoveryMulticall(
32912
+ {
32913
+ chain: chainId,
32914
+ calls: created.flatMap((v) => [
32915
+ { address: v, name: "intermediateVault", args: [] },
32916
+ { address: v, name: "targetAsset", args: [] },
32917
+ { address: v, name: "borrower", args: [] }
32918
+ ]),
32919
+ abi: TwyneCollateralVaultAbi,
32920
+ allowFailure: true
32921
+ },
32922
+ opts
32923
+ );
32677
32924
  const queried = twyneKeyParts(lender);
32678
32925
  const known = new Map(
32679
32926
  (twyneChainData(lender, chainId)?.markets ?? []).filter(
@@ -32702,19 +32949,24 @@ async function discover(chainId, lender, account) {
32702
32949
  });
32703
32950
  });
32704
32951
  const receipts = [
32705
- ...new Set(vaults.map((v) => v.collateralAsset).filter((a) => !!a))
32952
+ ...new Set(
32953
+ vaults.map((v) => v.collateralAsset).filter((a) => !!a)
32954
+ )
32706
32955
  ];
32707
32956
  if (receipts.length > 0) {
32708
- const scales = await multicallRetryUniversal({
32709
- chain: chainId,
32710
- calls: receipts.map((address) => ({
32711
- address,
32712
- name: "convertToAssets",
32713
- args: [10n ** 18n]
32714
- })),
32715
- abi: TwyneATokenWrapperAbi,
32716
- allowFailure: true
32717
- });
32957
+ const scales = await discoveryMulticall(
32958
+ {
32959
+ chain: chainId,
32960
+ calls: receipts.map((address) => ({
32961
+ address,
32962
+ name: "convertToAssets",
32963
+ args: [10n ** 18n]
32964
+ })),
32965
+ abi: TwyneATokenWrapperAbi,
32966
+ allowFailure: true
32967
+ },
32968
+ opts
32969
+ );
32718
32970
  const byReceipt = /* @__PURE__ */ new Map();
32719
32971
  receipts.forEach((address, i) => {
32720
32972
  const v = scales[i];
@@ -32730,8 +32982,8 @@ async function discover(chainId, lender, account) {
32730
32982
  discoveryCache4.set(key3, result);
32731
32983
  return result;
32732
32984
  }
32733
- async function buildTwyneUserCall(chainId, lender, account) {
32734
- const { vaults } = await discover(chainId, lender, account);
32985
+ async function buildTwyneUserCall(chainId, lender, account, opts) {
32986
+ const { vaults } = await discover(chainId, lender, account, opts);
32735
32987
  if (vaults.length === 0) return [];
32736
32988
  return vaults.flatMap(({ vault }) => [
32737
32989
  { address: vault, name: "totalAssetsDepositedOrReserved", args: [] },
@@ -32747,9 +32999,11 @@ var DSS_CALLS_PER_CDP = 1;
32747
32999
  var MAX_CDP_WALK = 64;
32748
33000
  var CACHE_TTL_MS2 = 5 * 6e4;
32749
33001
  var discoveryCache5 = /* @__PURE__ */ new Map();
32750
- var cacheKey2 = (lender, chainId, account) => `${lender}:${chainId}:${account.toLowerCase()}`;
32751
- var getCachedDssCdps = (lender, chainId, account) => {
32752
- const hit = discoveryCache5.get(cacheKey2(lender, chainId, account));
33002
+ var cacheKey2 = (lender, chainId, account, block = "head") => `${lender}:${chainId}:${account.toLowerCase()}:${block}`;
33003
+ var getCachedDssCdps = (lender, chainId, account, opts) => {
33004
+ const hit = discoveryCache5.get(
33005
+ cacheKey2(lender, chainId, account, blockKey(opts))
33006
+ );
32753
33007
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
32754
33008
  return hit;
32755
33009
  };
@@ -32762,10 +33016,10 @@ var big7 = (v) => {
32762
33016
  return 0n;
32763
33017
  };
32764
33018
  var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
32765
- var buildDssUserCall = async (chainId, lender, account) => {
33019
+ var buildDssUserCall = async (chainId, lender, account, opts) => {
32766
33020
  const cfg = dssConfigFor(lender, chainId);
32767
33021
  const markets = dssChainData(lender, chainId)?.markets ?? [];
32768
- const stash = (d) => discoveryCache5.set(cacheKey2(lender, chainId, account), d);
33022
+ const stash = (d) => discoveryCache5.set(cacheKey2(lender, chainId, account, blockKey(opts)), d);
32769
33023
  if (!cfg || markets.length === 0) {
32770
33024
  stash({ cdps: [], ilks: [], at: Date.now() });
32771
33025
  return [];
@@ -32774,28 +33028,34 @@ var buildDssUserCall = async (chainId, lender, account) => {
32774
33028
  const zero2 = "0x0000000000000000000000000000000000000000";
32775
33029
  const owners = [];
32776
33030
  try {
32777
- const [rawCount, rawFirst, rawProxy] = await multicallRetryUniversal({
32778
- chain: chainId,
32779
- abi: [...UsddCdpManagerAbi, ...UsddProxyRegistryAbi],
32780
- calls: [
32781
- { address: cfg.cdpManager, name: "count", params: [account] },
32782
- { address: cfg.cdpManager, name: "first", params: [account] },
32783
- { address: cfg.proxyRegistry, name: "proxies", params: [account] }
32784
- ],
32785
- allowFailure: false
32786
- });
32787
- owners.push({ owner: account, count: big7(rawCount), cursor: big7(rawFirst) });
32788
- const proxy = String(rawProxy ?? zero2);
32789
- if (proxy.toLowerCase() !== zero2) {
32790
- const [pCount, pFirst] = await multicallRetryUniversal({
33031
+ const [rawCount, rawFirst, rawProxy] = await discoveryMulticall(
33032
+ {
32791
33033
  chain: chainId,
32792
- abi: UsddCdpManagerAbi,
33034
+ abi: [...UsddCdpManagerAbi, ...UsddProxyRegistryAbi],
32793
33035
  calls: [
32794
- { address: cfg.cdpManager, name: "count", params: [proxy] },
32795
- { address: cfg.cdpManager, name: "first", params: [proxy] }
33036
+ { address: cfg.cdpManager, name: "count", params: [account] },
33037
+ { address: cfg.cdpManager, name: "first", params: [account] },
33038
+ { address: cfg.proxyRegistry, name: "proxies", params: [account] }
32796
33039
  ],
32797
33040
  allowFailure: false
32798
- });
33041
+ },
33042
+ opts
33043
+ );
33044
+ owners.push({ owner: account, count: big7(rawCount), cursor: big7(rawFirst) });
33045
+ const proxy = String(rawProxy ?? zero2);
33046
+ if (proxy.toLowerCase() !== zero2) {
33047
+ const [pCount, pFirst] = await discoveryMulticall(
33048
+ {
33049
+ chain: chainId,
33050
+ abi: UsddCdpManagerAbi,
33051
+ calls: [
33052
+ { address: cfg.cdpManager, name: "count", params: [proxy] },
33053
+ { address: cfg.cdpManager, name: "first", params: [proxy] }
33054
+ ],
33055
+ allowFailure: false
33056
+ },
33057
+ opts
33058
+ );
32799
33059
  owners.push({ owner: proxy, count: big7(pCount), cursor: big7(pFirst) });
32800
33060
  }
32801
33061
  } catch {
@@ -32819,16 +33079,19 @@ var buildDssUserCall = async (chainId, lender, account) => {
32819
33079
  );
32820
33080
  }
32821
33081
  for (let i = 0; i < steps && cursor !== 0n; i++) {
32822
- const [urn, ilk32, link] = await multicallRetryUniversal({
32823
- chain: chainId,
32824
- abi: UsddCdpManagerAbi,
32825
- calls: [
32826
- { address: cfg.cdpManager, name: "urns", params: [cursor] },
32827
- { address: cfg.cdpManager, name: "ilks", params: [cursor] },
32828
- { address: cfg.cdpManager, name: "list", params: [cursor] }
32829
- ],
32830
- allowFailure: false
32831
- });
33082
+ const [urn, ilk32, link] = await discoveryMulticall(
33083
+ {
33084
+ chain: chainId,
33085
+ abi: UsddCdpManagerAbi,
33086
+ calls: [
33087
+ { address: cfg.cdpManager, name: "urns", params: [cursor] },
33088
+ { address: cfg.cdpManager, name: "ilks", params: [cursor] },
33089
+ { address: cfg.cdpManager, name: "list", params: [cursor] }
33090
+ ],
33091
+ allowFailure: false
33092
+ },
33093
+ opts
33094
+ );
32832
33095
  let ilk = "";
32833
33096
  try {
32834
33097
  ilk = hexToString(ilk32, { size: 32 }).replace(/[\s\0]+$/g, "");
@@ -32931,9 +33194,11 @@ var buildFrankencoinUserCall = async (chainId, lender, account) => {
32931
33194
  }
32932
33195
  return calls;
32933
33196
  };
33197
+
33198
+ // src/lending/user-data/teller/lens.ts
32934
33199
  var ROW_BYTES2 = 117;
32935
33200
  var usesTellerLens = (chainId) => getPositionLensFor(chainId, LENS_FAMILY.TELLER) !== void 0;
32936
- async function discoverTellerBidsViaLens(chainId, tellerV2, account) {
33201
+ async function discoverTellerBidsViaLens(chainId, tellerV2, account, opts) {
32937
33202
  const lens = getPositionLensFor(chainId, LENS_FAMILY.TELLER);
32938
33203
  if (!lens || !tellerV2) return void 0;
32939
33204
  const payload = encodeAbiParameters(parseAbiParameters("address, uint256"), [
@@ -32942,18 +33207,21 @@ async function discoverTellerBidsViaLens(chainId, tellerV2, account) {
32942
33207
  ]);
32943
33208
  let blob;
32944
33209
  try {
32945
- const res = await multicallRetryUniversal({
32946
- chain: chainId,
32947
- calls: [
32948
- {
32949
- address: lens,
32950
- name: "getUserData",
32951
- params: [[{ family: LENS_FAMILY.TELLER, payload }], account]
32952
- }
32953
- ],
32954
- abi: PositionLensAbi,
32955
- allowFailure: true
32956
- });
33210
+ const res = await discoveryMulticall(
33211
+ {
33212
+ chain: chainId,
33213
+ calls: [
33214
+ {
33215
+ address: lens,
33216
+ name: "getUserData",
33217
+ params: [[{ family: LENS_FAMILY.TELLER, payload }], account]
33218
+ }
33219
+ ],
33220
+ abi: PositionLensAbi,
33221
+ allowFailure: true
33222
+ },
33223
+ opts
33224
+ );
32957
33225
  const blobs = res?.[0];
32958
33226
  if (!Array.isArray(blobs) || blobs.length !== 1) return void 0;
32959
33227
  blob = blobs[0];
@@ -32981,9 +33249,9 @@ async function discoverTellerBidsViaLens(chainId, tellerV2, account) {
32981
33249
  var TELLER_CALLS_PER_BID = 4;
32982
33250
  var CACHE_TTL_MS3 = 5 * 6e4;
32983
33251
  var discoveryCache7 = /* @__PURE__ */ new Map();
32984
- var cacheKey4 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
32985
- var getCachedTellerBids = (chainId, account) => {
32986
- const hit = discoveryCache7.get(cacheKey4(chainId, account));
33252
+ var cacheKey4 = (chainId, account, block = "head") => `${chainId}:${account.toLowerCase()}:${block}`;
33253
+ var getCachedTellerBids = (chainId, account, opts) => {
33254
+ const hit = discoveryCache7.get(cacheKey4(chainId, account, blockKey(opts)));
32987
33255
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS3) return void 0;
32988
33256
  return hit;
32989
33257
  };
@@ -32999,7 +33267,7 @@ var toBigints = (arr) => {
32999
33267
  }
33000
33268
  return out;
33001
33269
  };
33002
- var buildTellerUserCall = async (chainId, _lender, account) => {
33270
+ var buildTellerUserCall = async (chainId, _lender, account, opts) => {
33003
33271
  const proto = tellerConfigByChain(chainId);
33004
33272
  const pools = tellerPoolsByChain(chainId);
33005
33273
  if (!proto?.tellerV2 || !proto?.collateralManager || pools.length === 0) {
@@ -33011,7 +33279,8 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
33011
33279
  const viaLens = await discoverTellerBidsViaLens(
33012
33280
  chainId,
33013
33281
  proto.tellerV2,
33014
- account
33282
+ account,
33283
+ opts
33015
33284
  );
33016
33285
  if (viaLens) {
33017
33286
  const keptLens = [];
@@ -33019,7 +33288,7 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
33019
33288
  const pool = poolByAddrEarly.get(b.lender.toLowerCase());
33020
33289
  if (pool) keptLens.push({ bidId: b.bidId, pool });
33021
33290
  }
33022
- discoveryCache7.set(cacheKey4(chainId, account), {
33291
+ discoveryCache7.set(cacheKey4(chainId, account, blockKey(opts)), {
33023
33292
  bids: keptLens,
33024
33293
  at: Date.now()
33025
33294
  });
@@ -33028,40 +33297,49 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
33028
33297
  }
33029
33298
  let ids = [];
33030
33299
  try {
33031
- const res = await multicallRetryUniversal({
33032
- chain: chainId,
33033
- calls: [
33034
- {
33035
- address: proto.tellerV2,
33036
- name: "getBorrowerActiveLoanIds",
33037
- params: [account]
33038
- }
33039
- ],
33040
- abi: TellerV2Abi,
33041
- allowFailure: true
33042
- });
33300
+ const res = await discoveryMulticall(
33301
+ {
33302
+ chain: chainId,
33303
+ calls: [
33304
+ {
33305
+ address: proto.tellerV2,
33306
+ name: "getBorrowerActiveLoanIds",
33307
+ params: [account]
33308
+ }
33309
+ ],
33310
+ abi: TellerV2Abi,
33311
+ allowFailure: true
33312
+ },
33313
+ opts
33314
+ );
33043
33315
  ids = toBigints(res?.[0]);
33044
33316
  } catch {
33045
33317
  return [];
33046
33318
  }
33047
33319
  if (ids.length === 0) {
33048
- discoveryCache7.set(cacheKey4(chainId, account), { bids: [], at: Date.now() });
33320
+ discoveryCache7.set(cacheKey4(chainId, account, blockKey(opts)), {
33321
+ bids: [],
33322
+ at: Date.now()
33323
+ });
33049
33324
  return [];
33050
33325
  }
33051
33326
  const poolByAddr = /* @__PURE__ */ new Map();
33052
33327
  for (const p of pools) poolByAddr.set(p.pool.toLowerCase(), p);
33053
33328
  let lenders = [];
33054
33329
  try {
33055
- lenders = await multicallRetryUniversal({
33056
- chain: chainId,
33057
- calls: ids.map((id) => ({
33058
- address: proto.tellerV2,
33059
- name: "getLoanLender",
33060
- params: [id]
33061
- })),
33062
- abi: TellerV2Abi,
33063
- allowFailure: true
33064
- });
33330
+ lenders = await discoveryMulticall(
33331
+ {
33332
+ chain: chainId,
33333
+ calls: ids.map((id) => ({
33334
+ address: proto.tellerV2,
33335
+ name: "getLoanLender",
33336
+ params: [id]
33337
+ })),
33338
+ abi: TellerV2Abi,
33339
+ allowFailure: true
33340
+ },
33341
+ opts
33342
+ );
33065
33343
  } catch {
33066
33344
  return [];
33067
33345
  }
@@ -33072,7 +33350,10 @@ var buildTellerUserCall = async (chainId, _lender, account) => {
33072
33350
  const pool = poolByAddr.get(lenderAddr);
33073
33351
  if (pool) kept.push({ bidId: id, pool });
33074
33352
  });
33075
- discoveryCache7.set(cacheKey4(chainId, account), { bids: kept, at: Date.now() });
33353
+ discoveryCache7.set(cacheKey4(chainId, account, blockKey(opts)), {
33354
+ bids: kept,
33355
+ at: Date.now()
33356
+ });
33076
33357
  return buildTellerDataPhase(proto, kept);
33077
33358
  };
33078
33359
  function buildTellerDataPhase(proto, kept, _account) {
@@ -33164,7 +33445,7 @@ var buildTermMaxUserCall = async (chainId, _lender, account) => {
33164
33445
  };
33165
33446
 
33166
33447
  // src/lending/user-data/fetch-balances/prepare.ts
33167
- async function buildUserCall(chainId, lender, account, params, getClient) {
33448
+ async function buildUserCall(chainId, lender, account, params, opts) {
33168
33449
  if (isAaveV4Type(lender)) return buildAaveV4UserCall(chainId, lender, account);
33169
33450
  if (isAaveV2Type(lender)) return buildAaveV2UserCall(chainId, lender, account);
33170
33451
  if (isAaveV3Type(lender)) return buildAaveV3UserCall(chainId, lender, account);
@@ -33174,16 +33455,17 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
33174
33455
  chainId,
33175
33456
  account,
33176
33457
  lender,
33177
- params,
33178
- getClient
33458
+ marketKeysOf(params) ?? [],
33459
+ opts
33179
33460
  );
33180
33461
  if (isMidnight(lender)) return buildMidnightUserCall(chainId, lender, account);
33181
33462
  if (isTerm(lender)) return buildTermUserCall(chainId, lender, account);
33182
33463
  if (isExactly(lender)) return buildExactlyUserCall(chainId, lender, account);
33183
33464
  if (isLiquityFamily(lender))
33184
- return buildLiquityUserCall(chainId, lender, account);
33465
+ return buildLiquityUserCall(chainId, lender, account, opts);
33185
33466
  if (isRiver(lender)) return buildRiverUserCall(chainId, lender, account);
33186
- if (isTeller(lender)) return buildTellerUserCall(chainId, lender, account);
33467
+ if (isTeller(lender))
33468
+ return buildTellerUserCall(chainId, lender, account, opts);
33187
33469
  if (isTermMax(lender)) return buildTermMaxUserCall(chainId, lender, account);
33188
33470
  if (isInverse(lender)) return buildInverseUserCall(chainId, lender, account);
33189
33471
  if (isCooler(lender)) return buildCoolerUserCall(chainId, lender, account);
@@ -33191,11 +33473,13 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
33191
33473
  return buildFlyingTulipUserCall(chainId, lender, account);
33192
33474
  if (isLlamaLend(lender))
33193
33475
  return buildLlamaLendUserCall(chainId, lender, account);
33194
- if (isResupply(lender)) return buildResupplyUserCall(chainId, lender, account);
33476
+ if (isResupply(lender))
33477
+ return buildResupplyUserCall(chainId, lender, account, opts);
33195
33478
  if (isFraxlend(lender)) return buildFraxlendUserCall(chainId, lender, account);
33196
- if (isCurvance(lender)) return buildCurvanceUserCall(chainId, lender, account);
33197
- if (isTwyne(lender)) return buildTwyneUserCall(chainId, lender, account);
33198
- if (isDssType(lender)) return buildDssUserCall(chainId, lender, account);
33479
+ if (isCurvance(lender))
33480
+ return buildCurvanceUserCall(chainId, lender, account, opts);
33481
+ if (isTwyne(lender)) return buildTwyneUserCall(chainId, lender, account, opts);
33482
+ if (isDssType(lender)) return buildDssUserCall(chainId, lender, account, opts);
33199
33483
  if (isFrankencoin(lender))
33200
33484
  return buildFrankencoinUserCall(chainId, lender, account);
33201
33485
  if (isCompoundV3Type(lender))
@@ -33205,12 +33489,12 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
33205
33489
  chainId,
33206
33490
  lender,
33207
33491
  account,
33208
- params?.subAccountIndexes
33492
+ subAccountsOf(params)?.subAccountIndexes
33209
33493
  );
33210
33494
  if (isSiloV2Type(lender))
33211
- return buildSiloV2UserCall(chainId, lender, account, params);
33495
+ return buildSiloV2UserCall(chainId, lender, account, marketKeysOf(params));
33212
33496
  if (isSiloV3Type(lender))
33213
- return buildSiloV3UserCall(chainId, lender, account, params);
33497
+ return buildSiloV3UserCall(chainId, lender, account, marketKeysOf(params));
33214
33498
  if (isCompoundV2Type(lender))
33215
33499
  return buildCompoundV2UserCall(chainId, lender, account);
33216
33500
  if (isFluid(lender)) return buildFluidUserCall(chainId, lender, account);
@@ -33221,168 +33505,10 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
33221
33505
  chainId,
33222
33506
  lender,
33223
33507
  account,
33224
- params?.accountNumbers
33508
+ subAccountsOf(params)?.accountNumbers
33225
33509
  );
33226
33510
  return [];
33227
33511
  }
33228
- function organizeUserQueries(queries) {
33229
- const morphos = queries.filter((q) => isMorphoType(q.lender));
33230
- const gearbox = queries.filter((q) => isGearboxV3(q.lender));
33231
- const midnight = queries.filter((q) => isMidnight(q.lender));
33232
- const term = queries.filter((q) => isTerm(q.lender));
33233
- const exactly = queries.filter((q) => isExactly(q.lender));
33234
- const liquity = queries.filter((q) => isLiquityFamily(q.lender));
33235
- const river = queries.filter((q) => isRiver(q.lender));
33236
- const teller = queries.filter((q) => isTeller(q.lender));
33237
- const termMax = queries.filter((q) => isTermMax(q.lender));
33238
- const usdd = queries.filter((q) => isUsdd(q.lender));
33239
- const sky = queries.filter((q) => isSky(q.lender));
33240
- const llamaLend = queries.filter((q) => isLlamaLend(q.lender));
33241
- const siloV2 = queries.filter((q) => isSiloV2Type(q.lender));
33242
- const siloV3 = queries.filter((q) => isSiloV3Type(q.lender));
33243
- const frankencoin = queries.filter((q) => isFrankencoin(q.lender));
33244
- if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0 && sky.length === 0 && frankencoin.length === 0 && llamaLend.length === 0 && siloV2.length === 0 && siloV3.length === 0)
33245
- return queries;
33246
- const others = queries.filter(
33247
- (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isDssType(q.lender) && !isFrankencoin(q.lender) && !isLlamaLend(q.lender) && !isSiloV2Type(q.lender) && !isSiloV3Type(q.lender)
33248
- );
33249
- const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
33250
- const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
33251
- const result = [...others];
33252
- if (morphoBlue.length > 0) {
33253
- result.push({
33254
- lender: Lender.MORPHO_BLUE,
33255
- account: morphoBlue[0].account,
33256
- params: morphoBlue.map((p) => p.lender),
33257
- assets: void 0
33258
- });
33259
- }
33260
- if (moolah.length > 0) {
33261
- result.push({
33262
- lender: Lender.LISTA_DAO,
33263
- account: moolah[0].account,
33264
- params: moolah.map((p) => p.lender),
33265
- assets: void 0
33266
- });
33267
- }
33268
- if (gearbox.length > 0) {
33269
- result.push({
33270
- lender: Lender.GEARBOX_V3,
33271
- account: gearbox[0].account,
33272
- params: gearbox.map((p) => p.lender),
33273
- assets: void 0
33274
- });
33275
- }
33276
- if (midnight.length > 0) {
33277
- result.push({
33278
- lender: Lender.MORPHO_MIDNIGHT,
33279
- account: midnight[0].account,
33280
- params: midnight.map((p) => p.lender),
33281
- assets: void 0
33282
- });
33283
- }
33284
- if (term.length > 0) {
33285
- result.push({
33286
- lender: Lender.TERM_FINANCE,
33287
- account: term[0].account,
33288
- params: term.map((p) => p.lender),
33289
- assets: void 0
33290
- });
33291
- }
33292
- if (exactly.length > 0) {
33293
- result.push({
33294
- lender: Lender.EXACTLY,
33295
- account: exactly[0].account,
33296
- params: exactly.map((p) => p.lender),
33297
- assets: void 0
33298
- });
33299
- }
33300
- if (river.length > 0) {
33301
- result.push({
33302
- lender: Lender.RIVER,
33303
- account: river[0].account,
33304
- params: river.map((p) => p.lender),
33305
- assets: void 0
33306
- });
33307
- }
33308
- if (frankencoin.length > 0) {
33309
- result.push({
33310
- lender: Lender.FRANKENCOIN,
33311
- account: frankencoin[0].account,
33312
- params: frankencoin.map((p) => p.lender),
33313
- assets: void 0
33314
- });
33315
- }
33316
- if (usdd.length > 0) {
33317
- result.push({
33318
- lender: Lender.USDD,
33319
- account: usdd[0].account,
33320
- params: usdd.map((p) => p.lender),
33321
- assets: void 0
33322
- });
33323
- }
33324
- if (sky.length > 0) {
33325
- result.push({
33326
- lender: Lender.SKY,
33327
- account: sky[0].account,
33328
- params: sky.map((p) => p.lender),
33329
- assets: void 0
33330
- });
33331
- }
33332
- if (siloV2.length > 0) {
33333
- result.push({
33334
- lender: "SILO_V2",
33335
- account: siloV2[0].account,
33336
- params: siloV2.map((p) => p.lender),
33337
- assets: void 0
33338
- });
33339
- }
33340
- if (siloV3.length > 0) {
33341
- result.push({
33342
- lender: "SILO_V3",
33343
- account: siloV3[0].account,
33344
- params: siloV3.map((p) => p.lender),
33345
- assets: void 0
33346
- });
33347
- }
33348
- if (llamaLend.length > 0) {
33349
- result.push({
33350
- lender: Lender.LLAMALEND,
33351
- account: llamaLend[0].account,
33352
- params: llamaLend.map((p) => p.lender),
33353
- assets: void 0
33354
- });
33355
- }
33356
- if (teller.length > 0) {
33357
- result.push({
33358
- lender: Lender.TELLER,
33359
- account: teller[0].account,
33360
- params: teller.map((p) => p.lender),
33361
- assets: void 0
33362
- });
33363
- }
33364
- if (termMax.length > 0) {
33365
- result.push({
33366
- lender: Lender.TERMMAX,
33367
- account: termMax[0].account,
33368
- params: termMax.map((p) => p.lender),
33369
- assets: void 0
33370
- });
33371
- }
33372
- if (liquity.length > 0) {
33373
- for (const base of LIQUITY_FAMILY_LENDERS) {
33374
- const members = liquity.filter((q) => q.lender.startsWith(base));
33375
- if (members.length === 0) continue;
33376
- result.push({
33377
- lender: base,
33378
- account: members[0].account,
33379
- params: members.map((p) => p.lender),
33380
- assets: void 0
33381
- });
33382
- }
33383
- }
33384
- return result;
33385
- }
33386
33512
 
33387
33513
  // src/lending/user-data/aave-v2-type/userCallParse.ts
33388
33514
  var getAaveV2UserDataConverter = (lender, chainId, account, metaMap) => {
@@ -34052,7 +34178,7 @@ var userDataEmpty = (account, chainId, notWhitelisted = false) => {
34052
34178
  ]
34053
34179
  };
34054
34180
  };
34055
- var getMorphoTypeUserDataConverterWithlens = (lender, chainId, account, markets, metaMap) => {
34181
+ var getMorphoTypeUserDataConverterWithlens = (lender, chainId, account, markets, metaMap, opts) => {
34056
34182
  return !isLista(lender) ? getMorphoUserDataConverterWithlens(
34057
34183
  lender,
34058
34184
  chainId,
@@ -34064,7 +34190,8 @@ var getMorphoTypeUserDataConverterWithlens = (lender, chainId, account, markets,
34064
34190
  chainId,
34065
34191
  account,
34066
34192
  markets,
34067
- metaMap
34193
+ metaMap,
34194
+ opts
34068
34195
  );
34069
34196
  };
34070
34197
  var getMorphoUserDataConverterWithlens = (lender, chainId, account, markets, metaMap) => {
@@ -34118,7 +34245,7 @@ var getMorphoUserDataConverterWithlens = (lender, chainId, account, markets, met
34118
34245
  expectedNumberOfCalls
34119
34246
  ];
34120
34247
  };
34121
- var getListaUserDataConverterWithlens = (lender, chainId, account, markets, metaMap) => {
34248
+ var getListaUserDataConverterWithlens = (lender, chainId, account, markets, metaMap, opts) => {
34122
34249
  const expectedNumberOfCalls = Math.ceil(markets.length / CHUNK_SIZE);
34123
34250
  return [
34124
34251
  (data) => {
@@ -34151,7 +34278,8 @@ var getListaUserDataConverterWithlens = (lender, chainId, account, markets, meta
34151
34278
  const brokerData = getCachedListaBrokerUserData(
34152
34279
  chainId,
34153
34280
  account,
34154
- marketId
34281
+ marketId,
34282
+ opts?.blockNumber
34155
34283
  );
34156
34284
  const { dataForMarket, addedDebt, addedDeposits } = createMorphoEntryFromMarketWithLens(
34157
34285
  balanceData2,
@@ -34357,6 +34485,13 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
34357
34485
  }
34358
34486
 
34359
34487
  // src/lending/user-data/utils/createEulerMultiAccountTypeUserState.ts
34488
+ function subAccountAddressOf(owner, index) {
34489
+ const i = Number(index);
34490
+ if (!Number.isInteger(i) || i < 0 || i > 255) return void 0;
34491
+ if (!/^0x[0-9a-fA-F]{40}$/.test(owner)) return void 0;
34492
+ const last = parseInt(owner.slice(40), 16);
34493
+ return (owner.slice(0, 40) + ((last ^ i) & 255).toString(16).padStart(2, "0")).toLowerCase();
34494
+ }
34360
34495
  function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
34361
34496
  const subAccountIndexes = Object.keys(payload.lendingPositions ?? {});
34362
34497
  const marketUids2 = getMarketUidsFromMeta(lenderData);
@@ -34513,6 +34648,11 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
34513
34648
  }
34514
34649
  data.push({
34515
34650
  accountId: subAccountIndex,
34651
+ // owner ^ index, offline (see `euler/userCallBuild.ts`). Index 0 IS the
34652
+ // owner, so it carries no separate address.
34653
+ ...subAccountIndex === "0" ? {} : {
34654
+ accountAddress: subAccountAddressOf(account, subAccountIndex)
34655
+ },
34516
34656
  health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.collateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
34517
34657
  borrowCapacityUSD: creditLine,
34518
34658
  userConfig,
@@ -35571,7 +35711,16 @@ var getDolomiteUserDataConverter = (lender, chainId, account, metaMap) => {
35571
35711
  modes,
35572
35712
  account
35573
35713
  };
35574
- return createMultiAccountTypeUserState(payload, metaMap, histData);
35714
+ const accountAddresses = {};
35715
+ for (const sa of subAccounts)
35716
+ if (sa.owner && sa.owner.toLowerCase() !== account.toLowerCase())
35717
+ accountAddresses[sa.id] = sa.owner.toLowerCase();
35718
+ return createMultiAccountTypeUserState(
35719
+ payload,
35720
+ metaMap,
35721
+ histData,
35722
+ accountAddresses
35723
+ );
35575
35724
  },
35576
35725
  expectedNumberOfCalls
35577
35726
  ];
@@ -36052,10 +36201,10 @@ var big8 = (v) => {
36052
36201
  return 0n;
36053
36202
  };
36054
36203
  var field7 = (res, name, idx) => big8(res?.[name] ?? res?.[idx]);
36055
- var getLiquityUserDataConverter = (lender, chainId, account, meta) => {
36204
+ var getLiquityUserDataConverter = (lender, chainId, account, meta, opts) => {
36056
36205
  const cfg = liquityConfigFor(lender, chainId);
36057
36206
  const branches = liquityBranchesByChain(lender, chainId);
36058
- const discovery = getCachedLiquityTroves(chainId, lender, account);
36207
+ const discovery = getCachedLiquityTroves(chainId, lender, account, opts);
36059
36208
  const expected = cfg && discovery ? branches.reduce(
36060
36209
  (acc, b, i) => acc + liquityBranchCallCount(b, discovery.perBranch[i]?.length ?? 0),
36061
36210
  0
@@ -36976,9 +37125,9 @@ function sharesToAmount(shares, totalAmount, totalShares) {
36976
37125
  const q = shares * totalAmount / totalShares;
36977
37126
  return q * totalShares < shares * totalAmount ? q + 1n : q;
36978
37127
  }
36979
- var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
37128
+ var getResupplyUserDataConverter = (lender, chainId, account, meta, opts) => {
36980
37129
  const cfg = resupplyConfigFor(lender, chainId);
36981
- const discovery = getCachedResupplyDiscovery(chainId, lender, account);
37130
+ const discovery = getCachedResupplyDiscovery(chainId, lender, account, opts);
36982
37131
  const positions = discovery?.positions ?? [];
36983
37132
  const expected = cfg && positions.length > 0 ? positions.length * RESUPPLY_CALLS_PER_PAIR : 0;
36984
37133
  return [
@@ -37263,9 +37412,9 @@ var big16 = (v) => {
37263
37412
  };
37264
37413
  var tupleAt2 = (v, i) => Array.isArray(v) ? big16(v[i]) : 0n;
37265
37414
  var HOLD_PERIOD_SECONDS = 1200n;
37266
- var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
37415
+ var getCurvanceUserDataConverter = (lender, chainId, account, meta, opts) => {
37267
37416
  const cfg = curvanceConfigFor(lender, chainId);
37268
- const discovery = getCachedCurvanceDiscovery(chainId, lender, account);
37417
+ const discovery = getCachedCurvanceDiscovery(chainId, lender, account, opts);
37269
37418
  const positions = discovery?.positions ?? [];
37270
37419
  const expected = cfg && positions.length > 0 ? positions.reduce(
37271
37420
  (acc, p) => acc + CURVANCE_MARKET_READS + p.activeTokens.length * CURVANCE_READS_PER_TOKEN,
@@ -37377,8 +37526,8 @@ var big17 = (v) => {
37377
37526
  }
37378
37527
  return 0n;
37379
37528
  };
37380
- var getTwyneUserDataConverter = (lender, chainId, account, meta) => {
37381
- const discovery = getCachedTwyneDiscovery(chainId, lender, account);
37529
+ var getTwyneUserDataConverter = (lender, chainId, account, meta, opts) => {
37530
+ const discovery = getCachedTwyneDiscovery(chainId, lender, account, opts);
37382
37531
  const vaults = discovery?.vaults ?? [];
37383
37532
  const expected = vaults.length * TWYNE_READS_PER_VAULT;
37384
37533
  const markets = twyneChainData(lender, chainId)?.markets ?? [];
@@ -37405,7 +37554,12 @@ var getTwyneUserDataConverter = (lender, chainId, account, meta) => {
37405
37554
  (m) => m.intermediateVault.toLowerCase() === ref.intermediateVault && m.targetAsset.toLowerCase() === ref.targetAsset
37406
37555
  );
37407
37556
  if (!market) return;
37408
- const lenderKey = twyneLenderKey(lender, chainId, ref.intermediateVault, ref.targetAsset);
37557
+ const lenderKey = twyneLenderKey(
37558
+ lender,
37559
+ chainId,
37560
+ ref.intermediateVault,
37561
+ ref.targetAsset
37562
+ );
37409
37563
  if (!byMarket.has(lenderKey)) {
37410
37564
  byMarket.set(lenderKey, {
37411
37565
  collAddr: market.underlyingAsset.toLowerCase(),
@@ -37522,10 +37676,10 @@ var big18 = (v) => {
37522
37676
  return 0n;
37523
37677
  };
37524
37678
  var field9 = (res, name, idx) => big18(res?.[name] ?? res?.[idx]);
37525
- var getDssUserDataConverter = (lender, chainId, account, meta) => {
37679
+ var getDssUserDataConverter = (lender, chainId, account, meta, opts) => {
37526
37680
  const cfg = dssConfigFor(lender, chainId);
37527
37681
  const markets = dssChainData(lender, chainId)?.markets ?? [];
37528
- const discovery = getCachedDssCdps(lender, chainId, account);
37682
+ const discovery = getCachedDssCdps(lender, chainId, account, opts);
37529
37683
  const cdps = discovery?.cdps ?? [];
37530
37684
  const ilks = discovery?.ilks ?? [];
37531
37685
  const expected = cfg && markets.length > 0 && cdps.length > 0 ? cdps.length * DSS_CALLS_PER_CDP + ilks.length : 0;
@@ -37780,8 +37934,8 @@ var big20 = (v) => {
37780
37934
  return 0n;
37781
37935
  };
37782
37936
  var field10 = (res, name, idx) => res?.[name] ?? res?.[idx];
37783
- var getTellerUserDataConverter = (_lender, chainId, account, meta) => {
37784
- const discovery = getCachedTellerBids(chainId, account);
37937
+ var getTellerUserDataConverter = (_lender, chainId, account, meta, opts) => {
37938
+ const discovery = getCachedTellerBids(chainId, account, opts);
37785
37939
  const kept = discovery?.bids ?? [];
37786
37940
  const expected = kept.length * TELLER_CALLS_PER_BID;
37787
37941
  return [
@@ -38184,7 +38338,7 @@ function validateUserData(userData, hadFailedReads) {
38184
38338
  }
38185
38339
 
38186
38340
  // src/lending/user-data/fetch-balances/parse.ts
38187
- function getUserDataConverter(lender, chainId, account, params, meta) {
38341
+ function getUserDataConverter(lender, chainId, account, params, meta, opts) {
38188
38342
  if (isAaveV4Type(lender))
38189
38343
  return getAaveV4UserDataConverter(lender, chainId, account, meta?.[lender]);
38190
38344
  if (isYLDR(lender))
@@ -38201,7 +38355,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
38201
38355
  chainId,
38202
38356
  account,
38203
38357
  params,
38204
- meta
38358
+ meta,
38359
+ opts
38205
38360
  );
38206
38361
  if (isMidnight(lender))
38207
38362
  return getMidnightUserDataConverter(lender, chainId, account, meta);
@@ -38210,11 +38365,11 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
38210
38365
  if (isExactly(lender))
38211
38366
  return getExactlyUserDataConverter(lender, chainId, account, meta);
38212
38367
  if (isLiquityFamily(lender))
38213
- return getLiquityUserDataConverter(lender, chainId, account, meta);
38368
+ return getLiquityUserDataConverter(lender, chainId, account, meta, opts);
38214
38369
  if (isRiver(lender))
38215
38370
  return getRiverUserDataConverter(lender, chainId, account, meta);
38216
38371
  if (isTeller(lender))
38217
- return getTellerUserDataConverter(lender, chainId, account, meta);
38372
+ return getTellerUserDataConverter(lender, chainId, account, meta, opts);
38218
38373
  if (isTermMax(lender))
38219
38374
  return getTermMaxUserDataConverter(lender, chainId, account, meta);
38220
38375
  if (isInverse(lender))
@@ -38231,15 +38386,15 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
38231
38386
  if (isLlamaLend(lender))
38232
38387
  return getLlamaLendUserDataConverter(lender, chainId, account, meta);
38233
38388
  if (isResupply(lender))
38234
- return getResupplyUserDataConverter(lender, chainId, account, meta);
38389
+ return getResupplyUserDataConverter(lender, chainId, account, meta, opts);
38235
38390
  if (isFraxlend(lender))
38236
38391
  return getFraxlendUserDataConverter(lender, chainId, account, meta);
38237
38392
  if (isCurvance(lender))
38238
- return getCurvanceUserDataConverter(lender, chainId, account, meta);
38393
+ return getCurvanceUserDataConverter(lender, chainId, account, meta, opts);
38239
38394
  if (isTwyne(lender))
38240
- return getTwyneUserDataConverter(lender, chainId, account, meta);
38395
+ return getTwyneUserDataConverter(lender, chainId, account, meta, opts);
38241
38396
  if (isDssType(lender))
38242
- return getDssUserDataConverter(lender, chainId, account, meta);
38397
+ return getDssUserDataConverter(lender, chainId, account, meta, opts);
38243
38398
  if (isFrankencoin(lender))
38244
38399
  return getFrankencoinUserDataConverter(lender, chainId, account, meta);
38245
38400
  if (isCompoundV3Type(lender))
@@ -38295,6 +38450,7 @@ var filterEmptyUserData = (userData, keepActiveControllerMode = false) => {
38295
38450
  var getReadFailurePolicy = (lender) => isMultiMarket(lender) && !hasCrossMarginRisk(lender) ? "lenient" : "strict";
38296
38451
  var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState, options) => {
38297
38452
  const queries = organizeUserQueries(queriesRaw);
38453
+ const readOpts = options?.blockNumber === void 0 ? void 0 : { blockNumber: options.blockNumber };
38298
38454
  const lenderData = {};
38299
38455
  let currentSlice = 0;
38300
38456
  for (const query3 of queries) {
@@ -38303,7 +38459,8 @@ var convertLenderUserDataResult = (chainId, queriesRaw, rawResults, lenderState,
38303
38459
  chainId,
38304
38460
  query3.account,
38305
38461
  query3.params,
38306
- lenderState
38462
+ lenderState,
38463
+ readOpts
38307
38464
  );
38308
38465
  const data = rawResults.slice(currentSlice, currentSlice + sliceLength);
38309
38466
  let failedCalls = 0;
@@ -43041,7 +43198,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient21, allowF
43041
43198
  query3.lender,
43042
43199
  query3.account,
43043
43200
  query3.params,
43044
- getEvmClient21
43201
+ { getClient: getEvmClient21 }
43045
43202
  );
43046
43203
  return callData.map((call) => ({ call, abi: call.abi ?? abi }));
43047
43204
  })
@@ -43065,9 +43222,13 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient21, allowF
43065
43222
  onEndpointFailure ? { onEndpointFailure } : void 0
43066
43223
  );
43067
43224
  };
43068
- var prepareLenderUserDataRpcCalls = async (chainId, queriesRaw, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) => {
43225
+ var prepareLenderUserDataRpcCalls = async (chainId, queriesRaw, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true, opts) => {
43069
43226
  const multicallAddress = getEvmChain(chainId).contracts?.multicall3?.address;
43070
43227
  const queries = organizeUserQueries(queriesRaw);
43228
+ const readOpts = {
43229
+ ...opts,
43230
+ blockNumber: opts?.blockNumber ?? blockNumberFromTag(blockTag)
43231
+ };
43071
43232
  const builtCalls = await Promise.all(
43072
43233
  queries.map(async (query3) => {
43073
43234
  const abi = getAbi2(query3.lender);
@@ -43075,7 +43236,8 @@ var prepareLenderUserDataRpcCalls = async (chainId, queriesRaw, batchSize = MULT
43075
43236
  chainId,
43076
43237
  query3.lender,
43077
43238
  query3.account,
43078
- query3.params
43239
+ query3.params,
43240
+ readOpts
43079
43241
  );
43080
43242
  return callData.map((call) => ({ call, abi: call.abi ?? abi }));
43081
43243
  })
@@ -43991,6 +44153,248 @@ function fuseLenderData(userDataResult, summary) {
43991
44153
  return entries;
43992
44154
  }
43993
44155
 
44156
+ // src/lending/user-data/read/select.ts
44157
+ var PREFIX_LENDERS = /* @__PURE__ */ new Set([
44158
+ "MORPHO_BLUE",
44159
+ "LISTA_DAO",
44160
+ "COMPOUND_V3",
44161
+ "CURVANCE"
44162
+ ]);
44163
+ var parseLenderKey = (raw) => raw.trim().toUpperCase().replaceAll("-", "_");
44164
+ function filterLenderMeta(meta, filter) {
44165
+ const lenders = filter?.lenders;
44166
+ if (!lenders?.length) return meta;
44167
+ const exact = /* @__PURE__ */ new Set();
44168
+ const prefixes = [];
44169
+ for (const l of lenders) {
44170
+ if (PREFIX_LENDERS.has(l)) prefixes.push(l);
44171
+ else exact.add(l);
44172
+ }
44173
+ const markets = filter?.markets?.length ? new Set(filter.markets.map((m) => m.toLowerCase().replace(/^0x/, ""))) : void 0;
44174
+ const out = {};
44175
+ for (const key3 of Object.keys(meta)) {
44176
+ if (exact.has(key3)) {
44177
+ out[key3] = meta[key3];
44178
+ continue;
44179
+ }
44180
+ const p = prefixes.find((x) => key3.startsWith(`${x}_`));
44181
+ if (!p) continue;
44182
+ if (markets) {
44183
+ const id = key3.slice(p.length + 1).toLowerCase().replace(/^0x/, "");
44184
+ if (!markets.has(id)) continue;
44185
+ }
44186
+ out[key3] = meta[key3];
44187
+ }
44188
+ return out;
44189
+ }
44190
+ var buildQueriesFromMeta = (meta, account, selection) => Object.keys(meta).map((lender) => {
44191
+ if (selection?.subAccountIndexes?.length && isEulerType(lender))
44192
+ return {
44193
+ lender,
44194
+ account,
44195
+ params: { subAccountIndexes: selection.subAccountIndexes }
44196
+ };
44197
+ const dolomiteIds = selection?.accountNumbers ?? selection?.subAccountIndexes?.map((i) => String(i));
44198
+ if (dolomiteIds?.length && isDolomite(lender))
44199
+ return { lender, account, params: { accountNumbers: dolomiteIds } };
44200
+ return { lender, account };
44201
+ });
44202
+ var injectLenderInfoIntoEntries = (entries, infoByChain) => {
44203
+ if (!infoByChain) return;
44204
+ for (const entry of entries) {
44205
+ const hit = infoByChain[entry.chainId]?.[entry.lender];
44206
+ if (hit) entry.lenderInfo = hit;
44207
+ }
44208
+ };
44209
+
44210
+ // src/utils/rpcParse.ts
44211
+ function parseRawRpcResponses(responses, callMetadata, allowFailure = true) {
44212
+ const sortedResponses = [...responses].sort((a, b) => a.id - b.id);
44213
+ return sortedResponses.map((response, idx) => {
44214
+ const metadata = callMetadata[idx];
44215
+ if (response.error || !response.result) {
44216
+ if (!allowFailure) {
44217
+ throw new Error(
44218
+ `RPC call failed for ${metadata.functionName}: ${response.error?.message || "No result"}`
44219
+ );
44220
+ }
44221
+ return "0x";
44222
+ }
44223
+ try {
44224
+ const decoded = decodeFunctionResult({
44225
+ abi: metadata.abi,
44226
+ functionName: metadata.functionName,
44227
+ data: response.result
44228
+ });
44229
+ return decoded;
44230
+ } catch (error) {
44231
+ if (!allowFailure) {
44232
+ throw new Error(
44233
+ `Failed to decode result for ${metadata.functionName}: ${error}`
44234
+ );
44235
+ }
44236
+ return "0x";
44237
+ }
44238
+ });
44239
+ }
44240
+ function parseRawRpcBatchResponses(batches, batchResponses, allowFailure = true) {
44241
+ const allResults = [];
44242
+ batches.forEach((batch, batchIdx) => {
44243
+ const responses = batchResponses[batchIdx];
44244
+ const parsed = parseRawRpcResponses(
44245
+ responses,
44246
+ batch.callMetadata,
44247
+ allowFailure
44248
+ );
44249
+ allResults.push(...parsed);
44250
+ });
44251
+ return allResults;
44252
+ }
44253
+ function parseMulticallRpcResponses(responses, batches, allowFailure = true, permanentFailures) {
44254
+ const allResults = [];
44255
+ const sortedResponses = [...responses].sort((a, b) => a.id - b.id);
44256
+ sortedResponses.forEach((response, batchIdx) => {
44257
+ const batch = batches[batchIdx];
44258
+ if (response.error || !response.result) {
44259
+ if (!allowFailure) {
44260
+ throw new Error(
44261
+ `Multicall RPC failed: ${response.error?.message || "No result"}`
44262
+ );
44263
+ }
44264
+ batch.callMetadata.forEach(() => allResults.push("0x"));
44265
+ return;
44266
+ }
44267
+ try {
44268
+ const decoded = decodeAbiParameters(
44269
+ [
44270
+ {
44271
+ type: "tuple[]",
44272
+ components: [
44273
+ { name: "success", type: "bool" },
44274
+ { name: "returnData", type: "bytes" }
44275
+ ]
44276
+ }
44277
+ ],
44278
+ response.result
44279
+ )[0];
44280
+ decoded.forEach((result, idx) => {
44281
+ const metadata = batch.callMetadata[idx];
44282
+ if (!result.success || result.returnData === "0x") {
44283
+ if (!allowFailure) {
44284
+ throw new Error(`Call failed for ${metadata.functionName}`);
44285
+ }
44286
+ permanentFailures?.add(allResults.length);
44287
+ allResults.push("0x");
44288
+ return;
44289
+ }
44290
+ try {
44291
+ const decodedResult = decodeFunctionResult({
44292
+ abi: metadata.abi,
44293
+ functionName: metadata.functionName,
44294
+ data: result.returnData
44295
+ });
44296
+ allResults.push(decodedResult);
44297
+ } catch (error) {
44298
+ if (!allowFailure) {
44299
+ throw new Error(
44300
+ `Failed to decode result for ${metadata.functionName}: ${error}`
44301
+ );
44302
+ }
44303
+ permanentFailures?.add(allResults.length);
44304
+ allResults.push("0x");
44305
+ }
44306
+ });
44307
+ } catch (error) {
44308
+ if (!allowFailure) {
44309
+ throw new Error(`Failed to decode multicall response: ${error}`);
44310
+ }
44311
+ batch.callMetadata.forEach(() => allResults.push("0x"));
44312
+ }
44313
+ });
44314
+ return allResults;
44315
+ }
44316
+
44317
+ // src/lending/user-data/read/readUserPositions.ts
44318
+ async function readUserPositions(params) {
44319
+ const t0 = Date.now();
44320
+ const {
44321
+ chainId,
44322
+ account,
44323
+ meta,
44324
+ transport,
44325
+ batchSize = MULTICALL_DEFAULT_BATCH_SIZE
44326
+ } = params;
44327
+ const blockNumber = params.blockNumber === void 0 ? void 0 : BigInt(params.blockNumber);
44328
+ const asOfBlock = blockNumber === void 0 ? null : Number(blockNumber);
44329
+ const selected = filterLenderMeta(meta, {
44330
+ lenders: params.lenders,
44331
+ markets: params.markets
44332
+ });
44333
+ const queries = buildQueriesFromMeta(selected, account, {
44334
+ subAccountIndexes: params.subAccountIndexes,
44335
+ accountNumbers: params.accountNumbers
44336
+ });
44337
+ if (queries.length === 0)
44338
+ return {
44339
+ items: [],
44340
+ asOfBlock,
44341
+ partial: false,
44342
+ incompleteLenders: [],
44343
+ stats: { lenders: 0, calls: 0, batches: 0, ms: Date.now() - t0 }
44344
+ };
44345
+ const prepared = await prepareLenderUserDataRpcCalls(
44346
+ chainId,
44347
+ queries,
44348
+ batchSize,
44349
+ blockNumber === void 0 ? "latest" : `0x${blockNumber.toString(16)}`,
44350
+ true,
44351
+ { ...params.readContext, blockNumber }
44352
+ );
44353
+ const responses = await transport(prepared.rpcCalls);
44354
+ const permanentFailures = /* @__PURE__ */ new Set();
44355
+ const decoded = parseMulticallRpcResponses(
44356
+ responses,
44357
+ prepared.batches,
44358
+ true,
44359
+ permanentFailures
44360
+ );
44361
+ const incompleteLenders = [];
44362
+ const converted = convertLenderUserDataResult(
44363
+ chainId,
44364
+ prepared.queries,
44365
+ decoded,
44366
+ selected,
44367
+ {
44368
+ permanentFailures,
44369
+ // The build phase cached its discoveries under this block; the parse
44370
+ // phase has to look them up under the same one.
44371
+ blockNumber,
44372
+ onIncomplete: (info) => {
44373
+ incompleteLenders.push(`${chainId}:${info.lender}`);
44374
+ params.onIncomplete?.(info);
44375
+ }
44376
+ }
44377
+ );
44378
+ const userData = { [chainId]: converted };
44379
+ const items = fuseLenderData(userData, buildSummaries(userData));
44380
+ injectLenderInfoIntoEntries(
44381
+ items,
44382
+ params.lenderInfo ? { [chainId]: params.lenderInfo } : void 0
44383
+ );
44384
+ return {
44385
+ items,
44386
+ asOfBlock,
44387
+ partial: incompleteLenders.length > 0,
44388
+ incompleteLenders,
44389
+ stats: {
44390
+ lenders: queries.length,
44391
+ calls: prepared.batches.reduce((n, b) => n + b.callMetadata.length, 0),
44392
+ batches: prepared.batches.length,
44393
+ ms: Date.now() - t0
44394
+ }
44395
+ };
44396
+ }
44397
+
43994
44398
  // src/yields/intrinsic/fetchers/lido.ts
43995
44399
  var WSTETH_URL = "https://eth-api.lido.fi/v1/protocol/steth/apr/sma";
43996
44400
  var DEFILLAMA_LIDO_URL = "https://yields.llama.fi/chart/747c1d2a-c668-4682-b9f9-296708a3dd90";
@@ -50361,7 +50765,7 @@ var BITWAY_LEGS2 = [
50361
50765
  "USDT",
50362
50766
  "0x5c4a6903732532eeb3ae0803e062d8ae25d52bd1",
50363
50767
  "0x2b8464ffb2b77de64cfefdeb00ad925576f157cb",
50364
- "the Absolute Return strategy (0.5% instant-exit fee)"
50768
+ "Absolute Return strategy (0.5% instant-exit fee)"
50365
50769
  ],
50366
50770
  [
50367
50771
  "bwU",
@@ -50371,7 +50775,7 @@ var BITWAY_LEGS2 = [
50371
50775
  "U",
50372
50776
  "0x5c4a6903732532eeb3ae0803e062d8ae25d52bd1",
50373
50777
  "0x2b8464ffb2b77de64cfefdeb00ad925576f157cb",
50374
- "the Absolute Return strategy (0.5% instant-exit fee)"
50778
+ "Absolute Return strategy (0.5% instant-exit fee)"
50375
50779
  ],
50376
50780
  [
50377
50781
  "bwBTW",
@@ -50381,7 +50785,7 @@ var BITWAY_LEGS2 = [
50381
50785
  "BTW",
50382
50786
  "0x5c4a6903732532eeb3ae0803e062d8ae25d52bd1",
50383
50787
  "0x2b8464ffb2b77de64cfefdeb00ad925576f157cb",
50384
- "the Absolute Return strategy (0.5% instant-exit fee). The rate is denominated in BTW, Bitway's own volatile token \u2014 not in dollars"
50788
+ "Absolute Return strategy (0.5% instant-exit fee). The rate is denominated in BTW, Bitway's own volatile token \u2014 not in dollars"
50385
50789
  ],
50386
50790
  [
50387
50791
  "BTWUSDT",
@@ -50391,7 +50795,7 @@ var BITWAY_LEGS2 = [
50391
50795
  "USDT",
50392
50796
  "0xb82e32062c773c7748776c06fdb11b92edae3b63",
50393
50797
  "0xfc8e6b1ab1a4c37724f8bc797730afa8d01d04ef",
50394
- "the Core Alpha strategy (no instant-exit fee live; ~1M per-user stake cap)"
50798
+ "Core Alpha strategy (no instant-exit fee live; ~1M per-user stake cap)"
50395
50799
  ],
50396
50800
  [
50397
50801
  "BTWUSD1",
@@ -50401,7 +50805,7 @@ var BITWAY_LEGS2 = [
50401
50805
  "USD1",
50402
50806
  "0xb82e32062c773c7748776c06fdb11b92edae3b63",
50403
50807
  "0xfc8e6b1ab1a4c37724f8bc797730afa8d01d04ef",
50404
- "the Core Alpha strategy (no instant-exit fee live; ~1M per-user stake cap)"
50808
+ "Core Alpha strategy (no instant-exit fee live; ~1M per-user stake cap)"
50405
50809
  ],
50406
50810
  [
50407
50811
  "BTWU",
@@ -50411,7 +50815,7 @@ var BITWAY_LEGS2 = [
50411
50815
  "U",
50412
50816
  "0xb82e32062c773c7748776c06fdb11b92edae3b63",
50413
50817
  "0xfc8e6b1ab1a4c37724f8bc797730afa8d01d04ef",
50414
- "the Core Alpha strategy (no instant-exit fee live; ~1M per-user stake cap)"
50818
+ "Core Alpha strategy (no instant-exit fee live; ~1M per-user stake cap)"
50415
50819
  ]
50416
50820
  ];
50417
50821
  var BITWAY_ENTRIES = {
@@ -78616,11 +79020,27 @@ function toVaultTermInput(vault, provider, chainId) {
78616
79020
  exposures: Array.isArray(row.exposures) ? row.exposures : void 0
78617
79021
  };
78618
79022
  }
79023
+ function savingsCuration(provider, chainId, address) {
79024
+ if (provider !== "savings") return {};
79025
+ const lc2 = address.toLowerCase();
79026
+ const e = getSavingsRegistry(chainId).find((x) => x.address === lc2);
79027
+ if (!e) return {};
79028
+ return {
79029
+ // `''` is how an entry says "no curated copy"; it must not beat the
79030
+ // template, so it is normalized to absent.
79031
+ description: e.description || void 0,
79032
+ solvency: e.solvency,
79033
+ accrual: e.accrual,
79034
+ yieldWarmupSeconds: e.yieldWarmupSeconds,
79035
+ needsDepositApproval: e.needsDepositApproval
79036
+ };
79037
+ }
78619
79038
  function vaultTermInputFromEarnMarket(m) {
78620
79039
  if (m.venueKind !== "vault") return void 0;
78621
79040
  const provider = m.venue.startsWith(VAULT_VENUE_PREFIX) ? m.venue.slice(VAULT_VENUE_PREFIX.length) : void 0;
78622
79041
  if (!provider) return void 0;
78623
79042
  const meta = m.providerMeta ?? {};
79043
+ const curated = savingsCuration(provider, m.chainId, m.ref);
78624
79044
  return {
78625
79045
  provider,
78626
79046
  chainId: m.chainId,
@@ -78629,7 +79049,7 @@ function vaultTermInputFromEarnMarket(m) {
78629
79049
  name: m.name,
78630
79050
  brand: m.brand,
78631
79051
  curatorName: m.brand,
78632
- description: str7(meta.description),
79052
+ description: str7(meta.description) ?? curated.description,
78633
79053
  asset: {
78634
79054
  chainId: m.chainId,
78635
79055
  address: m.asset.address,
@@ -78659,9 +79079,9 @@ function vaultTermInputFromEarnMarket(m) {
78659
79079
  swapFeeRate: num14(meta.feeRate),
78660
79080
  redemptionDiscountBps: num14(meta.redemptionDiscountBps),
78661
79081
  instantRedeemEnabled: bool2(meta.instantRedeemEnabled),
78662
- yieldWarmupSeconds: num14(meta.yieldWarmupSeconds),
78663
- accrual: str7(meta.accrual),
78664
- needsDepositApproval: bool2(meta.needsDepositApproval),
79082
+ yieldWarmupSeconds: num14(meta.yieldWarmupSeconds) ?? curated.yieldWarmupSeconds,
79083
+ accrual: str7(meta.accrual) ?? curated.accrual,
79084
+ needsDepositApproval: bool2(meta.needsDepositApproval) ?? curated.needsDepositApproval,
78665
79085
  // `canDeposit` already folds in the cap, the pause and the gate, so it is
78666
79086
  // the authoritative answer — but the REASON is what a disabled CTA renders,
78667
79087
  // and that only survives in the raw fields.
@@ -78679,7 +79099,7 @@ function vaultTermInputFromEarnMarket(m) {
78679
79099
  curator: str7(meta.curator),
78680
79100
  guardian: str7(meta.guardian),
78681
79101
  feeRecipient: str7(meta.feeRecipient),
78682
- solvency: m.risk?.counterparty,
79102
+ solvency: m.risk?.counterparty ?? curated.solvency,
78683
79103
  navOracle: str7(meta.navOracle),
78684
79104
  yieldProfile: m.risk?.yieldProfile,
78685
79105
  exposures: m.refs?.exposures
@@ -78706,6 +79126,7 @@ function vaultTermInputFromSourceRow(row, chainId) {
78706
79126
  const info = row.vaultInfo ?? {};
78707
79127
  const assetInfo = row.underlyingInfo?.asset;
78708
79128
  const assetDecimals = num14(row.assetDecimals) ?? num14(assetInfo?.decimals) ?? num14(row.decimals);
79129
+ const curated = savingsCuration(provider, chainId, address);
78709
79130
  return {
78710
79131
  provider,
78711
79132
  chainId,
@@ -78714,7 +79135,7 @@ function vaultTermInputFromSourceRow(row, chainId) {
78714
79135
  name: str7(info.name) ?? str7(row.displayName) ?? str7(row.name),
78715
79136
  brand: str7(row.curatorName) ?? str7(meta.brand),
78716
79137
  curatorName: str7(row.curatorName),
78717
- description: str7(meta.description),
79138
+ description: str7(meta.description) ?? curated.description,
78718
79139
  asset: {
78719
79140
  chainId,
78720
79141
  address: str7(row.underlying)?.toLowerCase() ?? "",
@@ -78742,9 +79163,9 @@ function vaultTermInputFromSourceRow(row, chainId) {
78742
79163
  swapFeeRate: num14(meta.feeRate),
78743
79164
  redemptionDiscountBps: num14(meta.redemptionDiscountBps),
78744
79165
  instantRedeemEnabled: bool2(meta.instantRedeemEnabled),
78745
- yieldWarmupSeconds: num14(meta.yieldWarmupSeconds),
78746
- accrual: str7(meta.accrual),
78747
- needsDepositApproval: bool2(meta.needsDepositApproval),
79166
+ yieldWarmupSeconds: num14(meta.yieldWarmupSeconds) ?? curated.yieldWarmupSeconds,
79167
+ accrual: str7(meta.accrual) ?? curated.accrual,
79168
+ needsDepositApproval: bool2(meta.needsDepositApproval) ?? curated.needsDepositApproval,
78748
79169
  isMintable: bool2(meta.isMintable),
78749
79170
  depositCapacity: str7(meta.depositCapacity) ?? str7(meta.maxDeposit),
78750
79171
  supplyCap: str7(meta.supplyCap),
@@ -78760,7 +79181,7 @@ function vaultTermInputFromSourceRow(row, chainId) {
78760
79181
  curator: str7(meta.curator),
78761
79182
  guardian: str7(meta.guardian),
78762
79183
  feeRecipient: str7(meta.feeRecipient),
78763
- solvency: str7(meta.solvency),
79184
+ solvency: str7(meta.solvency) ?? curated.solvency,
78764
79185
  navOracle: str7(meta.navOracle),
78765
79186
  yieldProfile: str7(info.yieldProfile),
78766
79187
  exposures: Array.isArray(row.exposures) ? row.exposures : Array.isArray(meta.exposures) ? meta.exposures : void 0
@@ -79218,113 +79639,6 @@ function computeEModeAnalysis(subAccount, lenderMeta, eModes) {
79218
79639
  };
79219
79640
  });
79220
79641
  }
79221
-
79222
- // src/utils/rpcParse.ts
79223
- function parseRawRpcResponses(responses, callMetadata, allowFailure = true) {
79224
- const sortedResponses = [...responses].sort((a, b) => a.id - b.id);
79225
- return sortedResponses.map((response, idx) => {
79226
- const metadata = callMetadata[idx];
79227
- if (response.error || !response.result) {
79228
- if (!allowFailure) {
79229
- throw new Error(
79230
- `RPC call failed for ${metadata.functionName}: ${response.error?.message || "No result"}`
79231
- );
79232
- }
79233
- return "0x";
79234
- }
79235
- try {
79236
- const decoded = decodeFunctionResult({
79237
- abi: metadata.abi,
79238
- functionName: metadata.functionName,
79239
- data: response.result
79240
- });
79241
- return decoded;
79242
- } catch (error) {
79243
- if (!allowFailure) {
79244
- throw new Error(
79245
- `Failed to decode result for ${metadata.functionName}: ${error}`
79246
- );
79247
- }
79248
- return "0x";
79249
- }
79250
- });
79251
- }
79252
- function parseRawRpcBatchResponses(batches, batchResponses, allowFailure = true) {
79253
- const allResults = [];
79254
- batches.forEach((batch, batchIdx) => {
79255
- const responses = batchResponses[batchIdx];
79256
- const parsed = parseRawRpcResponses(
79257
- responses,
79258
- batch.callMetadata,
79259
- allowFailure
79260
- );
79261
- allResults.push(...parsed);
79262
- });
79263
- return allResults;
79264
- }
79265
- function parseMulticallRpcResponses(responses, batches, allowFailure = true, permanentFailures) {
79266
- const allResults = [];
79267
- const sortedResponses = [...responses].sort((a, b) => a.id - b.id);
79268
- sortedResponses.forEach((response, batchIdx) => {
79269
- const batch = batches[batchIdx];
79270
- if (response.error || !response.result) {
79271
- if (!allowFailure) {
79272
- throw new Error(
79273
- `Multicall RPC failed: ${response.error?.message || "No result"}`
79274
- );
79275
- }
79276
- batch.callMetadata.forEach(() => allResults.push("0x"));
79277
- return;
79278
- }
79279
- try {
79280
- const decoded = decodeAbiParameters(
79281
- [
79282
- {
79283
- type: "tuple[]",
79284
- components: [
79285
- { name: "success", type: "bool" },
79286
- { name: "returnData", type: "bytes" }
79287
- ]
79288
- }
79289
- ],
79290
- response.result
79291
- )[0];
79292
- decoded.forEach((result, idx) => {
79293
- const metadata = batch.callMetadata[idx];
79294
- if (!result.success || result.returnData === "0x") {
79295
- if (!allowFailure) {
79296
- throw new Error(`Call failed for ${metadata.functionName}`);
79297
- }
79298
- permanentFailures?.add(allResults.length);
79299
- allResults.push("0x");
79300
- return;
79301
- }
79302
- try {
79303
- const decodedResult = decodeFunctionResult({
79304
- abi: metadata.abi,
79305
- functionName: metadata.functionName,
79306
- data: result.returnData
79307
- });
79308
- allResults.push(decodedResult);
79309
- } catch (error) {
79310
- if (!allowFailure) {
79311
- throw new Error(
79312
- `Failed to decode result for ${metadata.functionName}: ${error}`
79313
- );
79314
- }
79315
- permanentFailures?.add(allResults.length);
79316
- allResults.push("0x");
79317
- }
79318
- });
79319
- } catch (error) {
79320
- if (!allowFailure) {
79321
- throw new Error(`Failed to decode multicall response: ${error}`);
79322
- }
79323
- batch.callMetadata.forEach(() => allResults.push("0x"));
79324
- }
79325
- });
79326
- return allResults;
79327
- }
79328
79642
  var ERC20_STRING_ABI = [
79329
79643
  {
79330
79644
  inputs: [],
@@ -81658,6 +81972,7 @@ function toDigest(sheet) {
81658
81972
  settlement: sheet.supply.exit.settlement,
81659
81973
  canOpen: sheet.supply.availability.canOpen,
81660
81974
  headline: sheet.supply.info.headline,
81975
+ description: sheet.supply.info.description,
81661
81976
  tags: sheet.supply.info.tags,
81662
81977
  backedBy: strip(sheet.supply.backedBy)
81663
81978
  } : void 0,
@@ -81671,6 +81986,7 @@ function toDigest(sheet) {
81671
81986
  liquidationTrigger: sheet.borrow.liquidation.trigger,
81672
81987
  canOpen: sheet.borrow.availability.canOpen,
81673
81988
  headline: sheet.borrow.info.headline,
81989
+ description: sheet.borrow.info.description,
81674
81990
  tags: sheet.borrow.info.tags,
81675
81991
  acceptedCollateral: strip(sheet.borrow.acceptedCollateral)
81676
81992
  } : void 0,
@@ -82759,6 +83075,6 @@ function earnPositionTotals(items) {
82759
83075
  };
82760
83076
  }
82761
83077
 
82762
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, DEFAULT_TERM_ORDER_STORE, DOLOMITE_ISO_ID_PREFIX, EARN_DESCRIPTIONS, EARN_LABELS, EARN_RATE_SOURCE_BY_PROVIDER, EMPTY_BALANCE, EXACTLY_LENDER_KEY, FLYING_TULIP_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, SPECTRA_NETWORKS, SPECTRA_RATE_MAX_PERCENT, SPECTRA_RATE_MIN_PERCENT, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_MARKETS_PER_CALL, 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_PROVIDERS, 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, applyEarnSanity, 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, clearSpectraMarketsCache, collateralSymbolsByVenue, 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, convertCoolerMarketsToResponse, convertDssMarketsToResponse, convertExactlyMarketsToResponse, convertFlyingTulipMarketsToResponse, 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, dexResolverFor, disambiguateEarnNames, dolomiteVaultAddress, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnMarketLabel, earnPositionFromLenderEntry, earnPositionFromVaultBalance, earnPositionTotals, earnRateAtMaturity, earnRowSubtitle, earnUidFromMarketUid, earnVaultTerms, earnVenueKind, emitterCoverage, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, enumerateEmitters, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchCoolerMarkets, fetchDolomiteAccountNumbers, fetchDolomiteSubAccounts, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidDexState, fetchFluidFTokens, fetchFlyingTulipMarkets, 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, fetchSpectraApiMarkets, fetchSpectraPtMarkets, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTermStoreOrders, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, fillableRemaining, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, formatRaw, frankencoinKeyParts, frankencoinLenderKey, fraxlendAssetPerCollateral, fraxlendKeyParts, fraxlendLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedFluidDexState, 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, getResolvedDolomiteSubAccounts, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasPendleMarkets, hasSpectraMarkets, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, inverseKeyParts, inverseLenderKey, isBoundNeed, isFailedCall, isIlliquid, isLendingPosition, isLiveMarket as isLivePendleMarket, isLiveSpectraMarket, isMaturedTerm, isSecondaryMarketOnly, isStablecoinSymbol, isUnearnableEarnRate, isUnrealizableEarnRate, isVaultPosition, isVaultVenue, isYearnV3, keySegmentToIlk, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, meetsLiquidityFloor, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, organizeUserQueries, parseBalanceFetcherResult, parseDolomiteSubAccountId, parseEarnUid, parseMergedResult, parseMulticallRpcResponses, parseExpirySeconds as parsePendleExpirySeconds, parseRawRpcBatchResponses, parseRawRpcResponses, parseCurveFee as parseSpectraCurveFee, parsePtRate as parseSpectraPtRate, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, pickPool as pickSpectraPool, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, repairImpossibleTvl, resolveAdapter, resolveDerivation, resolveDolomiteRowIdentity, resolveEarnIdentity, resolveModeConfig, resolveStCeloDepositGroup, resolveVaultProfileId, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, sanePercent as saneSpectraPercent, savingsAddresses, savingsBalanceKind, secondaryMarketVault, selectAssetGroupPrices, setMysticApiKey, shortDate, spectraAddress, spectraNetwork, spectraPoolsUrl, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, stampEarnSubtitles, stampVaultClassification, stampVaultTermSheets, stripLeadingBrand, supplyDescription, supplyFindings, supplyHeadline, swapRoutedProvidersArePriceConsistent, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termApiBaseUrl, 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, termOfferRateToAprPct, termOrderStoreBaseUrl, tickToAprNumber, tickToPrice, toDigest, toDolomiteSubAccountId, toTermFillNow, toTermSheetInput, toVaultTermInput, trancheFromCounterparty, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultSharesToAssets, vaultTermInputFromEarnMarket, vaultTermInputFromSourceRow, vaultTraits, vaultVenue, venueBrand, venueBrandKey, withMaturityLabel, withTrancheLabel };
83078
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, DEFAULT_TERM_ORDER_STORE, DOLOMITE_ISO_ID_PREFIX, EARN_DESCRIPTIONS, EARN_LABELS, EARN_RATE_SOURCE_BY_PROVIDER, EMPTY_BALANCE, EXACTLY_LENDER_KEY, FLYING_TULIP_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, PREFIX_LENDERS, SDK_FRACTION_RATE_PROVIDERS, SPECTRA_NETWORKS, SPECTRA_RATE_MAX_PERCENT, SPECTRA_RATE_MIN_PERCENT, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_MARKETS_PER_CALL, 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_PROVIDERS, 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, applyEarnSanity, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, blockNumberFromTag, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLendingPositionUid, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildQueriesFromMeta, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultEarnUid, buildVaultLookup, buildVaultTermSheet, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, clearPendleMarketsCache, clearSpectraMarketsCache, collateralSymbolsByVenue, 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, convertCoolerMarketsToResponse, convertDssMarketsToResponse, convertExactlyMarketsToResponse, convertFlyingTulipMarketsToResponse, 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, dexResolverFor, disambiguateEarnNames, dolomiteVaultAddress, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, earnDescription, earnLabel, earnMarketFromPool, earnMarketFromVault, earnMarketLabel, earnPositionFromLenderEntry, earnPositionFromVaultBalance, earnPositionTotals, earnRateAtMaturity, earnRowSubtitle, earnUidFromMarketUid, earnVaultTerms, earnVenueKind, emitterCoverage, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, enumerateEmitters, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchCoolerMarkets, fetchDolomiteAccountNumbers, fetchDolomiteSubAccounts, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidDexState, fetchFluidFTokens, fetchFlyingTulipMarkets, 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, fetchSpectraApiMarkets, fetchSpectraPtMarkets, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTermStoreOrders, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, fillableRemaining, filterActiveLenders, filterLenderMeta, filterLendersByProtocol, finalizeInfo, findingsFor, formatRaw, frankencoinKeyParts, frankencoinLenderKey, fraxlendAssetPerCollateral, fraxlendKeyParts, fraxlendLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedFluidDexState, 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, getResolvedDolomiteSubAccounts, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasPendleMarkets, hasSpectraMarkets, hasUpshiftVaults, hasYearnVaults, ilkToKeySegment, implausibleRatePercent, injectLenderInfoIntoEntries, inverseKeyParts, inverseLenderKey, isBoundNeed, isFailedCall, isIlliquid, isLendingPosition, isLiveMarket as isLivePendleMarket, isLiveSpectraMarket, isMaturedTerm, isSecondaryMarketOnly, isStablecoinSymbol, isUnearnableEarnRate, isUnrealizableEarnRate, isVaultPosition, isVaultVenue, isYearnV3, keySegmentToIlk, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, marketKeysOf, meetsLiquidityFloor, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, organizeUserQueries, parseBalanceFetcherResult, parseDolomiteSubAccountId, parseEarnUid, parseLenderKey, parseMergedResult, parseMulticallRpcResponses, parseExpirySeconds as parsePendleExpirySeconds, parseRawRpcBatchResponses, parseRawRpcResponses, parseCurveFee as parseSpectraCurveFee, parsePtRate as parseSpectraPtRate, parseTermMaxLtv, parseTokenBalanceResult, pct, assetKey as pendleAssetKey, pickPool as pickSpectraPool, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, ratePercent, readUserPositions, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, repairImpossibleTvl, resolveAdapter, resolveDerivation, resolveDolomiteRowIdentity, resolveEarnIdentity, resolveModeConfig, resolveStCeloDepositGroup, resolveVaultProfileId, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, sanePercent as saneSpectraPercent, savingsAddresses, savingsBalanceKind, secondaryMarketVault, selectAssetGroupPrices, setMysticApiKey, shortDate, spectraAddress, spectraNetwork, spectraPoolsUrl, splitChainScopedAddress as splitPendleChainScopedAddress, stampCapabilities, stampEarnSubtitles, stampVaultClassification, stampVaultTermSheets, stripLeadingBrand, subAccountsOf, supplyDescription, supplyFindings, supplyHeadline, swapRoutedProvidersArePriceConsistent, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termApiBaseUrl, 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, termOfferRateToAprPct, termOrderStoreBaseUrl, tickToAprNumber, tickToPrice, toDigest, toDolomiteSubAccountId, toTermFillNow, toTermSheetInput, toVaultTermInput, trancheFromCounterparty, tryParseEarnUid, unflattenLenderData, updateFeedStats, usdValue, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData, vaultSharesToAssets, vaultTermInputFromEarnMarket, vaultTermInputFromSourceRow, vaultTraits, vaultVenue, venueBrand, venueBrandKey, withMaturityLabel, withTrancheLabel };
82763
83079
  //# sourceMappingURL=index.js.map
82764
83080
  //# sourceMappingURL=index.js.map