@1delta/margin-fetcher 5.0.16 → 5.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -3735,6 +3735,16 @@ interface LlamaLendMarketRaw {
3735
3735
  * converting anyone's collateral.
3736
3736
  */
3737
3737
  activeBand: number | null;
3738
+ /**
3739
+ * Assets per 1e18 vault shares — the multiplier that turns a lender's share
3740
+ * balance into an amount of the borrowed token.
3741
+ *
3742
+ * Read once per market rather than per user. It is NOT ~1.0: `DEAD_SHARES`
3743
+ * puts LlamaLend vault shares roughly 1000x the asset scale, so it reads
3744
+ * around 1e-3. A consumer that treats a share balance as an amount overstates
3745
+ * a lender's position by three orders of magnitude.
3746
+ */
3747
+ pricePerShare: number | null;
3738
3748
  }
3739
3749
  /** Raw public-data batch for one LlamaLend chain (both generations together). */
3740
3750
  interface LlamaLendMarketsRaw {
@@ -3804,6 +3814,18 @@ interface LlamaLendPositionInfo {
3804
3814
  * the position IS or HAS BEEN in soft liquidation.
3805
3815
  */
3806
3816
  bandCollateralInBorrowed: string;
3817
+ /**
3818
+ * The user's SUPPLY position on this market, in the borrowed token — vault
3819
+ * shares plus gauge-staked shares, converted to assets.
3820
+ *
3821
+ * Separate from the row's `deposits`, which sums this with
3822
+ * `bandCollateralInBorrowed`. Only this part earns the vault's lend APR.
3823
+ */
3824
+ lendAssets: string;
3825
+ /** Raw lend SHARES (vault + gauge). ~1000x the asset scale — never an amount. */
3826
+ lendShares: string;
3827
+ /** True when some or all of the lend shares are staked in the market's gauge. */
3828
+ lendStaked: boolean;
3807
3829
  /** True when the LLAMMA currently holds a borrowed-token leg for this user. */
3808
3830
  softLiquidating: boolean;
3809
3831
  /**
package/dist/index.js CHANGED
@@ -17642,7 +17642,16 @@ function buildEModes(borrowVaults, cluster) {
17642
17642
  }
17643
17643
  return eModes;
17644
17644
  }
17645
+ var OP_DEPOSIT = 1 << 0;
17646
+ var OP_MINT = 1 << 1;
17647
+ var OP_BORROW = 1 << 6;
17648
+ function isOperationDisabled(info, operation) {
17649
+ const hookedOps = Number(info.hookedOperations ?? 0n);
17650
+ return (hookedOps & operation) !== 0 && info.hookTarget.toLowerCase() === zeroAddress;
17651
+ }
17645
17652
  function buildMetadata(info) {
17653
+ const hookedOperations = Number(info.hookedOperations ?? 0n);
17654
+ const hookTarget = info.hookTarget.toLowerCase();
17646
17655
  return {
17647
17656
  vault: info.vault.toLowerCase(),
17648
17657
  dToken: info.dToken.toLowerCase(),
@@ -17650,7 +17659,9 @@ function buildMetadata(info) {
17650
17659
  interestRateModel: info.interestRateModel.toLowerCase(),
17651
17660
  unitOfAccount: info.unitOfAccount.toLowerCase(),
17652
17661
  evc: info.evc.toLowerCase(),
17653
- governorAdmin: info.governorAdmin.toLowerCase()
17662
+ governorAdmin: info.governorAdmin.toLowerCase(),
17663
+ ...hookedOperations !== 0 ? { hookedOperations } : {},
17664
+ ...hookTarget !== zeroAddress ? { hookTarget } : {}
17654
17665
  };
17655
17666
  }
17656
17667
  function buildTokenEntry(info, config, collateralActive, borrowVaults, opts) {
@@ -17707,13 +17718,32 @@ function buildTokenEntry(info, config, collateralActive, borrowVaults, opts) {
17707
17718
  lastUpdateTimestamp: Number(info.timestamp),
17708
17719
  config,
17709
17720
  collateralActive,
17710
- borrowingEnabled: isBorrowVault,
17711
- depositsEnabled: true,
17721
+ // A governor can switch either side of a vault off through the hook system
17722
+ // without ever touching the caps, so these flags are read from
17723
+ // `hookedOperations`/`hookTarget` rather than assumed. A vault that takes no
17724
+ // deposits is not a collateral candidate and must not rank as one, however
17725
+ // attractive its rate — `maxDeposit`/`maxMint` return 0 for it on-chain.
17726
+ borrowingEnabled: isBorrowVault && !isOperationDisabled(info, OP_BORROW),
17727
+ // Gated on OP_DEPOSIT alone, not on `OP_DEPOSIT || OP_MINT`: every supply
17728
+ // route we encode calls `deposit`, so a vault that disabled only that leg is
17729
+ // unusable to us even while share-minting stays open.
17730
+ depositsEnabled: !isOperationDisabled(info, OP_DEPOSIT),
17712
17731
  hasStable: false,
17713
17732
  isActive: true,
17714
- isFrozen: false,
17733
+ // Supply AND borrow both off is the closest EVK analogue of an Aave-style
17734
+ // freeze: the vault still prices and still lets existing positions unwind.
17735
+ isFrozen: isOperationDisabled(info, OP_DEPOSIT) && isOperationDisabled(info, OP_MINT) && isOperationDisabled(info, OP_BORROW),
17715
17736
  borrowCap: toTokenAmount(info.borrowCap, info.assetDecimals),
17716
- supplyCap: toTokenAmount(info.supplyCap, info.assetDecimals),
17737
+ // Supply switched off reports as ZERO CAPACITY, not merely as a false flag.
17738
+ // Consumers that rank markets (the pair book) can only compare capacity
17739
+ // across lenders — `depositsEnabled` means different things per provider
17740
+ // (Gearbox marks collateral-only tokens false because they have no lend
17741
+ // side, while they remain perfectly good collateral), so it cannot be a
17742
+ // cross-lender gate. Capacity can, and 0 is exactly what the vault's own
17743
+ // `maxDeposit`/`maxMint` return here. Note this is already the shape Euler
17744
+ // itself emits for a cap-disabled vault: `caps() = (1, …)` resolves to a
17745
+ // supply cap of 0.
17746
+ supplyCap: isOperationDisabled(info, OP_DEPOSIT) ? 0 : toTokenAmount(info.supplyCap, info.assetDecimals),
17717
17747
  debtCeiling: 0,
17718
17748
  eMode: selfEMode,
17719
17749
  decimals: Number(info.assetDecimals),
@@ -22978,7 +23008,6 @@ function num(api, key2) {
22978
23008
  const v = api?.[key2];
22979
23009
  return typeof v === "number" && Number.isFinite(v) ? v : null;
22980
23010
  }
22981
- var BANDS_ENDPOINTS = [4, 10, 20, 50];
22982
23011
  var DEFAULT_BANDS = 10;
22983
23012
  var LLAMALEND_READ_ABI = [
22984
23013
  ...LlamaLendControllerAbi,
@@ -22989,6 +23018,8 @@ var LLAMALEND_READ_ABI = [
22989
23018
  ...Erc20Abi
22990
23019
  ];
22991
23020
  var ZERO = "0x0000000000000000000000000000000000000000";
23021
+ var WAD8 = 10n ** 18n;
23022
+ var CALLS_PER_MARKET = 6;
22992
23023
  var fetchJson2 = async (url, timeoutMs = 8e3) => {
22993
23024
  const res = await fetch(url, {
22994
23025
  headers: { accept: "application/json" },
@@ -23005,25 +23036,12 @@ var toBig5 = (v) => {
23005
23036
  };
23006
23037
  var human = (v, decimals) => v === null ? null : Number(v) / 10 ** decimals;
23007
23038
  var bandsFor = (m) => m.defaultBands && m.defaultBands >= 4 && m.defaultBands <= 50 ? m.defaultBands : DEFAULT_BANDS;
23008
- var bandGrid = (m) => {
23009
- const set = /* @__PURE__ */ new Set([...BANDS_ENDPOINTS, bandsFor(m)]);
23010
- return [...set].sort((a, b) => a - b);
23011
- };
23012
23039
  var MIN_BANDS = 4;
23013
23040
  var MAX_BANDS = 50;
23014
23041
  var LTV_CURVE_BANDS = Array.from(
23015
23042
  { length: MAX_BANDS - MIN_BANDS + 1 },
23016
23043
  (_3, i) => MIN_BANDS + i
23017
23044
  );
23018
- var maxBorrowableCall = (m, oneUnit, n) => m.version === 1 ? {
23019
- address: m.controller,
23020
- name: "max_borrowable",
23021
- params: [oneUnit, BigInt(n), 0n, ZERO]
23022
- } : {
23023
- address: m.controller,
23024
- name: "max_borrowable",
23025
- params: [oneUnit, BigInt(n), ZERO]
23026
- };
23027
23045
  var buildBandLtv = (market) => {
23028
23046
  if (!market.ammA || !market.loanDiscount) return null;
23029
23047
  try {
@@ -23044,8 +23062,6 @@ var buildBandLtv = (market) => {
23044
23062
  };
23045
23063
  async function fetchChainExtras(chainId, markets) {
23046
23064
  const perMarketCalls = markets.map((m) => {
23047
- const grid = bandGrid(m);
23048
- const oneUnit = 10n ** BigInt(m.collateralDecimals);
23049
23065
  const calls = [
23050
23066
  { address: m.amm, name: "price_oracle", params: [] },
23051
23067
  { address: m.amm, name: "active_band", params: [] },
@@ -23054,9 +23070,17 @@ async function fetchChainExtras(chainId, markets) {
23054
23070
  // v1 controllers have no `borrow_cap`; allowFailure turns that into a
23055
23071
  // null rather than sinking the whole batch.
23056
23072
  { address: m.controller, name: "borrow_cap", params: [] },
23057
- ...grid.map((n) => maxBorrowableCall(m, oneUnit, n))
23073
+ /**
23074
+ * Price per share, read ONCE PER MARKET rather than per user.
23075
+ *
23076
+ * Vault shares run ~1000x the asset scale (`DEAD_SHARES`), so a share
23077
+ * balance is never an amount — every consumer needs this multiplier to
23078
+ * turn a lender's holding into assets. Reading it here keeps the
23079
+ * per-user call to two plain `balanceOf`s.
23080
+ */
23081
+ { address: m.vault, name: "convertToAssets", params: [WAD8] }
23058
23082
  ];
23059
- return { market: m, grid, calls };
23083
+ return { market: m, calls };
23060
23084
  });
23061
23085
  const flat = perMarketCalls.flatMap((x) => x.calls);
23062
23086
  if (flat.length === 0) return {};
@@ -23077,13 +23101,14 @@ async function fetchChainExtras(chainId, markets) {
23077
23101
  }
23078
23102
  const out = {};
23079
23103
  let cursor = 0;
23080
- for (const { market, grid } of perMarketCalls) {
23104
+ for (const { market } of perMarketCalls) {
23081
23105
  const priceRaw = toBig5(results[cursor]);
23082
23106
  const activeBandRaw = toBig5(results[cursor + 1]);
23083
23107
  const nLoansRaw = toBig5(results[cursor + 2]);
23084
23108
  const maxDepositRaw = toBig5(results[cursor + 3]);
23085
23109
  const borrowCapRaw = toBig5(results[cursor + 4]);
23086
- cursor += 5 + grid.length;
23110
+ const pricePerShareRaw = toBig5(results[cursor + 5]);
23111
+ cursor += CALLS_PER_MARKET;
23087
23112
  const collateralPrice = priceRaw === null ? null : Number(priceRaw) / 1e18;
23088
23113
  const bandLtv = buildBandLtv(market);
23089
23114
  const defaultN = String(bandsFor(market));
@@ -23094,7 +23119,11 @@ async function fetchChainExtras(chainId, markets) {
23094
23119
  borrowCap: human(borrowCapRaw, market.borrowedDecimals),
23095
23120
  maxDeposit: human(maxDepositRaw, market.borrowedDecimals),
23096
23121
  nLoans: nLoansRaw === null ? null : Number(nLoansRaw),
23097
- activeBand: activeBandRaw === null ? null : Number(activeBandRaw)
23122
+ activeBand: activeBandRaw === null ? null : Number(activeBandRaw),
23123
+ // Assets-per-WAD-shares. Kept as a ratio (not scaled to the borrowed
23124
+ // token's decimals) so a consumer multiplies a raw share balance by it
23125
+ // and divides by 1e18 exactly once.
23126
+ pricePerShare: pricePerShareRaw === null ? null : Number(pricePerShareRaw) / 1e18
23098
23127
  };
23099
23128
  }
23100
23129
  return out;
@@ -23159,7 +23188,8 @@ async function fetchLlamaLendMarkets(lender, chainId) {
23159
23188
  ),
23160
23189
  maxDeposit: ex?.maxDeposit ?? null,
23161
23190
  nLoans: ex?.nLoans ?? null,
23162
- activeBand: ex?.activeBand ?? null
23191
+ activeBand: ex?.activeBand ?? null,
23192
+ pricePerShare: ex?.pricePerShare ?? null
23163
23193
  };
23164
23194
  });
23165
23195
  return { lender, config, chainData, markets: rows, source: "api" };
@@ -23219,7 +23249,8 @@ async function fetchLlamaLendMarkets(lender, chainId) {
23219
23249
  ),
23220
23250
  maxDeposit: ex?.maxDeposit ?? null,
23221
23251
  nLoans: ex?.nLoans ?? null,
23222
- activeBand: ex?.activeBand ?? null
23252
+ activeBand: ex?.activeBand ?? null,
23253
+ pricePerShare: ex?.pricePerShare ?? null
23223
23254
  };
23224
23255
  });
23225
23256
  return { lender, config, chainData, markets: rows, source: "chain" };
@@ -24411,6 +24442,13 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
24411
24442
  collateralPrice: m.collateralPrice !== null ? String(m.collateralPrice) : void 0,
24412
24443
  /** v2 only; `0` means borrowing is switched off. */
24413
24444
  borrowCap: m.borrowCap !== null ? String(m.borrowCap) : void 0,
24445
+ /**
24446
+ * Assets per 1e18 vault shares — what a lender's share balance is
24447
+ * worth. Published because the SUPPLY side of a LlamaLend market is
24448
+ * an ERC-4626 vault whose shares run ~1000x the asset scale, so a
24449
+ * raw balance is meaningless without it.
24450
+ */
24451
+ pricePerShare: m.pricePerShare !== null ? String(m.pricePerShare) : void 0,
24414
24452
  addresses: {
24415
24453
  controller: market.controller,
24416
24454
  vault: market.vault,
@@ -25109,7 +25147,7 @@ function dssKeyParts(key2) {
25109
25147
  if (!m) return void 0;
25110
25148
  return { lender: m[1], chainId: m[2], ilk: keySegmentToIlk(m[3]) };
25111
25149
  }
25112
- var WAD9 = 1e18;
25150
+ var WAD10 = 1e18;
25113
25151
  var RAY4 = 1e27;
25114
25152
  var RAD = 1e45;
25115
25153
  var YEAR_SECONDS2 = 31536e3;
@@ -25153,7 +25191,7 @@ function convertDssMarketsToResponse(raw, chainId, prices = {}, _additionalYield
25153
25191
  const totalColl = m.joinBalance !== null ? toHuman4(m.joinBalance, collDecimals) : 0;
25154
25192
  const mat = m.mat !== null ? Number(m.mat) / RAY4 : Number(market.mat) / RAY4 || 1.5;
25155
25193
  const ltv = mat > 0 ? 1 / mat : 0;
25156
- const chop = market.chop ? Number(market.chop) / WAD9 : 0;
25194
+ const chop = market.chop ? Number(market.chop) / WAD10 : 0;
25157
25195
  const liqPenalty = chop > 1 ? chop - 1 : 0;
25158
25196
  const duty = m.duty !== null ? m.duty : BigInt(market.duty ?? 0);
25159
25197
  const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY4 * YEAR_SECONDS2 * 100 : 0;
@@ -27885,7 +27923,7 @@ var buildRiverUserCall = (chainId, lender, account) => {
27885
27923
  });
27886
27924
  return calls;
27887
27925
  };
27888
- var LLAMALEND_CALLS_PER_MARKET = 5;
27926
+ var LLAMALEND_CALLS_PER_MARKET = 8;
27889
27927
  var buildLlamaLendUserCall = (chainId, lender, account, spender) => {
27890
27928
  const cfg = llamaLendConfigFor(lender, chainId);
27891
27929
  const markets = llamaLendChainData(lender, chainId)?.markets ?? [];
@@ -27896,7 +27934,16 @@ var buildLlamaLendUserCall = (chainId, lender, account, spender) => {
27896
27934
  { address: m.controller, name: "health", params: [account, true] },
27897
27935
  { address: m.controller, name: "user_prices", params: [account] },
27898
27936
  { address: m.amm, name: "read_user_tick_numbers", params: [account] },
27899
- { address: m.controller, name: "approval", params: [account, delegate] }
27937
+ { address: m.controller, name: "approval", params: [account, delegate] },
27938
+ { address: m.vault, name: "balanceOf", params: [account] },
27939
+ // A market without a gauge would call address(0), which returns '0x' and
27940
+ // parses as zero — the layout stays fixed either way.
27941
+ {
27942
+ address: m.gauge ?? "0x0000000000000000000000000000000000000000",
27943
+ name: "balanceOf",
27944
+ params: [account]
27945
+ },
27946
+ { address: m.vault, name: "convertToAssets", params: [10n ** 18n] }
27900
27947
  ]);
27901
27948
  };
27902
27949
  var INVERSE_CALLS_PER_MARKET = 4;
@@ -31073,7 +31120,7 @@ var getMidnightUserDataConverter = (_lender, chainId, account, meta) => {
31073
31120
  totalCalls
31074
31121
  ];
31075
31122
  };
31076
- var WAD10 = 1000000000000000000n;
31123
+ var WAD11 = 1000000000000000000n;
31077
31124
  function toBigInt11(v) {
31078
31125
  if (v === void 0 || v === null || v === "0x") return 0n;
31079
31126
  if (typeof v === "bigint") return v;
@@ -31115,8 +31162,8 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
31115
31162
  const debtStr = parseRawAmount(debtUnits.toString(), market.loanDecimals);
31116
31163
  const debtNum = Number(debtStr);
31117
31164
  const repoBalance = toBigInt11(balanceResult);
31118
- const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD10;
31119
- const lentUnits = repoBalance * redemptionValue / WAD10;
31165
+ const redemptionValue = toBigInt11(redemptionResult) || toBigInt11(market.redemptionValue) || WAD11;
31166
+ const lentUnits = repoBalance * redemptionValue / WAD11;
31120
31167
  const depositsStr = parseRawAmount(lentUnits.toString(), market.loanDecimals);
31121
31168
  const depositsNum = Number(depositsStr);
31122
31169
  const posData = {};
@@ -31194,7 +31241,7 @@ var getTermUserDataConverter = (_lender, chainId, account, meta) => {
31194
31241
  };
31195
31242
  var nowSec6 = () => Math.floor(Date.now() / 1e3);
31196
31243
  var DAY_SECONDS = 86400n;
31197
- var WAD11 = 10n ** 18n;
31244
+ var WAD12 = 10n ** 18n;
31198
31245
  function sumPreview(positions) {
31199
31246
  return positions.reduce((acc, p) => acc + p.previewValue, 0n);
31200
31247
  }
@@ -31218,7 +31265,7 @@ function toDetail(positions, kind, now, penaltyRate, penaltyApr) {
31218
31265
  ...kind === "borrow" ? {
31219
31266
  ...overdue ? { latePenalty: excess.toString() } : { earlyRepayDiscount: gap.toString() },
31220
31267
  // face × penaltyRate × 1 day — what another day of being late adds.
31221
- latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD11).toString(),
31268
+ latePenaltyPerDay: (face * penaltyRate * DAY_SECONDS / WAD12).toString(),
31222
31269
  latePenaltyApr: penaltyApr
31223
31270
  } : {
31224
31271
  ...overdue ? {} : { earlyExitCost: gap.toString() },
@@ -31347,7 +31394,7 @@ var getExactlyUserDataConverter = (_lender, chainId, account, meta) => {
31347
31394
  latePenalty: penalty,
31348
31395
  /** further penalty per day overdue — linear on face */
31349
31396
  latePenaltyPerDay: parseRawAmount(
31350
- (face * m.penaltyRate * DAY_SECONDS / WAD11).toString(),
31397
+ (face * m.penaltyRate * DAY_SECONDS / WAD12).toString(),
31351
31398
  decimals
31352
31399
  ),
31353
31400
  latePenaltyApr: penaltyApr,
@@ -31875,7 +31922,13 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31875
31922
  const bandBorrowed = big7(stateRaw[1]);
31876
31923
  const debt = big7(stateRaw[2]);
31877
31924
  const bandCount = Number(big7(stateRaw[3]));
31878
- if (collateral === 0n && debt === 0n && bandBorrowed === 0n) return;
31925
+ const vaultSharesRaw = data[base + 5];
31926
+ const gaugeSharesRaw = data[base + 6];
31927
+ const vaultShares = isFailedCall(vaultSharesRaw) ? 0n : big7(vaultSharesRaw);
31928
+ const gaugeShares = isFailedCall(gaugeSharesRaw) ? 0n : big7(gaugeSharesRaw);
31929
+ const lendShares = vaultShares + gaugeShares;
31930
+ if (collateral === 0n && debt === 0n && bandBorrowed === 0n && lendShares === 0n)
31931
+ return;
31879
31932
  const healthRaw = data[base + 1];
31880
31933
  const health = isFailedCall(healthRaw) ? 0n : big7(healthRaw);
31881
31934
  const pricesRaw = data[base + 2];
@@ -31902,6 +31955,15 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31902
31955
  const loanDisplay = loanMeta ? getDisplayPrice(loanMeta) : 0;
31903
31956
  const loanOracle = loanMeta ? getOraclePrice(loanMeta) : 0;
31904
31957
  const loanHist = loanMeta?.price?.priceUsd24h ?? loanDisplay;
31958
+ const shareToAssetRaw = data[base + 7];
31959
+ const shareToAsset = isFailedCall(shareToAssetRaw) ? 0n : big7(shareToAssetRaw);
31960
+ const lendAssets = shareToAsset === 0n ? 0n : lendShares * shareToAsset / 10n ** 18n;
31961
+ const lendStr = parseRawAmount(lendAssets.toString(), loanDecimals);
31962
+ const depositStr = parseRawAmount(
31963
+ (lendAssets + bandBorrowed).toString(),
31964
+ loanDecimals
31965
+ );
31966
+ const depositNum = Number(depositStr);
31905
31967
  const llamalendInfo = {
31906
31968
  health: health.toString(),
31907
31969
  priceUpper: priceUpper.toString(),
@@ -31909,6 +31971,9 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31909
31971
  bands,
31910
31972
  bandCount,
31911
31973
  bandCollateralInBorrowed: bandBorrowed.toString(),
31974
+ lendAssets: lendStr,
31975
+ lendShares: lendShares.toString(),
31976
+ lendStaked: gaugeShares > 0n,
31912
31977
  softLiquidating: bandBorrowed > 0n,
31913
31978
  delegated,
31914
31979
  supportsDelegation: market.supportsDelegation === true,
@@ -31918,11 +31983,10 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31918
31983
  const collNum = Number(collStr);
31919
31984
  const debtStr = parseRawAmount(debt.toString(), loanDecimals);
31920
31985
  const debtNum = Number(debtStr);
31921
- const bandBorrowedStr = parseRawAmount(
31986
+ parseRawAmount(
31922
31987
  bandBorrowed.toString(),
31923
31988
  loanDecimals
31924
31989
  );
31925
- const bandBorrowedNum = Number(bandBorrowedStr);
31926
31990
  const lendingPositions = {
31927
31991
  "0": {
31928
31992
  [collUid]: {
@@ -31944,16 +32008,18 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31944
32008
  [loanUid]: {
31945
32009
  marketUid: loanUid,
31946
32010
  underlying: loanAddr,
31947
- deposits: bandBorrowedStr,
32011
+ deposits: depositStr,
31948
32012
  debt: debtStr,
31949
32013
  debtStable: "0",
31950
- depositsUSD: bandBorrowedNum * loanDisplay,
32014
+ depositsUSD: depositNum * loanDisplay,
31951
32015
  debtUSD: debtNum * loanDisplay,
31952
32016
  debtStableUSD: 0,
31953
- depositsUSDOracle: bandBorrowedNum * loanOracle,
32017
+ depositsUSDOracle: depositNum * loanOracle,
31954
32018
  debtUSDOracle: debtNum * loanOracle,
31955
32019
  debtStableUSDOracle: 0,
31956
32020
  stableBorrowRate: "0",
32021
+ // The borrowed token is never collateral in a LlamaLend market —
32022
+ // supplying it earns the lend rate, it does not back a loan.
31957
32023
  collateralEnabled: false,
31958
32024
  claimableRewards: 0,
31959
32025
  llamalendInfo
@@ -31963,7 +32029,7 @@ var getLlamaLendUserDataConverter = (lender, chainId, account, meta) => {
31963
32029
  const modes = { "0": bandCount };
31964
32030
  const hist = {
31965
32031
  "0": {
31966
- totalDeposits24h: collNum * collHist + bandBorrowedNum * loanHist,
32032
+ totalDeposits24h: collNum * collHist + depositNum * loanHist,
31967
32033
  totalDebt24h: debtNum * loanHist
31968
32034
  }
31969
32035
  };
@@ -32111,7 +32177,7 @@ var getResupplyUserDataConverter = (lender, chainId, account, meta) => {
32111
32177
  expected
32112
32178
  ];
32113
32179
  };
32114
- var WAD12 = 10n ** 18n;
32180
+ var WAD13 = 10n ** 18n;
32115
32181
  var big9 = (v) => {
32116
32182
  try {
32117
32183
  if (typeof v === "bigint") return v;
@@ -32182,7 +32248,7 @@ var getCurvanceUserDataConverter = (lender, chainId, account, meta) => {
32182
32248
  const display = getDisplayPrice(rowMeta);
32183
32249
  const oracle = getOraclePrice(rowMeta);
32184
32250
  const histPrice = rowMeta.price?.priceUsd24h ?? display;
32185
- const toUnderlying = (s) => exchangeRate > 0n ? s * exchangeRate / WAD12 : s;
32251
+ const toUnderlying = (s) => exchangeRate > 0n ? s * exchangeRate / WAD13 : s;
32186
32252
  const depositsRaw = toUnderlying(collateralShares);
32187
32253
  const depositsStr = parseRawAmount(
32188
32254
  depositsRaw.toString(),