@1delta/data-sdk 0.0.35 → 0.0.36

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
@@ -77,6 +77,9 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
77
77
  liquityMarkets: {},
78
78
  riverConfig: {},
79
79
  riverMarkets: {},
80
+ inverseConfig: {},
81
+ termMaxConfig: {},
82
+ inverseMarkets: {},
80
83
  compoundV3Bulker: {},
81
84
  eulerConfigs: {},
82
85
  eulerVaults: {},
@@ -137,6 +140,9 @@ function initializeLenderData({
137
140
  liquityMarketsOverride,
138
141
  riverConfigOverride,
139
142
  riverMarketsOverride,
143
+ inverseConfigOverride,
144
+ termMaxConfigOverride,
145
+ inverseMarketsOverride,
140
146
  compoundV3BulkerOverride,
141
147
  eulerConfigsOverride,
142
148
  eulerVaultsOverride,
@@ -190,6 +196,9 @@ function initializeLenderData({
190
196
  if (liquityMarketsOverride) data.liquityMarkets = liquityMarketsOverride;
191
197
  if (riverConfigOverride) data.riverConfig = riverConfigOverride;
192
198
  if (riverMarketsOverride) data.riverMarkets = riverMarketsOverride;
199
+ if (inverseConfigOverride) data.inverseConfig = inverseConfigOverride;
200
+ if (termMaxConfigOverride) data.termMaxConfig = termMaxConfigOverride;
201
+ if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
193
202
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
194
203
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
195
204
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -307,12 +316,29 @@ var riverConfig = () => getGlobalData2()?.riverConfig;
307
316
  var riverConfigFor = (lender, chainId) => getGlobalData2()?.riverConfig?.[lender]?.[String(chainId)];
308
317
  var riverMarkets = () => getGlobalData2()?.riverMarkets;
309
318
  var riverChainData = (lender, chainId) => getGlobalData2()?.riverMarkets?.[lender]?.[String(chainId)];
319
+ var inverseConfig = () => getGlobalData2()?.inverseConfig;
320
+ var termMaxConfig = () => getGlobalData2()?.termMaxConfig;
321
+ var termMaxConfigByChain = (chainId) => getGlobalData2()?.termMaxConfig?.[String(chainId)];
322
+ var termMaxChainIds = () => Object.keys(getGlobalData2()?.termMaxConfig ?? {});
323
+ var termMaxApiBaseUrl = (chainId) => termMaxConfigByChain(chainId)?.apiBaseUrl || "https://api.termmax.ts.finance";
324
+ var inverseConfigFor = (lender, chainId) => getGlobalData2()?.inverseConfig?.[lender]?.[String(chainId)];
325
+ var inverseMarkets = () => getGlobalData2()?.inverseMarkets;
326
+ var inverseChainData = (lender, chainId) => getGlobalData2()?.inverseMarkets?.[lender]?.[String(chainId)];
327
+ var inverseMarketByAddress = (lender, chainId, address) => {
328
+ const lower = address.toLowerCase();
329
+ return inverseChainData(lender, chainId)?.markets?.find((m) => m.address.toLowerCase() === lower);
330
+ };
310
331
  var riverMarketByIndex = (lender, chainId, index) => riverChainData(lender, chainId)?.markets?.find((m) => m.index === Number(index));
311
332
  var riverLendersByChain = (chainId) => {
312
333
  const cfg = getGlobalData2()?.riverConfig ?? {};
313
334
  const chain = String(chainId);
314
335
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.xapp);
315
336
  };
337
+ var inverseLendersByChain = (chainId) => {
338
+ const cfg = getGlobalData2()?.inverseConfig ?? {};
339
+ const chain = String(chainId);
340
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
341
+ };
316
342
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
317
343
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
318
344
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -449,6 +475,17 @@ function parseGearboxV3LenderKey(lenderKey) {
449
475
  if (!match) return void 0;
450
476
  return { creditManagerAddrLower: "0x" + match[1].toLowerCase() };
451
477
  }
478
+ function termMaxLenderKey(market) {
479
+ if (!market || !market.startsWith("0x") || market.length !== 42) {
480
+ throw new Error(`termMaxLenderKey: invalid market address ${market}`);
481
+ }
482
+ return `TERMMAX_${market.slice(2).toUpperCase()}`;
483
+ }
484
+ function parseTermMaxLenderKey(lenderKey) {
485
+ const match = lenderKey.match(/^TERMMAX_([0-9A-Fa-f]{40})$/);
486
+ if (!match) return void 0;
487
+ return { marketAddrLower: "0x" + match[1].toLowerCase() };
488
+ }
452
489
 
453
490
  // src/tokens.ts
454
491
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -465,6 +502,21 @@ async function fetchTokenLists(chainIds) {
465
502
  const results = await Promise.all(promises);
466
503
  return Object.fromEntries(results);
467
504
  }
505
+ async function fetchTokenListFile(chainId) {
506
+ const data = await fetch(getListUrl(chainId));
507
+ if (!data.ok) throw new Error(`HTTP error! status: ${data.status}`);
508
+ const json = await data.json();
509
+ return {
510
+ list: json.list,
511
+ mainTokens: json.mainTokens ?? []
512
+ };
513
+ }
514
+ var MAIN_TOKENS_URL = "https://raw.githubusercontent.com/1delta-DAO/token-lists/main/main-tokens.json";
515
+ async function fetchMainTokensMap() {
516
+ const data = await fetch(MAIN_TOKENS_URL);
517
+ if (!data.ok) return void 0;
518
+ return await data.json();
519
+ }
468
520
 
469
521
  exports.GEARBOX_ACCOUNT_COMPRESSOR_V310 = GEARBOX_ACCOUNT_COMPRESSOR_V310;
470
522
  exports.aaveOracles = aaveOracles;
@@ -501,7 +553,9 @@ exports.exactlyMarketByAddress = exactlyMarketByAddress;
501
553
  exports.exactlyMarketByAsset = exactlyMarketByAsset;
502
554
  exports.exactlyMarkets = exactlyMarkets;
503
555
  exports.exactlyMarketsByChain = exactlyMarketsByChain;
556
+ exports.fetchMainTokensMap = fetchMainTokensMap;
504
557
  exports.fetchTokenList = fetchTokenList;
558
+ exports.fetchTokenListFile = fetchTokenListFile;
505
559
  exports.fetchTokenLists = fetchTokenLists;
506
560
  exports.findAaveV4PositionManager = findAaveV4PositionManager;
507
561
  exports.fluidChains = fluidChains;
@@ -526,6 +580,12 @@ exports.getSiloV3MarketEntry = getSiloV3MarketEntry;
526
580
  exports.initConfig = initConfig;
527
581
  exports.initializeChainData = initializeChainData;
528
582
  exports.initializeLenderData = initializeLenderData;
583
+ exports.inverseChainData = inverseChainData;
584
+ exports.inverseConfig = inverseConfig;
585
+ exports.inverseConfigFor = inverseConfigFor;
586
+ exports.inverseLendersByChain = inverseLendersByChain;
587
+ exports.inverseMarketByAddress = inverseMarketByAddress;
588
+ exports.inverseMarkets = inverseMarkets;
529
589
  exports.liquityBranchByIndex = liquityBranchByIndex;
530
590
  exports.liquityBranchByTroveManager = liquityBranchByTroveManager;
531
591
  exports.liquityBranchesByChain = liquityBranchesByChain;
@@ -549,6 +609,7 @@ exports.parseAaveV4SpokeLenderKey = parseAaveV4SpokeLenderKey;
549
609
  exports.parseGearboxV3LenderKey = parseGearboxV3LenderKey;
550
610
  exports.parseSiloV2LenderKey = parseSiloV2LenderKey;
551
611
  exports.parseSiloV3LenderKey = parseSiloV3LenderKey;
612
+ exports.parseTermMaxLenderKey = parseTermMaxLenderKey;
552
613
  exports.resolveMidnightApiBase = resolveMidnightApiBase;
553
614
  exports.resolveTermApiBase = resolveTermApiBase;
554
615
  exports.riverChainData = riverChainData;
@@ -575,3 +636,8 @@ exports.termConfig = termConfig;
575
636
  exports.termMarketById = termMarketById;
576
637
  exports.termMarkets = termMarkets;
577
638
  exports.termMarketsByChain = termMarketsByChain;
639
+ exports.termMaxApiBaseUrl = termMaxApiBaseUrl;
640
+ exports.termMaxChainIds = termMaxChainIds;
641
+ exports.termMaxConfig = termMaxConfig;
642
+ exports.termMaxConfigByChain = termMaxConfigByChain;
643
+ exports.termMaxLenderKey = termMaxLenderKey;
package/dist/index.mjs CHANGED
@@ -75,6 +75,9 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
75
75
  liquityMarkets: {},
76
76
  riverConfig: {},
77
77
  riverMarkets: {},
78
+ inverseConfig: {},
79
+ termMaxConfig: {},
80
+ inverseMarkets: {},
78
81
  compoundV3Bulker: {},
79
82
  eulerConfigs: {},
80
83
  eulerVaults: {},
@@ -135,6 +138,9 @@ function initializeLenderData({
135
138
  liquityMarketsOverride,
136
139
  riverConfigOverride,
137
140
  riverMarketsOverride,
141
+ inverseConfigOverride,
142
+ termMaxConfigOverride,
143
+ inverseMarketsOverride,
138
144
  compoundV3BulkerOverride,
139
145
  eulerConfigsOverride,
140
146
  eulerVaultsOverride,
@@ -188,6 +194,9 @@ function initializeLenderData({
188
194
  if (liquityMarketsOverride) data.liquityMarkets = liquityMarketsOverride;
189
195
  if (riverConfigOverride) data.riverConfig = riverConfigOverride;
190
196
  if (riverMarketsOverride) data.riverMarkets = riverMarketsOverride;
197
+ if (inverseConfigOverride) data.inverseConfig = inverseConfigOverride;
198
+ if (termMaxConfigOverride) data.termMaxConfig = termMaxConfigOverride;
199
+ if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
191
200
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
192
201
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
193
202
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -305,12 +314,29 @@ var riverConfig = () => getGlobalData2()?.riverConfig;
305
314
  var riverConfigFor = (lender, chainId) => getGlobalData2()?.riverConfig?.[lender]?.[String(chainId)];
306
315
  var riverMarkets = () => getGlobalData2()?.riverMarkets;
307
316
  var riverChainData = (lender, chainId) => getGlobalData2()?.riverMarkets?.[lender]?.[String(chainId)];
317
+ var inverseConfig = () => getGlobalData2()?.inverseConfig;
318
+ var termMaxConfig = () => getGlobalData2()?.termMaxConfig;
319
+ var termMaxConfigByChain = (chainId) => getGlobalData2()?.termMaxConfig?.[String(chainId)];
320
+ var termMaxChainIds = () => Object.keys(getGlobalData2()?.termMaxConfig ?? {});
321
+ var termMaxApiBaseUrl = (chainId) => termMaxConfigByChain(chainId)?.apiBaseUrl || "https://api.termmax.ts.finance";
322
+ var inverseConfigFor = (lender, chainId) => getGlobalData2()?.inverseConfig?.[lender]?.[String(chainId)];
323
+ var inverseMarkets = () => getGlobalData2()?.inverseMarkets;
324
+ var inverseChainData = (lender, chainId) => getGlobalData2()?.inverseMarkets?.[lender]?.[String(chainId)];
325
+ var inverseMarketByAddress = (lender, chainId, address) => {
326
+ const lower = address.toLowerCase();
327
+ return inverseChainData(lender, chainId)?.markets?.find((m) => m.address.toLowerCase() === lower);
328
+ };
308
329
  var riverMarketByIndex = (lender, chainId, index) => riverChainData(lender, chainId)?.markets?.find((m) => m.index === Number(index));
309
330
  var riverLendersByChain = (chainId) => {
310
331
  const cfg = getGlobalData2()?.riverConfig ?? {};
311
332
  const chain = String(chainId);
312
333
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.xapp);
313
334
  };
335
+ var inverseLendersByChain = (chainId) => {
336
+ const cfg = getGlobalData2()?.inverseConfig ?? {};
337
+ const chain = String(chainId);
338
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
339
+ };
314
340
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
315
341
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
316
342
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -447,6 +473,17 @@ function parseGearboxV3LenderKey(lenderKey) {
447
473
  if (!match) return void 0;
448
474
  return { creditManagerAddrLower: "0x" + match[1].toLowerCase() };
449
475
  }
476
+ function termMaxLenderKey(market) {
477
+ if (!market || !market.startsWith("0x") || market.length !== 42) {
478
+ throw new Error(`termMaxLenderKey: invalid market address ${market}`);
479
+ }
480
+ return `TERMMAX_${market.slice(2).toUpperCase()}`;
481
+ }
482
+ function parseTermMaxLenderKey(lenderKey) {
483
+ const match = lenderKey.match(/^TERMMAX_([0-9A-Fa-f]{40})$/);
484
+ if (!match) return void 0;
485
+ return { marketAddrLower: "0x" + match[1].toLowerCase() };
486
+ }
450
487
 
451
488
  // src/tokens.ts
452
489
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -463,5 +500,20 @@ async function fetchTokenLists(chainIds) {
463
500
  const results = await Promise.all(promises);
464
501
  return Object.fromEntries(results);
465
502
  }
503
+ async function fetchTokenListFile(chainId) {
504
+ const data = await fetch(getListUrl(chainId));
505
+ if (!data.ok) throw new Error(`HTTP error! status: ${data.status}`);
506
+ const json = await data.json();
507
+ return {
508
+ list: json.list,
509
+ mainTokens: json.mainTokens ?? []
510
+ };
511
+ }
512
+ var MAIN_TOKENS_URL = "https://raw.githubusercontent.com/1delta-DAO/token-lists/main/main-tokens.json";
513
+ async function fetchMainTokensMap() {
514
+ const data = await fetch(MAIN_TOKENS_URL);
515
+ if (!data.ok) return void 0;
516
+ return await data.json();
517
+ }
466
518
 
467
- export { GEARBOX_ACCOUNT_COMPRESSOR_V310, aaveOracles, aaveOraclesConfig, aavePools, aaveReserves, aaveTokens, aaveV4Oracles, aaveV4Peripherals, aaveV4SpokeLenderKey, aaveV4Spokes, aaveWethGateway, chainLogoURI, chains, compoundV2Oracles, compoundV2OraclesConfig, compoundV2Pools, compoundV2Reserves, compoundV2TokenArray, compoundV2Tokens, compoundV3BaseData, compoundV3Bulker, compoundV3OraclesData, compoundV3Pools, compoundV3Reserves, dolomiteChains, dolomiteConfigs, dolomiteEmode, dolomiteMarketIdByToken, eulerConfigs, eulerVaults, exactlyConfig, exactlyMarketByAddress, exactlyMarketByAsset, exactlyMarkets, exactlyMarketsByChain, fetchTokenList, fetchTokenLists, findAaveV4PositionManager, fluidChains, fluidResolvers, fluidVaultEntries, fluidVaults, gearboxAccountCompressor, gearboxAddressProviderV310, gearboxBotListV3, gearboxChains, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxResolvers, gearboxV3LenderKey, getAaveV4GatewayAddresses, getAaveV4PositionManagers, getAaveV4SpokeEntry, getAaveV4SpokePeripherals, getChainEntries, getSiloV2MarketEntry, getSiloV3MarketEntry, initConfig, initializeChainData, initializeLenderData, liquityBranchByIndex, liquityBranchByTroveManager, liquityBranchesByChain, liquityConfig, liquityConfigFor, liquityLendersByChain, liquityMarkets, listaNativeProvider, midnightApiBaseOverride, midnightConfig, midnightMarketById, midnightMarkets, midnightMarketsByChain, morphoBundler3, morphoOracles, morphoPools, morphoTypeMarkets, morphoTypeOracles, morphoTypeVaults, parseAaveV4SpokeLenderKey, parseGearboxV3LenderKey, parseSiloV2LenderKey, parseSiloV3LenderKey, resolveMidnightApiBase, resolveTermApiBase, riverChainData, riverConfig, riverConfigFor, riverLendersByChain, riverMarketByIndex, riverMarkets, setMidnightApiBase, setTermApiBase, siloMarkets, siloMarketsV3, siloPeripherals, siloPeripheralsV3, siloV2LenderKey, siloV3LenderKey, tellerConfig, tellerConfigByChain, tellerPoolByAddress, tellerPools, tellerPoolsByChain, termApiBaseOverride, termConfig, termMarketById, termMarkets, termMarketsByChain };
519
+ export { GEARBOX_ACCOUNT_COMPRESSOR_V310, aaveOracles, aaveOraclesConfig, aavePools, aaveReserves, aaveTokens, aaveV4Oracles, aaveV4Peripherals, aaveV4SpokeLenderKey, aaveV4Spokes, aaveWethGateway, chainLogoURI, chains, compoundV2Oracles, compoundV2OraclesConfig, compoundV2Pools, compoundV2Reserves, compoundV2TokenArray, compoundV2Tokens, compoundV3BaseData, compoundV3Bulker, compoundV3OraclesData, compoundV3Pools, compoundV3Reserves, dolomiteChains, dolomiteConfigs, dolomiteEmode, dolomiteMarketIdByToken, eulerConfigs, eulerVaults, exactlyConfig, exactlyMarketByAddress, exactlyMarketByAsset, exactlyMarkets, exactlyMarketsByChain, fetchMainTokensMap, fetchTokenList, fetchTokenListFile, fetchTokenLists, findAaveV4PositionManager, fluidChains, fluidResolvers, fluidVaultEntries, fluidVaults, gearboxAccountCompressor, gearboxAddressProviderV310, gearboxBotListV3, gearboxChains, gearboxMarketCompressor, gearboxMarketConfigurators, gearboxResolvers, gearboxV3LenderKey, getAaveV4GatewayAddresses, getAaveV4PositionManagers, getAaveV4SpokeEntry, getAaveV4SpokePeripherals, getChainEntries, getSiloV2MarketEntry, getSiloV3MarketEntry, initConfig, initializeChainData, initializeLenderData, inverseChainData, inverseConfig, inverseConfigFor, inverseLendersByChain, inverseMarketByAddress, inverseMarkets, liquityBranchByIndex, liquityBranchByTroveManager, liquityBranchesByChain, liquityConfig, liquityConfigFor, liquityLendersByChain, liquityMarkets, listaNativeProvider, midnightApiBaseOverride, midnightConfig, midnightMarketById, midnightMarkets, midnightMarketsByChain, morphoBundler3, morphoOracles, morphoPools, morphoTypeMarkets, morphoTypeOracles, morphoTypeVaults, parseAaveV4SpokeLenderKey, parseGearboxV3LenderKey, parseSiloV2LenderKey, parseSiloV3LenderKey, parseTermMaxLenderKey, resolveMidnightApiBase, resolveTermApiBase, riverChainData, riverConfig, riverConfigFor, riverLendersByChain, riverMarketByIndex, riverMarkets, setMidnightApiBase, setTermApiBase, siloMarkets, siloMarketsV3, siloPeripherals, siloPeripheralsV3, siloV2LenderKey, siloV3LenderKey, tellerConfig, tellerConfigByChain, tellerPoolByAddress, tellerPools, tellerPoolsByChain, termApiBaseOverride, termConfig, termMarketById, termMarkets, termMarketsByChain, termMaxApiBaseUrl, termMaxChainIds, termMaxConfig, termMaxConfigByChain, termMaxLenderKey };
package/dist/lending.d.ts CHANGED
@@ -457,6 +457,84 @@ export type RiverMarketsType = {
457
457
  [chainId: string]: RiverChainData;
458
458
  };
459
459
  };
460
+ /** Per-chain FiRM deployment seed (hand-maintained). */
461
+ export type InverseConfigChain = {
462
+ /** DOLA — the only debt asset. */
463
+ dola: string;
464
+ /** DBR — the prepaid-interest token (deficit gates borrows AND withdrawals). */
465
+ dbr: string;
466
+ /** Pessimistic oracle (2-day-low `viewPrice`). */
467
+ oracle: string;
468
+ /** BorrowController v4 (contract-caller allowlist; EOAs bypass). */
469
+ borrowController: string;
470
+ /** Debt decimals (18). */
471
+ debtDecimals?: number;
472
+ /** Metadata snapshot of the DBR price in DOLA (= fixed borrow APR as a
473
+ * decimal) — FALLBACK ONLY when the live API/AMM read fails. */
474
+ dbrPriceDolaSnapshot?: string;
475
+ };
476
+ export type InverseConfigType = {
477
+ [lender: string]: {
478
+ [chainId: string]: InverseConfigChain;
479
+ };
480
+ };
481
+ /** Per-chain, protocol-level (evergreen) TermMax addresses. */
482
+ export type TermMaxConfigChain = {
483
+ /** TermMaxRouterV2 — the native atomic write surface (borrow, repay, …). */
484
+ routerV2: string;
485
+ /** OracleAggregatorV2 — `getPrice(asset) → (price, decimals)`; the feed LTV
486
+ * and liquidation are computed against. */
487
+ oracleAggregatorV2: string;
488
+ /** TermMaxViewer — batch position/order reads (the user-data multicall target). */
489
+ viewer: string;
490
+ /** WhitelistManager — gates which markets/adapters the ROUTER will touch.
491
+ * Does NOT gate the market/order/GT primitives (those are permissionless). */
492
+ whitelistManager?: string | null;
493
+ /** TermMaxSwapAdapter — the router swap adapter that executes ORDER swaps
494
+ * inside a `SwapPath`. Required to build `borrowTokenFromCollateral`; the
495
+ * order swaps themselves can be called directly without it. */
496
+ termMaxSwapAdapter?: string | null;
497
+ /** Market factories, newest last. Used for event-based discovery when the
498
+ * API is unavailable; not needed on the happy path. */
499
+ marketFactories?: string[] | null;
500
+ /** Legacy V1 router — retired, kept only so a stale key can be recognised
501
+ * and rejected rather than silently encoded against. */
502
+ routerV1?: string | null;
503
+ /** TermMax data API base, e.g. `https://api.termmax.ts.finance`. Overridable
504
+ * per chain so a self-hosted indexer can be swapped in. */
505
+ apiBaseUrl?: string | null;
506
+ };
507
+ export type TermMaxConfigType = {
508
+ [chainId: string]: TermMaxConfigChain;
509
+ };
510
+ /** One FiRM market (= one Market contract, one collateral). */
511
+ export type InverseMarketConfig = {
512
+ /** Market contract — also the per-market lender-key suffix (`INVERSE_<ADDR>`). */
513
+ address: string;
514
+ collToken: string;
515
+ collDecimals: number;
516
+ /** Escrow implementation the Market clones per user (CREATE2 predict). */
517
+ escrowImplementation: string;
518
+ /** Owner-mutable params, snapshotted each metadata refresh. */
519
+ collateralFactorBps: string;
520
+ liquidationIncentiveBps: string;
521
+ liquidationFactorBps: string;
522
+ /** Smaller borrows revert (DOLA units, human number as string). */
523
+ minDebt: string;
524
+ /** Per-market daily borrow cap (DOLA, human number as string). */
525
+ dailyLimit: string;
526
+ borrowPaused?: boolean;
527
+ name?: string;
528
+ };
529
+ /** Generated per-chain data: the curated Market list. */
530
+ export type InverseChainData = {
531
+ markets: InverseMarketConfig[];
532
+ };
533
+ export type InverseMarketsType = {
534
+ [lender: string]: {
535
+ [chainId: string]: InverseChainData;
536
+ };
537
+ };
460
538
  type OracleMap = {
461
539
  [lender: string]: {
462
540
  [chainId: string]: string;
@@ -871,7 +949,7 @@ export type AaveV4PeripheralsType = {
871
949
  [chainId: string]: AaveV4ChainPeripherals;
872
950
  };
873
951
  /** Override datas used in the SDK - works across all module instances */
874
- export declare function initializeLenderData({ aaveTokensOverride, aavePoolsOverride, aaveOraclesOverride, compoundV2OraclesOverride, compoundV3OraclesDataOverride, compoundV3PoolsOverride, compoundV3BaseDataOverride, morphoPoolsOverride, compoundV2TokensOverride, compoundV2TokenArrayOverride, compoundV2PoolsOverride, initConfigOverride, aaveReservesOverride, compoundV3ReservesOverride, compoundV2ReservesOverride, morphoOraclesOverride, morphoTypeOraclesOverride, morphoTypeMarketsOverride, morphoTypeVaultsOverride, aaveOraclesConfigOverride, compoundV2OraclesConfigOverride, aaveWethGatewayOverride, morphoBundler3Override, listaNativeProviderOverride, midnightConfigOverride, midnightMarketsOverride, termConfigOverride, termMarketsOverride, exactlyConfigOverride, exactlyMarketsOverride, tellerConfigOverride, tellerPoolsOverride, liquityConfigOverride, liquityMarketsOverride, riverConfigOverride, riverMarketsOverride, compoundV3BulkerOverride, eulerConfigsOverride, eulerVaultsOverride, dolomiteConfigsOverride, dolomiteEmodeOverride, aaveV4SpokesOverride, aaveV4OraclesOverride, aaveV4PeripheralsOverride, siloMarketsOverride, siloPeripheralsOverride, siloMarketsV3Override, siloPeripheralsV3Override, fluidResolversOverride, fluidVaultsOverride, gearboxResolversOverride, }: {
952
+ export declare function initializeLenderData({ aaveTokensOverride, aavePoolsOverride, aaveOraclesOverride, compoundV2OraclesOverride, compoundV3OraclesDataOverride, compoundV3PoolsOverride, compoundV3BaseDataOverride, morphoPoolsOverride, compoundV2TokensOverride, compoundV2TokenArrayOverride, compoundV2PoolsOverride, initConfigOverride, aaveReservesOverride, compoundV3ReservesOverride, compoundV2ReservesOverride, morphoOraclesOverride, morphoTypeOraclesOverride, morphoTypeMarketsOverride, morphoTypeVaultsOverride, aaveOraclesConfigOverride, compoundV2OraclesConfigOverride, aaveWethGatewayOverride, morphoBundler3Override, listaNativeProviderOverride, midnightConfigOverride, midnightMarketsOverride, termConfigOverride, termMarketsOverride, exactlyConfigOverride, exactlyMarketsOverride, tellerConfigOverride, tellerPoolsOverride, liquityConfigOverride, liquityMarketsOverride, riverConfigOverride, riverMarketsOverride, inverseConfigOverride, termMaxConfigOverride, inverseMarketsOverride, compoundV3BulkerOverride, eulerConfigsOverride, eulerVaultsOverride, dolomiteConfigsOverride, dolomiteEmodeOverride, aaveV4SpokesOverride, aaveV4OraclesOverride, aaveV4PeripheralsOverride, siloMarketsOverride, siloPeripheralsOverride, siloMarketsV3Override, siloPeripheralsV3Override, fluidResolversOverride, fluidVaultsOverride, gearboxResolversOverride, }: {
875
953
  aaveTokensOverride?: AaveTokensType;
876
954
  aavePoolsOverride?: AavePoolsType;
877
955
  aaveOraclesOverride?: OracleMap;
@@ -908,6 +986,9 @@ export declare function initializeLenderData({ aaveTokensOverride, aavePoolsOver
908
986
  liquityMarketsOverride?: LiquityMarketsType;
909
987
  riverConfigOverride?: RiverConfigType;
910
988
  riverMarketsOverride?: RiverMarketsType;
989
+ inverseConfigOverride?: InverseConfigType;
990
+ termMaxConfigOverride?: TermMaxConfigType;
991
+ inverseMarketsOverride?: InverseMarketsType;
911
992
  compoundV3BulkerOverride?: CompoundV3BulkerType;
912
993
  eulerConfigsOverride?: EulerConfigsType;
913
994
  eulerVaultsOverride?: EulerVaultsType;
@@ -1006,10 +1087,32 @@ export declare const riverConfigFor: (lender: string, chainId: string | number)
1006
1087
  export declare const riverMarkets: () => RiverMarketsType;
1007
1088
  /** Generated chain data (minNetDebt + TroveManager list; undefined if unloaded). */
1008
1089
  export declare const riverChainData: (lender: string, chainId: string | number) => RiverChainData | undefined;
1090
+ export declare const inverseConfig: () => InverseConfigType;
1091
+ /** TermMax per-chain config map (undefined if unloaded). */
1092
+ export declare const termMaxConfig: () => TermMaxConfigType;
1093
+ /** TermMax deployment addresses for one chain (undefined if unloaded). */
1094
+ export declare const termMaxConfigByChain: (chainId: string | number) => TermMaxConfigChain | undefined;
1095
+ /** Chains with a TermMax deployment loaded. */
1096
+ export declare const termMaxChainIds: () => string[];
1097
+ /**
1098
+ * TermMax data API base for a chain. Read through the getter (not a module
1099
+ * constant) for the same reason as Midnight/Term: the per-request metadata
1100
+ * re-init rewrites `termMaxConfig`, so a captured value goes stale.
1101
+ */
1102
+ export declare const termMaxApiBaseUrl: (chainId: string | number) => string;
1103
+ /** Deployment seed for one Inverse lender on a chain (undefined if unloaded). */
1104
+ export declare const inverseConfigFor: (lender: string, chainId: string | number) => InverseConfigChain | undefined;
1105
+ export declare const inverseMarkets: () => InverseMarketsType;
1106
+ /** Generated chain data (curated Market list; undefined if unloaded). */
1107
+ export declare const inverseChainData: (lender: string, chainId: string | number) => InverseChainData | undefined;
1108
+ /** Find one FiRM market by its Market contract address. */
1109
+ export declare const inverseMarketByAddress: (lender: string, chainId: string | number, address: string) => InverseMarketConfig | undefined;
1009
1110
  /** Look up one River market by its factory index (the per-market key suffix). */
1010
1111
  export declare const riverMarketByIndex: (lender: string, chainId: string | number, index: number | string) => RiverMarketConfig | undefined;
1011
1112
  /** All River lender keys with config on a chain (drives getLendersForChain). */
1012
1113
  export declare const riverLendersByChain: (chainId: string | number) => string[];
1114
+ /** All Inverse lender keys with config on a chain (drives getLendersForChain). */
1115
+ export declare const inverseLendersByChain: (chainId: string | number) => string[];
1013
1116
  export declare const compoundV3Bulker: () => CompoundV3BulkerType;
1014
1117
  export declare const eulerConfigs: () => EulerConfigsType;
1015
1118
  export declare const eulerVaults: () => EulerVaultsType;
@@ -1221,4 +1324,28 @@ export declare function gearboxV3LenderKey(creditManager: string): string;
1221
1324
  export declare function parseGearboxV3LenderKey(lenderKey: string): {
1222
1325
  creditManagerAddrLower: string;
1223
1326
  } | undefined;
1327
+ /**
1328
+ * Synthesize the per-market lender key for a TermMax market.
1329
+ *
1330
+ * Mirrors `EXACTLY_<MARKET_ADDRESS_HEX>` / `TELLER_<POOL_ADDRESS_HEX>`. One key
1331
+ * per TermMax market, i.e. per (debtToken, collateral, maturity) tuple — the
1332
+ * maturity is baked into the market contract, so unlike Exactly there is NO
1333
+ * `terms[]` menu underneath a key.
1334
+ *
1335
+ * Format: `TERMMAX_${marketAddr.slice(2).toUpperCase()}`
1336
+ *
1337
+ * chainId is intentionally NOT in the token (chain scoping happens at the
1338
+ * marketUid level), matching every other per-market key in this file.
1339
+ *
1340
+ * `isTermMax()` works on this because it matches `startsWith('TERMMAX')`.
1341
+ */
1342
+ export declare function termMaxLenderKey(market: string): string;
1343
+ /**
1344
+ * Inverse of `termMaxLenderKey`: given a per-market lender key, return
1345
+ * `{ marketAddrLower }`. Returns `undefined` if the key isn't a per-market
1346
+ * TermMax key (e.g. someone passed the bare prefix `TERMMAX`).
1347
+ */
1348
+ export declare function parseTermMaxLenderKey(lenderKey: string): {
1349
+ marketAddrLower: string;
1350
+ } | undefined;
1224
1351
  export {};
package/dist/tokens.d.ts CHANGED
@@ -17,4 +17,24 @@ export declare function fetchTokenList(chainId: string): Promise<TokenList>;
17
17
  export declare function fetchTokenLists(chainIds: string[]): Promise<{
18
18
  [chainId: string]: TokenList;
19
19
  }>;
20
+ export interface TokenListFileData {
21
+ list: TokenList;
22
+ /**
23
+ * Curated "main" token addresses (lowercase, native = zero address first).
24
+ * The full lists can hold tens of thousands of entries — mainTokens is the
25
+ * small subset intended for balance scans and default UI selections.
26
+ */
27
+ mainTokens: string[];
28
+ }
29
+ /** Like {@link fetchTokenList} but keeps the `mainTokens` curation. */
30
+ export declare function fetchTokenListFile(chainId: string): Promise<TokenListFileData>;
31
+ /**
32
+ * Aggregated chainId → mainTokens map (one small file for all chains, so
33
+ * multi-chain consumers avoid downloading N full lists). Returns undefined
34
+ * while the file is not yet published — callers fall back to
35
+ * {@link fetchTokenListFile} per chain.
36
+ */
37
+ export declare function fetchMainTokensMap(): Promise<{
38
+ [chainId: string]: string[];
39
+ } | undefined>;
20
40
  export {};
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.0.35",
7
+ "version": "0.0.36",
8
8
  "description": "Hold and initialize lending protocol data across a stack",
9
9
  "files": [
10
10
  "dist"