@1delta/margin-fetcher 0.0.266 → 0.0.267

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 (64) hide show
  1. package/dist/index.js +1215 -84
  2. package/dist/index.js.map +1 -1
  3. package/dist/lending/dolomite-subgraph.d.ts +11 -0
  4. package/dist/lending/dolomite-subgraph.d.ts.map +1 -0
  5. package/dist/lending/public-data/dolomite/emodeConfig.d.ts +45 -0
  6. package/dist/lending/public-data/dolomite/emodeConfig.d.ts.map +1 -0
  7. package/dist/lending/public-data/dolomite/fetchFromSubgraph.d.ts +56 -0
  8. package/dist/lending/public-data/dolomite/fetchFromSubgraph.d.ts.map +1 -0
  9. package/dist/lending/public-data/dolomite/publicCallBuild.d.ts +19 -0
  10. package/dist/lending/public-data/dolomite/publicCallBuild.d.ts.map +1 -0
  11. package/dist/lending/public-data/dolomite/publicCallParse.d.ts +23 -0
  12. package/dist/lending/public-data/dolomite/publicCallParse.d.ts.map +1 -0
  13. package/dist/lending/public-data/fetchLender.d.ts.map +1 -1
  14. package/dist/lending/public-data/fetchLenderAll.d.ts.map +1 -1
  15. package/dist/lending/public-data/fetchLenderExt.d.ts.map +1 -1
  16. package/dist/lending/user-data/abis.d.ts.map +1 -1
  17. package/dist/lending/user-data/dolomite/userCallBuild.d.ts +21 -0
  18. package/dist/lending/user-data/dolomite/userCallBuild.d.ts.map +1 -0
  19. package/dist/lending/user-data/dolomite/userCallParse.d.ts +15 -0
  20. package/dist/lending/user-data/dolomite/userCallParse.d.ts.map +1 -0
  21. package/dist/lending/user-data/fetch-balances/parse.d.ts.map +1 -1
  22. package/dist/lending/user-data/fetch-balances/prepare.d.ts.map +1 -1
  23. package/dist/prices/oracle-prices/fetchOraclePrices.d.ts.map +1 -1
  24. package/dist/prices/oracle-prices/fetchers/dolomite.d.ts +297 -0
  25. package/dist/prices/oracle-prices/fetchers/dolomite.d.ts.map +1 -0
  26. package/dist/prices/oracle-prices/fetchers/index.d.ts +1 -0
  27. package/dist/prices/oracle-prices/fetchers/index.d.ts.map +1 -1
  28. package/dist/utils/index.d.ts +1 -1
  29. package/dist/utils/index.d.ts.map +1 -1
  30. package/dist/utils/marketName.d.ts.map +1 -1
  31. package/dist/vaults/lst/abis/core.d.ts +27 -0
  32. package/dist/vaults/lst/abis/core.d.ts.map +1 -0
  33. package/dist/vaults/lst/abis/index.d.ts +2 -0
  34. package/dist/vaults/lst/abis/index.d.ts.map +1 -1
  35. package/dist/vaults/lst/abis/stella.d.ts +30 -0
  36. package/dist/vaults/lst/abis/stella.d.ts.map +1 -0
  37. package/dist/vaults/lst/coreValidators.d.ts +16 -0
  38. package/dist/vaults/lst/coreValidators.d.ts.map +1 -0
  39. package/dist/vaults/lst/fetchPublic.d.ts.map +1 -1
  40. package/dist/vaults/lst/index.d.ts +1 -0
  41. package/dist/vaults/lst/index.d.ts.map +1 -1
  42. package/dist/vaults/lst/readers/core.d.ts +22 -0
  43. package/dist/vaults/lst/readers/core.d.ts.map +1 -0
  44. package/dist/vaults/lst/readers/index.d.ts.map +1 -1
  45. package/dist/vaults/lst/readers/stella.d.ts +18 -0
  46. package/dist/vaults/lst/readers/stella.d.ts.map +1 -0
  47. package/dist/vaults/lst/registry.d.ts +11 -1
  48. package/dist/vaults/lst/registry.d.ts.map +1 -1
  49. package/dist/vaults/lst/types.d.ts +10 -1
  50. package/dist/vaults/lst/types.d.ts.map +1 -1
  51. package/dist/vaults/lst/withdrawals/abis/stella.d.ts +25 -0
  52. package/dist/vaults/lst/withdrawals/abis/stella.d.ts.map +1 -0
  53. package/dist/vaults/lst/withdrawals/readers/index.d.ts.map +1 -1
  54. package/dist/vaults/lst/withdrawals/readers/stella.d.ts +17 -0
  55. package/dist/vaults/lst/withdrawals/readers/stella.d.ts.map +1 -0
  56. package/dist/vaults/lst/withdrawals/registry.d.ts.map +1 -1
  57. package/dist/vaults/lst/withdrawals/types.d.ts +1 -1
  58. package/dist/vaults/lst/withdrawals/types.d.ts.map +1 -1
  59. package/dist/yields/intrinsic/fetchers/core.d.ts +3 -0
  60. package/dist/yields/intrinsic/fetchers/core.d.ts.map +1 -0
  61. package/dist/yields/intrinsic/fetchers/stella.d.ts +3 -0
  62. package/dist/yields/intrinsic/fetchers/stella.d.ts.map +1 -0
  63. package/dist/yields/intrinsic/index.d.ts.map +1 -1
  64. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, encodeFunctionData, formatUnits, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, pad, isAddress, InvalidAddressError, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-H6U3H7VY.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, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isEulerType, isFluid, isGearboxV3, isYLDR, isCompoundV3Type, isLista, isTectonicType, isKineticType, 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, getEvmClientWithCustomRpcsUniversal } from '@1delta/providers';
8
- import { FluidLendingResolverAbi, MetaMorphoAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, FluidVaultResolverAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
8
+ import { FluidLendingResolverAbi, MetaMorphoAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, FluidVaultResolverAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
9
9
  export { MorphoLensAbi } from '@1delta/abis';
10
- import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses } from '@1delta/calldata-sdk';
10
+ import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
11
11
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
12
12
  import { BALANCER_V2_FORKS, BALANCER_V3_FORKS, UNISWAP_V4_FORKS, isFlashLoanSourceExcluded, FLASH_LOAN_IDS } from '@1delta/dex-registry';
13
13
 
@@ -6278,6 +6278,8 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
6278
6278
  compoundV3Bulker: {},
6279
6279
  eulerConfigs: {},
6280
6280
  eulerVaults: {},
6281
+ dolomiteConfigs: {},
6282
+ dolomiteEmode: {},
6281
6283
  aaveV4Spokes: {},
6282
6284
  aaveV4Oracles: {},
6283
6285
  aaveV4Peripherals: {},
@@ -6317,6 +6319,8 @@ var aaveOraclesConfig = () => getGlobalData2()?.aaveOraclesConfig;
6317
6319
  var compoundV2OraclesConfig = () => getGlobalData2()?.compoundV2OraclesConfig;
6318
6320
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
6319
6321
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
6322
+ var dolomiteConfigs = () => getGlobalData2()?.dolomiteConfigs;
6323
+ var dolomiteEmode = () => getGlobalData2()?.dolomiteEmode;
6320
6324
  var aaveV4Spokes = () => getGlobalData2()?.aaveV4Spokes;
6321
6325
  var aaveV4Oracles = () => getGlobalData2()?.aaveV4Oracles;
6322
6326
  var siloMarkets = () => getGlobalData2()?.siloMarkets;
@@ -6428,6 +6432,7 @@ var LENDER_SHORT_NAMES = {
6428
6432
  [Lender.COMPOUND_V3_WETH]: "Comp. WETH",
6429
6433
  [Lender.COMPOUND_V3_WSTETH]: "Comp. wstETH",
6430
6434
  [Lender.EULER_V2]: "Euler V2",
6435
+ [Lender.DOLOMITE]: "Dolomite",
6431
6436
  [Lender.FLUID]: "Fluid",
6432
6437
  [Lender.FLUX_FINANCE]: "Flux",
6433
6438
  [Lender.GEARBOX_V3]: "Gearbox V3",
@@ -7650,6 +7655,9 @@ var getLendersForChain = (c) => {
7650
7655
  if (gearboxResolvers()?.chains?.[c]?.marketConfigurators) {
7651
7656
  lenders.push(Lender.GEARBOX_V3);
7652
7657
  }
7658
+ if (dolomiteConfigs()?.[c]?.dolomiteMargin) {
7659
+ lenders.push(Lender.DOLOMITE);
7660
+ }
7653
7661
  return lenders.filter((l) => !isExcludedLender(l));
7654
7662
  };
7655
7663
  var filterLendersByProtocol = (allLenders, protocolList) => {
@@ -7660,8 +7668,9 @@ var filterLendersByProtocol = (allLenders, protocolList) => {
7660
7668
  const hasMoolah = protocolList.includes(Lender.LISTA_DAO);
7661
7669
  const hasFluid = protocolList.includes(Lender.FLUID);
7662
7670
  const hasGearboxV3 = protocolList.includes(Lender.GEARBOX_V3);
7671
+ const hasDolomite = protocolList.includes(Lender.DOLOMITE);
7663
7672
  return allLenders.filter(
7664
- (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3")
7673
+ (lender) => protocolList.includes(lender) || hasMorpho && lender?.startsWith("MORPHO_BLUE") || hasMoolah && lender?.startsWith("LISTA_DAO") || hasFluid && lender?.startsWith("FLUID") || hasGearboxV3 && lender?.startsWith("GEARBOX_V3") || hasDolomite && lender?.startsWith("DOLOMITE")
7665
7674
  );
7666
7675
  };
7667
7676
  var getAavesForChain = () => {
@@ -19721,6 +19730,184 @@ function parseVault(vault, chainId, prices, additionalYields, tokenList) {
19721
19730
  };
19722
19731
  }
19723
19732
 
19733
+ // src/lending/public-data/dolomite/publicCallBuild.ts
19734
+ var getDolomiteMarketIds = (chainId) => {
19735
+ const markets = dolomiteConfigs()?.[chainId]?.markets;
19736
+ return markets ? Object.keys(markets) : [];
19737
+ };
19738
+ var DOLOMITE_MARKET_FNS = [
19739
+ "getMarketTokenAddress",
19740
+ "getMarketIsClosing",
19741
+ "getMarketTotalPar",
19742
+ "getMarketCurrentIndex",
19743
+ "getMarketPrice",
19744
+ "getMarketMarginPremium",
19745
+ "getMarketInterestRate"
19746
+ ];
19747
+ var DOLOMITE_GLOBAL_FNS = ["getMarginRatio", "getEarningsRate"];
19748
+ var buildDolomiteCall = (chainId, _lender) => {
19749
+ const margin = dolomiteConfigs()?.[chainId]?.dolomiteMargin;
19750
+ const marketIds = getDolomiteMarketIds(chainId);
19751
+ if (!margin || marketIds.length === 0) return [];
19752
+ const calls = DOLOMITE_GLOBAL_FNS.map((name) => ({
19753
+ address: margin,
19754
+ name,
19755
+ params: []
19756
+ }));
19757
+ for (const marketId of marketIds) {
19758
+ for (const name of DOLOMITE_MARKET_FNS) {
19759
+ calls.push({ address: margin, name, params: [marketId] });
19760
+ }
19761
+ }
19762
+ return calls;
19763
+ };
19764
+
19765
+ // src/lending/public-data/dolomite/emodeConfig.ts
19766
+ var DISABLED_BORROW_FACTOR = 3402823669209385e5;
19767
+ var dolomiteFactors = (p, R) => ({
19768
+ collateralFactor: 1 / (1 + p),
19769
+ borrowCollateralFactor: 1 / ((1 + R) * (1 + p)),
19770
+ borrowFactor: 1 + p
19771
+ });
19772
+ function buildDolomiteConfigs(marketId, marginPremium, R, isClosing, emode) {
19773
+ const borrowOnly = emode?.riskFeatures?.[marketId]?.feature === "BORROW_ONLY";
19774
+ const base = dolomiteFactors(marginPremium, R);
19775
+ const configs = {
19776
+ ["0"]: {
19777
+ category: "0",
19778
+ label: "Cross-margin",
19779
+ ...base,
19780
+ debtDisabled: isClosing,
19781
+ collateralDisabled: borrowOnly
19782
+ }
19783
+ };
19784
+ if (!emode?.categories) return configs;
19785
+ const marketCategory = emode.marketCategories?.[marketId];
19786
+ for (const [cat, param] of Object.entries(emode.categories)) {
19787
+ if (marketCategory === cat) {
19788
+ const f = dolomiteFactors(0, param.marginRatioOverride);
19789
+ configs[cat] = {
19790
+ category: cat,
19791
+ label: cat,
19792
+ ...f,
19793
+ debtDisabled: isClosing,
19794
+ collateralDisabled: borrowOnly
19795
+ };
19796
+ } else {
19797
+ configs[cat] = {
19798
+ category: cat,
19799
+ label: cat,
19800
+ collateralFactor: 0,
19801
+ borrowCollateralFactor: 0,
19802
+ borrowFactor: DISABLED_BORROW_FACTOR,
19803
+ debtDisabled: true,
19804
+ collateralDisabled: true
19805
+ };
19806
+ }
19807
+ }
19808
+ return configs;
19809
+ }
19810
+ function resolveDolomiteMode(heldMarketIds, emode) {
19811
+ if (!emode?.marketCategories || heldMarketIds.length === 0) return "0";
19812
+ const cats = /* @__PURE__ */ new Set();
19813
+ for (const m of heldMarketIds) {
19814
+ const cat = emode.marketCategories[m];
19815
+ if (!cat) return "0";
19816
+ cats.add(cat);
19817
+ }
19818
+ return cats.size === 1 ? [...cats][0] : "0";
19819
+ }
19820
+
19821
+ // src/lending/public-data/dolomite/publicCallParse.ts
19822
+ var BASE = 10n ** 18n;
19823
+ var SECONDS_PER_YEAR5 = 31536e3;
19824
+ var MARKET_STRIDE = DOLOMITE_MARKET_FNS.length;
19825
+ var GLOBAL_COUNT = DOLOMITE_GLOBAL_FNS.length;
19826
+ var toBig = (v) => {
19827
+ try {
19828
+ return BigInt(v ?? 0);
19829
+ } catch {
19830
+ return 0n;
19831
+ }
19832
+ };
19833
+ var parToWei = (par, index) => toBig(par) * toBig(index) / BASE;
19834
+ var getDolomitePublicDataConverter = (lender, chainId, _prices, additionalYields, tokenList = {}) => {
19835
+ const marketIds = getDolomiteMarketIds(chainId);
19836
+ const expectedNumberOfCalls = GLOBAL_COUNT + MARKET_STRIDE * marketIds.length;
19837
+ return [
19838
+ (data) => {
19839
+ if (data.length !== expectedNumberOfCalls) return void 0;
19840
+ const R = Number(parseRawAmount(toBig(data[0]?.value), 18));
19841
+ const earningsRate = Number(parseRawAmount(toBig(data[1]?.value), 18));
19842
+ const emode = dolomiteEmode()?.[chainId];
19843
+ const result = {};
19844
+ marketIds.forEach((marketId, m) => {
19845
+ const base = GLOBAL_COUNT + MARKET_STRIDE * m;
19846
+ const token = data[base + 0 /* token */];
19847
+ if (!token) return;
19848
+ const underlying = String(token).toLowerCase();
19849
+ const meta = tokenList[underlying];
19850
+ const decimals = meta?.decimals ?? 18;
19851
+ const totalPar = data[base + 2 /* totalPar */];
19852
+ const currentIndex = data[base + 3 /* currentIndex */];
19853
+ const totalDeposits = parseRawAmount(
19854
+ parToWei(totalPar?.supply, currentIndex?.supply),
19855
+ decimals
19856
+ );
19857
+ const totalDebt = parseRawAmount(
19858
+ parToWei(totalPar?.borrow, currentIndex?.borrow),
19859
+ decimals
19860
+ );
19861
+ const price2 = Number(
19862
+ parseRawAmount(toBig(data[base + 4 /* price */]?.value), 36 - decimals)
19863
+ );
19864
+ const borrowRatePerSec = Number(
19865
+ parseRawAmount(toBig(data[base + 6 /* interestRate */]?.value), 18)
19866
+ );
19867
+ const variableBorrowRate = borrowRatePerSec * SECONDS_PER_YEAR5 * 100;
19868
+ const util = Number(totalDeposits) > 0 ? Number(totalDebt) / Number(totalDeposits) : 0;
19869
+ const depositRate = variableBorrowRate * util * earningsRate;
19870
+ const p = Number(
19871
+ parseRawAmount(toBig(data[base + 5 /* marginPremium */]?.value), 18)
19872
+ );
19873
+ const isClosing = Boolean(data[base + 1 /* isClosing */]);
19874
+ const config = buildDolomiteConfigs(marketId, p, R, isClosing, emode);
19875
+ const liquidity = Number(totalDeposits) - Number(totalDebt);
19876
+ const marketUid = createMarketUid(chainId, lender, underlying);
19877
+ result[underlying] = {
19878
+ marketUid,
19879
+ name: lenderShortName(lender) + " " + (meta?.symbol ?? ""),
19880
+ poolId: underlying,
19881
+ underlying,
19882
+ asset: meta,
19883
+ marketId,
19884
+ totalDeposits,
19885
+ totalDebt,
19886
+ totalDepositsUSD: price2 * Number(totalDeposits),
19887
+ totalDebtUSD: price2 * Number(totalDebt),
19888
+ totalLiquidity: liquidity,
19889
+ borrowLiquidity: liquidity,
19890
+ totalLiquidityUSD: liquidity * price2,
19891
+ borrowLiquidityUSD: liquidity * price2,
19892
+ utilization: computeUtilization(totalDeposits, totalDebt),
19893
+ price: price2,
19894
+ depositRate,
19895
+ variableBorrowRate,
19896
+ stableBorrowRate: 0,
19897
+ collateralActive: true,
19898
+ intrinsicYield: additionalYields?.intrinsicYields?.[underlying] ?? 0,
19899
+ rewards: [],
19900
+ config,
19901
+ borrowingEnabled: !isClosing,
19902
+ depositsEnabled: !isClosing
19903
+ };
19904
+ });
19905
+ return { data: result, chainId };
19906
+ },
19907
+ expectedNumberOfCalls
19908
+ ];
19909
+ };
19910
+
19724
19911
  // src/lending/public-data/gearbox/publicCallBuild.ts
19725
19912
  var buildGearboxCall = (chainId, _lender) => {
19726
19913
  const compressor = gearboxMarketCompressor();
@@ -19987,6 +20174,7 @@ function buildLenderCall(chainId, lender) {
19987
20174
  if (isSiloV2Type(lender)) return buildSiloV2LenderReserveCall(chainId, lender);
19988
20175
  if (isSiloV3Type(lender)) return buildSiloV3LenderReserveCall(chainId, lender);
19989
20176
  if (isFluid(lender)) return buildFluidCall(chainId);
20177
+ if (isDolomite(lender)) return buildDolomiteCall(chainId);
19990
20178
  if (isGearboxV3(lender)) return buildGearboxCall(chainId);
19991
20179
  return [];
19992
20180
  }
@@ -20088,6 +20276,14 @@ function getLenderDataConverter(lender, chainId, prices, additionalYields, token
20088
20276
  additionalYields,
20089
20277
  tokenList
20090
20278
  );
20279
+ if (isDolomite(lender))
20280
+ return getDolomitePublicDataConverter(
20281
+ lender,
20282
+ chainId,
20283
+ prices,
20284
+ additionalYields,
20285
+ tokenList
20286
+ );
20091
20287
  return [() => null, 0];
20092
20288
  }
20093
20289
  var getAbi = (lender) => {
@@ -20114,6 +20310,7 @@ var getAbi = (lender) => {
20114
20310
  return [...SiloAbi, ...SiloLensAbi, ...InterestRateModelV2Abi];
20115
20311
  if (isFluid(lender))
20116
20312
  return [...FluidVaultResolverAbi];
20313
+ if (isDolomite(lender)) return [...DolomiteMarginAbi];
20117
20314
  if (isGearboxV3(lender))
20118
20315
  return [...GearboxMarketCompressorV310Abi];
20119
20316
  if (isSumerType(lender)) return [...SumerLensAbi, ...SumerComptrollerAbi];
@@ -20639,6 +20836,133 @@ function bigintToLtv2(v) {
20639
20836
  return Number.isFinite(n) ? n / 1e18 : 0;
20640
20837
  }
20641
20838
  }
20839
+
20840
+ // src/lending/dolomite-subgraph.ts
20841
+ var DOLO_KEY = "1301d2d1-7a9d-4be4-9e9a-061cb8611549";
20842
+ var DOLO_VER = "latest";
20843
+ var doloUrl = (slug) => `https://subgraph.api.dolomite.io/api/public/${DOLO_KEY}/subgraphs/dolomite-${slug}/${DOLO_VER}/gn`;
20844
+ var DOLOMITE_SUBGRAPH_URLS = {
20845
+ "1": doloUrl("ethereum"),
20846
+ // unlisted but live
20847
+ "56": doloUrl("bsc"),
20848
+ // unlisted but live (no markets yet)
20849
+ "196": doloUrl("x-layer"),
20850
+ "1101": doloUrl("polygon-zkevm"),
20851
+ "3637": doloUrl("botanix"),
20852
+ // unlisted but live
20853
+ "5000": doloUrl("mantle"),
20854
+ "8453": doloUrl("base"),
20855
+ "42161": doloUrl("arbitrum"),
20856
+ "80094": doloUrl("berachain-mainnet")
20857
+ };
20858
+ var dolomiteSubgraphUrl = (chainId) => DOLOMITE_SUBGRAPH_URLS[chainId];
20859
+ var hasDolomiteSubgraph = (chainId) => chainId in DOLOMITE_SUBGRAPH_URLS;
20860
+
20861
+ // src/lending/public-data/dolomite/fetchFromSubgraph.ts
20862
+ var LENDER = "DOLOMITE";
20863
+ var SUBGRAPH_TIMEOUT_MS = 12e3;
20864
+ async function fetchDolomiteMarketsFromSubgraph(chainId) {
20865
+ const url = dolomiteSubgraphUrl(chainId);
20866
+ if (!url) return null;
20867
+ const query3 = `{
20868
+ dolomiteMargins(first: 1) { liquidationRatio }
20869
+ marketRiskInfos(first: 1000) {
20870
+ marginPremium
20871
+ isBorrowingDisabled
20872
+ token { id symbol decimals marketId supplyLiquidity borrowLiquidity }
20873
+ }
20874
+ interestRates(first: 1000) {
20875
+ token { id }
20876
+ supplyInterestRate
20877
+ borrowInterestRate
20878
+ }
20879
+ }`;
20880
+ const controller = new AbortController();
20881
+ const timeout = setTimeout(() => controller.abort(), SUBGRAPH_TIMEOUT_MS);
20882
+ try {
20883
+ const response = await fetch(url, {
20884
+ method: "POST",
20885
+ headers: { "Content-Type": "application/json" },
20886
+ body: JSON.stringify({ query: query3 }),
20887
+ signal: controller.signal
20888
+ });
20889
+ if (!response.ok) return null;
20890
+ const json = await response.json();
20891
+ const d = json?.data;
20892
+ if (!d?.marketRiskInfos?.length) return null;
20893
+ const rates = {};
20894
+ for (const r of d.interestRates ?? []) {
20895
+ rates[r.token.id.toLowerCase()] = {
20896
+ supply: Number(r.supplyInterestRate),
20897
+ borrow: Number(r.borrowInterestRate)
20898
+ };
20899
+ }
20900
+ return {
20901
+ liquidationRatio: Number(d.dolomiteMargins?.[0]?.liquidationRatio ?? 0),
20902
+ riskInfos: d.marketRiskInfos,
20903
+ rates
20904
+ };
20905
+ } catch {
20906
+ return null;
20907
+ } finally {
20908
+ clearTimeout(timeout);
20909
+ }
20910
+ }
20911
+ function convertDolomiteSubgraphMarkets(raw, chainId, prices, additionalYields, tokenList = {}) {
20912
+ const R = raw.liquidationRatio > 0 ? raw.liquidationRatio - 1 : 0;
20913
+ const emode = dolomiteEmode()?.[chainId];
20914
+ const result = {};
20915
+ for (const info of raw.riskInfos) {
20916
+ const underlying = info.token.id.toLowerCase();
20917
+ const meta = tokenList[underlying];
20918
+ const oracleKey = toOracleKey(meta?.assetGroup) ?? toGenericPriceKey(underlying, chainId);
20919
+ const price2 = prices[underlying] ?? prices[oracleKey] ?? 0;
20920
+ const totalDeposits = info.token.supplyLiquidity ?? "0";
20921
+ const totalDebt = info.token.borrowLiquidity ?? "0";
20922
+ const liquidity = Number(totalDeposits) - Number(totalDebt);
20923
+ const rate = raw.rates[underlying] ?? { supply: 0, borrow: 0 };
20924
+ const depositRate = rate.supply * 100;
20925
+ const variableBorrowRate = rate.borrow * 100;
20926
+ const p = Number(info.marginPremium) || 0;
20927
+ const isClosing = Boolean(info.isBorrowingDisabled);
20928
+ const config = buildDolomiteConfigs(
20929
+ info.token.marketId,
20930
+ p,
20931
+ R,
20932
+ isClosing,
20933
+ emode
20934
+ );
20935
+ const marketUid = createMarketUid(chainId, LENDER, underlying);
20936
+ result[underlying] = {
20937
+ marketUid,
20938
+ name: lenderShortName(LENDER) + " " + (meta?.symbol ?? info.token.symbol ?? ""),
20939
+ poolId: underlying,
20940
+ underlying,
20941
+ asset: meta,
20942
+ marketId: info.token.marketId,
20943
+ totalDeposits,
20944
+ totalDebt,
20945
+ totalDepositsUSD: price2 * Number(totalDeposits),
20946
+ totalDebtUSD: price2 * Number(totalDebt),
20947
+ totalLiquidity: liquidity,
20948
+ borrowLiquidity: liquidity,
20949
+ totalLiquidityUSD: liquidity * price2,
20950
+ borrowLiquidityUSD: liquidity * price2,
20951
+ utilization: computeUtilization(totalDeposits, totalDebt),
20952
+ price: price2,
20953
+ depositRate,
20954
+ variableBorrowRate,
20955
+ stableBorrowRate: 0,
20956
+ collateralActive: true,
20957
+ intrinsicYield: additionalYields?.intrinsicYields?.[underlying] ?? 0,
20958
+ rewards: [],
20959
+ config,
20960
+ borrowingEnabled: !isClosing,
20961
+ depositsEnabled: !isClosing
20962
+ };
20963
+ }
20964
+ return { data: result, chainId };
20965
+ }
20642
20966
  var warn = (...args) => {
20643
20967
  };
20644
20968
  async function getLenderDataFromApi(lender, chainId, prices, additionalYields, includeUnlisted = false) {
@@ -20656,8 +20980,9 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
20656
20980
  }, includeUnlisted = false) => {
20657
20981
  const siloV2Lenders = lenders.filter((l) => isSiloV2Type(l));
20658
20982
  const siloV3Lenders = lenders.filter((l) => isSiloV3Type(l));
20983
+ const dolomiteLenders = lenders.filter((l) => isDolomite(l));
20659
20984
  const otherLenders = lenders.filter(
20660
- (l) => !isSiloV2Type(l) && !isSiloV3Type(l)
20985
+ (l) => !isSiloV2Type(l) && !isSiloV3Type(l) && !isDolomite(l)
20661
20986
  );
20662
20987
  const siloV2Promise = siloV2Lenders.length > 0 ? fetchSiloMarkets(chainId, { protocolVersion: "v2" }).then((items) => ({
20663
20988
  __silo_items__: items
@@ -20677,11 +21002,13 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
20677
21002
  )
20678
21003
  );
20679
21004
  }
21005
+ const dolomitePromise = dolomiteLenders.length > 0 ? fetchDolomiteMarketsFromSubgraph(chainId) : Promise.resolve(null);
20680
21006
  const settled = await Promise.allSettled([
20681
21007
  tokenList(),
20682
21008
  siloV2Promise,
20683
21009
  siloV3Promise,
20684
- ...promises
21010
+ ...promises,
21011
+ dolomitePromise
20685
21012
  ]);
20686
21013
  const listResult = settled[0];
20687
21014
  const list = listResult.status === "fulfilled" ? listResult.value : {};
@@ -20783,6 +21110,31 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
20783
21110
  } catch (e) {
20784
21111
  }
20785
21112
  }
21113
+ if (dolomiteLenders.length > 0) {
21114
+ const dolomiteResult = settled[settled.length - 1];
21115
+ if (dolomiteResult.status === "fulfilled" && dolomiteResult.value) {
21116
+ try {
21117
+ const converted = convertDolomiteSubgraphMarkets(
21118
+ dolomiteResult.value,
21119
+ chainId,
21120
+ prices,
21121
+ additionalYields,
21122
+ list
21123
+ );
21124
+ for (const lk of dolomiteLenders) lenderData[lk] = converted;
21125
+ } catch (e) {
21126
+ warn(
21127
+ `[lending] Dolomite subgraph convert failed on chain ${chainId}:`,
21128
+ e?.message ?? e
21129
+ );
21130
+ }
21131
+ } else if (dolomiteResult.status === "rejected") {
21132
+ warn(
21133
+ `[lending] Dolomite subgraph fetch failed on chain ${chainId}:`,
21134
+ dolomiteResult.reason?.message ?? dolomiteResult.reason
21135
+ );
21136
+ }
21137
+ }
20786
21138
  return lenderData;
20787
21139
  };
20788
21140
  var warn2 = (...args) => {
@@ -20808,6 +21160,9 @@ function lenderApiWithOnChainFallback(lender, chainId) {
20808
21160
  if (isSiloV2Type(lender) || isSiloV3Type(lender)) {
20809
21161
  return SILO_API_SUPPORTED_CHAIN_IDS.has(chainId);
20810
21162
  }
21163
+ if (isDolomite(lender)) {
21164
+ return hasDolomiteSubgraph(chainId);
21165
+ }
20811
21166
  return false;
20812
21167
  }
20813
21168
  var getLenderPublicDataAll = async (chainId, lenders, prices, additionalYields, multicallRetry, tokenList, includeUnlistedMorphoMarkets = false) => {
@@ -21396,6 +21751,80 @@ var buildGearboxV3UserCall = (chainId, _lender, account) => {
21396
21751
  ];
21397
21752
  };
21398
21753
 
21754
+ // src/lending/user-data/dolomite/userCallBuild.ts
21755
+ var SUBGRAPH_CACHE_TTL_MS2 = 3e4;
21756
+ var SUBGRAPH_TIMEOUT_MS2 = 1e4;
21757
+ var subgraphCache2 = /* @__PURE__ */ new Map();
21758
+ function fetchDolomiteAccountNumbers(chainId, owner) {
21759
+ const key = `${chainId}:${owner.toLowerCase()}`;
21760
+ const cached = subgraphCache2.get(key);
21761
+ if (cached) return cached.promise;
21762
+ const promise = fetchAccountNumbersFromSubgraph(chainId, owner).then((ns) => dedupeWithDefault(ns)).catch(() => ["0"]);
21763
+ const timer = setTimeout(() => subgraphCache2.delete(key), SUBGRAPH_CACHE_TTL_MS2);
21764
+ subgraphCache2.set(key, { promise, timer });
21765
+ return promise;
21766
+ }
21767
+ function dedupeWithDefault(numbers) {
21768
+ const set = new Set(numbers);
21769
+ set.add("0");
21770
+ return [...set];
21771
+ }
21772
+ async function fetchAccountNumbersFromSubgraph(chainId, owner) {
21773
+ const url = DOLOMITE_SUBGRAPH_URLS[chainId];
21774
+ if (!url) return ["0"];
21775
+ const query3 = `{
21776
+ marginAccounts(
21777
+ first: 1000
21778
+ where: { user: "${owner.toLowerCase()}", or: [{ hasSupplyValue: true }, { hasBorrowValue: true }] }
21779
+ ) {
21780
+ accountNumber
21781
+ }
21782
+ }`;
21783
+ const controller = new AbortController();
21784
+ const timeout = setTimeout(() => controller.abort(), SUBGRAPH_TIMEOUT_MS2);
21785
+ try {
21786
+ const response = await fetch(url, {
21787
+ method: "POST",
21788
+ headers: { "Content-Type": "application/json" },
21789
+ body: JSON.stringify({ query: query3 }),
21790
+ signal: controller.signal
21791
+ });
21792
+ if (!response.ok) return ["0"];
21793
+ const data = await response.json();
21794
+ const accounts = data?.data?.marginAccounts;
21795
+ if (!accounts || accounts.length === 0) return ["0"];
21796
+ return accounts.map((a) => String(a.accountNumber));
21797
+ } finally {
21798
+ clearTimeout(timeout);
21799
+ }
21800
+ }
21801
+ var RESOLVED_STORE_TTL_MS2 = 6e4;
21802
+ var resolvedStore = /* @__PURE__ */ new Map();
21803
+ function getResolvedDolomiteAccountNumbers(chainId, account) {
21804
+ return resolvedStore.get(`${chainId}:${account.toLowerCase()}`)?.numbers;
21805
+ }
21806
+ function storeResolvedNumbers(chainId, account, numbers) {
21807
+ const key = `${chainId}:${account.toLowerCase()}`;
21808
+ const existing = resolvedStore.get(key);
21809
+ if (existing) clearTimeout(existing.timer);
21810
+ const timer = setTimeout(
21811
+ () => resolvedStore.delete(key),
21812
+ RESOLVED_STORE_TTL_MS2
21813
+ );
21814
+ resolvedStore.set(key, { numbers, timer });
21815
+ }
21816
+ var buildDolomiteUserCall = async (chainId, _lender, account, accountNumbers) => {
21817
+ const margin = dolomiteConfigs()?.[chainId]?.dolomiteMargin;
21818
+ if (!margin) return [];
21819
+ const numbers = accountNumbers ?? await fetchDolomiteAccountNumbers(chainId, account);
21820
+ storeResolvedNumbers(chainId, account, numbers);
21821
+ return numbers.map((number) => ({
21822
+ address: margin,
21823
+ name: "getAccountBalances",
21824
+ params: [{ owner: account, number }]
21825
+ }));
21826
+ };
21827
+
21399
21828
  // src/lending/user-data/fetch-balances/prepare.ts
21400
21829
  async function buildUserCall(chainId, lender, account, params) {
21401
21830
  if (isAaveV4Type(lender)) return buildAaveV4UserCall(chainId, lender, account);
@@ -21418,6 +21847,8 @@ async function buildUserCall(chainId, lender, account, params) {
21418
21847
  return buildFluidUserCall(chainId, lender, account);
21419
21848
  if (isGearboxV3(lender))
21420
21849
  return buildGearboxV3UserCall(chainId, lender, account);
21850
+ if (isDolomite(lender))
21851
+ return buildDolomiteUserCall(chainId, lender, account, params?.accountNumbers);
21421
21852
  return [];
21422
21853
  }
21423
21854
  function organizeUserQueries(queries) {
@@ -23486,6 +23917,80 @@ var getGearboxV3UserDataConverter = (_lender, chainId, account, meta) => {
23486
23917
  ];
23487
23918
  };
23488
23919
 
23920
+ // src/lending/user-data/dolomite/userCallParse.ts
23921
+ var getDolomiteUserDataConverter = (lender, chainId, account, metaMap) => {
23922
+ const numbers = getResolvedDolomiteAccountNumbers(chainId, account) ?? ["0"];
23923
+ const expectedNumberOfCalls = numbers.length;
23924
+ const emode = dolomiteEmode()?.[chainId];
23925
+ return [
23926
+ (_data) => {
23927
+ if (_data.length !== expectedNumberOfCalls) return void 0;
23928
+ const histData = {};
23929
+ const lendingPositions = {};
23930
+ const modes = {};
23931
+ _data.forEach((res, i) => {
23932
+ const id = numbers[i];
23933
+ histData[id] = { totalDebt24h: 0, totalDeposits24h: 0 };
23934
+ lendingPositions[id] = {};
23935
+ const marketIds = res?.[0 /* markets */] ?? [];
23936
+ const tokens = res?.[1 /* tokens */] ?? [];
23937
+ const weis = res?.[3 /* weis */] ?? [];
23938
+ modes[id] = resolveDolomiteMode(
23939
+ marketIds.map((m) => String(m)),
23940
+ emode
23941
+ );
23942
+ tokens.forEach((token, k) => {
23943
+ const wei = weis[k];
23944
+ if (!wei) return;
23945
+ const underlying = normalizeUnderlying3(token);
23946
+ const key = createMarketUid(chainId, lender, underlying);
23947
+ const meta = metaMap?.[key];
23948
+ if (!meta) return;
23949
+ const decimals = meta.asset?.decimals ?? 18;
23950
+ const amount = parseRawAmount(wei.value, decimals);
23951
+ const isSupply = wei.sign;
23952
+ const deposits = isSupply ? amount : "0";
23953
+ const debt = isSupply ? "0" : amount;
23954
+ const price2 = getDisplayPrice(meta);
23955
+ const oPrice = getOraclePrice(meta);
23956
+ const priceHist = meta?.price?.priceUsd24h ?? price2;
23957
+ histData[id].totalDeposits24h += Number(deposits) * priceHist;
23958
+ histData[id].totalDebt24h += Number(debt) * priceHist;
23959
+ lendingPositions[id][key] = {
23960
+ marketUid: key,
23961
+ underlying,
23962
+ deposits,
23963
+ debt,
23964
+ debtStable: "0",
23965
+ debtStableUSD: 0,
23966
+ depositsUSD: price2 * Number(deposits),
23967
+ debtUSD: price2 * Number(debt),
23968
+ depositsUSDOracle: oPrice * Number(deposits),
23969
+ debtStableUSDOracle: 0,
23970
+ debtUSDOracle: oPrice * Number(debt),
23971
+ collateralEnabled: true
23972
+ };
23973
+ });
23974
+ });
23975
+ const payload = {
23976
+ chainId,
23977
+ lendingPositions,
23978
+ modes,
23979
+ account
23980
+ };
23981
+ return createMultiAccountTypeUserState(payload, metaMap, histData);
23982
+ },
23983
+ expectedNumberOfCalls
23984
+ ];
23985
+ };
23986
+ var WETH_BY_CHAIN = {
23987
+ // populated by the meta's native handling; kept as a hook. Default: identity.
23988
+ };
23989
+ function normalizeUnderlying3(token) {
23990
+ const lower = token.toLowerCase();
23991
+ return Object.values(WETH_BY_CHAIN).includes(lower) ? zeroAddress : lower;
23992
+ }
23993
+
23489
23994
  // src/lending/user-data/fetch-balances/parse.ts
23490
23995
  function getUserDataConverter(lender, chainId, account, params, meta) {
23491
23996
  if (isAaveV4Type(lender))
@@ -23528,6 +24033,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
23528
24033
  return getFluidUserDataConverter(lender, chainId, account, meta);
23529
24034
  if (isGearboxV3(lender))
23530
24035
  return getGearboxV3UserDataConverter(lender, chainId, account, meta);
24036
+ if (isDolomite(lender))
24037
+ return getDolomiteUserDataConverter(lender, chainId, account, meta?.[lender]);
23531
24038
  return getCompoundV2UserDataConverter(
23532
24039
  lender,
23533
24040
  chainId,
@@ -23663,9 +24170,9 @@ var MULTICALL_ADDRESS = {
23663
24170
  // src/utils/multicall.ts
23664
24171
  var { isArray } = lodash;
23665
24172
  var maxRetries = 3;
23666
- var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient11, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
24173
+ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient14, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
23667
24174
  try {
23668
- const provider = getEvmClient11(chainId, providerId);
24175
+ const provider = getEvmClient14(chainId, providerId);
23669
24176
  const abiIsArray = isArray(abi[0]);
23670
24177
  const returnData = await provider.multicall({
23671
24178
  allowFailure,
@@ -23691,7 +24198,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient11, retry =
23691
24198
  chainId,
23692
24199
  abi,
23693
24200
  calls,
23694
- getEvmClient11,
24201
+ getEvmClient14,
23695
24202
  retry,
23696
24203
  providerId,
23697
24204
  retries,
@@ -28178,8 +28685,6 @@ var accountLensAbi = [
28178
28685
  stateMutability: "view"
28179
28686
  }
28180
28687
  ];
28181
-
28182
- // src/lending/user-data/abis.ts
28183
28688
  var getAbi2 = (lender) => {
28184
28689
  if (isAaveV4Type(lender)) return [...AaveV4SpokeAbi];
28185
28690
  if (isAaveV2Type(lender))
@@ -28212,6 +28717,7 @@ var getAbi2 = (lender) => {
28212
28717
  if (isFluid(lender)) return [...FluidVaultResolverAbi];
28213
28718
  if (isGearboxV3(lender))
28214
28719
  return [...GearboxCreditAccountCompressorV310Abi];
28720
+ if (isDolomite(lender)) return [...DolomiteMarginAbi];
28215
28721
  return [];
28216
28722
  };
28217
28723
 
@@ -28315,7 +28821,7 @@ function unflattenLenderData(pools) {
28315
28821
  }
28316
28822
  return result;
28317
28823
  }
28318
- var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient11, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false) => {
28824
+ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient14, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false) => {
28319
28825
  const queries = organizeUserQueries(queriesRaw);
28320
28826
  const builtCalls = await Promise.all(
28321
28827
  queries.map(async (query3) => {
@@ -28334,7 +28840,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient11, allowF
28334
28840
  chainId,
28335
28841
  calls.map((call) => call.abi),
28336
28842
  calls.map((call) => call.call),
28337
- getEvmClient11,
28843
+ getEvmClient14,
28338
28844
  true,
28339
28845
  0,
28340
28846
  retries,
@@ -31694,6 +32200,127 @@ var psxdcFetcher = {
31694
32200
  return { psXDC: PRIME_STAKING_BASE_APY };
31695
32201
  }
31696
32202
  };
32203
+ var STCORE_KEY = "Liquid staked CORE::stCORE";
32204
+ var DUALCORE_KEY = "b14g dualCORE::DUALCORE";
32205
+ var SCORE_KEY = "StakedCore::SCORE";
32206
+ var YEAR_SECONDS6 = 365 * 24 * 60 * 60;
32207
+ var ONE_E184 = 10n ** 18n;
32208
+ var EARN = "0xf5fa1728babc3f8d2a617397fac2696c958c3409";
32209
+ var SCORE = "0xa20b3b97df3a02f9185175760300a06b4e0a2c05";
32210
+ var GET_EXCHANGE_RATES_ABI = [
32211
+ {
32212
+ name: "getExchangeRates",
32213
+ type: "function",
32214
+ stateMutability: "view",
32215
+ inputs: [{ type: "uint256", name: "count" }],
32216
+ outputs: [{ type: "uint256[]" }]
32217
+ }
32218
+ ];
32219
+ var VIEW_U256 = (name) => [
32220
+ {
32221
+ name,
32222
+ type: "function",
32223
+ stateMutability: "view",
32224
+ inputs: [],
32225
+ outputs: [{ type: "uint256" }]
32226
+ }
32227
+ ];
32228
+ var computeStCoreApr = async () => {
32229
+ for (let rpcId = 0; rpcId < 4; rpcId++) {
32230
+ try {
32231
+ const client = getEvmClient(Chain.CORE_BLOCKCHAIN_MAINNET, rpcId);
32232
+ const rates = await client.readContract({
32233
+ address: EARN,
32234
+ abi: GET_EXCHANGE_RATES_ABI,
32235
+ functionName: "getExchangeRates",
32236
+ args: [8n]
32237
+ });
32238
+ if (!rates || rates.length < 2) continue;
32239
+ const first = rates[0];
32240
+ const last = rates[rates.length - 1];
32241
+ const days = rates.length - 1;
32242
+ if (first <= 0n || last < first) continue;
32243
+ const growth = Number(last - first) / Number(first);
32244
+ const apr = growth * (YEAR_SECONDS6 / (days * 86400)) * 100;
32245
+ if (Number.isFinite(apr) && apr >= 0) return apr;
32246
+ } catch {
32247
+ }
32248
+ }
32249
+ throw new Error("stCORE APR: Earn.getExchangeRates unavailable");
32250
+ };
32251
+ var DUALCORE_LLAMA_POOL = "f183f1a4-5d17-4bfa-8270-32d861a13fd3";
32252
+ var fetchDualCoreApy = async () => {
32253
+ const res = await fetch(
32254
+ `https://yields.llama.fi/chart/${DUALCORE_LLAMA_POOL}`
32255
+ ).then((r) => r.json());
32256
+ const series = res?.data ?? [];
32257
+ const latest = series[series.length - 1];
32258
+ const apy = Number(latest?.apy ?? latest?.apyBase);
32259
+ if (!Number.isFinite(apy) || apy < 0)
32260
+ throw new Error("dualCORE APY: bad DefiLlama value");
32261
+ return apy;
32262
+ };
32263
+ var computeScoreApr = async () => {
32264
+ const WINDOWS = [604800n, 259200n, 86400n];
32265
+ const rateAt = async (client, block) => {
32266
+ const opt = block !== void 0 ? { blockNumber: block } : {};
32267
+ const [staked, supply] = await Promise.all([
32268
+ client.readContract({
32269
+ address: SCORE,
32270
+ abi: VIEW_U256("totalStaked"),
32271
+ functionName: "totalStaked",
32272
+ ...opt
32273
+ }),
32274
+ client.readContract({
32275
+ address: SCORE,
32276
+ abi: VIEW_U256("totalSupply"),
32277
+ functionName: "totalSupply",
32278
+ ...opt
32279
+ })
32280
+ ]);
32281
+ const sup = supply;
32282
+ if (sup <= 0n) return 0;
32283
+ return Number(staked * ONE_E184 / sup) / 1e18;
32284
+ };
32285
+ for (const window of WINDOWS) {
32286
+ for (let rpcId = 0; rpcId < 3; rpcId++) {
32287
+ try {
32288
+ const client = getEvmClient(Chain.CORE_BLOCKCHAIN_MAINNET, rpcId);
32289
+ const head = await client.getBlockNumber();
32290
+ if (head <= window) continue;
32291
+ const oldBlock = head - window;
32292
+ const [rNow, rOld, bNow, bOld] = await Promise.all([
32293
+ rateAt(client),
32294
+ rateAt(client, oldBlock),
32295
+ client.getBlock({ blockNumber: head }),
32296
+ client.getBlock({ blockNumber: oldBlock })
32297
+ ]);
32298
+ const elapsed = Number(bNow.timestamp - bOld.timestamp);
32299
+ if (rOld <= 0 || rNow <= rOld || elapsed <= 0) continue;
32300
+ const apr = (rNow - rOld) / rOld * (YEAR_SECONDS6 / elapsed) * 100;
32301
+ if (Number.isFinite(apr) && apr > 0) return apr;
32302
+ } catch {
32303
+ }
32304
+ }
32305
+ }
32306
+ return 0;
32307
+ };
32308
+ var coreLstFetcher = {
32309
+ label: "CORE_LST",
32310
+ fetch: async () => {
32311
+ const [stcore, dualcore, score] = await Promise.allSettled([
32312
+ computeStCoreApr(),
32313
+ fetchDualCoreApy(),
32314
+ computeScoreApr()
32315
+ ]);
32316
+ const result = {};
32317
+ if (stcore.status === "fulfilled") result[STCORE_KEY] = stcore.value;
32318
+ if (dualcore.status === "fulfilled") result[DUALCORE_KEY] = dualcore.value;
32319
+ if (score.status === "fulfilled" && score.value > 0)
32320
+ result[SCORE_KEY] = score.value;
32321
+ return result;
32322
+ }
32323
+ };
31697
32324
 
31698
32325
  // src/yields/intrinsic/index.ts
31699
32326
  async function fetchIntrinsicYields() {
@@ -31762,7 +32389,8 @@ async function fetchIntrinsicYields() {
31762
32389
  ibgtFetcher,
31763
32390
  beraEthFetcher,
31764
32391
  lbgtFetcher,
31765
- psxdcFetcher
32392
+ psxdcFetcher,
32393
+ coreLstFetcher
31766
32394
  ];
31767
32395
  const results = await Promise.all([
31768
32396
  wstethPromise,
@@ -33329,7 +33957,7 @@ var siloV3Fetcher = {
33329
33957
  getAbi: getSiloV3Abi
33330
33958
  };
33331
33959
  var FLUID_EEE_LOWER3 = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
33332
- var normalizeUnderlying3 = (addr) => addr === FLUID_EEE_LOWER3 ? zeroAddress : addr;
33960
+ var normalizeUnderlying4 = (addr) => addr === FLUID_EEE_LOWER3 ? zeroAddress : addr;
33333
33961
  function priceColInDebt(raw, colDec, debtDec) {
33334
33962
  return formatMorphoPrice(raw, debtDec, colDec + 9);
33335
33963
  }
@@ -33366,8 +33994,8 @@ function parseFluidResults(data, _meta, context) {
33366
33994
  const rawCol = (constants.supplyToken?.token0 ?? constants.supplyToken ?? "").toString().toLowerCase();
33367
33995
  const rawLoan = (constants.borrowToken?.token0 ?? constants.borrowToken ?? "").toString().toLowerCase();
33368
33996
  if (!rawCol || !rawLoan) continue;
33369
- const collateral = normalizeUnderlying3(rawCol);
33370
- const loan = normalizeUnderlying3(rawLoan);
33997
+ const collateral = normalizeUnderlying4(rawCol);
33998
+ const loan = normalizeUnderlying4(rawLoan);
33371
33999
  const colDec = tokenList?.[collateral]?.decimals ?? 18;
33372
34000
  const loanDec = tokenList?.[loan]?.decimals ?? 18;
33373
34001
  const rawPrice = configs.oraclePriceOperate?.toString() ?? "0";
@@ -33483,6 +34111,56 @@ var gearboxV3Fetcher = {
33483
34111
  parse: parseGearboxV3Results,
33484
34112
  getAbi: getGearboxV3Abi
33485
34113
  };
34114
+ var LENDER2 = "DOLOMITE";
34115
+ function getDolomiteCalls(chainId) {
34116
+ const cfg = dolomiteConfigs()?.[chainId];
34117
+ const margin = cfg?.dolomiteMargin;
34118
+ const marketsMap = cfg?.markets;
34119
+ if (!margin || !marketsMap) return [];
34120
+ const markets = Object.entries(marketsMap).map(([marketId, token]) => ({
34121
+ marketId,
34122
+ token: String(token).toLowerCase()
34123
+ }));
34124
+ if (markets.length === 0) return [];
34125
+ const calls = markets.map(({ marketId }) => ({
34126
+ address: margin,
34127
+ name: "getMarketPrice",
34128
+ params: [marketId]
34129
+ }));
34130
+ return [{ calls, meta: { markets }, lender: LENDER2 }];
34131
+ }
34132
+ function parseDolomiteResults(data, meta, context) {
34133
+ const { chainId, tokenList } = context;
34134
+ const entries = [];
34135
+ meta.markets.forEach((mkt, i) => {
34136
+ const raw = data[i];
34137
+ if (raw === void 0 || raw === "0x") return;
34138
+ const asset = mkt.token;
34139
+ const decimals = tokenList?.[asset]?.decimals ?? 18;
34140
+ try {
34141
+ const value = BigInt((raw?.value ?? raw).toString());
34142
+ const priceUSD = Number(formatUnits(value, 36 - decimals));
34143
+ if (!isFinite(priceUSD) || priceUSD === 0) return;
34144
+ entries.push({
34145
+ asset,
34146
+ price: priceUSD,
34147
+ priceUSD,
34148
+ marketUid: createMarketUid(chainId, LENDER2, asset),
34149
+ targetLender: LENDER2
34150
+ });
34151
+ } catch {
34152
+ }
34153
+ });
34154
+ return entries;
34155
+ }
34156
+ function getDolomiteAbi() {
34157
+ return DolomiteMarginAbi;
34158
+ }
34159
+ var dolomiteFetcher = {
34160
+ getCalls: getDolomiteCalls,
34161
+ parse: parseDolomiteResults,
34162
+ getAbi: getDolomiteAbi
34163
+ };
33486
34164
 
33487
34165
  // src/prices/oracle-prices/fetchers/siloV2Graphql.ts
33488
34166
  async function fetchSiloV2GraphQLMarkets(chainId) {
@@ -34007,6 +34685,11 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
34007
34685
  () => gearboxV3Fetcher.getCalls(chainId),
34008
34686
  getCallsErrors
34009
34687
  ) : [];
34688
+ const dolomiteResults = isActive("dolomite") ? safeGetCalls(
34689
+ "dolomite",
34690
+ () => dolomiteFetcher.getCalls(chainId),
34691
+ getCallsErrors
34692
+ ) : [];
34010
34693
  const aaveGroup = buildGroup(
34011
34694
  "aave",
34012
34695
  aaveResults,
@@ -34073,6 +34756,12 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
34073
34756
  gearboxV3Fetcher.parse,
34074
34757
  getGearboxV3Abi()
34075
34758
  );
34759
+ const dolomiteGroup = buildGroup(
34760
+ "dolomite",
34761
+ dolomiteResults,
34762
+ dolomiteFetcher.parse,
34763
+ getDolomiteAbi()
34764
+ );
34076
34765
  const allGroups = [
34077
34766
  aaveGroup,
34078
34767
  compoundV2Group,
@@ -34084,7 +34773,8 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
34084
34773
  siloV2Group,
34085
34774
  siloV3Group,
34086
34775
  fluidGroup,
34087
- gearboxV3Group
34776
+ gearboxV3Group,
34777
+ dolomiteGroup
34088
34778
  ];
34089
34779
  const totalCalls = allGroups.reduce((s, g) => s + g.calls.length, 0);
34090
34780
  if (totalCalls === 0 && !isActive("morpho")) {
@@ -34114,6 +34804,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
34114
34804
  aaveV4Data,
34115
34805
  fluidData,
34116
34806
  gearboxV3Data,
34807
+ dolomiteData,
34117
34808
  morphoGqlEntries,
34118
34809
  siloV2GqlEntries,
34119
34810
  siloV3GqlEntries
@@ -34182,6 +34873,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
34182
34873
  allowFailure,
34183
34874
  rpcOverrides
34184
34875
  ),
34876
+ executeGroup(
34877
+ dolomiteGroup,
34878
+ chainId,
34879
+ chainBatchSize,
34880
+ retries,
34881
+ allowFailure,
34882
+ rpcOverrides
34883
+ ),
34185
34884
  morphoGqlPromise,
34186
34885
  siloV2GqlPromise,
34187
34886
  siloV3GqlPromise
@@ -34231,6 +34930,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
34231
34930
  { group: aaveV4Group, data: aaveV4Data },
34232
34931
  { group: fluidGroup, data: fluidData },
34233
34932
  { group: gearboxV3Group, data: gearboxV3Data },
34933
+ { group: dolomiteGroup, data: dolomiteData },
34234
34934
  ...siloV2GqlEntries != null ? [] : [{ group: siloV2Group, data: siloV2Data }],
34235
34935
  ...siloV3GqlEntries != null ? [] : [{ group: siloV3Group, data: siloV3Data }],
34236
34936
  // In hybrid mode the on-chain multicall ran too — surface its errors.
@@ -34320,6 +35020,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
34320
35020
  );
34321
35021
  parseTrackers(fluidGroup, fluidData.results, false);
34322
35022
  parseTrackers(gearboxV3Group, gearboxV3Data.results, false);
35023
+ parseTrackers(dolomiteGroup, dolomiteData.results);
34323
35024
  if (siloV2GqlEntries != null) {
34324
35025
  const diag2 = {
34325
35026
  lender: "SILO_V2 (GraphQL)",
@@ -34925,7 +35626,7 @@ var composeVaultDisplayName = (brand, curatorName, asset, fallbackName) => {
34925
35626
 
34926
35627
  // src/vaults/fluid/publicCallParse.ts
34927
35628
  var FLUID_EEE_LOWER4 = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
34928
- var normalizeUnderlying4 = (addr) => addr === FLUID_EEE_LOWER4 ? zeroAddress : addr;
35629
+ var normalizeUnderlying5 = (addr) => addr === FLUID_EEE_LOWER4 ? zeroAddress : addr;
34929
35630
  var FLUID_RATE_SCALE2 = 100;
34930
35631
  var scaleFluidRate2 = (raw) => {
34931
35632
  if (raw === void 0 || raw === null) return 0;
@@ -34947,7 +35648,7 @@ function parseFTokens(fTokens, chainId, prices, tokenList) {
34947
35648
  for (const ft of fTokens) {
34948
35649
  const rawAsset = (ft.asset ?? "").toString().toLowerCase();
34949
35650
  if (!rawAsset) continue;
34950
- const underlying = normalizeUnderlying4(rawAsset);
35651
+ const underlying = normalizeUnderlying5(rawAsset);
34951
35652
  const assetMeta = tokenList[underlying];
34952
35653
  const decimals = Number(ft.decimals ?? assetMeta?.decimals ?? 18);
34953
35654
  const totalAssetsFormatted = Number(
@@ -35032,7 +35733,7 @@ var buildGearboxV3PoolsCall = (chainId) => {
35032
35733
 
35033
35734
  // src/vaults/gearbox/publicCallParse.ts
35034
35735
  var WETH_MAINNET = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
35035
- var normalizeUnderlying5 = (addr, chainId) => {
35736
+ var normalizeUnderlying6 = (addr, chainId) => {
35036
35737
  const lower = addr.toLowerCase();
35037
35738
  if (chainId === "1" && lower === WETH_MAINNET) return zeroAddress;
35038
35739
  return lower;
@@ -35063,7 +35764,7 @@ function parseMarkets(markets, chainId, prices, tokenList) {
35063
35764
  const rawAddress = (pool.baseParams?.addr ?? "").toString().toLowerCase();
35064
35765
  const rawUnderlying = (pool.underlying ?? "").toString().toLowerCase();
35065
35766
  if (!rawAddress || !rawUnderlying) continue;
35066
- const underlying = normalizeUnderlying5(rawUnderlying, chainId);
35767
+ const underlying = normalizeUnderlying6(rawUnderlying, chainId);
35067
35768
  const assetMeta = tokenList[underlying];
35068
35769
  const decimals = Number(assetMeta?.decimals ?? pool.decimals ?? 18);
35069
35770
  const totalAssetsRaw = pool.expectedLiquidity?.toString() ?? "0";
@@ -36061,7 +36762,7 @@ var fetchEulerEarnVaults = async (chainId, prices = {}, tokenList = {}) => {
36061
36762
  var CHAIN_ID4 = "1";
36062
36763
  var SWBTC = "0x8db2350d78abc13f5673a411d4700bcf87864dde";
36063
36764
  var ONE_E8 = 10n ** 8n;
36064
- var YEAR_SECONDS6 = 365 * 24 * 60 * 60;
36765
+ var YEAR_SECONDS7 = 365 * 24 * 60 * 60;
36065
36766
  var WINDOW_SECONDS4 = 7 * 24 * 60 * 60;
36066
36767
  var BLOCK_TIME_SECONDS3 = 12;
36067
36768
  var WINDOW_BLOCKS3 = BigInt(Math.floor(WINDOW_SECONDS4 / BLOCK_TIME_SECONDS3));
@@ -36103,7 +36804,7 @@ var computeApr4 = async () => {
36103
36804
  const elapsed = Number(headBlock.timestamp - thenBlock.timestamp);
36104
36805
  if (elapsed <= 0) throw new Error(`bad elapsed ${elapsed}`);
36105
36806
  const growth = Number(rateNow) / Number(rateThen) - 1;
36106
- const apr = growth * (YEAR_SECONDS6 / elapsed) * 100;
36807
+ const apr = growth * (YEAR_SECONDS7 / elapsed) * 100;
36107
36808
  if (!Number.isFinite(apr) || apr < 0) throw new Error(`bad apr ${apr}`);
36108
36809
  return apr;
36109
36810
  } catch (e) {
@@ -36126,8 +36827,8 @@ var swBtcFetcher = {
36126
36827
  };
36127
36828
  var CHAIN_ID5 = "42220";
36128
36829
  var MANAGER = "0x0239b96d10a434a56cc9e09383077a0490cf9398";
36129
- var ONE_E184 = 10n ** 18n;
36130
- var YEAR_SECONDS7 = 365 * 24 * 60 * 60;
36830
+ var ONE_E185 = 10n ** 18n;
36831
+ var YEAR_SECONDS8 = 365 * 24 * 60 * 60;
36131
36832
  var WINDOW_SECONDS5 = 7 * 24 * 60 * 60;
36132
36833
  var BLOCK_TIME_SECONDS4 = 1;
36133
36834
  var WINDOW_BLOCKS4 = BigInt(Math.floor(WINDOW_SECONDS5 / BLOCK_TIME_SECONDS4));
@@ -36145,7 +36846,7 @@ var readRateAt4 = (client, blockNumber) => client.readContract({
36145
36846
  address: MANAGER,
36146
36847
  abi: TO_CELO_ABI,
36147
36848
  functionName: "toCelo",
36148
- args: [ONE_E184],
36849
+ args: [ONE_E185],
36149
36850
  ...blockNumber !== void 0 ? { blockNumber } : {}
36150
36851
  });
36151
36852
  var computeApr5 = async () => {
@@ -36161,7 +36862,7 @@ var computeApr5 = async () => {
36161
36862
  client.getBlock({ blockNumber: head }),
36162
36863
  client.getBlock({ blockNumber: pastBlock })
36163
36864
  ]);
36164
- if (rateNow < ONE_E184 || rateThen < ONE_E184 || rateNow < rateThen) {
36865
+ if (rateNow < ONE_E185 || rateThen < ONE_E185 || rateNow < rateThen) {
36165
36866
  throw new Error(
36166
36867
  `non-archival or invalid rates (now=${rateNow}, then=${rateThen})`
36167
36868
  );
@@ -36169,7 +36870,7 @@ var computeApr5 = async () => {
36169
36870
  const elapsed = Number(headBlock.timestamp - thenBlock.timestamp);
36170
36871
  if (elapsed <= 0) throw new Error("non-positive elapsed window");
36171
36872
  const growth = Number(rateNow - rateThen) / Number(rateThen);
36172
- const apr = growth * (YEAR_SECONDS7 / elapsed) * 100;
36873
+ const apr = growth * (YEAR_SECONDS8 / elapsed) * 100;
36173
36874
  if (!Number.isFinite(apr) || apr < 0) throw new Error(`bad apr ${apr}`);
36174
36875
  return apr;
36175
36876
  } catch (e) {
@@ -36200,6 +36901,69 @@ var lombardLbtcFetcher = {
36200
36901
  return { LBTC: Number.isFinite(frac) ? frac * 100 : 0 };
36201
36902
  }
36202
36903
  };
36904
+ var CHAIN_ID6 = "1284";
36905
+ var STDOT = "0xbc7e02c4178a7df7d3e564323a5c359dc96c4db4";
36906
+ var ONE_E186 = 10n ** 18n;
36907
+ var YEAR_SECONDS9 = 365 * 24 * 60 * 60;
36908
+ var WINDOW_SECONDS6 = 180 * 24 * 60 * 60;
36909
+ var BLOCK_TIME_SECONDS5 = 6;
36910
+ var WINDOW_BLOCKS5 = BigInt(Math.floor(WINDOW_SECONDS6 / BLOCK_TIME_SECONDS5));
36911
+ var MAX_RPC_TRIES5 = 5;
36912
+ var POOLED_BY_SHARES_ABI = [
36913
+ {
36914
+ name: "getPooledTokenByShares",
36915
+ type: "function",
36916
+ stateMutability: "view",
36917
+ inputs: [{ type: "uint256", name: "_sharesAmount" }],
36918
+ outputs: [{ type: "uint256" }]
36919
+ }
36920
+ ];
36921
+ var readRateAt5 = (client, blockNumber) => client.readContract({
36922
+ address: STDOT,
36923
+ abi: POOLED_BY_SHARES_ABI,
36924
+ functionName: "getPooledTokenByShares",
36925
+ args: [ONE_E186],
36926
+ ...blockNumber !== void 0 ? { blockNumber } : {}
36927
+ });
36928
+ var computeApr6 = async () => {
36929
+ let lastErr;
36930
+ for (let rpcId = 0; rpcId < MAX_RPC_TRIES5; rpcId++) {
36931
+ try {
36932
+ const client = getEvmClient(CHAIN_ID6, rpcId);
36933
+ const head = await client.getBlockNumber();
36934
+ const pastBlock = head > WINDOW_BLOCKS5 ? head - WINDOW_BLOCKS5 : 0n;
36935
+ const [rateNow, rateThen, headBlock, thenBlock] = await Promise.all([
36936
+ readRateAt5(client),
36937
+ readRateAt5(client, pastBlock),
36938
+ client.getBlock({ blockNumber: head }),
36939
+ client.getBlock({ blockNumber: pastBlock })
36940
+ ]);
36941
+ if (rateNow < ONE_E186 || rateThen < ONE_E186 || rateNow < rateThen) {
36942
+ throw new Error(
36943
+ `non-archival or invalid rates (now=${rateNow}, then=${rateThen})`
36944
+ );
36945
+ }
36946
+ const elapsed = Number(headBlock.timestamp - thenBlock.timestamp);
36947
+ if (elapsed <= 0) throw new Error("non-positive elapsed window");
36948
+ const growth = Number(rateNow - rateThen) / Number(rateThen);
36949
+ const apr = growth * (YEAR_SECONDS9 / elapsed) * 100;
36950
+ if (!Number.isFinite(apr) || apr < 0) throw new Error(`bad apr ${apr}`);
36951
+ return apr;
36952
+ } catch (e) {
36953
+ lastErr = e;
36954
+ }
36955
+ }
36956
+ throw new Error(
36957
+ `stDOT APR: no archival Moonbeam RPC returned valid historical state (${String(lastErr)})`
36958
+ );
36959
+ };
36960
+ var stDotFetcher = {
36961
+ label: "STDOT",
36962
+ fetch: async () => {
36963
+ const apr = await computeApr6();
36964
+ return { STDOT: apr };
36965
+ }
36966
+ };
36203
36967
 
36204
36968
  // src/yields/intrinsic/fetchers/solv.ts
36205
36969
  var BTCPLUS_STATS_URL = "https://api.solvprotocol.org/btcplus/stats";
@@ -36682,6 +37446,32 @@ var LST_REGISTRY = {
36682
37446
  mintInputAsset: "0x004e9c3ef86bc1ca1f0bb5c7662861ee93350568",
36683
37447
  withdrawalMode: "queued"
36684
37448
  },
37449
+ {
37450
+ // PumpBTC pumpBTC — flat 1:1 (no on-chain rate; verified
37451
+ // 2026-06-03 — `asset()`/`getRate()`/`exchangeRate()`/
37452
+ // `convertToAssets()`/`pricePerShare()` all revert, exactly like
37453
+ // uniBTC/brBTC). Babylon BTC liquid staking; yield is off-chain
37454
+ // (points / BABY airdrops), no public APR feed → no yieldFetcher.
37455
+ // Minted 1:1 from WBTC via the WBTC `PumpStaking` proxy
37456
+ // `stake(amount)` (0x1fcca65f…, `pumpBTC()`==this token verified).
37457
+ // Separate per-collateral staking contracts exist
37458
+ // (FBTC 0x3d9bcca8…, cbBTC 0xc0c687a1…). Exit is a queue:
37459
+ // `unstakeRequest`→`claimSlot/claimAll` (~10-day T+10) or
37460
+ // `unstakeInstant` (currently 2% fee) — withdrawal reader deferred.
37461
+ address: "0xf469fbd2abcd6b9de8e169d128226c0fc90a012e",
37462
+ underlying: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
37463
+ symbol: "pumpBTC",
37464
+ brand: "PumpBTC",
37465
+ decimals: 8,
37466
+ reader: "offChain",
37467
+ isErc4626: false,
37468
+ isRebasing: false,
37469
+ isMintable: true,
37470
+ isNativeUnderlying: false,
37471
+ mintContract: "0x1fcca65fb6ae3b2758b9b2b394cb227eae404e1e",
37472
+ mintInputAsset: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
37473
+ withdrawalMode: "queued"
37474
+ },
36685
37475
  {
36686
37476
  // Solv SolvBTC — 1:1 BTC reserve token (18-dec, no direct yield).
36687
37477
  // The base/mint input for xSolvBTC. Mint/redeem via SolvBTCRouter
@@ -37259,6 +38049,141 @@ var LST_REGISTRY = {
37259
38049
  yieldFetcher: psxdcFetcher,
37260
38050
  yieldKey: "psXDC"
37261
38051
  }
38052
+ ],
38053
+ "1116": [
38054
+ {
38055
+ // Core DAO stCORE — official liquid staking. The rate getter lives
38056
+ // on the `Earn` contract (`stCORE.earn()`), not the token:
38057
+ // `getCurrentExchangeRate()` is 1e6-scaled CORE-per-stCORE. Mint via
38058
+ // `Earn.mint(validator)` (native CORE); exit via `redeem` → `withdraw`
38059
+ // (queued — Core round-based unbond).
38060
+ address: "0xb3a8f0f0da9ffc65318aa39e55079796093029ad",
38061
+ underlying: "0x0000000000000000000000000000000000000000",
38062
+ symbol: "stCORE",
38063
+ brand: "Core",
38064
+ decimals: 18,
38065
+ reader: "coreEarnRate",
38066
+ isErc4626: false,
38067
+ isRebasing: false,
38068
+ isMintable: true,
38069
+ isNativeUnderlying: true,
38070
+ mintContract: "0xf5fa1728babc3f8d2a617397fac2696c958c3409",
38071
+ mintInputAsset: "native",
38072
+ withdrawalMode: "queued",
38073
+ yieldFetcher: coreLstFetcher,
38074
+ yieldKey: "Liquid staked CORE::stCORE",
38075
+ readerExtras: {
38076
+ coreEarn: "0xf5fa1728babc3f8d2a617397fac2696c958c3409"
38077
+ }
38078
+ },
38079
+ {
38080
+ // b14g dualCORE — liquid dual-staking (CORE matched with staked BTC).
38081
+ // Value-accruing share token; backing CORE is `coreVault.totalStaked()`
38082
+ // (`dualCORE.coreVault()`) over the share supply. Deposit via
38083
+ // `coreVault.stake()` (native CORE); exit via `unbond(amount, instant)`
38084
+ // — 1-day unbond (0% fee) or instant (fee).
38085
+ address: "0xc5555ea27e63cd89f8b227dece2a3916800c0f4f",
38086
+ underlying: "0x0000000000000000000000000000000000000000",
38087
+ symbol: "dualCORE",
38088
+ brand: "b14g",
38089
+ decimals: 18,
38090
+ reader: "coreStakedRatio",
38091
+ isErc4626: false,
38092
+ isRebasing: false,
38093
+ isMintable: true,
38094
+ isNativeUnderlying: true,
38095
+ mintContract: "0xee21ab613d30330823d35cf91a84ce964808b83f",
38096
+ mintInputAsset: "native",
38097
+ withdrawalMode: "fee-or-queued",
38098
+ yieldFetcher: coreLstFetcher,
38099
+ yieldKey: "b14g dualCORE::DUALCORE",
38100
+ readerExtras: {
38101
+ coreStakeContract: "0xee21ab613d30330823d35cf91a84ce964808b83f"
38102
+ }
38103
+ },
38104
+ {
38105
+ // StakedCore SCORE — small liquid staking token that is its own
38106
+ // staking contract: `totalStaked()/totalSupply()` is the rate. Mint
38107
+ // via `deposit(validator)` (native CORE); exit via `withdraw(amount)`.
38108
+ address: "0xa20b3b97df3a02f9185175760300a06b4e0a2c05",
38109
+ underlying: "0x0000000000000000000000000000000000000000",
38110
+ symbol: "SCORE",
38111
+ brand: "StakedCore",
38112
+ decimals: 18,
38113
+ reader: "coreStakedRatio",
38114
+ isErc4626: false,
38115
+ isRebasing: false,
38116
+ isMintable: true,
38117
+ isNativeUnderlying: true,
38118
+ mintContract: "0xa20b3b97df3a02f9185175760300a06b4e0a2c05",
38119
+ mintInputAsset: "native",
38120
+ withdrawalMode: "queued",
38121
+ yieldFetcher: coreLstFetcher,
38122
+ yieldKey: "StakedCore::SCORE"
38123
+ },
38124
+ {
38125
+ // PumpBTC pumpBTC on Core — the BTC LST (8-dec), distinct from the
38126
+ // native-CORE LSTs above. Flat 1:1 (verified on-chain 2026-06-03:
38127
+ // `asset()`/`getRate()` revert), same as Ethereum pumpBTC. Here it
38128
+ // is a **bridged** token — there is no local `PumpStaking`
38129
+ // (canonical mint is on Ethereum/BNB; the on-chain minters are
38130
+ // small bridge proxies, not the staking interface, and supply is
38131
+ // negligible), so it is non-mintable on Core and exits via DEX.
38132
+ // `underlying` is SolvBTC.CORE (0x9410…f2aa) as the BTC price
38133
+ // reference (no plain WBTC exists on Core). Off-chain yield (points)
38134
+ // → no yieldFetcher.
38135
+ address: "0x5a2aa871954ebdf89b1547e75d032598356caad5",
38136
+ underlying: "0x9410e8052bc661041e5cb27fdf7d9e9e842af2aa",
38137
+ symbol: "pumpBTC",
38138
+ brand: "PumpBTC",
38139
+ decimals: 8,
38140
+ reader: "offChain",
38141
+ isErc4626: false,
38142
+ isRebasing: false,
38143
+ isMintable: false,
38144
+ isNativeUnderlying: false,
38145
+ withdrawalMode: "dex-only"
38146
+ }
38147
+ ],
38148
+ "1284": [
38149
+ {
38150
+ // StellaSwap stDOT (Moonbeam) — liquid-staked DOT, built on the
38151
+ // lido-dot-ksm architecture that StellaSwap operates. Non-rebasing,
38152
+ // value-accruing: `totalSupply()` is shares and the rate comes from
38153
+ // `getPooledTokenByShares(1e18)` (1e18-scaled DOT-per-share, verified
38154
+ // on-chain 2026-06-04 ≈ 1.3413). `getTotalPooledToken()` is total
38155
+ // pooled DOT. Underlying is xcDOT (the XC-20 DOT, 10-dec). Mint by
38156
+ // approving xcDOT then `deposit(amount)` on the token (proxy impl
38157
+ // `0x0d54…efd3`). Exit: `redeem(amount)` → ~28-day Polkadot unbond →
38158
+ // `claimUnbonded()` (`getUnbonded(holder)` tracks waiting/unbonded);
38159
+ // instant exit only via the Pulsar V3 pool. `getCurrentAPY()` is not
38160
+ // exposed on-chain and there is no public APR API → no yieldFetcher
38161
+ // yet (APR best derived from an on-chain rate-delta like stCELO).
38162
+ // NB: a legacy Lido rebasing stDOT (`0xfa36…a108`, "KSM"-named getters)
38163
+ // also exists — this `0xbc7e…4db4` is the StellaSwap one.
38164
+ address: "0xbc7e02c4178a7df7d3e564323a5c359dc96c4db4",
38165
+ underlying: "0xffffffff1fcacbd218edc0eba20fc2308c778080",
38166
+ symbol: "stDOT",
38167
+ brand: "StellaSwap",
38168
+ decimals: 10,
38169
+ reader: "stellaStDot",
38170
+ isErc4626: false,
38171
+ isRebasing: false,
38172
+ isMintable: true,
38173
+ isNativeUnderlying: false,
38174
+ mintContract: "0xbc7e02c4178a7df7d3e564323a5c359dc96c4db4",
38175
+ mintInputAsset: "0xffffffff1fcacbd218edc0eba20fc2308c778080",
38176
+ withdrawalMode: "fixed-cooldown",
38177
+ // Polkadot unbonding is 28 eras (~28 days).
38178
+ withdrawalCooldownSeconds: 28 * 86400,
38179
+ // No on-chain `getCurrentAPY()` / public API → APR derived from the
38180
+ // on-chain rate-delta (`getPooledTokenByShares(1e18)` growth). The
38181
+ // rate steps in infrequent lumps, so the fetcher uses a 180-day
38182
+ // window to smooth to the realised ~9% (public Moonbeam RPCs serve
38183
+ // the deep archival reads; falls back to 0 if none do).
38184
+ yieldFetcher: stDotFetcher,
38185
+ yieldKey: "STDOT"
38186
+ }
37262
38187
  ]
37263
38188
  };
37264
38189
  var getLstRegistry = (chainId) => LST_REGISTRY[chainId] ?? [];
@@ -37325,7 +38250,7 @@ var Erc4626PreviewRedeemAbi = [
37325
38250
  ];
37326
38251
 
37327
38252
  // src/vaults/lst/readers/shared.ts
37328
- var ONE_E185 = 10n ** 18n;
38253
+ var ONE_E187 = 10n ** 18n;
37329
38254
  var toBigInt10 = (v) => {
37330
38255
  if (v === void 0 || v === null) return void 0;
37331
38256
  if (typeof v === "bigint") return v;
@@ -37357,7 +38282,7 @@ var readerBeetsStS = (entry) => ({
37357
38282
  }
37358
38283
  const liquidity = toBigInt10(pool);
37359
38284
  return {
37360
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38285
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37361
38286
  totalSupply,
37362
38287
  exchangeRate,
37363
38288
  liquidity
@@ -37390,7 +38315,7 @@ var readerBenqiSavax = (entry) => ({
37390
38315
  {
37391
38316
  address: entry.address,
37392
38317
  name: "getPooledAvaxByShares",
37393
- params: [ONE_E185]
38318
+ params: [ONE_E187]
37394
38319
  },
37395
38320
  { address: entry.address, name: "totalPooledAvax", params: [] }
37396
38321
  ],
@@ -37401,7 +38326,7 @@ var readerBenqiSavax = (entry) => ({
37401
38326
  if (totalSupply === void 0 || exchangeRate === void 0) {
37402
38327
  return void 0;
37403
38328
  }
37404
- const totalAssets = toBigInt10(totalPooled) ?? totalSupply * exchangeRate / ONE_E185;
38329
+ const totalAssets = toBigInt10(totalPooled) ?? totalSupply * exchangeRate / ONE_E187;
37405
38330
  return {
37406
38331
  totalAssets,
37407
38332
  totalSupply,
@@ -37420,7 +38345,7 @@ var readerBgtWrapper1to1 = (entry) => ({
37420
38345
  return {
37421
38346
  totalAssets: totalSupply,
37422
38347
  totalSupply,
37423
- exchangeRate: ONE_E185
38348
+ exchangeRate: ONE_E187
37424
38349
  };
37425
38350
  }
37426
38351
  });
@@ -37450,7 +38375,7 @@ var readerDineroBeraEth = (entry) => ({
37450
38375
  return void 0;
37451
38376
  }
37452
38377
  return {
37453
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38378
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37454
38379
  totalSupply,
37455
38380
  exchangeRate
37456
38381
  };
@@ -37462,7 +38387,7 @@ var readerErc4626 = (entry) => ({
37462
38387
  calls: [
37463
38388
  { address: entry.address, name: "totalAssets", params: [] },
37464
38389
  { address: entry.address, name: "totalSupply", params: [] },
37465
- { address: entry.address, name: "convertToAssets", params: [ONE_E185] }
38390
+ { address: entry.address, name: "convertToAssets", params: [ONE_E187] }
37466
38391
  ],
37467
38392
  abis: [Erc4626ReadAbi, TotalSupplyAbi, Erc4626ReadAbi],
37468
38393
  parse: ([assets, supply, rate]) => {
@@ -37479,7 +38404,7 @@ var readerErc4626PreviewRedeem = (entry) => ({
37479
38404
  calls: [
37480
38405
  { address: entry.address, name: "totalAssets", params: [] },
37481
38406
  { address: entry.address, name: "totalSupply", params: [] },
37482
- { address: entry.address, name: "previewRedeem", params: [ONE_E185] }
38407
+ { address: entry.address, name: "previewRedeem", params: [ONE_E187] }
37483
38408
  ],
37484
38409
  abis: [Erc4626PreviewRedeemAbi, TotalSupplyAbi, Erc4626PreviewRedeemAbi],
37485
38410
  parse: ([assets, supply, rate]) => {
@@ -37536,7 +38461,7 @@ var readerEtherFiWeEth = (entry) => {
37536
38461
  }
37537
38462
  const liquidity = lp ? toBigInt10(slice[2]) : void 0;
37538
38463
  return {
37539
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38464
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37540
38465
  totalSupply,
37541
38466
  exchangeRate,
37542
38467
  liquidity
@@ -37569,7 +38494,7 @@ var readerHyperbeatBeHype = (entry) => {
37569
38494
  return {
37570
38495
  totalAssets: totalSupply,
37571
38496
  totalSupply,
37572
- exchangeRate: ONE_E185
38497
+ exchangeRate: ONE_E187
37573
38498
  };
37574
38499
  }
37575
38500
  };
@@ -37577,7 +38502,7 @@ var readerHyperbeatBeHype = (entry) => {
37577
38502
  return {
37578
38503
  calls: [
37579
38504
  { address: entry.address, name: "totalSupply", params: [] },
37580
- { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E185] }
38505
+ { address: stakingCore, name: "BeHYPEToHYPE", params: [ONE_E187] }
37581
38506
  ],
37582
38507
  abis: [TotalSupplyAbi, HyperbeatStakingCoreAbi],
37583
38508
  parse: ([supply, rate]) => {
@@ -37587,7 +38512,7 @@ var readerHyperbeatBeHype = (entry) => {
37587
38512
  return void 0;
37588
38513
  }
37589
38514
  return {
37590
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38515
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37591
38516
  totalSupply,
37592
38517
  exchangeRate
37593
38518
  };
@@ -37619,7 +38544,7 @@ var readerKelpRsEth = (entry) => {
37619
38544
  return {
37620
38545
  totalAssets: totalSupply,
37621
38546
  totalSupply,
37622
- exchangeRate: ONE_E185
38547
+ exchangeRate: ONE_E187
37623
38548
  };
37624
38549
  }
37625
38550
  };
@@ -37637,7 +38562,7 @@ var readerKelpRsEth = (entry) => {
37637
38562
  return void 0;
37638
38563
  }
37639
38564
  return {
37640
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38565
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37641
38566
  totalSupply,
37642
38567
  exchangeRate
37643
38568
  };
@@ -37669,7 +38594,7 @@ var readerKinetiqKHype = (entry) => {
37669
38594
  return {
37670
38595
  totalAssets: totalSupply,
37671
38596
  totalSupply,
37672
- exchangeRate: ONE_E185
38597
+ exchangeRate: ONE_E187
37673
38598
  };
37674
38599
  }
37675
38600
  };
@@ -37677,7 +38602,7 @@ var readerKinetiqKHype = (entry) => {
37677
38602
  return {
37678
38603
  calls: [
37679
38604
  { address: entry.address, name: "totalSupply", params: [] },
37680
- { address: accountant, name: "kHYPEToHYPE", params: [ONE_E185] }
38605
+ { address: accountant, name: "kHYPEToHYPE", params: [ONE_E187] }
37681
38606
  ],
37682
38607
  abis: [TotalSupplyAbi, KinetiqStakingAccountantAbi],
37683
38608
  parse: ([supply, rate]) => {
@@ -37687,7 +38612,7 @@ var readerKinetiqKHype = (entry) => {
37687
38612
  return void 0;
37688
38613
  }
37689
38614
  return {
37690
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38615
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37691
38616
  totalSupply,
37692
38617
  exchangeRate
37693
38618
  };
@@ -37727,7 +38652,7 @@ var readerLairStKaia = (entry) => ({
37727
38652
  if (totalSupply === void 0 || exchangeRate === void 0) {
37728
38653
  return void 0;
37729
38654
  }
37730
- const totalAssets = toBigInt10(totalStaking) ?? totalSupply * exchangeRate / ONE_E185;
38655
+ const totalAssets = toBigInt10(totalStaking) ?? totalSupply * exchangeRate / ONE_E187;
37731
38656
  return {
37732
38657
  totalAssets,
37733
38658
  totalSupply,
@@ -37761,7 +38686,7 @@ var readerLidoWstEth = (entry) => ({
37761
38686
  return void 0;
37762
38687
  }
37763
38688
  return {
37764
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38689
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37765
38690
  totalSupply,
37766
38691
  exchangeRate
37767
38692
  };
@@ -37799,7 +38724,7 @@ var readerListaSlisBnb = (entry) => {
37799
38724
  return {
37800
38725
  totalAssets: totalSupply,
37801
38726
  totalSupply,
37802
- exchangeRate: ONE_E185
38727
+ exchangeRate: ONE_E187
37803
38728
  };
37804
38729
  }
37805
38730
  };
@@ -37807,7 +38732,7 @@ var readerListaSlisBnb = (entry) => {
37807
38732
  return {
37808
38733
  calls: [
37809
38734
  { address: entry.address, name: "totalSupply", params: [] },
37810
- { address: manager, name: "convertSnBnbToBnb", params: [ONE_E185] },
38735
+ { address: manager, name: "convertSnBnbToBnb", params: [ONE_E187] },
37811
38736
  { address: manager, name: "getTotalPooledBnb", params: [] }
37812
38737
  ],
37813
38738
  abis: [TotalSupplyAbi, ListaStakeManagerReadAbi, ListaStakeManagerReadAbi],
@@ -37818,7 +38743,7 @@ var readerListaSlisBnb = (entry) => {
37818
38743
  return void 0;
37819
38744
  }
37820
38745
  const pooledBnb = toBigInt10(pooled);
37821
- const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E185;
38746
+ const totalAssets = pooledBnb ?? totalSupply * exchangeRate / ONE_E187;
37822
38747
  return { totalAssets, totalSupply, exchangeRate };
37823
38748
  }
37824
38749
  };
@@ -37848,7 +38773,7 @@ var readerMantleMEth = (entry) => {
37848
38773
  return {
37849
38774
  totalAssets: totalSupply,
37850
38775
  totalSupply,
37851
- exchangeRate: ONE_E185
38776
+ exchangeRate: ONE_E187
37852
38777
  };
37853
38778
  }
37854
38779
  };
@@ -37856,7 +38781,7 @@ var readerMantleMEth = (entry) => {
37856
38781
  return {
37857
38782
  calls: [
37858
38783
  { address: entry.address, name: "totalSupply", params: [] },
37859
- { address: staking, name: "mETHToETH", params: [ONE_E185] }
38784
+ { address: staking, name: "mETHToETH", params: [ONE_E187] }
37860
38785
  ],
37861
38786
  abis: [TotalSupplyAbi, MantleStakingAbi],
37862
38787
  parse: ([supply, rate]) => {
@@ -37866,7 +38791,7 @@ var readerMantleMEth = (entry) => {
37866
38791
  return void 0;
37867
38792
  }
37868
38793
  return {
37869
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38794
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37870
38795
  totalSupply,
37871
38796
  exchangeRate
37872
38797
  };
@@ -37881,7 +38806,7 @@ var readerOffChain = (entry) => ({
37881
38806
  parse: ([supply]) => {
37882
38807
  const totalSupply = toBigInt10(supply);
37883
38808
  if (totalSupply === void 0) return void 0;
37884
- return { totalAssets: totalSupply, totalSupply, exchangeRate: ONE_E185 };
38809
+ return { totalAssets: totalSupply, totalSupply, exchangeRate: ONE_E187 };
37885
38810
  }
37886
38811
  });
37887
38812
 
@@ -37913,7 +38838,7 @@ var readerRenzoEzEth = (entry) => {
37913
38838
  return {
37914
38839
  totalAssets: totalSupply,
37915
38840
  totalSupply,
37916
- exchangeRate: ONE_E185
38841
+ exchangeRate: ONE_E187
37917
38842
  };
37918
38843
  }
37919
38844
  };
@@ -37932,7 +38857,7 @@ var readerRenzoEzEth = (entry) => {
37932
38857
  return {
37933
38858
  totalAssets: totalTvl,
37934
38859
  totalSupply,
37935
- exchangeRate: totalTvl * ONE_E185 / totalSupply
38860
+ exchangeRate: totalTvl * ONE_E187 / totalSupply
37936
38861
  };
37937
38862
  }
37938
38863
  };
@@ -37988,7 +38913,7 @@ var readerRocketReth = (entry) => {
37988
38913
  }
37989
38914
  const liquidity = depositPool ? toBigInt10(slice[2]) : void 0;
37990
38915
  return {
37991
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38916
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
37992
38917
  totalSupply,
37993
38918
  exchangeRate,
37994
38919
  liquidity
@@ -38030,7 +38955,7 @@ var readerStaderEthx = (entry) => {
38030
38955
  return {
38031
38956
  totalAssets: totalSupply,
38032
38957
  totalSupply,
38033
- exchangeRate: ONE_E185
38958
+ exchangeRate: ONE_E187
38034
38959
  };
38035
38960
  }
38036
38961
  };
@@ -38048,7 +38973,7 @@ var readerStaderEthx = (entry) => {
38048
38973
  return void 0;
38049
38974
  }
38050
38975
  return {
38051
- totalAssets: totalSupply * exchangeRate / ONE_E185,
38976
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
38052
38977
  totalSupply,
38053
38978
  exchangeRate
38054
38979
  };
@@ -38065,7 +38990,7 @@ var readerStaderMaticX = (entry) => {
38065
38990
  {
38066
38991
  address: rateAddress,
38067
38992
  name: "convertMaticXToMatic",
38068
- params: [ONE_E185],
38993
+ params: [ONE_E187],
38069
38994
  chainId: homeChainId
38070
38995
  }
38071
38996
  ],
@@ -38080,7 +39005,7 @@ var readerStaderMaticX = (entry) => {
38080
39005
  }
38081
39006
  const isCrossChain = homeContract !== void 0;
38082
39007
  return {
38083
- totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E185 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E185,
39008
+ totalAssets: isCrossChain ? totalSupply * amountInMatic / ONE_E187 : totalPooledMatic ?? totalSupply * amountInMatic / ONE_E187,
38084
39009
  totalSupply,
38085
39010
  exchangeRate: amountInMatic
38086
39011
  };
@@ -38112,7 +39037,7 @@ var readerStakeWiseOsEth = (entry) => {
38112
39037
  return {
38113
39038
  totalAssets: totalSupply,
38114
39039
  totalSupply,
38115
- exchangeRate: ONE_E185
39040
+ exchangeRate: ONE_E187
38116
39041
  };
38117
39042
  }
38118
39043
  };
@@ -38120,7 +39045,7 @@ var readerStakeWiseOsEth = (entry) => {
38120
39045
  return {
38121
39046
  calls: [
38122
39047
  { address: entry.address, name: "totalSupply", params: [] },
38123
- { address: controller, name: "convertToAssets", params: [ONE_E185] }
39048
+ { address: controller, name: "convertToAssets", params: [ONE_E187] }
38124
39049
  ],
38125
39050
  abis: [TotalSupplyAbi, StakeWiseOsTokenAbi],
38126
39051
  parse: ([supply, rate]) => {
@@ -38130,7 +39055,7 @@ var readerStakeWiseOsEth = (entry) => {
38130
39055
  return void 0;
38131
39056
  }
38132
39057
  return {
38133
- totalAssets: totalSupply * exchangeRate / ONE_E185,
39058
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
38134
39059
  totalSupply,
38135
39060
  exchangeRate
38136
39061
  };
@@ -38162,7 +39087,7 @@ var readerStCelo = (entry) => {
38162
39087
  return {
38163
39088
  totalAssets: totalSupply,
38164
39089
  totalSupply,
38165
- exchangeRate: ONE_E185
39090
+ exchangeRate: ONE_E187
38166
39091
  };
38167
39092
  }
38168
39093
  };
@@ -38170,7 +39095,7 @@ var readerStCelo = (entry) => {
38170
39095
  return {
38171
39096
  calls: [
38172
39097
  { address: entry.address, name: "totalSupply", params: [] },
38173
- { address: manager, name: "toCelo", params: [ONE_E185] }
39098
+ { address: manager, name: "toCelo", params: [ONE_E187] }
38174
39099
  ],
38175
39100
  abis: [TotalSupplyAbi, StCeloManagerAbi],
38176
39101
  parse: ([supply, rate]) => {
@@ -38180,7 +39105,7 @@ var readerStCelo = (entry) => {
38180
39105
  return void 0;
38181
39106
  }
38182
39107
  return {
38183
- totalAssets: totalSupply * exchangeRate / ONE_E185,
39108
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
38184
39109
  totalSupply,
38185
39110
  exchangeRate
38186
39111
  };
@@ -38213,7 +39138,7 @@ var readerSwellGetRate = (entry) => ({
38213
39138
  return void 0;
38214
39139
  }
38215
39140
  return {
38216
- totalAssets: totalSupply * exchangeRate / ONE_E185,
39141
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
38217
39142
  totalSupply,
38218
39143
  exchangeRate
38219
39144
  };
@@ -38244,7 +39169,7 @@ var readerValantisWstHype = (entry) => {
38244
39169
  return {
38245
39170
  totalAssets: totalSupply,
38246
39171
  totalSupply,
38247
- exchangeRate: ONE_E185
39172
+ exchangeRate: ONE_E187
38248
39173
  };
38249
39174
  }
38250
39175
  };
@@ -38262,7 +39187,7 @@ var readerValantisWstHype = (entry) => {
38262
39187
  return void 0;
38263
39188
  }
38264
39189
  return {
38265
- totalAssets: totalSupply * exchangeRate / ONE_E185,
39190
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
38266
39191
  totalSupply,
38267
39192
  exchangeRate
38268
39193
  };
@@ -38291,7 +39216,7 @@ var readerVedaAccountant = (entry) => {
38291
39216
  parse: ([supply]) => {
38292
39217
  const totalSupply = toBigInt10(supply);
38293
39218
  if (totalSupply === void 0) return void 0;
38294
- return { totalAssets: totalSupply, totalSupply, exchangeRate: ONE_E185 };
39219
+ return { totalAssets: totalSupply, totalSupply, exchangeRate: ONE_E187 };
38295
39220
  }
38296
39221
  };
38297
39222
  }
@@ -38308,7 +39233,7 @@ var readerVedaAccountant = (entry) => {
38308
39233
  if (totalSupply === void 0 || rawRate === void 0) return void 0;
38309
39234
  const exchangeRate = rawRate * scale;
38310
39235
  return {
38311
- totalAssets: totalSupply * exchangeRate / ONE_E185,
39236
+ totalAssets: totalSupply * exchangeRate / ONE_E187,
38312
39237
  totalSupply,
38313
39238
  exchangeRate
38314
39239
  };
@@ -38341,9 +39266,121 @@ var readerAnkrRatio = (entry) => ({
38341
39266
  return void 0;
38342
39267
  }
38343
39268
  return {
38344
- totalAssets: totalSupply * ONE_E185 / r,
39269
+ totalAssets: totalSupply * ONE_E187 / r,
38345
39270
  totalSupply,
38346
- exchangeRate: ONE_E185 * ONE_E185 / r
39271
+ exchangeRate: ONE_E187 * ONE_E187 / r
39272
+ };
39273
+ }
39274
+ });
39275
+
39276
+ // src/vaults/lst/abis/core.ts
39277
+ var CoreEarnRateAbi = [
39278
+ {
39279
+ name: "getCurrentExchangeRate",
39280
+ type: "function",
39281
+ stateMutability: "view",
39282
+ inputs: [],
39283
+ outputs: [{ type: "uint256" }]
39284
+ }
39285
+ ];
39286
+ var CoreTotalStakedAbi = [
39287
+ {
39288
+ name: "totalStaked",
39289
+ type: "function",
39290
+ stateMutability: "view",
39291
+ inputs: [],
39292
+ outputs: [{ type: "uint256" }]
39293
+ }
39294
+ ];
39295
+
39296
+ // src/vaults/lst/readers/core.ts
39297
+ var CORE_RATE_DENOM = 10n ** 6n;
39298
+ var readerCoreEarnRate = (entry) => {
39299
+ const earn = entry.readerExtras?.coreEarn ?? entry.address;
39300
+ return {
39301
+ calls: [
39302
+ { address: earn, name: "getCurrentExchangeRate", params: [] },
39303
+ { address: entry.address, name: "totalSupply", params: [] }
39304
+ ],
39305
+ abis: [CoreEarnRateAbi, TotalSupplyAbi],
39306
+ parse: ([rate, supply]) => {
39307
+ const r = toBigInt10(rate);
39308
+ const totalSupply = toBigInt10(supply);
39309
+ if (r === void 0 || r === 0n || totalSupply === void 0) {
39310
+ return void 0;
39311
+ }
39312
+ return {
39313
+ totalAssets: totalSupply * r / CORE_RATE_DENOM,
39314
+ totalSupply,
39315
+ exchangeRate: r * ONE_E187 / CORE_RATE_DENOM
39316
+ };
39317
+ }
39318
+ };
39319
+ };
39320
+ var readerCoreStakedRatio = (entry) => {
39321
+ const stakeContract = entry.readerExtras?.coreStakeContract ?? entry.address;
39322
+ return {
39323
+ calls: [
39324
+ { address: stakeContract, name: "totalStaked", params: [] },
39325
+ { address: entry.address, name: "totalSupply", params: [] }
39326
+ ],
39327
+ abis: [CoreTotalStakedAbi, TotalSupplyAbi],
39328
+ parse: ([staked, supply]) => {
39329
+ const totalStaked = toBigInt10(staked);
39330
+ const totalSupply = toBigInt10(supply);
39331
+ if (totalStaked === void 0 || totalSupply === void 0 || totalSupply === 0n) {
39332
+ return void 0;
39333
+ }
39334
+ return {
39335
+ totalAssets: totalStaked,
39336
+ totalSupply,
39337
+ exchangeRate: totalStaked * ONE_E187 / totalSupply
39338
+ };
39339
+ }
39340
+ };
39341
+ };
39342
+
39343
+ // src/vaults/lst/abis/stella.ts
39344
+ var StellaStDotAbi = [
39345
+ {
39346
+ name: "getPooledTokenByShares",
39347
+ type: "function",
39348
+ stateMutability: "view",
39349
+ inputs: [{ type: "uint256", name: "_sharesAmount" }],
39350
+ outputs: [{ type: "uint256" }]
39351
+ },
39352
+ {
39353
+ name: "getTotalPooledToken",
39354
+ type: "function",
39355
+ stateMutability: "view",
39356
+ inputs: [],
39357
+ outputs: [{ type: "uint256" }]
39358
+ }
39359
+ ];
39360
+
39361
+ // src/vaults/lst/readers/stella.ts
39362
+ var readerStellaStDot = (entry) => ({
39363
+ calls: [
39364
+ { address: entry.address, name: "totalSupply", params: [] },
39365
+ {
39366
+ address: entry.address,
39367
+ name: "getPooledTokenByShares",
39368
+ params: [ONE_E187]
39369
+ },
39370
+ { address: entry.address, name: "getTotalPooledToken", params: [] }
39371
+ ],
39372
+ abis: [TotalSupplyAbi, StellaStDotAbi, StellaStDotAbi],
39373
+ parse: ([supply, rate, pooled]) => {
39374
+ const totalSupply = toBigInt10(supply);
39375
+ const exchangeRate = toBigInt10(rate);
39376
+ if (totalSupply === void 0 || exchangeRate === void 0) {
39377
+ return void 0;
39378
+ }
39379
+ const totalAssets = toBigInt10(pooled) ?? totalSupply * exchangeRate / ONE_E187;
39380
+ return {
39381
+ totalAssets,
39382
+ totalSupply,
39383
+ exchangeRate
38347
39384
  };
38348
39385
  }
38349
39386
  });
@@ -38401,6 +39438,12 @@ var buildReader = (entry) => {
38401
39438
  return readerOffChain(entry);
38402
39439
  case "ankrRatio":
38403
39440
  return readerAnkrRatio(entry);
39441
+ case "coreEarnRate":
39442
+ return readerCoreEarnRate(entry);
39443
+ case "coreStakedRatio":
39444
+ return readerCoreStakedRatio(entry);
39445
+ case "stellaStDot":
39446
+ return readerStellaStDot(entry);
38404
39447
  }
38405
39448
  };
38406
39449
 
@@ -38447,7 +39490,18 @@ var resolveYieldApr = async (entries) => {
38447
39490
  };
38448
39491
 
38449
39492
  // src/vaults/lst/fetchPublic.ts
38450
- var ONE_E186 = 10n ** 18n;
39493
+ var ONE_E188 = 10n ** 18n;
39494
+ var resolveAcceptedInputs = (chainId, shareToken, entry) => {
39495
+ const enriched = getLstAcceptedInputs(chainId, shareToken);
39496
+ if (enriched) return enriched;
39497
+ if (!entry.isMintable || entry.mintInputAsset === void 0) return [];
39498
+ return [
39499
+ {
39500
+ asset: entry.mintInputAsset === "native" ? "native" : entry.mintInputAsset.toLowerCase(),
39501
+ mode: "direct"
39502
+ }
39503
+ ];
39504
+ };
38451
39505
  var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
38452
39506
  const entries = getLstRegistry(chainId);
38453
39507
  if (entries.length === 0) return {};
@@ -38503,7 +39557,7 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
38503
39557
  const totalAssetsFormatted = Number(state.totalAssets) / decimalsFactor;
38504
39558
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
38505
39559
  const convertToAssets = state.exchangeRate;
38506
- const convertToShares = state.exchangeRate > 0n ? ONE_E186 * ONE_E186 / state.exchangeRate : 0n;
39560
+ const convertToShares = state.exchangeRate > 0n ? ONE_E188 * ONE_E188 / state.exchangeRate : 0n;
38507
39561
  const liquidity = state.liquidity;
38508
39562
  const liquidityFormatted = liquidity !== void 0 ? Number(liquidity) / decimalsFactor : void 0;
38509
39563
  const liquidityUsd = liquidityFormatted !== void 0 && priceUsd !== void 0 ? liquidityFormatted * priceUsd : liquidityFormatted !== void 0 ? 0 : void 0;
@@ -38539,6 +39593,7 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
38539
39593
  isNativeUnderlying: entry.isNativeUnderlying,
38540
39594
  mintContract: entry.mintContract?.toLowerCase(),
38541
39595
  mintInputAsset: entry.mintInputAsset === void 0 ? void 0 : entry.mintInputAsset === "native" ? "native" : entry.mintInputAsset.toLowerCase(),
39596
+ acceptedInputs: resolveAcceptedInputs(chainId, addressLc, entry),
38542
39597
  withdrawalMode: entry.withdrawalMode,
38543
39598
  withdrawalCooldownSeconds: entry.withdrawalCooldownSeconds,
38544
39599
  asset,
@@ -40454,6 +41509,65 @@ var readerStCelo2 = {
40454
41509
  }
40455
41510
  };
40456
41511
 
41512
+ // src/vaults/lst/withdrawals/abis/stella.ts
41513
+ var StellaGetUnbondedAbi = [
41514
+ {
41515
+ name: "getUnbonded",
41516
+ type: "function",
41517
+ stateMutability: "view",
41518
+ inputs: [{ type: "address", name: "_holder" }],
41519
+ outputs: [
41520
+ { type: "uint256", name: "waiting" },
41521
+ { type: "uint256", name: "unbonded" }
41522
+ ]
41523
+ }
41524
+ ];
41525
+
41526
+ // src/vaults/lst/withdrawals/readers/stella.ts
41527
+ var readerStellaUnbond = {
41528
+ fetch: async (user, multicallRetry, chainId, entry) => {
41529
+ const res = await multicallRetry({
41530
+ chain: chainId,
41531
+ calls: [
41532
+ { address: entry.lst, name: "getUnbonded", params: [user] }
41533
+ ],
41534
+ abi: [StellaGetUnbondedAbi]
41535
+ });
41536
+ const cell = res[0];
41537
+ let waiting;
41538
+ let unbonded;
41539
+ if (Array.isArray(cell)) {
41540
+ waiting = toBigInt11(cell[0]);
41541
+ unbonded = toBigInt11(cell[1]);
41542
+ } else if (cell && typeof cell === "object") {
41543
+ waiting = toBigInt11(cell.waiting);
41544
+ unbonded = toBigInt11(cell.unbonded);
41545
+ }
41546
+ const out = [];
41547
+ if (unbonded && unbonded > 0n) {
41548
+ out.push({
41549
+ lst: entry.lst,
41550
+ brand: entry.brand,
41551
+ symbol: entry.symbol,
41552
+ requestId: "unbonded",
41553
+ amountUnderlying: unbonded.toString(),
41554
+ status: "claimable"
41555
+ });
41556
+ }
41557
+ if (waiting && waiting > 0n) {
41558
+ out.push({
41559
+ lst: entry.lst,
41560
+ brand: entry.brand,
41561
+ symbol: entry.symbol,
41562
+ requestId: "waiting",
41563
+ amountUnderlying: waiting.toString(),
41564
+ status: "pending"
41565
+ });
41566
+ }
41567
+ return out;
41568
+ }
41569
+ };
41570
+
40457
41571
  // src/vaults/lst/withdrawals/abis/swell.ts
40458
41572
  var SwellRswExitAbi = [
40459
41573
  {
@@ -40888,6 +42002,8 @@ var buildWithdrawalReader = (entry) => {
40888
42002
  return readerPrimeStaking;
40889
42003
  case "berapawRedeemQueue":
40890
42004
  return readerBeraPaw;
42005
+ case "stellaUnbondQueue":
42006
+ return readerStellaUnbond;
40891
42007
  case "eventsOnly":
40892
42008
  case "noQueue":
40893
42009
  case "unverified":
@@ -41267,6 +42383,21 @@ var LST_WITHDRAWAL_REGISTRY = {
41267
42383
  reader: "primeStakingQueue",
41268
42384
  withdrawalContract: "0x98d916f5773ac0482b49856f2659d6c32114c4ba"
41269
42385
  }
42386
+ ],
42387
+ "1284": [
42388
+ {
42389
+ // StellaSwap stDOT (lido-dot-ksm). After `redeem(amount)` the
42390
+ // position enters Polkadot's ~28-day unbond; `getUnbonded(holder)`
42391
+ // returns the per-user aggregate as `(waiting, unbonded)` — no
42392
+ // per-request IDs. The reader emits up to two synthetic requests
42393
+ // (waiting→pending, unbonded→claimable via `claimUnbonded()`). The
42394
+ // stDOT token is its own withdrawal contract.
42395
+ lst: "0xbc7e02c4178a7df7d3e564323a5c359dc96c4db4",
42396
+ brand: "StellaSwap",
42397
+ symbol: "stDOT",
42398
+ reader: "stellaUnbondQueue",
42399
+ withdrawalContract: "0xbc7e02c4178a7df7d3e564323a5c359dc96c4db4"
42400
+ }
41270
42401
  ]
41271
42402
  };
41272
42403
  var getLstWithdrawalRegistry = (chainId, extraEntries) => {
@@ -41335,7 +42466,7 @@ var Erc4626ReadAbi2 = [
41335
42466
  ];
41336
42467
 
41337
42468
  // src/vaults/savings/readers/shared.ts
41338
- var ONE_E187 = 10n ** 18n;
42469
+ var ONE_E189 = 10n ** 18n;
41339
42470
  var toBigInt12 = (v) => {
41340
42471
  if (v === void 0 || v === null) return void 0;
41341
42472
  if (typeof v === "bigint") return v;
@@ -41376,7 +42507,7 @@ var readerErc46262 = (entry) => {
41376
42507
  return {
41377
42508
  totalAssets,
41378
42509
  totalSupply,
41379
- exchangeRate: convertToAssetsRaw * ONE_E187 / underlyingUnit
42510
+ exchangeRate: convertToAssetsRaw * ONE_E189 / underlyingUnit
41380
42511
  };
41381
42512
  }
41382
42513
  };
@@ -41718,7 +42849,7 @@ var resolveYieldApr2 = async (entries) => {
41718
42849
  };
41719
42850
 
41720
42851
  // src/vaults/savings/fetchPublic.ts
41721
- var ONE_E188 = 10n ** 18n;
42852
+ var ONE_E1810 = 10n ** 18n;
41722
42853
  var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
41723
42854
  const entries = getSavingsRegistry(chainId);
41724
42855
  if (entries.length === 0) return {};
@@ -41755,8 +42886,8 @@ var fetchSavingsVaults = async (chainId, multicallRetry, prices = {}, tokenList
41755
42886
  const underlyingUnit = 10n ** BigInt(underlyingDec);
41756
42887
  const totalAssetsFormatted = Number(state.totalAssets) / 10 ** underlyingDec;
41757
42888
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
41758
- const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E188;
41759
- const convertToShares = state.exchangeRate > 0n ? ONE_E188 * shareUnit / state.exchangeRate : 0n;
42889
+ const convertToAssets = state.exchangeRate * underlyingUnit / ONE_E1810;
42890
+ const convertToShares = state.exchangeRate > 0n ? ONE_E1810 * shareUnit / state.exchangeRate : 0n;
41760
42891
  const displayName = composeVaultDisplayName(
41761
42892
  entry.brand,
41762
42893
  entry.brand,
@@ -43221,7 +44352,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
43221
44352
  };
43222
44353
 
43223
44354
  // src/vaults/yield/annualize.ts
43224
- var YEAR_SECONDS8 = 365 * 24 * 60 * 60;
44355
+ var YEAR_SECONDS10 = 365 * 24 * 60 * 60;
43225
44356
  var SCALE = 10n ** 18n;
43226
44357
  var appendSnapshot = (points, snap, options) => {
43227
44358
  const maxPoints = options?.maxPoints ?? 90;
@@ -43250,7 +44381,7 @@ var computeVaultApr = (points, options) => {
43250
44381
  if (pThen === 0n) return void 0;
43251
44382
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
43252
44383
  const ratio = Number(ratioScaled) / 1e18;
43253
- const apr = (ratio - 1) * (YEAR_SECONDS8 / windowSeconds);
44384
+ const apr = (ratio - 1) * (YEAR_SECONDS10 / windowSeconds);
43254
44385
  return {
43255
44386
  apr,
43256
44387
  sharePriceNow: now.p,