@1delta/margin-fetcher 0.0.242 → 0.0.245

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.
Files changed (41) hide show
  1. package/dist/index.js +533 -21
  2. package/dist/index.js.map +1 -1
  3. package/dist/lending/public-data/fetchLender.d.ts.map +1 -1
  4. package/dist/lending/public-data/gearbox/index.d.ts +3 -0
  5. package/dist/lending/public-data/gearbox/index.d.ts.map +1 -0
  6. package/dist/lending/public-data/gearbox/publicCallBuild.d.ts +17 -0
  7. package/dist/lending/public-data/gearbox/publicCallBuild.d.ts.map +1 -0
  8. package/dist/lending/public-data/gearbox/publicCallParse.d.ts +27 -0
  9. package/dist/lending/public-data/gearbox/publicCallParse.d.ts.map +1 -0
  10. package/dist/lending/user-data/abis.d.ts.map +1 -1
  11. package/dist/lending/user-data/fetch-balances/parse.d.ts.map +1 -1
  12. package/dist/lending/user-data/fetch-balances/prepare.d.ts.map +1 -1
  13. package/dist/lending/user-data/gearbox/index.d.ts +3 -0
  14. package/dist/lending/user-data/gearbox/index.d.ts.map +1 -0
  15. package/dist/lending/user-data/gearbox/userCallBuild.d.ts +19 -0
  16. package/dist/lending/user-data/gearbox/userCallBuild.d.ts.map +1 -0
  17. package/dist/lending/user-data/gearbox/userCallParse.d.ts +25 -0
  18. package/dist/lending/user-data/gearbox/userCallParse.d.ts.map +1 -0
  19. package/dist/prices/oracle-prices/fetchOraclePrices.d.ts.map +1 -1
  20. package/dist/prices/oracle-prices/fetchers/gearbox.d.ts +601 -0
  21. package/dist/prices/oracle-prices/fetchers/gearbox.d.ts.map +1 -0
  22. package/dist/prices/oracle-prices/fetchers/index.d.ts +2 -1
  23. package/dist/prices/oracle-prices/fetchers/index.d.ts.map +1 -1
  24. package/dist/prices/oracle-prices/fetchers/morpho.d.ts +9 -0
  25. package/dist/prices/oracle-prices/fetchers/morpho.d.ts.map +1 -1
  26. package/dist/utils/index.d.ts +1 -1
  27. package/dist/utils/index.d.ts.map +1 -1
  28. package/dist/utils/marketName.d.ts.map +1 -1
  29. package/dist/vaults/gearbox/fetchPublic.d.ts +23 -0
  30. package/dist/vaults/gearbox/fetchPublic.d.ts.map +1 -0
  31. package/dist/vaults/gearbox/index.d.ts +5 -0
  32. package/dist/vaults/gearbox/index.d.ts.map +1 -0
  33. package/dist/vaults/gearbox/publicCallBuild.d.ts +14 -0
  34. package/dist/vaults/gearbox/publicCallBuild.d.ts.map +1 -0
  35. package/dist/vaults/gearbox/publicCallParse.d.ts +13 -0
  36. package/dist/vaults/gearbox/publicCallParse.d.ts.map +1 -0
  37. package/dist/vaults/gearbox/types.d.ts +61 -0
  38. package/dist/vaults/gearbox/types.d.ts.map +1 -0
  39. package/dist/vaults/index.d.ts +1 -0
  40. package/dist/vaults/index.d.ts.map +1 -1
  41. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { parseAbi, formatEther, BaseError, encodeFunctionData, formatUnits, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, isAddress, InvalidAddressError, pad, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-KQ6K6D2V.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isEulerType, isFluid, isYLDR, isCompoundV3Type, isLista, isTectonicType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isEulerType, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
6
  import lodash from 'lodash';
7
7
  import { getEvmChain, getEvmClient, getEvmClientUniversal, multicallRetryUniversal } from '@1delta/providers';
8
- import { FluidLendingResolverAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, FluidVaultResolverAbi, MorphoBlueAbi } from '@1delta/abis';
8
+ import { FluidLendingResolverAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, FluidVaultResolverAbi, GearboxDataCompressorV3Abi, MorphoBlueAbi } from '@1delta/abis';
9
9
  export { MorphoLensAbi } from '@1delta/abis';
10
10
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses } from '@1delta/calldata-sdk';
11
11
  import { BALANCER_V2_FORKS, BALANCER_V3_FORKS, UNISWAP_V4_FORKS, isFlashLoanSourceExcluded, FLASH_LOAN_IDS } from '@1delta/dex-registry';
@@ -6283,7 +6283,8 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
6283
6283
  siloMarketsV3: {},
6284
6284
  siloPeripheralsV3: {},
6285
6285
  fluidResolvers: {},
6286
- fluidVaults: {}
6286
+ fluidVaults: {},
6287
+ gearboxResolvers: {}
6287
6288
  };
6288
6289
  function getGlobalData2() {
6289
6290
  return globalThis[GLOBAL_LENDER_DATA_KEY];
@@ -6312,6 +6313,7 @@ var aaveV4Oracles = () => getGlobalData2()?.aaveV4Oracles;
6312
6313
  var siloMarkets = () => getGlobalData2()?.siloMarkets;
6313
6314
  var siloMarketsV3 = () => getGlobalData2()?.siloMarketsV3;
6314
6315
  var fluidResolvers = () => getGlobalData2()?.fluidResolvers;
6316
+ var gearboxResolvers = () => getGlobalData2()?.gearboxResolvers;
6315
6317
  function aaveV4SpokeLenderKey(spoke) {
6316
6318
  if (!spoke || !spoke.startsWith("0x") || spoke.length !== 42) {
6317
6319
  throw new Error(`aaveV4SpokeLenderKey: invalid spoke address ${spoke}`);
@@ -6363,6 +6365,14 @@ function getSiloV3MarketEntry(chainId, lenderKey) {
6363
6365
  (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
6364
6366
  );
6365
6367
  }
6368
+ function gearboxV3LenderKey(creditManager) {
6369
+ if (!creditManager || !creditManager.startsWith("0x") || creditManager.length !== 42) {
6370
+ throw new Error(
6371
+ `gearboxV3LenderKey: invalid creditManager address ${creditManager}`
6372
+ );
6373
+ }
6374
+ return `GEARBOX_V3_${creditManager.slice(2).toUpperCase()}`;
6375
+ }
6366
6376
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
6367
6377
  async function fetchTokenList(chainId) {
6368
6378
  const data = await fetch(getListUrl(chainId));
@@ -6407,6 +6417,7 @@ var LENDER_SHORT_NAMES = {
6407
6417
  [Lender.EULER_V2]: "Euler V2",
6408
6418
  [Lender.FLUID]: "Fluid",
6409
6419
  [Lender.FLUX_FINANCE]: "Flux",
6420
+ [Lender.GEARBOX_V3]: "Gearbox V3",
6410
6421
  [Lender.GRANARY]: "Granary",
6411
6422
  [Lender.HANA]: "Hana",
6412
6423
  [Lender.INIT]: "Init",
@@ -6416,7 +6427,7 @@ var LENDER_SHORT_NAMES = {
6416
6427
  [Lender.MERIDIAN]: "Meridian"
6417
6428
  };
6418
6429
  function formatUnderscoreString(input) {
6419
- const _in = input.replace("MORPHO_BLUE", "MB").replace(/^FLUID_/, "Fluid ");
6430
+ const _in = input.replace("MORPHO_BLUE", "MB").replace(/^FLUID_/, "Fluid ").replace(/^GEARBOX_V3_/, "Gearbox V3 ");
6420
6431
  return _in.split("_").map((word, index) => {
6421
6432
  if (index === 0) {
6422
6433
  return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
@@ -6426,6 +6437,7 @@ function formatUnderscoreString(input) {
6426
6437
  }
6427
6438
  function lenderShortName(lender) {
6428
6439
  if (lender?.startsWith("FLUID")) return "Fluid";
6440
+ if (lender?.startsWith("GEARBOX_V3")) return "Gearbox V3";
6429
6441
  return LENDER_SHORT_NAMES[lender] ?? formatUnderscoreString(lender);
6430
6442
  }
6431
6443
 
@@ -7610,6 +7622,9 @@ var getLendersForChain = (c) => {
7610
7622
  if (fluidResolvers()?.[c]) {
7611
7623
  lenders.push(Lender.FLUID);
7612
7624
  }
7625
+ if (gearboxResolvers()?.[c]) {
7626
+ lenders.push(Lender.GEARBOX_V3);
7627
+ }
7613
7628
  return lenders;
7614
7629
  };
7615
7630
  var filterLendersByProtocol = (allLenders, protocolList) => {
@@ -7619,8 +7634,9 @@ var filterLendersByProtocol = (allLenders, protocolList) => {
7619
7634
  const hasMorpho = protocolList.includes(Lender.MORPHO_BLUE);
7620
7635
  const hasMoolah = protocolList.includes(Lender.LISTA_DAO);
7621
7636
  const hasFluid = protocolList.includes(Lender.FLUID);
7637
+ const hasGearboxV3 = protocolList.includes(Lender.GEARBOX_V3);
7622
7638
  return allLenders.filter(
7623
- (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID")
7639
+ (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3")
7624
7640
  );
7625
7641
  };
7626
7642
  var getAavesForChain = () => {
@@ -18867,7 +18883,7 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
18867
18883
  { self: market.silo0, other: market.silo1 },
18868
18884
  { self: market.silo1, other: market.silo0 }
18869
18885
  ];
18870
- const toBigInt8 = (v) => {
18886
+ const toBigInt9 = (v) => {
18871
18887
  if (v === void 0 || v === null || v === "0x") return 0n;
18872
18888
  if (typeof v === "bigint") return v;
18873
18889
  try {
@@ -18879,8 +18895,8 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
18879
18895
  for (let s = 0; s < 2; s++) {
18880
18896
  const { self, other } = sides[s];
18881
18897
  const slot = s * SILO_V2_CALLS_PER_SIDE;
18882
- const totalAssetsRaw = toBigInt8(data[slot]);
18883
- const debtAssetsRaw = toBigInt8(data[slot + 1]);
18898
+ const totalAssetsRaw = toBigInt9(data[slot]);
18899
+ const debtAssetsRaw = toBigInt9(data[slot + 1]);
18884
18900
  const irmConfigRaw = data[slot + 2];
18885
18901
  const decimals = self.decimals;
18886
18902
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -19035,7 +19051,7 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
19035
19051
  { self: market.silo0, other: market.silo1 },
19036
19052
  { self: market.silo1, other: market.silo0 }
19037
19053
  ];
19038
- const toBigInt8 = (v) => {
19054
+ const toBigInt9 = (v) => {
19039
19055
  if (v === void 0 || v === null || v === "0x") return 0n;
19040
19056
  if (typeof v === "bigint") return v;
19041
19057
  try {
@@ -19047,8 +19063,8 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
19047
19063
  for (let s = 0; s < 2; s++) {
19048
19064
  const { self, other } = sides[s];
19049
19065
  const slot = s * SILO_V3_CALLS_PER_SIDE;
19050
- const totalAssetsRaw = toBigInt8(data[slot]);
19051
- const debtAssetsRaw = toBigInt8(data[slot + 1]);
19066
+ const totalAssetsRaw = toBigInt9(data[slot]);
19067
+ const debtAssetsRaw = toBigInt9(data[slot + 1]);
19052
19068
  const irmConfigRaw = data[slot + 2];
19053
19069
  const decimals = self.decimals;
19054
19070
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -19354,6 +19370,203 @@ function parseVault(vault, chainId, prices, additionalYields, tokenList) {
19354
19370
  }
19355
19371
  };
19356
19372
  }
19373
+
19374
+ // src/lending/public-data/gearbox/publicCallBuild.ts
19375
+ var buildGearboxCall = (chainId, _lender) => {
19376
+ const resolvers = gearboxResolvers()?.[chainId];
19377
+ if (!resolvers?.dataCompressor) return [];
19378
+ return [
19379
+ {
19380
+ address: resolvers.dataCompressor,
19381
+ name: "getPoolsV3List",
19382
+ params: []
19383
+ },
19384
+ {
19385
+ address: resolvers.dataCompressor,
19386
+ name: "getCreditManagersV3List",
19387
+ params: []
19388
+ }
19389
+ ];
19390
+ };
19391
+
19392
+ // src/lending/public-data/gearbox/publicCallParse.ts
19393
+ var RAY_TO_PERCENT = 1e25;
19394
+ var scaleGearboxRate = (raw) => {
19395
+ if (raw === void 0 || raw === null) return 0;
19396
+ return Number(raw) / RAY_TO_PERCENT;
19397
+ };
19398
+ var getGearboxV3PublicDataConverter = (_lender, chainId, prices, additionalYields, tokenList = {}) => {
19399
+ const expectedNumberOfCalls = 2;
19400
+ return [
19401
+ (data) => {
19402
+ if (data.length !== expectedNumberOfCalls) return void 0;
19403
+ const [poolsData, cmsData] = data;
19404
+ const out = {};
19405
+ const poolByAddr = {};
19406
+ for (const pool of poolsData ?? []) {
19407
+ const addr = (pool.addr ?? "").toString().toLowerCase();
19408
+ if (!addr) continue;
19409
+ poolByAddr[addr] = pool;
19410
+ }
19411
+ for (const cm of cmsData ?? []) {
19412
+ const cmAddr = (cm.addr ?? "").toString().toLowerCase();
19413
+ if (!cmAddr) continue;
19414
+ const poolAddr = (cm.pool ?? "").toString().toLowerCase();
19415
+ const pool = poolByAddr[poolAddr];
19416
+ if (!pool) continue;
19417
+ if (pool.isPaused) continue;
19418
+ const rawPoolUnderlying = (cm.underlying ?? pool.underlying ?? "").toString().toLowerCase();
19419
+ if (!rawPoolUnderlying) continue;
19420
+ const underlying = rawPoolUnderlying;
19421
+ const underlyingMeta = tokenList[underlying];
19422
+ const underlyingDecimals = Number(underlyingMeta?.decimals ?? 18);
19423
+ const supplyRate = scaleGearboxRate(pool.supplyRate);
19424
+ const borrowRate = scaleGearboxRate(
19425
+ cm.baseBorrowRate ?? pool.baseInterestRate
19426
+ );
19427
+ const underlyingPriceKey = toOracleKey(underlyingMeta?.assetGroup) ?? toGenericPriceKey(underlying, chainId);
19428
+ const underlyingPrice = prices[underlyingPriceKey] ?? 0;
19429
+ let lender;
19430
+ try {
19431
+ lender = gearboxV3LenderKey(cmAddr);
19432
+ } catch {
19433
+ continue;
19434
+ }
19435
+ const availableToBorrow = Number(
19436
+ parseRawAmount(
19437
+ cm.availableToBorrow?.toString(),
19438
+ underlyingDecimals
19439
+ )
19440
+ );
19441
+ const totalDebtCm = Number(
19442
+ parseRawAmount(cm.totalDebt?.toString(), underlyingDecimals)
19443
+ );
19444
+ const data2 = {};
19445
+ const loanMarketUid = createMarketUid(chainId, lender, underlying);
19446
+ data2[loanMarketUid] = {
19447
+ marketUid: loanMarketUid,
19448
+ name: "Loan " + (underlyingMeta?.symbol ?? pool.symbol ?? ""),
19449
+ poolId: underlying,
19450
+ underlying,
19451
+ asset: underlyingMeta,
19452
+ totalDeposits: 0,
19453
+ totalDebtStable: 0,
19454
+ totalDebt: totalDebtCm,
19455
+ totalLiquidity: availableToBorrow,
19456
+ borrowLiquidity: availableToBorrow,
19457
+ totalDepositsUSD: 0,
19458
+ totalDebtStableUSD: 0,
19459
+ totalDebtUSD: totalDebtCm * underlyingPrice,
19460
+ totalLiquidityUSD: availableToBorrow * underlyingPrice,
19461
+ borrowLiquidityUSD: availableToBorrow * underlyingPrice,
19462
+ utilization: 0,
19463
+ depositRate: supplyRate,
19464
+ variableBorrowRate: borrowRate,
19465
+ stableBorrowRate: 0,
19466
+ intrinsicYield: additionalYields?.intrinsicYields?.[underlyingPriceKey] ?? 0,
19467
+ rewards: [],
19468
+ decimals: underlyingDecimals,
19469
+ config: {
19470
+ "0": {
19471
+ category: 0,
19472
+ borrowCollateralFactor: 0,
19473
+ collateralFactor: 0,
19474
+ borrowFactor: 1,
19475
+ collateralDisabled: true,
19476
+ debtDisabled: false
19477
+ }
19478
+ },
19479
+ liquidationBonus: 0,
19480
+ collateralActive: false,
19481
+ borrowingEnabled: true,
19482
+ depositsEnabled: false,
19483
+ hasStable: false,
19484
+ isActive: true,
19485
+ isFrozen: false
19486
+ };
19487
+ const collateralTokens = Array.isArray(cm.collateralTokens) ? cm.collateralTokens : [];
19488
+ const liquidationThresholds = Array.isArray(
19489
+ cm.liquidationThresholds
19490
+ ) ? cm.liquidationThresholds : [];
19491
+ for (let i = 0; i < collateralTokens.length; i++) {
19492
+ const rawToken = (collateralTokens[i] ?? "").toString().toLowerCase();
19493
+ if (!rawToken) continue;
19494
+ const token = rawToken;
19495
+ const ltRaw = Number(liquidationThresholds[i] ?? 0);
19496
+ const lt = ltRaw / BPS;
19497
+ if (lt <= 0) continue;
19498
+ const ctMeta = tokenList[token];
19499
+ const ctDecimals = Number(ctMeta?.decimals ?? 18);
19500
+ const ctPriceKey = toOracleKey(ctMeta?.assetGroup) ?? toGenericPriceKey(token, chainId);
19501
+ const colMarketUid = createMarketUid(chainId, lender, token);
19502
+ if (colMarketUid === loanMarketUid) continue;
19503
+ data2[colMarketUid] = {
19504
+ marketUid: colMarketUid,
19505
+ name: "Collateral " + (ctMeta?.symbol ?? ""),
19506
+ poolId: token,
19507
+ underlying: token,
19508
+ asset: ctMeta,
19509
+ totalDeposits: 0,
19510
+ totalDebtStable: 0,
19511
+ totalDebt: 0,
19512
+ totalLiquidity: 0,
19513
+ borrowLiquidity: 0,
19514
+ totalDepositsUSD: 0,
19515
+ totalDebtStableUSD: 0,
19516
+ totalDebtUSD: 0,
19517
+ totalLiquidityUSD: 0,
19518
+ borrowLiquidityUSD: 0,
19519
+ utilization: 0,
19520
+ depositRate: 0,
19521
+ variableBorrowRate: 0,
19522
+ stableBorrowRate: 0,
19523
+ intrinsicYield: additionalYields?.intrinsicYields?.[ctPriceKey] ?? 0,
19524
+ rewards: [],
19525
+ decimals: ctDecimals,
19526
+ config: {
19527
+ "0": {
19528
+ category: 0,
19529
+ borrowCollateralFactor: lt,
19530
+ collateralFactor: lt,
19531
+ borrowFactor: 1,
19532
+ collateralDisabled: false,
19533
+ debtDisabled: true
19534
+ }
19535
+ },
19536
+ liquidationBonus: 0,
19537
+ collateralActive: true,
19538
+ borrowingEnabled: false,
19539
+ depositsEnabled: false,
19540
+ hasStable: false,
19541
+ isActive: true,
19542
+ isFrozen: false
19543
+ };
19544
+ }
19545
+ out[lender] = {
19546
+ data: data2,
19547
+ params: {
19548
+ creditManager: {
19549
+ lender,
19550
+ creditManager: cmAddr,
19551
+ creditFacade: (cm.creditFacade ?? "").toString().toLowerCase(),
19552
+ pool: poolAddr,
19553
+ underlying,
19554
+ underlyingDecimals,
19555
+ minDebt: cm.minDebt?.toString() ?? "0",
19556
+ maxDebt: cm.maxDebt?.toString() ?? "0",
19557
+ degenNFT: (cm.degenNFT ?? zeroAddress).toString().toLowerCase(),
19558
+ forbiddenTokenMask: cm.forbiddenTokenMask?.toString() ?? "0",
19559
+ isDegenMode: !!cm.isDegenMode
19560
+ }
19561
+ },
19562
+ chainId
19563
+ };
19564
+ }
19565
+ return out;
19566
+ },
19567
+ expectedNumberOfCalls
19568
+ ];
19569
+ };
19357
19570
  function getMorphoTypeMarketConverter(lender, chainId, prices, additionalYields, tokenList = {}, marketsOverride) {
19358
19571
  if (lender.startsWith("LISTA_DAO"))
19359
19572
  return getListaMarketDataConverter(
@@ -19391,6 +19604,7 @@ function buildLenderCall(chainId, lender) {
19391
19604
  if (isSiloV2Type(lender)) return buildSiloV2LenderReserveCall(chainId, lender);
19392
19605
  if (isSiloV3Type(lender)) return buildSiloV3LenderReserveCall(chainId, lender);
19393
19606
  if (isFluid(lender)) return buildFluidCall(chainId);
19607
+ if (isGearboxV3(lender)) return buildGearboxCall(chainId);
19394
19608
  return [];
19395
19609
  }
19396
19610
  function getLenderDataConverter(lender, chainId, prices, additionalYields, tokenList = {}) {
@@ -19483,6 +19697,14 @@ function getLenderDataConverter(lender, chainId, prices, additionalYields, token
19483
19697
  additionalYields,
19484
19698
  tokenList
19485
19699
  );
19700
+ if (isGearboxV3(lender))
19701
+ return getGearboxV3PublicDataConverter(
19702
+ lender,
19703
+ chainId,
19704
+ prices,
19705
+ additionalYields,
19706
+ tokenList
19707
+ );
19486
19708
  return [() => null, 0];
19487
19709
  }
19488
19710
  var getAbi = (lender) => {
@@ -19509,6 +19731,8 @@ var getAbi = (lender) => {
19509
19731
  return [...SiloAbi, ...SiloLensAbi, ...InterestRateModelV2Abi];
19510
19732
  if (isFluid(lender))
19511
19733
  return [...FluidVaultResolverAbi];
19734
+ if (isGearboxV3(lender))
19735
+ return [...GearboxDataCompressorV3Abi];
19512
19736
  if (isSumerType(lender)) return [...SumerLensAbi, ...SumerComptrollerAbi];
19513
19737
  if (lender === Lender.TAKARA) return [...TakaraMarketStateAbi];
19514
19738
  if (isCompoundV2Type(lender)) return VenusLensAbi;
@@ -20741,6 +20965,22 @@ var buildFluidUserCall = (chainId, _lender, account) => {
20741
20965
  ];
20742
20966
  };
20743
20967
 
20968
+ // src/lending/user-data/gearbox/userCallBuild.ts
20969
+ var GEARBOX_V3_USER_CALL_COUNT = 1;
20970
+ var buildGearboxV3UserCall = (chainId, _lender, account) => {
20971
+ const resolvers = gearboxResolvers()?.[chainId];
20972
+ if (!resolvers?.dataCompressor) return [];
20973
+ return [
20974
+ {
20975
+ address: resolvers.dataCompressor,
20976
+ name: "getCreditAccountsByBorrower",
20977
+ // Second arg is `PriceOnDemand[] priceUpdates` — empty means
20978
+ // "use the current on-chain feed quotes for healthFactor".
20979
+ params: [account, []]
20980
+ }
20981
+ ];
20982
+ };
20983
+
20744
20984
  // src/lending/user-data/fetch-balances/prepare.ts
20745
20985
  async function buildUserCall(chainId, lender, account, params) {
20746
20986
  if (isAaveV4Type(lender)) return buildAaveV4UserCall(chainId, lender, account);
@@ -20761,6 +21001,8 @@ async function buildUserCall(chainId, lender, account, params) {
20761
21001
  return buildCompoundV2UserCall(chainId, lender, account);
20762
21002
  if (isFluid(lender))
20763
21003
  return buildFluidUserCall(chainId, lender, account);
21004
+ if (isGearboxV3(lender))
21005
+ return buildGearboxV3UserCall(chainId, lender, account);
20764
21006
  return [];
20765
21007
  }
20766
21008
  function organizeUserQueries(queries) {
@@ -22624,6 +22866,169 @@ var getFluidUserDataConverter = (lender, chainId, account, meta) => {
22624
22866
  ];
22625
22867
  };
22626
22868
 
22869
+ // src/lending/user-data/gearbox/userCallParse.ts
22870
+ function toBigInt8(v) {
22871
+ if (v === void 0 || v === null || v === "0x") return 0n;
22872
+ if (typeof v === "bigint") return v;
22873
+ try {
22874
+ return BigInt(v);
22875
+ } catch {
22876
+ return 0n;
22877
+ }
22878
+ }
22879
+ var getGearboxV3UserDataConverter = (_lender, chainId, account, meta) => {
22880
+ return [
22881
+ (data) => {
22882
+ if (!data || data.length !== GEARBOX_V3_USER_CALL_COUNT) return void 0;
22883
+ const creditAccounts = data[0];
22884
+ if (!Array.isArray(creditAccounts) || creditAccounts.length === 0)
22885
+ return void 0;
22886
+ const perCM = /* @__PURE__ */ new Map();
22887
+ for (const ca of creditAccounts) {
22888
+ if (!ca?.isSuccessful) continue;
22889
+ const cm = (ca.creditManager ?? "").toString().toLowerCase();
22890
+ if (!cm) continue;
22891
+ if (!perCM.has(cm)) perCM.set(cm, []);
22892
+ perCM.get(cm).push(ca);
22893
+ }
22894
+ if (perCM.size === 0) return void 0;
22895
+ const out = {};
22896
+ for (const [cmAddr, accounts] of perCM) {
22897
+ let lenderKey;
22898
+ try {
22899
+ lenderKey = gearboxV3LenderKey(cmAddr);
22900
+ } catch {
22901
+ continue;
22902
+ }
22903
+ const metaMap = meta?.[lenderKey];
22904
+ if (!metaMap) continue;
22905
+ const firstCa = accounts[0];
22906
+ const rawUnderlying = (firstCa.underlying ?? "").toString().toLowerCase();
22907
+ const underlying = rawUnderlying;
22908
+ const loanMarketUid = createMarketUid(chainId, lenderKey, underlying);
22909
+ const loanMeta = metaMap[loanMarketUid];
22910
+ const loanDec = loanMeta?.asset?.decimals ?? 18;
22911
+ const loanDisplayPrice = loanMeta ? getDisplayPrice(loanMeta) : 0;
22912
+ const loanOraclePrice = loanMeta ? getOraclePrice(loanMeta) : 0;
22913
+ const loanPriceHist = loanMeta?.price?.priceUsd24h ?? loanDisplayPrice;
22914
+ const lendingPositions = {};
22915
+ const modes = {};
22916
+ const histData = {};
22917
+ for (const ca of accounts) {
22918
+ const caAddress = (ca.addr ?? "").toString().toLowerCase();
22919
+ if (!caAddress) continue;
22920
+ const debtRaw = toBigInt8(ca.debt);
22921
+ const balances = Array.isArray(ca.balances) ? ca.balances : [];
22922
+ const hasAnyBalance = balances.some(
22923
+ (b) => toBigInt8(b?.balance) > 0n
22924
+ );
22925
+ if (debtRaw === 0n && !hasAnyBalance) continue;
22926
+ modes[caAddress] = 0;
22927
+ const posData = {};
22928
+ let totalDepositsUSD = 0;
22929
+ for (const bal of balances) {
22930
+ const rawToken = (bal?.token ?? "").toString().toLowerCase();
22931
+ if (!rawToken) continue;
22932
+ const token = rawToken;
22933
+ const balRaw = toBigInt8(bal.balance);
22934
+ if (balRaw === 0n) continue;
22935
+ const colMarketUid = createMarketUid(chainId, lenderKey, token);
22936
+ const colMeta = metaMap[colMarketUid];
22937
+ const colDec = colMeta?.asset?.decimals ?? 18;
22938
+ const colDisplayPrice = colMeta ? getDisplayPrice(colMeta) : 0;
22939
+ const colOraclePrice = colMeta ? getOraclePrice(colMeta) : 0;
22940
+ const depositsStr = parseRawAmount(balRaw.toString(), colDec);
22941
+ const depositsNum = Number(depositsStr);
22942
+ const depositsUSD = depositsNum * colDisplayPrice;
22943
+ const depositsUSDOracle = depositsNum * colOraclePrice;
22944
+ totalDepositsUSD += depositsUSD;
22945
+ if (posData[colMarketUid]) {
22946
+ const existing = posData[colMarketUid];
22947
+ const prevDepositsNum = Number(existing.deposits ?? 0);
22948
+ const combinedDeposits = (prevDepositsNum + depositsNum).toString();
22949
+ posData[colMarketUid] = {
22950
+ ...existing,
22951
+ deposits: combinedDeposits,
22952
+ depositsUSD: existing.depositsUSD + depositsUSD,
22953
+ depositsUSDOracle: existing.depositsUSDOracle + depositsUSDOracle,
22954
+ collateralEnabled: existing.collateralEnabled || !!bal?.isQuoted
22955
+ };
22956
+ } else {
22957
+ posData[colMarketUid] = {
22958
+ marketUid: colMarketUid,
22959
+ underlying: token,
22960
+ deposits: depositsStr,
22961
+ debt: "0",
22962
+ debtStable: "0",
22963
+ depositsUSD,
22964
+ debtUSD: 0,
22965
+ debtStableUSD: 0,
22966
+ depositsUSDOracle,
22967
+ debtUSDOracle: 0,
22968
+ debtStableUSDOracle: 0,
22969
+ stableBorrowRate: "0",
22970
+ collateralEnabled: !!bal?.isQuoted,
22971
+ claimableRewards: 0
22972
+ };
22973
+ }
22974
+ }
22975
+ const debtStr = parseRawAmount(debtRaw.toString(), loanDec);
22976
+ const debtNum = Number(debtStr);
22977
+ const debtUSD = debtNum * loanDisplayPrice;
22978
+ const debtUSDOracle = debtNum * loanOraclePrice;
22979
+ if (posData[loanMarketUid]) {
22980
+ const existing = posData[loanMarketUid];
22981
+ posData[loanMarketUid] = {
22982
+ ...existing,
22983
+ debt: debtStr,
22984
+ debtUSD,
22985
+ debtUSDOracle
22986
+ };
22987
+ } else {
22988
+ posData[loanMarketUid] = {
22989
+ marketUid: loanMarketUid,
22990
+ underlying,
22991
+ deposits: "0",
22992
+ debt: debtStr,
22993
+ debtStable: "0",
22994
+ depositsUSD: 0,
22995
+ debtUSD,
22996
+ debtStableUSD: 0,
22997
+ depositsUSDOracle: 0,
22998
+ debtUSDOracle,
22999
+ debtStableUSDOracle: 0,
23000
+ stableBorrowRate: "0",
23001
+ collateralEnabled: false,
23002
+ claimableRewards: 0
23003
+ };
23004
+ }
23005
+ histData[caAddress] = {
23006
+ totalDeposits24h: totalDepositsUSD,
23007
+ totalDebt24h: debtNum * loanPriceHist
23008
+ };
23009
+ lendingPositions[caAddress] = posData;
23010
+ }
23011
+ if (Object.keys(lendingPositions).length === 0) continue;
23012
+ const userData = createMultiAccountTypeUserState(
23013
+ {
23014
+ chainId,
23015
+ account,
23016
+ lendingPositions,
23017
+ modes
23018
+ },
23019
+ metaMap,
23020
+ histData
23021
+ );
23022
+ if (userData && userData.data.length > 0) {
23023
+ out[lenderKey] = userData;
23024
+ }
23025
+ }
23026
+ return Object.keys(out).length > 0 ? out : void 0;
23027
+ },
23028
+ GEARBOX_V3_USER_CALL_COUNT
23029
+ ];
23030
+ };
23031
+
22627
23032
  // src/lending/user-data/fetch-balances/parse.ts
22628
23033
  function getUserDataConverter(lender, chainId, account, params, meta) {
22629
23034
  if (isAaveV4Type(lender))
@@ -22664,6 +23069,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
22664
23069
  return getSiloV3UserDataConverter(lender, chainId, account, meta?.[lender]);
22665
23070
  if (isFluid(lender))
22666
23071
  return getFluidUserDataConverter(lender, chainId, account, meta);
23072
+ if (isGearboxV3(lender))
23073
+ return getGearboxV3UserDataConverter(lender, chainId, account, meta);
22667
23074
  return getCompoundV2UserDataConverter(
22668
23075
  lender,
22669
23076
  chainId,
@@ -27346,6 +27753,8 @@ var getAbi2 = (lender) => {
27346
27753
  if (isSiloV2Type(lender) || isSiloV3Type(lender))
27347
27754
  return [...SiloAbi];
27348
27755
  if (isFluid(lender)) return [...FluidVaultResolverAbi];
27756
+ if (isGearboxV3(lender))
27757
+ return [...GearboxDataCompressorV3Abi];
27349
27758
  return [];
27350
27759
  };
27351
27760
 
@@ -30544,6 +30953,7 @@ function morphoApiAvailable(chainId) {
30544
30953
  if (chainId === Chain.BERACHAIN) return false;
30545
30954
  if (chainId === Chain.SEI_NETWORK) return false;
30546
30955
  if (chainId === Chain.CELO_MAINNET) return false;
30956
+ if (chainId === Chain.LISK) return false;
30547
30957
  return true;
30548
30958
  }
30549
30959
  function generateMarketId(oracle, loanAsset, collateralAsset) {
@@ -31757,6 +32167,88 @@ var fluidFetcher = {
31757
32167
  parse: parseFluidResults,
31758
32168
  getAbi: getFluidAbi
31759
32169
  };
32170
+ function getGearboxV3Calls(chainId) {
32171
+ const resolvers = gearboxResolvers()?.[chainId];
32172
+ if (!resolvers?.dataCompressor) return [];
32173
+ const call = {
32174
+ address: resolvers.dataCompressor,
32175
+ name: "getPoolsV3List",
32176
+ params: []
32177
+ };
32178
+ return [
32179
+ {
32180
+ calls: [call],
32181
+ meta: { _: [] },
32182
+ lender: Lender.GEARBOX_V3
32183
+ }
32184
+ ];
32185
+ }
32186
+ function parseGearboxV3Results(data, _meta, context) {
32187
+ const { chainId, usdPrices, tokenList } = context;
32188
+ const entries = [];
32189
+ const now = Math.floor(Date.now() / 1e3);
32190
+ const pools = data[0];
32191
+ if (!Array.isArray(pools) || pools.length === 0) return entries;
32192
+ const resolvePriceUSD = (token) => {
32193
+ const key = tokenList?.[token]?.assetGroup ?? `${chainId}-${token}`;
32194
+ return usdPrices[key] ?? usdPrices[token];
32195
+ };
32196
+ for (const pool of pools) {
32197
+ try {
32198
+ const underlying = (pool.underlying ?? "").toString().toLowerCase();
32199
+ if (!underlying) continue;
32200
+ const underlyingUSD = resolvePriceUSD(underlying);
32201
+ if (!underlyingUSD) continue;
32202
+ for (const cm of pool.creditManagers ?? []) {
32203
+ const cmAddr = (cm.addr ?? "").toString().toLowerCase();
32204
+ if (!cmAddr) continue;
32205
+ const expirationDate = Number(cm.expirationDate ?? 0);
32206
+ if (expirationDate > 0 && expirationDate < now) continue;
32207
+ let lenderKey;
32208
+ try {
32209
+ lenderKey = gearboxV3LenderKey(cmAddr);
32210
+ } catch {
32211
+ continue;
32212
+ }
32213
+ entries.push({
32214
+ asset: underlying,
32215
+ price: 1,
32216
+ priceUSD: underlyingUSD,
32217
+ marketUid: createMarketUid(chainId, lenderKey, underlying),
32218
+ targetLender: lenderKey,
32219
+ description: `Gearbox V3 loan (${pool.symbol ?? ""})`,
32220
+ staticBase: true,
32221
+ baseAsset: underlying
32222
+ });
32223
+ for (const ct of cm.collateralTokens ?? []) {
32224
+ const token = (ct.token ?? "").toString().toLowerCase();
32225
+ if (!token) continue;
32226
+ if (token === underlying) continue;
32227
+ const tokenUSD = resolvePriceUSD(token);
32228
+ if (!tokenUSD) continue;
32229
+ entries.push({
32230
+ asset: token,
32231
+ price: tokenUSD / underlyingUSD,
32232
+ priceUSD: tokenUSD,
32233
+ marketUid: createMarketUid(chainId, lenderKey, token),
32234
+ targetLender: lenderKey,
32235
+ baseAsset: underlying
32236
+ });
32237
+ }
32238
+ }
32239
+ } catch {
32240
+ }
32241
+ }
32242
+ return entries;
32243
+ }
32244
+ function getGearboxV3Abi() {
32245
+ return GearboxDataCompressorV3Abi;
32246
+ }
32247
+ var gearboxV3Fetcher = {
32248
+ getCalls: getGearboxV3Calls,
32249
+ parse: parseGearboxV3Results,
32250
+ getAbi: getGearboxV3Abi
32251
+ };
31760
32252
 
31761
32253
  // src/prices/oracle-prices/fetchers/siloV2Graphql.ts
31762
32254
  async function fetchSiloV2GraphQLMarkets(chainId) {
@@ -32189,7 +32681,9 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32189
32681
  () => aaveV4Fetcher.getCalls(chainId),
32190
32682
  getCallsErrors
32191
32683
  ) : [];
32192
- const morphoResults = isActive("morpho") ? safeGetCalls(
32684
+ const morphoUseApi = isActive("morpho") && morphoApiAvailable(chainId);
32685
+ const morphoUseOnChain = isActive("morpho") && !morphoUseApi;
32686
+ const morphoResults = morphoUseOnChain ? safeGetCalls(
32193
32687
  "morpho",
32194
32688
  () => morphoFetcher.getCalls(chainId, {
32195
32689
  marketOverrides: morphoMarketOverrides
@@ -32211,6 +32705,11 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32211
32705
  () => fluidFetcher.getCalls(chainId),
32212
32706
  getCallsErrors
32213
32707
  ) : [];
32708
+ const gearboxV3Results = isActive("gearboxV3") ? safeGetCalls(
32709
+ "gearboxV3",
32710
+ () => gearboxV3Fetcher.getCalls(chainId),
32711
+ getCallsErrors
32712
+ ) : [];
32214
32713
  const aaveGroup = buildGroup(
32215
32714
  "aave",
32216
32715
  aaveResults,
@@ -32271,6 +32770,12 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32271
32770
  fluidFetcher.parse,
32272
32771
  getFluidAbi()
32273
32772
  );
32773
+ const gearboxV3Group = buildGroup(
32774
+ "gearboxV3",
32775
+ gearboxV3Results,
32776
+ gearboxV3Fetcher.parse,
32777
+ getGearboxV3Abi()
32778
+ );
32274
32779
  const allGroups = [
32275
32780
  aaveGroup,
32276
32781
  compoundV2Group,
@@ -32281,7 +32786,8 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32281
32786
  morphoGroup,
32282
32787
  siloV2Group,
32283
32788
  siloV3Group,
32284
- fluidGroup
32789
+ fluidGroup,
32790
+ gearboxV3Group
32285
32791
  ];
32286
32792
  const totalCalls = allGroups.reduce((s, g) => s + g.calls.length, 0);
32287
32793
  if (totalCalls === 0 && !isActive("morpho")) {
@@ -32299,7 +32805,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32299
32805
  return { chainId, data: chainResult, diagnostic: diag2 };
32300
32806
  }
32301
32807
  const chainBatchSize = batchSize?.[chainId];
32302
- const morphoGqlPromise = isActive("morpho") ? fetchMorphoGraphQLPrices(chainId) : Promise.resolve(null);
32808
+ const morphoGqlPromise = morphoUseApi ? fetchMorphoGraphQLPrices(chainId) : Promise.resolve(null);
32303
32809
  const siloV2GqlPromise = isActive("silov2") ? fetchSiloV2GraphQLPrices(chainId, basePrices, tokenList) : Promise.resolve(null);
32304
32810
  const siloV3GqlPromise = isActive("silov3") ? fetchSiloV3GraphQLPrices(chainId, basePrices, tokenList) : Promise.resolve(null);
32305
32811
  const [
@@ -32310,6 +32816,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32310
32816
  eulerData,
32311
32817
  aaveV4Data,
32312
32818
  fluidData,
32819
+ gearboxV3Data,
32313
32820
  morphoGqlEntries,
32314
32821
  siloV2GqlEntries,
32315
32822
  siloV3GqlEntries
@@ -32370,6 +32877,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32370
32877
  allowFailure,
32371
32878
  rpcOverrides
32372
32879
  ),
32880
+ executeGroup(
32881
+ gearboxV3Group,
32882
+ chainId,
32883
+ chainBatchSize,
32884
+ retries,
32885
+ allowFailure,
32886
+ rpcOverrides
32887
+ ),
32373
32888
  morphoGqlPromise,
32374
32889
  siloV2GqlPromise,
32375
32890
  siloV3GqlPromise
@@ -32400,19 +32915,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32400
32915
  allowFailure,
32401
32916
  rpcOverrides
32402
32917
  );
32403
- if (morphoGqlEntries == null && isActive("morpho")) {
32404
- console.warn(
32405
- `[prices] chain ${chainId}: Morpho GraphQL returned null, falling back to on-chain (${morphoGroup.trackers.length} trackers)`
32406
- );
32407
- }
32408
- const morphoData = morphoGqlEntries != null ? { results: [], error: void 0 } : await executeGroup(
32918
+ const morphoData = morphoUseOnChain ? await executeGroup(
32409
32919
  morphoGroup,
32410
32920
  chainId,
32411
32921
  chainBatchSize,
32412
32922
  retries,
32413
32923
  allowFailure,
32414
32924
  rpcOverrides
32415
- );
32925
+ ) : { results: [], error: void 0 };
32416
32926
  const useMorphoGql = morphoGqlEntries != null;
32417
32927
  const groupResults = [
32418
32928
  { group: aaveGroup, data: aaveData },
@@ -32422,6 +32932,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32422
32932
  { group: eulerGroup, data: eulerData },
32423
32933
  { group: aaveV4Group, data: aaveV4Data },
32424
32934
  { group: fluidGroup, data: fluidData },
32935
+ { group: gearboxV3Group, data: gearboxV3Data },
32425
32936
  ...siloV2GqlEntries != null ? [] : [{ group: siloV2Group, data: siloV2Data }],
32426
32937
  ...siloV3GqlEntries != null ? [] : [{ group: siloV3Group, data: siloV3Data }],
32427
32938
  ...useMorphoGql ? [] : [{ group: morphoGroup, data: morphoData }]
@@ -32509,6 +33020,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
32509
33020
  (t) => !!t.meta.baseAssetSource
32510
33021
  );
32511
33022
  parseTrackers(fluidGroup, fluidData.results, false);
33023
+ parseTrackers(gearboxV3Group, gearboxV3Data.results, false);
32512
33024
  if (siloV2GqlEntries != null) {
32513
33025
  const diag2 = {
32514
33026
  lender: "SILO_V2 (GraphQL)",