@1delta/margin-fetcher 5.0.13 → 5.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
- import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, stringToHex, pad, encodeFunctionData, formatUnits, isAddress, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-YILYOOYB.js';
1
+ import { parseAbi, keccak256, encodeAbiParameters, formatEther, BaseError, erc20Abi, stringToHex, isAddress, pad, encodeFunctionData, formatUnits, getAddress, decodeFunctionResult, decodeAbiParameters, concat, AbiEncodingLengthMismatchError, concatHex, toBytes, slice, hexToString, InvalidAddressError, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-YILYOOYB.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isUsdd, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, isCurvance, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
4
+ import { Lender, isExactly, isMidnight, isTerm, isTermMax, isTeller, isListaDao, isLiquityFamily, isRiver, isInverse, isDssType, isCompoundV3Type, isFluid, isGearboxV3, isLlamaLend, isFrankencoin, isResupply, isCurvance, LIQUITY_FAMILY_LENDERS, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3Type, isDolomite, hasCrossMarginRisk, isEulerType, isAaveV4Type, isInit, isMorphoType, isCompoundV2Type, isVenusType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isUsdd, isSky, isYLDR, isLista, hasSubAccounts, isTectonicType, isKineticType, isBenqiType } from '@1delta/lender-registry';
5
5
  export { hasCrossMarginRisk, isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
- import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, llamaLendLendersByChain, usddLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, usddConfigFor, usddChainData, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
6
+ import { fetchTokenLists, fetchTokenList, aavePools, compoundV3Pools, initConfig, morphoPools, compoundV2Pools, eulerVaults, siloMarkets, siloV2LenderKey, siloMarketsV3, siloV3LenderKey, aaveV4Spokes, aaveV4SpokeLenderKey, fluidResolvers, gearboxResolvers, dolomiteConfigs, midnightConfig, termConfig, termMarketsByChain, exactlyConfig, liquityLendersByChain, riverLendersByChain, inverseLendersByChain, llamaLendLendersByChain, usddLendersByChain, skyLendersByChain, frankencoinLendersByChain, resupplyLendersByChain, curvanceLendersByChain, tellerConfigByChain, tellerPoolsByChain, termMaxConfigByChain, aaveReserves, compoundV3Reserves, liquityConfigFor, liquityBranchesByChain, riverConfigFor, riverChainData, termMaxApiBaseUrl, termMaxLenderKey, inverseConfigFor, inverseChainData, llamaLendConfigFor, llamaLendChainData, llamaLendApiBaseUrl, resupplyConfigFor, dssConfigFor, dssChainData, dssDebtToken, dssDebtJoin, frankencoinConfigFor, frankencoinChainData, aaveOracles, morphoTypeMarkets, resolveMidnightApiBase, resolveTermApiBase, llamaLendMarketByVault, getSiloV2MarketEntry, getSiloV3MarketEntry, dolomiteEmode, curvanceConfigFor, aaveTokens, morphoTypeVaults, eulerConfigs, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxV3LenderKey, midnightMarketsByChain, parseAaveV4SpokeLenderKey, gearboxAccountCompressor, compoundV2Tokens, exactlyMarketsByChain, aaveOraclesConfig, compoundV2Oracles, compoundV2TokenArray, compoundV2OraclesConfig, compoundV3OraclesData, compoundV3BaseData, compoundV2Reserves, aaveV4Oracles } from '@1delta/data-sdk';
7
7
  import lodash from 'lodash';
8
8
  import { Chain } from '@1delta/chain-registry';
9
9
  import { multicallRetryUniversal, getEvmClient, getEvmChain, getEvmClientUniversal } from '@1delta/providers';
10
- import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, ResupplyUtilitiesAbi, ResupplyRewardHandlerAbi, ResupplyPairEmissionsAbi, ConvexPoolUtilAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, CurvanceMarketManagerAbi, CurvanceCTokenAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, CurvanceProtocolReaderAbi, CurvanceCentralRegistryAbi, TermPriceConsumerAbi, CurvanceOracleManagerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
10
+ import { LiquityTroveManagerAbi, LiquityActivePoolAbi, LiquityStabilityPoolAbi, LiquityPriceFeedAbi, LiquitySortedTrovesAbi, RiverTroveManagerAbi, RiverStabilityPoolAbi, TellerMarketRegistryAbi, TellerV2Abi, InverseMarketAbi, InverseOracleAbi, InverseDbrAbi, Erc20Abi, LlamaLendControllerAbi, LlamaLendControllerV1Abi, LlamaLendControllerV2Abi, LlamaLendVaultAbi, LlamaLendAmmAbi, MetaMorphoAbi, ExactlyPreviewerAbi, ExactlyAuditorAbi, LenderCommitmentGroupAbi, ResupplyRegistryAbi, ResupplyPairAbi, ResupplyUtilitiesAbi, ResupplyRewardHandlerAbi, ResupplyPairEmissionsAbi, ConvexPoolUtilAbi, FrankencoinPositionAbi, FluidLendingResolverAbi, FluidVaultResolverAbi, FluidLiquidityResolverAbi, MoolahVaultAbi, UsddVatAbi, UsddJugAbi, UsddSpotAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, DolomiteMarginAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, MidnightAbi, TermRepoTokenAbi, TermRepoServicerAbi, TermRepoCollateralManagerAbi, LiquityTroveNFTAbi, LiquityCollSurplusPoolAbi, TellerCollateralManagerAbi, TermMaxViewerAbi, InverseEscrowAbi, CurvanceMarketManagerAbi, CurvanceCTokenAbi, GearboxCreditAccountCompressorV310Abi, UsddCdpManagerAbi, UsddProxyRegistryAbi, CurvanceProtocolReaderAbi, CurvanceCentralRegistryAbi, TermPriceConsumerAbi, CurvanceOracleManagerAbi, TermMaxOracleAggregatorV2Abi } from '@1delta/abis';
11
11
  export { MorphoLensAbi } from '@1delta/abis';
12
12
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, bandLtvCurve, InitMarginAddresses, getLstAcceptedInputs } from '@1delta/calldata-sdk';
13
13
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
@@ -6424,6 +6424,9 @@ var getLendersForChain = (c) => {
6424
6424
  for (const l of usddLendersByChain(c)) {
6425
6425
  lenders.push(l);
6426
6426
  }
6427
+ for (const l of skyLendersByChain(c)) {
6428
+ lenders.push(l);
6429
+ }
6427
6430
  for (const l of frankencoinLendersByChain(c)) {
6428
6431
  lenders.push(l);
6429
6432
  }
@@ -6454,7 +6457,7 @@ var filterLendersByProtocol = (allLenders, protocolList) => {
6454
6457
  (b) => protocolList.includes(b)
6455
6458
  );
6456
6459
  return allLenders.filter(
6457
- (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") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER") || protocolList.includes(Lender.USDD) && lender?.startsWith("USDD") || protocolList.includes(Lender.FRANKENCOIN) && lender?.startsWith("FRANKENCOIN")
6460
+ (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") || liquityBases.some((b) => lender?.startsWith(b)) || protocolList.includes(Lender.RIVER) && lender?.startsWith("RIVER") || protocolList.includes(Lender.TELLER) && lender?.startsWith("TELLER") || protocolList.includes(Lender.USDD) && lender?.startsWith("USDD") || protocolList.includes(Lender.SKY) && lender?.startsWith("SKY") || protocolList.includes(Lender.FRANKENCOIN) && lender?.startsWith("FRANKENCOIN")
6458
6461
  );
6459
6462
  };
6460
6463
  var getAavesForChain = () => {
@@ -21885,7 +21888,7 @@ async function fetchTellerMarkets(chainId) {
21885
21888
  } catch {
21886
21889
  return { chainId, pools: [] };
21887
21890
  }
21888
- const big15 = (i) => {
21891
+ const big16 = (i) => {
21889
21892
  const r = results[i];
21890
21893
  if (typeof r === "bigint") return r;
21891
21894
  if (typeof r === "number") return BigInt(r);
@@ -21899,20 +21902,20 @@ async function fetchTellerMarkets(chainId) {
21899
21902
  return null;
21900
21903
  };
21901
21904
  const num12 = (i) => {
21902
- const b = big15(i);
21905
+ const b = big16(i);
21903
21906
  return b === null ? null : Number(b);
21904
21907
  };
21905
21908
  const pool0 = pools.map((config, i) => {
21906
21909
  const base = i * READS_PER_POOL;
21907
21910
  return {
21908
21911
  config,
21909
- available: big15(base),
21910
- committed: big15(base + 1),
21912
+ available: big16(base),
21913
+ committed: big16(base + 1),
21911
21914
  minRateBps: num12(base + 2),
21912
- collateralPerPrincipal: big15(base + 3),
21915
+ collateralPerPrincipal: big16(base + 3),
21913
21916
  maxLoanDuration: num12(base + 4),
21914
- marketId: big15(base + 5),
21915
- totalAssets: big15(base + 6)
21917
+ marketId: big16(base + 5),
21918
+ totalAssets: big16(base + 6)
21916
21919
  };
21917
21920
  });
21918
21921
  const attByMarket = /* @__PURE__ */ new Map();
@@ -24352,6 +24355,23 @@ function convertLlamaLendMarketsToResponse(raw, chainId, prices = {}, additional
24352
24355
  // --- LlamaLend descriptor (consumed by the calldata builders,
24353
24356
  // the leverage sizer and worker-api resolvers) ---
24354
24357
  llamalend: {
24358
+ /**
24359
+ * The market's LLAMMA, and the ONLY readable oracle for it:
24360
+ * `price_oracle()` lives here, quoted in the BORROWED token.
24361
+ *
24362
+ * Carried on the descriptor — not only under `addresses` — because
24363
+ * this object is what consumers persist verbatim (yield-tracer
24364
+ * serialises it into the `llamalend` column of the shared isolated-
24365
+ * market table) and the oracle-price path resolves the AMM from it.
24366
+ * Omitting it does not fail loudly: the reader finds `undefined`,
24367
+ * skips the market, and the lender ends up with NO prices at all
24368
+ * while every row still looks present and correct.
24369
+ *
24370
+ * Do not "clean this up" as a duplicate of `addresses.amm` — the two
24371
+ * are read by different consumers, and only this one survives into
24372
+ * the descriptor column.
24373
+ */
24374
+ amm: market.amm,
24355
24375
  /** 1 = `oneway` (v1), 2 = `oneway-v2`. Branch every encoder on this. */
24356
24376
  version: market.version,
24357
24377
  /** FAIL CLOSED — an unknown market is not delegatable. */
@@ -25002,72 +25022,90 @@ function resolvePositionManagers(cfg, marketManager) {
25002
25022
  }
25003
25023
  return void 0;
25004
25024
  }
25005
- var READS_PER_ILK = 4;
25006
- var USDD_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi, erc20Abi];
25007
- var usddIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
25008
- async function fetchUsddMarkets(lender, chainId) {
25009
- const config = usddConfigFor(lender, chainId);
25010
- const chainData = usddChainData(lender, chainId);
25025
+ var CORE_READS_PER_ILK = 3;
25026
+ var DSS_CORE_ABI_PER_READ = [UsddVatAbi, UsddJugAbi, UsddSpotAbi];
25027
+ var dssIlkBytes32 = (ilk) => stringToHex(ilk, { size: 32 });
25028
+ async function fetchDssMarkets(lender, chainId) {
25029
+ const config = dssConfigFor(lender, chainId);
25030
+ const chainData = dssChainData(lender, chainId);
25011
25031
  const markets = chainData?.markets ?? [];
25012
25032
  if (!config || markets.length === 0) {
25013
25033
  return { lender, config, chainData, markets: [] };
25014
25034
  }
25015
- const calls = markets.flatMap((m) => {
25016
- const ilk32 = usddIlkBytes32(m.ilk);
25017
- return [
25035
+ const calls = [];
25036
+ const abi = [];
25037
+ const joinReadIndex = [];
25038
+ for (const m of markets) {
25039
+ const ilk32 = dssIlkBytes32(m.ilk);
25040
+ calls.push(
25018
25041
  { address: config.vat, name: "ilks", params: [ilk32] },
25019
25042
  { address: config.jug, name: "ilks", params: [ilk32] },
25020
- { address: config.spot, name: "ilks", params: [ilk32] },
25021
- { address: m.collToken, name: "balanceOf", params: [m.gemJoin] }
25022
- ];
25023
- });
25043
+ { address: config.spot, name: "ilks", params: [ilk32] }
25044
+ );
25045
+ abi.push(...DSS_CORE_ABI_PER_READ);
25046
+ if (isAddress(m.gemJoin ?? "", { strict: false })) {
25047
+ joinReadIndex.push(calls.length);
25048
+ calls.push({
25049
+ address: m.collToken,
25050
+ name: "balanceOf",
25051
+ params: [m.gemJoin]
25052
+ });
25053
+ abi.push(erc20Abi);
25054
+ } else {
25055
+ joinReadIndex.push(-1);
25056
+ }
25057
+ }
25024
25058
  let results = [];
25025
25059
  try {
25026
25060
  results = await multicallRetryUniversal({
25027
25061
  chain: chainId,
25028
25062
  calls,
25029
- abi: markets.flatMap(() => USDD_ABI_PER_READ),
25063
+ abi,
25030
25064
  allowFailure: true
25031
25065
  });
25032
25066
  } catch {
25033
25067
  return { lender, config, chainData, markets: [] };
25034
25068
  }
25035
- const big15 = (v) => {
25069
+ const big16 = (v) => {
25036
25070
  if (typeof v === "bigint") return v;
25037
25071
  if (typeof v === "number") return BigInt(v);
25038
25072
  return null;
25039
25073
  };
25040
- const field12 = (res, name, idx) => big15(res?.[name] ?? res?.[idx]);
25074
+ const field13 = (res, name, idx) => big16(res?.[name] ?? res?.[idx]);
25075
+ let cursor = 0;
25041
25076
  const out = markets.map((market, i) => {
25042
- const base = i * READS_PER_ILK;
25077
+ const base = cursor;
25078
+ cursor += CORE_READS_PER_ILK + (joinReadIndex[i] >= 0 ? 1 : 0);
25043
25079
  const vatIlk = results[base];
25044
25080
  const jugIlk = results[base + 1];
25045
25081
  const spotIlk = results[base + 2];
25046
25082
  return {
25047
25083
  market,
25048
- Art: field12(vatIlk, "Art", 0),
25049
- rate: field12(vatIlk, "rate", 1),
25050
- spot: field12(vatIlk, "spot", 2),
25051
- line: field12(vatIlk, "line", 3),
25052
- dust: field12(vatIlk, "dust", 4),
25053
- duty: field12(jugIlk, "duty", 0),
25054
- mat: field12(spotIlk, "mat", 1),
25055
- joinBalance: big15(results[base + 3])
25084
+ Art: field13(vatIlk, "Art", 0),
25085
+ rate: field13(vatIlk, "rate", 1),
25086
+ spot: field13(vatIlk, "spot", 2),
25087
+ line: field13(vatIlk, "line", 3),
25088
+ dust: field13(vatIlk, "dust", 4),
25089
+ duty: field13(jugIlk, "duty", 0),
25090
+ mat: field13(spotIlk, "mat", 1),
25091
+ joinBalance: joinReadIndex[i] >= 0 ? big16(results[joinReadIndex[i]]) : null
25056
25092
  };
25057
25093
  });
25058
25094
  return { lender, config, chainData, markets: out };
25059
25095
  }
25060
-
25061
- // src/lending/public-data/usdd/convertPublic.ts
25062
- function usddLenderKey(lender, chainId, ilk) {
25096
+ var fetchUsddMarkets = fetchDssMarkets;
25097
+ var usddIlkBytes32 = dssIlkBytes32;
25098
+ function dssLenderKey(lender, chainId, ilk) {
25063
25099
  return `${lender}_${chainId}_${ilk}`;
25064
25100
  }
25065
- function usddKeyParts(key2) {
25066
- if (!key2.startsWith("USDD_")) return void 0;
25067
- const suffix = key2.slice("USDD_".length);
25068
- const m = suffix.match(/^(\d+)_([A-Z0-9][A-Z0-9-]*)$/);
25101
+ var DSS_KEY_PREFIXES = ["USDD", "SKY"];
25102
+ var DSS_KEY_RE = new RegExp(
25103
+ `^(${DSS_KEY_PREFIXES.join("|")})_(\\d+)_([A-Z0-9][A-Z0-9-]*)$`
25104
+ );
25105
+ function dssKeyParts(key2) {
25106
+ const m = key2.match(DSS_KEY_RE);
25069
25107
  if (!m) return void 0;
25070
- return { lender: "USDD", chainId: m[1], ilk: m[2] };
25108
+ return { lender: m[1], chainId: m[2], ilk: m[3] };
25071
25109
  }
25072
25110
  var WAD9 = 1e18;
25073
25111
  var RAY4 = 1e27;
@@ -25080,7 +25118,7 @@ function currencyFor12(address, decimals, symbol, tokens) {
25080
25118
  const lower3 = address.toLowerCase();
25081
25119
  return tokens[lower3] ?? { address: lower3, symbol, name: symbol, decimals };
25082
25120
  }
25083
- function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
25121
+ function convertDssMarketsToResponse(raw, chainId, prices = {}, _additionalYields = {
25084
25122
  intrinsicYields: {},
25085
25123
  lenderRewards: {},
25086
25124
  loaded: true
@@ -25089,15 +25127,18 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
25089
25127
  const cfg = raw?.config;
25090
25128
  const chainData = raw?.chainData;
25091
25129
  if (!cfg || !chainData) return out;
25092
- const debtAddr = cfg.usdd.toLowerCase();
25130
+ const rawDebtAddr = dssDebtToken(cfg);
25131
+ if (!rawDebtAddr) return out;
25132
+ const debtAddr = rawDebtAddr.toLowerCase();
25133
+ const debtJoin = dssDebtJoin(cfg);
25093
25134
  const debtDecimals = cfg.debtDecimals ?? 18;
25094
25135
  const debtToken = tokens[debtAddr];
25095
- const debtSymbol = debtToken?.symbol ?? "USDD";
25136
+ const debtSymbol = debtToken?.symbol ?? cfg.debtSymbol ?? "USDD";
25096
25137
  const debtPriceKey = toOracleKey(debtToken?.assetGroup) || toGenericPriceKey(debtAddr, chainId);
25097
25138
  const debtPrice = prices[debtPriceKey] || 1;
25098
25139
  for (const m of raw.markets ?? []) {
25099
25140
  const market = m.market;
25100
- const lenderKey = usddLenderKey(raw.lender, chainId, market.ilk);
25141
+ const lenderKey = dssLenderKey(raw.lender, chainId, market.ilk);
25101
25142
  const collAddr = market.collToken.toLowerCase();
25102
25143
  const collDecimals = market.collDecimals;
25103
25144
  const collToken = tokens[collAddr];
@@ -25116,13 +25157,14 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
25116
25157
  const borrowApr = duty > BigInt(1e27) ? Number(duty - BigInt(10) ** BigInt(27)) / RAY4 * YEAR_SECONDS2 * 100 : 0;
25117
25158
  const line = m.line !== null ? Number(m.line) / RAD : 0;
25118
25159
  let borrowLiquidity = Math.max(0, line - totalDebt);
25119
- const halted = line === 0;
25160
+ const offboarded = market.offboarded === true;
25161
+ const halted = line === 0 || offboarded;
25120
25162
  const entry = { data: {} };
25121
25163
  const collUid = createMarketUid(chainId, lenderKey, collAddr);
25122
25164
  entry.data[collUid] = {
25123
25165
  marketUid: collUid,
25124
25166
  name: "Collateral " + collSymbol,
25125
- poolId: market.gemJoin.toLowerCase(),
25167
+ poolId: market.gemJoin?.toLowerCase(),
25126
25168
  underlying: collAddr,
25127
25169
  asset: currencyFor12(collAddr, collDecimals, collSymbol, tokens),
25128
25170
  totalDeposits: totalColl,
@@ -25180,7 +25222,8 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
25180
25222
  totalDebtStableUSD: 0,
25181
25223
  totalDebtUSD: totalDebt * debtPrice,
25182
25224
  utilization: 0,
25183
- // The earn side is sUSDD (savings provider), not a lending deposit.
25225
+ // The earn side is the savings token (savings provider), not a lending
25226
+ // deposit.
25184
25227
  depositRate: 0,
25185
25228
  variableBorrowRate: borrowApr,
25186
25229
  stableBorrowRate: 0,
@@ -25210,6 +25253,38 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
25210
25253
  isActive: !halted,
25211
25254
  isFrozen: halted
25212
25255
  };
25256
+ const descriptor = {
25257
+ ilk: market.ilk,
25258
+ /** Per-second stability fee (ray string) — live, metadata fallback. */
25259
+ duty: duty.toString(),
25260
+ /** Liquidation ratio (ray string). */
25261
+ mat: m.mat !== null ? m.mat.toString() : market.mat,
25262
+ /** Liquidation penalty multiplier (wad string, Dog.chop). */
25263
+ chop: market.chop,
25264
+ /** Ilk debt ceiling / per-CDP floor (rad strings). */
25265
+ line: m.line !== null ? m.line.toString() : market.line,
25266
+ dust: m.dust !== null ? m.dust.toString() : market.dust,
25267
+ /** Debt accumulator (ray string) — art × rate = debt. */
25268
+ rate: m.rate !== null ? m.rate.toString() : void 0,
25269
+ /** Governance has retired the ilk: no new debt, exits only. */
25270
+ offboarded,
25271
+ addresses: {
25272
+ vat: cfg.vat,
25273
+ jug: cfg.jug,
25274
+ spot: cfg.spot,
25275
+ dog: cfg.dog,
25276
+ cdpManager: cfg.cdpManager,
25277
+ proxyActions: cfg.proxyActions,
25278
+ proxyRegistry: cfg.proxyRegistry,
25279
+ /** DaiJoin-equivalent — the debt enter/exit adapter. */
25280
+ debtJoin,
25281
+ /** @deprecated brand-specific alias of `debtJoin`. */
25282
+ usddJoin: debtJoin,
25283
+ gemJoin: market.gemJoin,
25284
+ clip: market.clip,
25285
+ pip: market.pip
25286
+ }
25287
+ };
25213
25288
  entry.params = {
25214
25289
  market: {
25215
25290
  lender: lenderKey,
@@ -25218,41 +25293,16 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
25218
25293
  collateralDecimals: collDecimals,
25219
25294
  // The gem join doubles as the market id (marketUid address) — one
25220
25295
  // adapter per ilk, like River's TroveManager.
25221
- id: market.gemJoin.toLowerCase(),
25296
+ id: market.gemJoin?.toLowerCase(),
25222
25297
  lltv: m.mat !== null ? m.mat.toString() : market.mat,
25223
25298
  oracle: market.pip ?? zeroAddress,
25224
25299
  irm: zeroAddress,
25225
25300
  collateralAddress: collAddr,
25226
25301
  loanAddress: debtAddr,
25227
- // --- USDD descriptor (metadata + live snapshot; consumed by the
25228
- // calldata builders + worker-api resolvers) ---
25229
- usdd: {
25230
- ilk: market.ilk,
25231
- /** Per-second stability fee (ray string) — live, metadata fallback. */
25232
- duty: duty.toString(),
25233
- /** Liquidation ratio (ray string). */
25234
- mat: m.mat !== null ? m.mat.toString() : market.mat,
25235
- /** Liquidation penalty multiplier (wad string, Dog.chop). */
25236
- chop: market.chop,
25237
- /** Ilk debt ceiling / per-CDP floor (rad strings). */
25238
- line: m.line !== null ? m.line.toString() : market.line,
25239
- dust: m.dust !== null ? m.dust.toString() : market.dust,
25240
- /** Debt accumulator (ray string) — art × rate = debt. */
25241
- rate: m.rate !== null ? m.rate.toString() : void 0,
25242
- addresses: {
25243
- vat: cfg.vat,
25244
- jug: cfg.jug,
25245
- spot: cfg.spot,
25246
- dog: cfg.dog,
25247
- cdpManager: cfg.cdpManager,
25248
- proxyActions: cfg.proxyActions,
25249
- proxyRegistry: cfg.proxyRegistry,
25250
- usddJoin: cfg.usddJoin,
25251
- gemJoin: market.gemJoin,
25252
- clip: market.clip,
25253
- pip: market.pip
25254
- }
25255
- }
25302
+ dss: descriptor,
25303
+ // Back-compat duplicate: worker-api + the term-sheet input list read
25304
+ // `market.usdd`. Same object, so the two can never drift.
25305
+ usdd: descriptor
25256
25306
  }
25257
25307
  };
25258
25308
  entry.chainId = chainId;
@@ -25260,6 +25310,9 @@ function convertUsddMarketsToResponse(raw, chainId, prices = {}, _additionalYiel
25260
25310
  }
25261
25311
  return out;
25262
25312
  }
25313
+ var convertUsddMarketsToResponse = convertDssMarketsToResponse;
25314
+ var usddLenderKey = dssLenderKey;
25315
+ var usddKeyParts = dssKeyParts;
25263
25316
  var READS_PER_MARKET3 = 10;
25264
25317
  var FRANKENCOIN_ABI_PER_READ = [
25265
25318
  FrankencoinPositionAbi,
@@ -25307,26 +25360,26 @@ async function fetchFrankencoinMarkets(lender, chainId) {
25307
25360
  } catch {
25308
25361
  return { lender, config, chainData, markets: [] };
25309
25362
  }
25310
- const big15 = (v) => {
25363
+ const big16 = (v) => {
25311
25364
  if (typeof v === "bigint") return v;
25312
25365
  if (typeof v === "number") return BigInt(v);
25313
25366
  return null;
25314
25367
  };
25315
25368
  const out = markets.map((market, i) => {
25316
25369
  const base = i * READS_PER_MARKET3;
25317
- const expiration = big15(results[base + 7]);
25370
+ const expiration = big16(results[base + 7]);
25318
25371
  return {
25319
25372
  market,
25320
- price: big15(results[base]),
25321
- minted: big15(results[base + 1]),
25322
- availableForClones: big15(results[base + 2]),
25323
- annualInterestPPM: big15(results[base + 3]),
25324
- currentFeePPM: big15(results[base + 4]),
25325
- reserveContribution: big15(results[base + 5]),
25326
- challengedAmount: big15(results[base + 6]),
25373
+ price: big16(results[base]),
25374
+ minted: big16(results[base + 1]),
25375
+ availableForClones: big16(results[base + 2]),
25376
+ annualInterestPPM: big16(results[base + 3]),
25377
+ currentFeePPM: big16(results[base + 4]),
25378
+ reserveContribution: big16(results[base + 5]),
25379
+ challengedAmount: big16(results[base + 6]),
25327
25380
  expiration,
25328
25381
  isClosed: typeof results[base + 8] === "boolean" ? results[base + 8] : null,
25329
- collateralBalance: big15(results[base + 9])
25382
+ collateralBalance: big16(results[base + 9])
25330
25383
  };
25331
25384
  });
25332
25385
  return { lender, config, chainData, markets: out };
@@ -26171,7 +26224,7 @@ async function getLenderDataFromApi(lender, chainId, prices, additionalYields, i
26171
26224
  if (isResupply(lender)) return await fetchResupplyMarkets(lender, chainId);
26172
26225
  if (isCurvance(lender)) return await fetchCurvanceMarkets(lender, chainId);
26173
26226
  if (isTermMax(lender)) return await fetchTermMaxMarkets(chainId);
26174
- if (isUsdd(lender)) return await fetchUsddMarkets(lender, chainId);
26227
+ if (isDssType(lender)) return await fetchDssMarkets(lender, chainId);
26175
26228
  if (isFrankencoin(lender))
26176
26229
  return await fetchFrankencoinMarkets(lender, chainId);
26177
26230
  return {};
@@ -26267,8 +26320,8 @@ function convertLenderDataFromApi(lender, chainId, data, prices, additionalYield
26267
26320
  additionalYields,
26268
26321
  list
26269
26322
  );
26270
- if (isUsdd(lender))
26271
- return convertUsddMarketsToResponse(
26323
+ if (isDssType(lender))
26324
+ return convertDssMarketsToResponse(
26272
26325
  data,
26273
26326
  chainId,
26274
26327
  prices,
@@ -26486,7 +26539,7 @@ function lenderApiOnly(lender, chainId) {
26486
26539
  if (isTermMax(lender)) return true;
26487
26540
  if (isResupply(lender)) return true;
26488
26541
  if (isCurvance(lender)) return true;
26489
- if (isUsdd(lender)) return true;
26542
+ if (isDssType(lender)) return true;
26490
26543
  if (isFrankencoin(lender)) return true;
26491
26544
  if (isLlamaLend(lender)) return true;
26492
26545
  return false;
@@ -28166,13 +28219,13 @@ var buildCurvanceUserCall = async (chainId, lender, account) => {
28166
28219
  ])
28167
28220
  ]);
28168
28221
  };
28169
- var USDD_CALLS_PER_CDP = 1;
28222
+ var DSS_CALLS_PER_CDP = 1;
28170
28223
  var MAX_CDP_WALK = 64;
28171
28224
  var CACHE_TTL_MS2 = 5 * 6e4;
28172
28225
  var discoveryCache4 = /* @__PURE__ */ new Map();
28173
- var cacheKey2 = (chainId, account) => `${chainId}:${account.toLowerCase()}`;
28174
- var getCachedUsddCdps = (chainId, account) => {
28175
- const hit = discoveryCache4.get(cacheKey2(chainId, account));
28226
+ var cacheKey2 = (lender, chainId, account) => `${lender}:${chainId}:${account.toLowerCase()}`;
28227
+ var getCachedDssCdps = (lender, chainId, account) => {
28228
+ const hit = discoveryCache4.get(cacheKey2(lender, chainId, account));
28176
28229
  if (!hit || Date.now() - hit.at > CACHE_TTL_MS2) return void 0;
28177
28230
  return hit;
28178
28231
  };
@@ -28185,10 +28238,10 @@ var big3 = (v) => {
28185
28238
  return 0n;
28186
28239
  };
28187
28240
  var field6 = (res, name, idx) => res?.[name] ?? res?.[idx];
28188
- var buildUsddUserCall = async (chainId, lender, account) => {
28189
- const cfg = usddConfigFor(lender, chainId);
28190
- const markets = usddChainData(lender, chainId)?.markets ?? [];
28191
- const stash = (d) => discoveryCache4.set(cacheKey2(chainId, account), d);
28241
+ var buildDssUserCall = async (chainId, lender, account) => {
28242
+ const cfg = dssConfigFor(lender, chainId);
28243
+ const markets = dssChainData(lender, chainId)?.markets ?? [];
28244
+ const stash = (d) => discoveryCache4.set(cacheKey2(lender, chainId, account), d);
28192
28245
  if (!cfg || markets.length === 0) {
28193
28246
  stash({ cdps: [], ilks: [], at: Date.now() });
28194
28247
  return [];
@@ -28238,7 +28291,7 @@ var buildUsddUserCall = async (chainId, lender, account) => {
28238
28291
  );
28239
28292
  if (head.count > BigInt(MAX_CDP_WALK)) {
28240
28293
  console.warn(
28241
- `USDD: owner ${head.owner} holds ${head.count} CDPs on chain ${chainId} \u2014 truncating discovery at ${MAX_CDP_WALK}`
28294
+ `${lender}: owner ${head.owner} holds ${head.count} CDPs on chain ${chainId} \u2014 truncating discovery at ${MAX_CDP_WALK}`
28242
28295
  );
28243
28296
  }
28244
28297
  for (let i = 0; i < steps && cursor !== 0n; i++) {
@@ -28272,13 +28325,13 @@ var buildUsddUserCall = async (chainId, lender, account) => {
28272
28325
  const calls = cdps.map((c) => ({
28273
28326
  address: cfg.vat,
28274
28327
  name: "urns",
28275
- params: [usddIlkBytes32(c.ilk), c.urn]
28328
+ params: [dssIlkBytes32(c.ilk), c.urn]
28276
28329
  }));
28277
28330
  for (const ilk of ilks) {
28278
28331
  calls.push({
28279
28332
  address: cfg.vat,
28280
28333
  name: "ilks",
28281
- params: [usddIlkBytes32(ilk)]
28334
+ params: [dssIlkBytes32(ilk)]
28282
28335
  });
28283
28336
  }
28284
28337
  return calls;
@@ -28513,7 +28566,7 @@ async function buildUserCall(chainId, lender, account, params, getClient) {
28513
28566
  return buildLlamaLendUserCall(chainId, lender, account);
28514
28567
  if (isResupply(lender)) return buildResupplyUserCall(chainId, lender, account);
28515
28568
  if (isCurvance(lender)) return buildCurvanceUserCall(chainId, lender, account);
28516
- if (isUsdd(lender)) return buildUsddUserCall(chainId, lender, account);
28569
+ if (isDssType(lender)) return buildDssUserCall(chainId, lender, account);
28517
28570
  if (isFrankencoin(lender))
28518
28571
  return buildFrankencoinUserCall(chainId, lender, account);
28519
28572
  if (isCompoundV3Type(lender))
@@ -28552,12 +28605,13 @@ function organizeUserQueries(queries) {
28552
28605
  const teller = queries.filter((q) => isTeller(q.lender));
28553
28606
  const termMax = queries.filter((q) => isTermMax(q.lender));
28554
28607
  const usdd = queries.filter((q) => isUsdd(q.lender));
28608
+ const sky = queries.filter((q) => isSky(q.lender));
28555
28609
  const llamaLend = queries.filter((q) => isLlamaLend(q.lender));
28556
28610
  const frankencoin = queries.filter((q) => isFrankencoin(q.lender));
28557
- if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0 && frankencoin.length === 0 && llamaLend.length === 0)
28611
+ if (morphos.length === 0 && gearbox.length === 0 && midnight.length === 0 && term.length === 0 && exactly.length === 0 && liquity.length === 0 && river.length === 0 && teller.length === 0 && termMax.length === 0 && usdd.length === 0 && sky.length === 0 && frankencoin.length === 0 && llamaLend.length === 0)
28558
28612
  return queries;
28559
28613
  const others = queries.filter(
28560
- (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isUsdd(q.lender) && !isFrankencoin(q.lender) && !isLlamaLend(q.lender)
28614
+ (q) => !isMorphoType(q.lender) && !isGearboxV3(q.lender) && !isMidnight(q.lender) && !isTerm(q.lender) && !isExactly(q.lender) && !isLiquityFamily(q.lender) && !isRiver(q.lender) && !isTeller(q.lender) && !isTermMax(q.lender) && !isDssType(q.lender) && !isFrankencoin(q.lender) && !isLlamaLend(q.lender)
28561
28615
  );
28562
28616
  const morphoBlue = morphos.filter((q) => q.lender.startsWith("MORPHO_BLUE"));
28563
28617
  const moolah = morphos.filter((q) => q.lender.startsWith("LISTA_DAO"));
@@ -28634,6 +28688,14 @@ function organizeUserQueries(queries) {
28634
28688
  assets: void 0
28635
28689
  });
28636
28690
  }
28691
+ if (sky.length > 0) {
28692
+ result.push({
28693
+ lender: Lender.SKY,
28694
+ account: sky[0].account,
28695
+ params: sky.map((p) => p.lender),
28696
+ assets: void 0
28697
+ });
28698
+ }
28637
28699
  if (llamaLend.length > 0) {
28638
28700
  result.push({
28639
28701
  lender: Lender.LLAMALEND,
@@ -32173,27 +32235,29 @@ var big10 = (v) => {
32173
32235
  return 0n;
32174
32236
  };
32175
32237
  var field9 = (res, name, idx) => big10(res?.[name] ?? res?.[idx]);
32176
- var getUsddUserDataConverter = (lender, chainId, account, meta) => {
32177
- const cfg = usddConfigFor(lender, chainId);
32178
- const markets = usddChainData(lender, chainId)?.markets ?? [];
32179
- const discovery = getCachedUsddCdps(chainId, account);
32238
+ var getDssUserDataConverter = (lender, chainId, account, meta) => {
32239
+ const cfg = dssConfigFor(lender, chainId);
32240
+ const markets = dssChainData(lender, chainId)?.markets ?? [];
32241
+ const discovery = getCachedDssCdps(lender, chainId, account);
32180
32242
  const cdps = discovery?.cdps ?? [];
32181
32243
  const ilks = discovery?.ilks ?? [];
32182
- const expected = cfg && markets.length > 0 && cdps.length > 0 ? cdps.length * USDD_CALLS_PER_CDP + ilks.length : 0;
32244
+ const expected = cfg && markets.length > 0 && cdps.length > 0 ? cdps.length * DSS_CALLS_PER_CDP + ilks.length : 0;
32183
32245
  return [
32184
32246
  (data) => {
32185
32247
  if (!cfg || expected === 0) return void 0;
32186
32248
  if (!data || data.length < expected) return void 0;
32187
- const debtAddr = cfg.usdd.toLowerCase();
32249
+ const rawDebtAddr = dssDebtToken(cfg);
32250
+ if (!rawDebtAddr) return void 0;
32251
+ const debtAddr = rawDebtAddr.toLowerCase();
32188
32252
  const debtDecimals = cfg.debtDecimals ?? 18;
32189
32253
  const rateByIlk = /* @__PURE__ */ new Map();
32190
32254
  ilks.forEach((ilk, i) => {
32191
- const res = data[cdps.length * USDD_CALLS_PER_CDP + i];
32255
+ const res = data[cdps.length * DSS_CALLS_PER_CDP + i];
32192
32256
  if (!isFailedCall(res)) rateByIlk.set(ilk, field9(res, "rate", 1));
32193
32257
  });
32194
32258
  const perMarket = /* @__PURE__ */ new Map();
32195
32259
  cdps.forEach((cdp, i) => {
32196
- const res = data[i * USDD_CALLS_PER_CDP];
32260
+ const res = data[i * DSS_CALLS_PER_CDP];
32197
32261
  if (isFailedCall(res)) return;
32198
32262
  const ink = field9(res, "ink", 0);
32199
32263
  const art = field9(res, "art", 1);
@@ -32202,7 +32266,7 @@ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
32202
32266
  if (ink === 0n && debt === 0n) return;
32203
32267
  const market = markets.find((m) => m.ilk === cdp.ilk);
32204
32268
  if (!market) return;
32205
- const key2 = usddLenderKey(lender, chainId, cdp.ilk);
32269
+ const key2 = dssLenderKey(lender, chainId, cdp.ilk);
32206
32270
  if (!perMarket.has(key2)) perMarket.set(key2, { market, positions: [] });
32207
32271
  perMarket.get(key2).positions.push({ cdp, ink, debt });
32208
32272
  });
@@ -32230,7 +32294,7 @@ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
32230
32294
  const collNum = Number(collStr);
32231
32295
  const debtStr = parseRawAmount(debt.toString(), debtDecimals);
32232
32296
  const debtNum = Number(debtStr);
32233
- const usddInfo = { ...cdp };
32297
+ const dssInfo = { ...cdp };
32234
32298
  lendingPositions[cdp.cdpId] = {
32235
32299
  [collUid]: {
32236
32300
  marketUid: collUid,
@@ -32263,7 +32327,7 @@ var getUsddUserDataConverter = (lender, chainId, account, meta) => {
32263
32327
  stableBorrowRate: "0",
32264
32328
  collateralEnabled: false,
32265
32329
  claimableRewards: 0,
32266
- usddInfo
32330
+ dssInfo
32267
32331
  }
32268
32332
  };
32269
32333
  modes[cdp.cdpId] = 0;
@@ -32751,21 +32815,21 @@ function checkSubAccount(entry) {
32751
32815
  const accountId = entry?.accountId ?? "0";
32752
32816
  const balance = entry?.balanceData;
32753
32817
  const apr = entry?.aprData;
32754
- for (const field12 of BALANCE_FIELDS) {
32755
- if (isBadNumber(balance?.[field12]))
32818
+ for (const field13 of BALANCE_FIELDS) {
32819
+ if (isBadNumber(balance?.[field13]))
32756
32820
  violations.push({
32757
32821
  accountId,
32758
32822
  code: "non-finite",
32759
- detail: `balanceData.${field12} = ${balance[field12]}`,
32823
+ detail: `balanceData.${field13} = ${balance[field13]}`,
32760
32824
  requiresFailedReads: false
32761
32825
  });
32762
32826
  }
32763
- for (const field12 of APR_FIELDS) {
32764
- if (isBadNumber(apr?.[field12]))
32827
+ for (const field13 of APR_FIELDS) {
32828
+ if (isBadNumber(apr?.[field13]))
32765
32829
  violations.push({
32766
32830
  accountId,
32767
32831
  code: "non-finite",
32768
- detail: `aprData.${field12} = ${apr[field12]}`,
32832
+ detail: `aprData.${field13} = ${apr[field13]}`,
32769
32833
  requiresFailedReads: false
32770
32834
  });
32771
32835
  }
@@ -32856,8 +32920,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
32856
32920
  return getResupplyUserDataConverter(lender, chainId, account, meta);
32857
32921
  if (isCurvance(lender))
32858
32922
  return getCurvanceUserDataConverter(lender, chainId, account, meta);
32859
- if (isUsdd(lender))
32860
- return getUsddUserDataConverter(lender, chainId, account, meta);
32923
+ if (isDssType(lender))
32924
+ return getDssUserDataConverter(lender, chainId, account, meta);
32861
32925
  if (isFrankencoin(lender))
32862
32926
  return getFrankencoinUserDataConverter(lender, chainId, account, meta);
32863
32927
  if (isCompoundV3Type(lender))
@@ -37515,7 +37579,7 @@ var getAbi2 = (lender) => {
37515
37579
  return [...InverseMarketAbi, ...InverseEscrowAbi, ...InverseDbrAbi];
37516
37580
  if (isLlamaLend(lender))
37517
37581
  return [...LlamaLendControllerAbi, ...LlamaLendAmmAbi];
37518
- if (isUsdd(lender)) return [...UsddVatAbi];
37582
+ if (isDssType(lender)) return [...UsddVatAbi];
37519
37583
  if (isFrankencoin(lender))
37520
37584
  return [...FrankencoinPositionAbi, ...erc20Abi];
37521
37585
  if (isResupply(lender))
@@ -38287,8 +38351,8 @@ function calculateOverallNetApr(totalDepositsUSD, totalDebtUSD, avgDepositApr, a
38287
38351
  return (totalDepositsUSD * avgDepositApr - totalDebtUSD * avgBorrowApr) / Math.abs(totalNetWorth) * (totalNetWorth > 0 ? 1 : -1);
38288
38352
  }
38289
38353
  function calculateWeightedAprs(items) {
38290
- const wa = (field12, weightField) => calculateWeightedAverage(
38291
- items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field12], weight: Math.abs(i[weightField]) }))
38354
+ const wa = (field13, weightField) => calculateWeightedAverage(
38355
+ items.filter((i) => i[weightField] !== 0).map((i) => ({ value: i[field13], weight: Math.abs(i[weightField]) }))
38292
38356
  );
38293
38357
  return {
38294
38358
  apr: wa("apr", "nav"),
@@ -42547,6 +42611,32 @@ var sreusdSavingsFetcher = {
42547
42611
  return { [SREUSD_KEY]: apr, [SREUSD_GROUP_KEY]: apr };
42548
42612
  }
42549
42613
  };
42614
+
42615
+ // src/yields/intrinsic/fetchers/fxProtocol.ts
42616
+ var ALADDIN_APY_URL = "https://api.aladdin.club/api1/concentrator_aToken_tvl_apy";
42617
+ var FXSAVE_DEFILLAMA_POOL = "ee0b7069-f8f3-4aa2-a415-728f13e6cc3d";
42618
+ var FXSAVE_KEY = "FXSAVE";
42619
+ var FXSAVE_GROUP_KEY = "f(x) USD Saving::fxSAVE";
42620
+ var fetchAladdinApyPercent = async () => {
42621
+ const res = await fetch(ALADDIN_APY_URL, {
42622
+ headers: { accept: "application/json" },
42623
+ signal: AbortSignal.timeout(8e3)
42624
+ });
42625
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
42626
+ const apy = Number((await res.json())?.data?.fxSave?.apy);
42627
+ if (Number.isFinite(apy) && apy > 0) return apy;
42628
+ throw new Error("apy missing");
42629
+ };
42630
+ var fxSaveFetcher = {
42631
+ label: "FXSAVE",
42632
+ fetch: async () => {
42633
+ const apy = await fetchAladdinApyPercent().catch(
42634
+ () => fetchDefiLlamaApy(FXSAVE_DEFILLAMA_POOL)
42635
+ );
42636
+ const apr = apyToAprPercent(apy);
42637
+ return { [FXSAVE_KEY]: apr, [FXSAVE_GROUP_KEY]: apr };
42638
+ }
42639
+ };
42550
42640
  var RATE_ABI = [
42551
42641
  {
42552
42642
  name: "rate",
@@ -45023,6 +45113,31 @@ var SINGLE_CHAIN_ENTRIES = {
45023
45113
  yieldFetcher: sreusdSavingsFetcher,
45024
45114
  yieldKey: "SREUSD"
45025
45115
  },
45116
+ {
45117
+ // f(x) Protocol fxSAVE — 4626 auto-compounder over `fxSP`, the f(x)
45118
+ // Stability Pool share (it holds 57.4M of fxSP's 59.4M supply, i.e.
45119
+ // ~97% of the pool). Plain instant exit: `maxDeposit = uint.max`,
45120
+ // `maxRedeem == balanceOf` on a live holder, `previewRedeem ==
45121
+ // convertToAssets` (no fee, no cooldown) — verified on-chain 2026-08-09.
45122
+ //
45123
+ // The underlying is fxSP and NOT fxUSD: fxSP appreciates on its own
45124
+ // ($1.0101 vs fxUSD's $1.0000 at integration), so pricing `totalAssets`
45125
+ // off fxUSD would understate TVL by ~1%. The token-list row's
45126
+ // `props.savings.underlying: 'fxUSD'` is the classifier's economic
45127
+ // underlying, a different question from `asset()`.
45128
+ address: "0x7743e50f534a7f9f1791dde7dcd89f7783eefc39",
45129
+ underlying: "0x65c9a641afceb9c0e6034e558a319488fa0fa3be",
45130
+ // fxSP
45131
+ symbol: "fxSAVE",
45132
+ brand: "f(x) Protocol",
45133
+ description: "fxUSD is f(x) Protocol's stablecoin; its Stability Pool (fxSP) backstops leveraged positions and earns the protocol's rebalance and liquidation revenue. fxSAVE auto-compounds that revenue back into fxSP, so the share price appreciates. Instant permissionless exit, no fee or cooldown.",
45134
+ decimals: 18,
45135
+ isRebasing: false,
45136
+ isMintable: true,
45137
+ withdrawalMode: "instant",
45138
+ yieldFetcher: fxSaveFetcher,
45139
+ yieldKey: FXSAVE_KEY
45140
+ },
45026
45141
  {
45027
45142
  // Frax sFRAX — the pre-rename sibling of sfrxUSD, over legacy
45028
45143
  // FRAX. Still live and roughly 2x sfrxUSD's size, so it stays a
@@ -47895,6 +48010,96 @@ var riverFetcher = {
47895
48010
  parse: parseRiverResults,
47896
48011
  getAbi: getRiverAbi
47897
48012
  };
48013
+ var dssLendersByChain = (chainId) => [
48014
+ ...skyLendersByChain(chainId),
48015
+ ...usddLendersByChain(chainId)
48016
+ ];
48017
+ function getDssCalls(chainId) {
48018
+ const results = [];
48019
+ for (const lender of dssLendersByChain(chainId)) {
48020
+ const cfg = dssConfigFor(lender, chainId);
48021
+ const markets = dssChainData(lender, chainId)?.markets ?? [];
48022
+ if (!cfg?.vat || markets.length === 0) continue;
48023
+ const debtToken = dssDebtToken(cfg);
48024
+ for (const m of markets) {
48025
+ if (!m.ilk || !m.collToken || !m.mat) continue;
48026
+ const calls = [
48027
+ { address: cfg.vat, name: "ilks", params: [dssIlkBytes32(m.ilk)] }
48028
+ ];
48029
+ results.push({
48030
+ calls,
48031
+ meta: {
48032
+ lender,
48033
+ chainId,
48034
+ ilk: m.ilk,
48035
+ collToken: m.collToken.toLowerCase(),
48036
+ debtToken: debtToken?.toLowerCase(),
48037
+ mat: String(m.mat)
48038
+ },
48039
+ lender: dssLenderKey(lender, chainId, m.ilk)
48040
+ });
48041
+ }
48042
+ }
48043
+ return results;
48044
+ }
48045
+ var RAY8 = 1e27;
48046
+ var big13 = (v) => {
48047
+ try {
48048
+ if (typeof v === "bigint") return v;
48049
+ if (v == null || v === "0x") return 0n;
48050
+ return BigInt(v);
48051
+ } catch {
48052
+ return 0n;
48053
+ }
48054
+ };
48055
+ var field12 = (res, name, idx) => {
48056
+ const v = res?.[name];
48057
+ if (typeof v === "bigint" || typeof v === "number" || typeof v === "string") {
48058
+ return big13(v);
48059
+ }
48060
+ return big13(res?.[idx]);
48061
+ };
48062
+ function parseDssResults(data, meta, context) {
48063
+ const { chainId } = context;
48064
+ const key2 = dssLenderKey(meta.lender, chainId, meta.ilk);
48065
+ const entries = [];
48066
+ const spot = field12(data?.[0], "spot", 2);
48067
+ const mat = big13(meta.mat);
48068
+ if (spot > 0n && mat > 0n) {
48069
+ const collUSD = Number(spot) / RAY8 * (Number(mat) / RAY8);
48070
+ if (collUSD > 0 && collUSD < 1e9) {
48071
+ entries.push({
48072
+ asset: meta.collToken,
48073
+ price: collUSD,
48074
+ priceUSD: collUSD,
48075
+ marketUid: createMarketUid(chainId, key2, meta.collToken),
48076
+ targetLender: key2,
48077
+ description: "Maker OSM via Vat.spot \xD7 Spot.mat (USD, ~1h delayed)"
48078
+ });
48079
+ }
48080
+ }
48081
+ if (meta.debtToken) {
48082
+ entries.push({
48083
+ asset: meta.debtToken,
48084
+ price: 1,
48085
+ priceUSD: 1,
48086
+ marketUid: createMarketUid(chainId, key2, meta.debtToken),
48087
+ targetLender: key2,
48088
+ description: "dss debt token (par)",
48089
+ staticBase: true,
48090
+ baseAsset: meta.debtToken
48091
+ });
48092
+ }
48093
+ return entries;
48094
+ }
48095
+ function getDssAbi() {
48096
+ return UsddVatAbi;
48097
+ }
48098
+ var dssFetcher = {
48099
+ getCalls: getDssCalls,
48100
+ parse: parseDssResults,
48101
+ getAbi: getDssAbi
48102
+ };
47898
48103
  var READS_PER_ASSET = 2;
47899
48104
  function getCurvanceCalls(chainId) {
47900
48105
  const results = [];
@@ -50049,6 +50254,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50049
50254
  () => riverFetcher.getCalls(chainId),
50050
50255
  getCallsErrors
50051
50256
  ) : [];
50257
+ const dssResults = isActive("dss") ? safeGetCalls("dss", () => dssFetcher.getCalls(chainId), getCallsErrors) : [];
50052
50258
  const curvanceResults = isActive("curvance") ? safeGetCalls(
50053
50259
  "curvance",
50054
50260
  () => curvanceFetcher.getCalls(chainId),
@@ -50185,6 +50391,13 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50185
50391
  getRiverAbi(),
50186
50392
  "direct"
50187
50393
  );
50394
+ const dssGroup = buildGroup(
50395
+ "dss",
50396
+ dssResults,
50397
+ dssFetcher.parse,
50398
+ dssFetcher.getAbi(),
50399
+ "direct"
50400
+ );
50188
50401
  const curvanceGroup = buildGroup(
50189
50402
  "curvance",
50190
50403
  curvanceResults,
@@ -50264,6 +50477,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50264
50477
  termGroup,
50265
50478
  liquityGroup,
50266
50479
  riverGroup,
50480
+ dssGroup,
50267
50481
  curvanceGroup,
50268
50482
  inverseGroup,
50269
50483
  tellerGroup,
@@ -50314,6 +50528,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50314
50528
  termData,
50315
50529
  liquityData,
50316
50530
  riverData,
50531
+ dssData,
50317
50532
  curvanceData,
50318
50533
  inverseData,
50319
50534
  tellerData,
@@ -50442,6 +50657,14 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50442
50657
  allowFailure,
50443
50658
  rpcOverrides
50444
50659
  ),
50660
+ executeGroup(
50661
+ dssGroup,
50662
+ chainId,
50663
+ chainBatchSize,
50664
+ retries,
50665
+ allowFailure,
50666
+ rpcOverrides
50667
+ ),
50445
50668
  executeGroup(
50446
50669
  curvanceGroup,
50447
50670
  chainId,
@@ -50601,6 +50824,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
50601
50824
  parseTrackers(termGroup, termData.results);
50602
50825
  parseTrackers(liquityGroup, liquityData.results);
50603
50826
  parseTrackers(riverGroup, riverData.results);
50827
+ parseTrackers(dssGroup, dssData.results);
50604
50828
  parseTrackers(curvanceGroup, curvanceData.results);
50605
50829
  parseTrackers(inverseGroup, inverseData.results);
50606
50830
  if (siloV2GqlEntries != null) {
@@ -51201,10 +51425,10 @@ function createAssetArrayPerChain() {
51201
51425
  return assetsPerChain;
51202
51426
  }
51203
51427
  var RELEVANT_LENDING_ASSETS = () => createAssetArrayPerChain();
51204
- function createSimpleArrayPerChain(fork, field12 = void 0) {
51428
+ function createSimpleArrayPerChain(fork, field13 = void 0) {
51205
51429
  let pools = {};
51206
51430
  Object.entries(fork ?? {}).forEach(([b2, data]) => {
51207
- Object.entries(field12 ? data[field12] : data).forEach(
51431
+ Object.entries(field13 ? data[field13] : data).forEach(
51208
51432
  ([chainId, address]) => {
51209
51433
  if (!pools[chainId]) pools[chainId] = [];
51210
51434
  pools[chainId] = uniq2([...pools[chainId], { address, pool: b2 }]);
@@ -53411,9 +53635,9 @@ query EvkByAssets($assets: [Bytes!]!) {
53411
53635
  `;
53412
53636
  var ZERO2 = 0n;
53413
53637
  var RAY_TO_PERCENT3 = 1e25;
53414
- function readAddress2(field12) {
53415
- if (!field12) return void 0;
53416
- return field12.toLowerCase();
53638
+ function readAddress2(field13) {
53639
+ if (!field13) return void 0;
53640
+ return field13.toLowerCase();
53417
53641
  }
53418
53642
  function parseVaultFee(v) {
53419
53643
  if (v.performanceFee == null) return 0;
@@ -53778,7 +54002,7 @@ var num4 = (v) => {
53778
54002
  const n = Number(v);
53779
54003
  return Number.isFinite(n) ? n : 0;
53780
54004
  };
53781
- var big13 = (v) => {
54005
+ var big14 = (v) => {
53782
54006
  try {
53783
54007
  if (v === void 0 || v === null || v === "") return "0";
53784
54008
  const s = String(v);
@@ -53814,12 +54038,12 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
53814
54038
  const assetEntry = tokenList[underlying];
53815
54039
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(underlying, chainId);
53816
54040
  const priceUsd = prices[priceKey];
53817
- const totalAssets = big13(r.totalAssets);
53818
- const totalSupply = big13(r.totalSupplyAmt);
54041
+ const totalAssets = big14(r.totalAssets);
54042
+ const totalSupply = big14(r.totalSupplyAmt);
53819
54043
  const totalAssetsFormatted = Number(totalAssets) / scale2;
53820
54044
  const supplyRate = num4(r.apr) * 100;
53821
54045
  const rewardsRate = num4(r?.incentiveData?.TMX_APR) * 100;
53822
- const rawLiquidity = BigInt(big13(r.redeemableAmt ?? r.idleFunds ?? "0"));
54046
+ const rawLiquidity = BigInt(big14(r.redeemableAmt ?? r.idleFunds ?? "0"));
53823
54047
  const totalAssetsBig = BigInt(totalAssets);
53824
54048
  const liquidity = (rawLiquidity > totalAssetsBig ? totalAssetsBig : rawLiquidity).toString();
53825
54049
  const liquidityFormatted = Number(liquidity) / scale2;
@@ -53855,7 +54079,7 @@ async function fetchTermMaxVaultsFromApi(chainId, prices = {}, tokenList = {}, f
53855
54079
  liquidityUsd: priceUsd ? liquidityFormatted * priceUsd : 0,
53856
54080
  version: r.version,
53857
54081
  isPaused: r.isPaused === true || void 0,
53858
- supplyCap: r.capacity ? big13(r.capacity) : void 0,
54082
+ supplyCap: r.capacity ? big14(r.capacity) : void 0,
53859
54083
  basePool: r.poolAddress ? lower2(r.poolAddress) : void 0
53860
54084
  };
53861
54085
  }
@@ -53911,7 +54135,7 @@ var Erc20DecimalsBalanceAbi = [
53911
54135
 
53912
54136
  // src/vaults/termmax/fetchFromChain.ts
53913
54137
  var DECIMAL_BASE2 = 100000000n;
53914
- var big14 = (v) => {
54138
+ var big15 = (v) => {
53915
54139
  if (v === void 0 || v === null || v === "0x") return 0n;
53916
54140
  try {
53917
54141
  return typeof v === "bigint" ? v : BigInt(v);
@@ -53975,7 +54199,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
53975
54199
  vaults.forEach((address, i) => {
53976
54200
  const at = (k) => res[i * READS_PER_VAULT + VAULT_READS.indexOf(k)];
53977
54201
  const asset = addr(at("asset"));
53978
- const totalAssets = big14(at("totalAssets"));
54202
+ const totalAssets = big15(at("totalAssets"));
53979
54203
  if (!asset || totalAssets === 0n) return;
53980
54204
  rows.push({
53981
54205
  address,
@@ -53984,11 +54208,11 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
53984
54208
  decimals: num5(at("decimals")) ?? 18,
53985
54209
  asset,
53986
54210
  totalAssets,
53987
- totalSupply: big14(at("totalSupply")),
53988
- annualizedInterest: big14(at("annualizedInterest")),
53989
- accretingPrincipal: big14(at("accretingPrincipal")),
53990
- performanceFeeRate: big14(at("performanceFeeRate")),
53991
- aprRaw: at("apr") != null ? big14(at("apr")) : void 0,
54211
+ totalSupply: big15(at("totalSupply")),
54212
+ annualizedInterest: big15(at("annualizedInterest")),
54213
+ accretingPrincipal: big15(at("accretingPrincipal")),
54214
+ performanceFeeRate: big15(at("performanceFeeRate")),
54215
+ aprRaw: at("apr") != null ? big15(at("apr")) : void 0,
53992
54216
  curator: addr(at("curator")),
53993
54217
  guardian: addr(at("guardian")),
53994
54218
  timelock: num5(at("timelock")),
@@ -54009,7 +54233,7 @@ var fetchTermMaxVaultsFromChain = async (chainId, multicallRetry, prices = {}, t
54009
54233
  const out = {};
54010
54234
  rows.forEach((r, i) => {
54011
54235
  const assetDecimals = num5(res2[i * 2]) ?? r.decimals;
54012
- const idle = big14(res2[i * 2 + 1]);
54236
+ const idle = big15(res2[i * 2 + 1]);
54013
54237
  const assetEntry = tokenList[r.asset];
54014
54238
  const priceKey = toOracleKey(assetEntry?.assetGroup) || toGenericPriceKey(r.asset, chainId);
54015
54239
  const priceUsd = prices[priceKey];
@@ -61414,23 +61638,23 @@ var priceGmMarkets = async (chainId, multicallRetry, markets, prices) => {
61414
61638
  const indexMax = price(prices, m.indexToken)?.max;
61415
61639
  if (Array.isArray(dsRes) && longMax != null && shortMax != null) {
61416
61640
  const base = i * SLOTS;
61417
- const big15 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
61641
+ const big16 = (j) => typeof dsRes[base + j] === "bigint" ? dsRes[base + j] : 0n;
61418
61642
  const cap = computeDepositCapacityUsd(
61419
- [info?.longTokenAmount, longMax, big15(0), big15(2)],
61420
- [info?.shortTokenAmount, shortMax, big15(1), big15(3)]
61643
+ [info?.longTokenAmount, longMax, big16(0), big16(2)],
61644
+ [info?.shortTokenAmount, shortMax, big16(1), big16(3)]
61421
61645
  );
61422
61646
  if (cap != null) value.depositCapacityUsd = cap;
61423
61647
  if (indexMax != null) {
61424
61648
  const divisor = m.longToken.toLowerCase() === m.shortToken.toLowerCase() ? 2n : 1n;
61425
- const reservedUsdLong = (big15(4) + big15(5)) / divisor * indexMax;
61426
- const reservedUsdShort = (big15(6) + big15(7)) / divisor;
61649
+ const reservedUsdLong = (big16(4) + big16(5)) / divisor * indexMax;
61650
+ const reservedUsdShort = (big16(6) + big16(7)) / divisor;
61427
61651
  const liq = computeLiquidityUsd(
61428
61652
  info?.longTokenUsd,
61429
61653
  info?.shortTokenUsd,
61430
61654
  reservedUsdLong,
61431
61655
  reservedUsdShort,
61432
- big15(8),
61433
- big15(9)
61656
+ big16(8),
61657
+ big16(9)
61434
61658
  );
61435
61659
  if (liq != null)
61436
61660
  value.liquidityUsd = Math.max(0, Math.min(liq, value.tvlUsd));
@@ -61629,21 +61853,21 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
61629
61853
  } catch {
61630
61854
  return void 0;
61631
61855
  }
61632
- const big15 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
61633
- const base = big15(0);
61634
- const mult = big15(1);
61856
+ const big16 = (i) => typeof res[i] === "bigint" ? res[i] : 0n;
61857
+ const base = big16(0);
61858
+ const mult = big16(1);
61635
61859
  if (base === 0n && mult === 0n) return void 0;
61636
61860
  const PRECISION = 10n ** 30n;
61637
61861
  const adjusted = (opGas) => base + opGas * mult / PRECISION;
61638
61862
  const fee = (opGas) => (adjusted(opGas) * gasPriceWei).toString();
61639
- const glvExtra = big15(6) * GLV_NOMINAL_MARKET_COUNT;
61863
+ const glvExtra = big16(6) * GLV_NOMINAL_MARKET_COUNT;
61640
61864
  return {
61641
61865
  chainId,
61642
61866
  gasPriceWei: gasPriceWei.toString(),
61643
- deposit: fee(big15(2)),
61644
- withdrawal: fee(big15(3)),
61645
- glvDeposit: fee(big15(4) + glvExtra),
61646
- glvWithdrawal: fee(big15(5) + glvExtra)
61867
+ deposit: fee(big16(2)),
61868
+ withdrawal: fee(big16(3)),
61869
+ glvDeposit: fee(big16(4) + glvExtra),
61870
+ glvWithdrawal: fee(big16(5) + glvExtra)
61647
61871
  };
61648
61872
  };
61649
61873
 
@@ -62991,6 +63215,7 @@ var ROW_DESCRIPTOR_KEYS = [
62991
63215
  "inverse",
62992
63216
  "exactly",
62993
63217
  "usdd",
63218
+ "dss",
62994
63219
  "termmax",
62995
63220
  // These five were missing, and the failure is SILENT: the adapter still
62996
63221
  // runs, reads an empty descriptor and returns a sheet that looks complete
@@ -63612,9 +63837,12 @@ var TERM_PROFILES = [
63612
63837
  }
63613
63838
  }),
63614
63839
  P({
63615
- id: "usdd.cdp@v1",
63616
- name: "USDD CDP ilk",
63617
- family: "usdd",
63840
+ id: "dss.cdp@v1",
63841
+ name: "Maker-style (dss) CDP ilk",
63842
+ // One profile for the whole dss family — Sky (the original MakerDAO) and
63843
+ // its forks (USDD 2.0). The prose is identical because the mechanism is:
63844
+ // same Vat/Jug/Spot accounting, same governance-set stability fee.
63845
+ family: "dss",
63618
63846
  borrow: {
63619
63847
  description: "A Maker-style CDP with a governance-set stability fee and no utilization curve.",
63620
63848
  implications: [
@@ -63935,8 +64163,8 @@ function resolveMinDebt(input) {
63935
64163
  m.river?.minNetDebt,
63936
64164
  // Inverse FiRM.
63937
64165
  m.inverse?.minDebt,
63938
- // USDD / Maker-fork: `dust` IS the per-vault debt floor.
63939
- m.usdd?.dust,
64166
+ // dss (Sky / the USDD fork): `dust` IS the per-vault debt floor.
64167
+ m.dss?.dust ?? m.usdd?.dust,
63940
64168
  // Gearbox credit facade.
63941
64169
  m.gearbox?.minDebt,
63942
64170
  // Resupply — a hard per-position floor that also bounds partial repayment.
@@ -65102,10 +65330,10 @@ var inverseAdapter = {
65102
65330
  }
65103
65331
  })
65104
65332
  };
65105
- var usddAdapter = {
65106
- id: "usdd",
65107
- matches: isUsdd,
65108
- profileId: () => "usdd.cdp@v1",
65333
+ var dssAdapter = {
65334
+ id: "dss",
65335
+ matches: isDssType,
65336
+ profileId: () => "dss.cdp@v1",
65109
65337
  build: () => ({
65110
65338
  borrow: {
65111
65339
  rate: { kind: "variable-managed", source: "governance", isLocked: false },
@@ -65519,7 +65747,7 @@ var TERM_ADAPTERS = [
65519
65747
  liquityAdapter,
65520
65748
  riverAdapter,
65521
65749
  inverseAdapter,
65522
- usddAdapter,
65750
+ dssAdapter,
65523
65751
  compoundV3Adapter,
65524
65752
  fluidAdapter,
65525
65753
  gearboxAdapter,
@@ -65961,6 +66189,6 @@ function validateTermSheets(sheets) {
65961
66189
  return sheets.flatMap((s) => validateTermSheet(s));
65962
66190
  }
65963
66191
 
65964
- export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, EXACTLY_LENDER_KEY, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MULTICALL_FAILURE, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, duration, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, frankencoinKeyParts, frankencoinLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getReadFailurePolicy, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isFailedCall, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, stampVaultClassification, supplyDescription, supplyFindings, supplyHeadline, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, toDigest, toTermSheetInput, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData };
66192
+ export { ApiBookSource, DEFAULT_MIDNIGHT_API, DEFAULT_OUTLIER_GUARD, DEFAULT_PROFILE_ID, DEFAULT_STALE_REJECT_SECONDS, DEFAULT_TERMMAX_API, EMPTY_BALANCE, EXACTLY_LENDER_KEY, GMX_API_HOSTS, GMX_READ_CONTRACTS, GMX_SUPPORTED_CHAINS, HYPERCORE_VAULT_REGISTRY, IDLE_MARKET_ID, INTERFACE_IDS, LAGOON_API_URL, LAGOON_CHAIN_IDS, MORPHO_LENS, MULTICALL_FAILURE, MaxParamThresholds, STABLECOIN_SYMBOLS, STCELO_MANAGER_ADDRESS, TELLER_CALLS_PER_BID, TERMMAX_CALLS_PER_ACCOUNT, DECIMAL_BASE as TERMMAX_DECIMAL_BASE, TERMMAX_LIQUIDATION_PENALTY, TERMMAX_LIQUIDATION_WINDOW_SECS, TERMMAX_LIQUIDATOR_BONUS, TERMMAX_PARTIAL_CLOSE_FACTOR, TERMMAX_PARTIAL_LIQUIDATION_THRESHOLD_USD, TERM_ADAPTERS, TERM_PROFILES, TERM_SHEET_SCHEMA_VERSION, TermMaxApiSource, TermSubgraphSource, UPSHIFT_CHAIN_IDS, UPSHIFT_VAULTS_URL, VAULT_SHARE_PRICE_PROBE, VOLATILE_VAULT_OVERRIDES, YEARN_CHAIN_IDS, YEARN_YDAEMON_BASE, __resetResupplyUserCaches, accountDepositListKey, accountWithdrawalListKey, appendSnapshot, applyPositionDelta, attachImplications, attachPricesToFlashLiquidity, borrowDescription, borrowFindings, borrowHeadline, buildExposures2 as buildExposures, buildFluidFTokensCall, buildLiquityUserCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, buildTellerUserCall, buildTermMaxUserCall, buildTermSheet, buildTermSheetsForGroup, buildVaultLookup, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, classifyFreshness, classifyReliability, classifyVault, collectFeedObservations, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeVaultApr, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, consensusReference, convertDssMarketsToResponse, convertExactlyMarketsToResponse, convertFrankencoinMarketsToResponse, convertInverseMarketsToResponse, convertLenderUserDataResult, convertLiquityMarketsToResponse, convertLlamaLendMarketsToResponse, convertResupplyMarketsToResponse, convertRiverMarketsToResponse, convertTellerMarketsToResponse, convertTermMarketsToResponse, convertTermMaxMarketsToResponse, convertUsddMarketsToResponse, createMarketUid, createMidnightBookSource, createMulticallRpcCall, createRawRpcCalls, createTermBookSource, createTermMaxDataSource, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, deriveBorrowTags, deriveSupplyTags, detectInterfaceKinds, dssIlkBytes32, dssKeyParts, dssLenderKey, duration, encodeBalanceFetcherCalldata, enrichTermSheet, enrichmentIndexFromRows, exactlyPairLtv, exactlyPenaltyRateToAprPercent, exactlyWadRateToPercent, feePhrase, feedKeyOf, feedStatKey, fetchDolomiteAccountNumbers, fetchDssMarkets, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchExactlyMarkets, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchFrankencoinMarkets, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchGmxExecutionFees, fetchGmxTickerPrices, fetchGmxVaults, fetchHypercoreVaults, fetchInverseMarkets, fetchLagoonApiVaults, fetchLagoonVaults, fetchLiquityMarkets, fetchListaVaultsFromChain, fetchLlamaLendMarkets, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchOraclePrices, fetchPendlePrices, fetchResupplyMarkets, fetchRiverMarkets, fetchSiloVaults, fetchTellerMarkets, fetchTermMarkets, fetchTermMaxMarkets, fetchTokenBalances, fetchTokenMetadata, fetchUpshiftApiVaults, fetchUpshiftVaults, fetchUsddMarkets, fetchYearnApiVaults, fetchYearnVaults, filterActiveLenders, filterLendersByProtocol, finalizeInfo, findingsFor, frankencoinKeyParts, frankencoinLenderKey, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getCachedLiquityTroves, getCachedTellerBids, getCachedTermMaxDiscovery, getCachedTermMaxMarket, getCachedTermMaxMarkets, getCoreValidators, getFluidFTokensConverter, getGmxApiHost, getGmxReadContracts, getGmxUserPositions, getHealthFactor, getHypercoreUserPositions, getHypercoreVaultRegistry, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getLstDelegation, getLstValidators, getLstWithdrawalRegistry, getLstWithdrawalRequests, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getReadFailurePolicy, getResolvedDolomiteAccountNumbers, getStCeloValidatorGroups, getSubAccountAddress, getSubAccountIndex, getTermProfile, getVaultPublicDataAll, getVaultWithdrawalRequests, hasCritical, hasEulerEarnVaultSubgraph, hasLagoonVaults, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasUpshiftVaults, hasYearnVaults, inverseKeyParts, inverseLenderKey, isFailedCall, isStablecoinSymbol, isYearnV3, keysFromMaps, lenderApiOnly, lenderFamily, liquityCandidateTroveIds, liquityKeyParts, liquityLenderKey, llamaLendKeyParts, llamaLendLenderKey, mergeDeep, multicall3Abi2 as multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTermMaxLtv, parseTokenBalanceResult, pct, positivePart2 as positivePart, predictInverseEscrow, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, priceGlvVaults, priceGmMarkets, probeAaveFeedTimestamps, pruneFeedStats, rankFindings, readVaultSharePrices, rejectOutliers as rejectPriceOutliers, resolveAdapter, resolveDerivation, resolveStCeloDepositGroup, resupplyKeyParts, resupplyLenderKey, resupplyMarketLabel, riverKeyParts, riverLenderKey, selectAssetGroupPrices, shortDate, stampVaultClassification, supplyDescription, supplyFindings, supplyHeadline, tellerBpsToPercent, tellerImpliedLtv, tellerLenderKey, tellerPoolFromLenderKey, termLenderKey, termMaxApiBase, borrowNif as termMaxBorrowNif, curveApr as termMaxCurveApr, curveAprNumber as termMaxCurveAprNumber, daysToMaturity as termMaxDaysToMaturity, lendNif as termMaxLendNif, mintGtFeeRatio as termMaxMintGtFeeRatio, ratioToNumber as termMaxRatioToNumber, ratioToPercent as termMaxRatioToPercent, tickToAprNumber, tickToPrice, toDigest, toTermSheetInput, unflattenLenderData, updateFeedStats, usddIlkBytes32, usddKeyParts, usddLenderKey, validateTermSheet, validateTermSheets, validateUserData };
65965
66193
  //# sourceMappingURL=index.js.map
65966
66194
  //# sourceMappingURL=index.js.map