@1delta/margin-fetcher 0.0.321 → 0.0.322

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
@@ -6,7 +6,7 @@ export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, is
6
6
  import { aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, aaveReserves, compoundV3Reserves, morphoTypeMarkets, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, aaveOracles, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, fetchTokenLists, fetchTokenList, aaveV4Oracles, resolveMidnightApiBase } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
8
  import { getEvmClient, getEvmChain, getEvmClientUniversal, multicallRetryUniversal } from '@1delta/providers';
9
- import { MetaMorphoAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
9
+ import { MetaMorphoAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
10
10
  export { MorphoLensAbi } from '@1delta/abis';
11
11
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
12
12
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
@@ -19891,6 +19891,11 @@ var buildFluidCall = (chainId, _lender) => {
19891
19891
  address: resolvers.vaultResolver,
19892
19892
  name: "getVaultsEntireData",
19893
19893
  params: []
19894
+ },
19895
+ {
19896
+ address: resolvers.liquidityResolver,
19897
+ name: "getAllOverallTokensData",
19898
+ params: []
19894
19899
  }
19895
19900
  ];
19896
19901
  };
@@ -19903,12 +19908,36 @@ var scaleFluidRate = (raw) => {
19903
19908
  if (raw === void 0 || raw === null) return 0;
19904
19909
  return Number(raw) / FLUID_RATE_SCALE;
19905
19910
  };
19911
+ var parseOverallTokensData = (overallTokensData) => {
19912
+ const out = {};
19913
+ if (!Array.isArray(overallTokensData)) return out;
19914
+ for (const td of overallTokensData) {
19915
+ const rateData = td?.rateData;
19916
+ if (!rateData) continue;
19917
+ const version = Number(rateData.version ?? 1);
19918
+ const rawToken = ((version === 2 ? rateData.rateDataV2?.token : rateData.rateDataV1?.token) ?? "").toString().toLowerCase();
19919
+ if (!rawToken || rawToken === zeroAddress) continue;
19920
+ const token = normalizeUnderlying(rawToken);
19921
+ const maxUtilizationRaw = Number(td.maxUtilization ?? 0);
19922
+ out[token] = {
19923
+ utilization: Number(td.lastStoredUtilization ?? 0) / BPS,
19924
+ fee: Number(td.fee ?? 0) / BPS,
19925
+ maxUtilization: maxUtilizationRaw > 0 ? maxUtilizationRaw / BPS : 1,
19926
+ totalSupply: (td.totalSupply ?? 0n).toString(),
19927
+ totalBorrow: (td.totalBorrow ?? 0n).toString(),
19928
+ borrowRate: scaleFluidRate(td.borrowRate),
19929
+ supplyRate: scaleFluidRate(td.supplyRate)
19930
+ };
19931
+ }
19932
+ return out;
19933
+ };
19906
19934
  var getFluidPublicDataConverter = (_lender, chainId, prices, additionalYields, tokenList = {}) => {
19907
- const expectedNumberOfCalls = 1;
19935
+ const expectedNumberOfCalls = 2;
19908
19936
  return [
19909
19937
  (data) => {
19910
19938
  if (data.length !== expectedNumberOfCalls) return void 0;
19911
- const [vaultEntireData] = data;
19939
+ const [vaultEntireData, overallTokensData] = data;
19940
+ const liquidityByToken = parseOverallTokensData(overallTokensData);
19912
19941
  const out = {};
19913
19942
  for (const vault of vaultEntireData ?? []) {
19914
19943
  const parsed = parseVault(
@@ -19916,7 +19945,8 @@ var getFluidPublicDataConverter = (_lender, chainId, prices, additionalYields, t
19916
19945
  chainId,
19917
19946
  prices,
19918
19947
  additionalYields,
19919
- tokenList
19948
+ tokenList,
19949
+ liquidityByToken
19920
19950
  );
19921
19951
  if (parsed) {
19922
19952
  out[parsed.lender] = {
@@ -19931,7 +19961,7 @@ var getFluidPublicDataConverter = (_lender, chainId, prices, additionalYields, t
19931
19961
  expectedNumberOfCalls
19932
19962
  ];
19933
19963
  };
19934
- function parseVault(vault, chainId, prices, additionalYields, tokenList) {
19964
+ function parseVault(vault, chainId, prices, additionalYields, tokenList, liquidityByToken = {}) {
19935
19965
  const vaultAddress = (vault.vault ?? "").toLowerCase();
19936
19966
  const constants = vault.constantVariables;
19937
19967
  const configs = vault.configs;
@@ -19981,9 +20011,14 @@ function parseVault(vault, chainId, prices, additionalYields, tokenList) {
19981
20011
  const liquidationPenalty = Number(configs.liquidationPenalty ?? 0) / BPS;
19982
20012
  const supplyRate = scaleFluidRate(rates.supplyRateVault);
19983
20013
  const borrowRate = scaleFluidRate(rates.borrowRateVault);
19984
- const utilization = totalSupply > 0 ? totalBorrow / totalSupply : 0;
20014
+ const collateralLiquidity = liquidityByToken[collateralAddress];
20015
+ const loanLiquidity = liquidityByToken[loanAddress];
19985
20016
  const data = {};
19986
- const collateralMarketUid = createMarketUid(chainId, lender, collateralAddress);
20017
+ const collateralMarketUid = createMarketUid(
20018
+ chainId,
20019
+ lender,
20020
+ collateralAddress
20021
+ );
19987
20022
  data[collateralMarketUid] = {
19988
20023
  marketUid: collateralMarketUid,
19989
20024
  name: "Collateral " + (collateralMeta?.symbol ?? ""),
@@ -20000,7 +20035,12 @@ function parseVault(vault, chainId, prices, additionalYields, tokenList) {
20000
20035
  totalDebtUSD: 0,
20001
20036
  totalLiquidityUSD: totalSupply * collateralPrice,
20002
20037
  borrowLiquidityUSD: 0,
20003
- utilization: lockupRatio,
20038
+ // IRM x-coordinate: the collateral token's Liquidity-layer utilization —
20039
+ // it drives the supply rate (borrowRate × utilization × (1 - fee)).
20040
+ utilization: collateralLiquidity?.utilization ?? 0,
20041
+ // Share of this vault's collateral currently locked below the LL
20042
+ // withdrawal limit (withdrawLimit / totalSupplyVault).
20043
+ lockupRatio,
20004
20044
  depositRate: supplyRate,
20005
20045
  // vault collateral earns the supply side rate
20006
20046
  variableBorrowRate: 0,
@@ -20046,7 +20086,9 @@ function parseVault(vault, chainId, prices, additionalYields, tokenList) {
20046
20086
  totalDebtUSD: totalBorrow * loanPrice,
20047
20087
  totalLiquidityUSD: borrowable * loanPrice,
20048
20088
  borrowLiquidityUSD: borrowable * loanPrice,
20049
- utilization,
20089
+ // IRM x-coordinate: the loan token's Liquidity-layer utilization — the
20090
+ // exact input the current borrow rate was computed from.
20091
+ utilization: loanLiquidity?.utilization ?? 0,
20050
20092
  depositRate: 0,
20051
20093
  variableBorrowRate: borrowRate,
20052
20094
  stableBorrowRate: 0,
@@ -20083,6 +20125,15 @@ function parseVault(vault, chainId, prices, additionalYields, tokenList) {
20083
20125
  expandDuration: Number(llSupply.expandDuration ?? 0),
20084
20126
  lastUpdateTimestamp: Number(llSupply.lastUpdateTimestamp ?? 0)
20085
20127
  } : void 0;
20128
+ const formatLiquidity = (state, decimals) => state ? {
20129
+ utilization: state.utilization,
20130
+ fee: state.fee,
20131
+ maxUtilization: state.maxUtilization,
20132
+ totalSupply: Number(parseRawAmount(state.totalSupply, decimals)),
20133
+ totalBorrow: Number(parseRawAmount(state.totalBorrow, decimals)),
20134
+ borrowRate: state.borrowRate,
20135
+ supplyRate: state.supplyRate
20136
+ } : void 0;
20086
20137
  return {
20087
20138
  lender,
20088
20139
  data,
@@ -20104,7 +20155,11 @@ function parseVault(vault, chainId, prices, additionalYields, tokenList) {
20104
20155
  oraclePriceLiquidate: configs.oraclePriceLiquidate?.toString(),
20105
20156
  isSmartCol: !!vault.isSmartCol,
20106
20157
  isSmartDebt: !!vault.isSmartDebt,
20107
- liquidityUserSupply
20158
+ liquidityUserSupply,
20159
+ liquidity: {
20160
+ supplyToken: formatLiquidity(collateralLiquidity, colDecimals),
20161
+ borrowToken: formatLiquidity(loanLiquidity, borrowDecimals)
20162
+ }
20108
20163
  }
20109
20164
  }
20110
20165
  };
@@ -20693,16 +20748,16 @@ var getAbi = (lender) => {
20693
20748
  if (isInit(lender)) return InitLensAbi;
20694
20749
  if (isMorphoType(lender)) return MorphoLensAbi;
20695
20750
  if (isEulerType(lender)) return vaultLensAbi;
20696
- if (isAaveV4Type(lender)) return [...AaveV4SpokeAbi, ...AaveV4OracleAbi, ...AaveV4HubAbi];
20751
+ if (isAaveV4Type(lender))
20752
+ return [...AaveV4SpokeAbi, ...AaveV4OracleAbi, ...AaveV4HubAbi];
20697
20753
  if (isSiloV2Type(lender))
20698
20754
  return [...SiloAbi, ...SiloLensAbi, ...InterestRateModelV2Abi];
20699
20755
  if (isSiloV3Type(lender))
20700
20756
  return [...SiloAbi, ...SiloLensAbi, ...InterestRateModelV2Abi];
20701
20757
  if (isFluid(lender))
20702
- return [...FluidVaultResolverAbi];
20758
+ return [...FluidVaultResolverAbi, ...FluidLiquidityResolverAbi];
20703
20759
  if (isDolomite(lender)) return [...DolomiteMarginAbi];
20704
- if (isGearboxV3(lender))
20705
- return [...GearboxMarketCompressorV310Abi];
20760
+ if (isGearboxV3(lender)) return [...GearboxMarketCompressorV310Abi];
20706
20761
  if (isSumerType(lender)) return [...SumerLensAbi, ...SumerComptrollerAbi];
20707
20762
  if (lender === Lender.TAKARA) return [...TakaraMarketStateAbi];
20708
20763
  if (isCompoundV2Type(lender)) return VenusLensAbi;
@@ -37206,7 +37261,12 @@ async function fetchFluidExposures(chainId, multicallRetry, prices, tokenList) {
37206
37261
  const rawVaults = await multicallRetry({
37207
37262
  chain: chainId,
37208
37263
  calls: vaultCalls,
37209
- abi: vaultCalls.map(() => FluidVaultResolverAbi)
37264
+ // buildFluidCall mixes vault-resolver and liquidity-resolver calls; the
37265
+ // merged ABI lets viem resolve each call by function name.
37266
+ abi: vaultCalls.map(() => [
37267
+ ...FluidVaultResolverAbi,
37268
+ ...FluidLiquidityResolverAbi
37269
+ ])
37210
37270
  });
37211
37271
  const [convert] = getFluidPublicDataConverter(
37212
37272
  "FLUID",