@1delta/data-sdk 0.0.35 → 0.0.37

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,11 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
77
77
  liquityMarkets: {},
78
78
  riverConfig: {},
79
79
  riverMarkets: {},
80
+ inverseConfig: {},
81
+ termMaxConfig: {},
82
+ inverseMarkets: {},
83
+ usddConfig: {},
84
+ usddMarkets: {},
80
85
  compoundV3Bulker: {},
81
86
  eulerConfigs: {},
82
87
  eulerVaults: {},
@@ -137,6 +142,11 @@ function initializeLenderData({
137
142
  liquityMarketsOverride,
138
143
  riverConfigOverride,
139
144
  riverMarketsOverride,
145
+ inverseConfigOverride,
146
+ termMaxConfigOverride,
147
+ inverseMarketsOverride,
148
+ usddConfigOverride,
149
+ usddMarketsOverride,
140
150
  compoundV3BulkerOverride,
141
151
  eulerConfigsOverride,
142
152
  eulerVaultsOverride,
@@ -190,6 +200,11 @@ function initializeLenderData({
190
200
  if (liquityMarketsOverride) data.liquityMarkets = liquityMarketsOverride;
191
201
  if (riverConfigOverride) data.riverConfig = riverConfigOverride;
192
202
  if (riverMarketsOverride) data.riverMarkets = riverMarketsOverride;
203
+ if (inverseConfigOverride) data.inverseConfig = inverseConfigOverride;
204
+ if (termMaxConfigOverride) data.termMaxConfig = termMaxConfigOverride;
205
+ if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
206
+ if (usddConfigOverride) data.usddConfig = usddConfigOverride;
207
+ if (usddMarketsOverride) data.usddMarkets = usddMarketsOverride;
193
208
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
194
209
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
195
210
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -197,13 +212,11 @@ function initializeLenderData({
197
212
  if (dolomiteEmodeOverride) data.dolomiteEmode = dolomiteEmodeOverride;
198
213
  if (aaveV4SpokesOverride) data.aaveV4Spokes = aaveV4SpokesOverride;
199
214
  if (aaveV4OraclesOverride) data.aaveV4Oracles = aaveV4OraclesOverride;
200
- if (aaveV4PeripheralsOverride)
201
- data.aaveV4Peripherals = aaveV4PeripheralsOverride;
215
+ if (aaveV4PeripheralsOverride) data.aaveV4Peripherals = aaveV4PeripheralsOverride;
202
216
  if (siloMarketsOverride) data.siloMarkets = siloMarketsOverride;
203
217
  if (siloPeripheralsOverride) data.siloPeripherals = siloPeripheralsOverride;
204
218
  if (siloMarketsV3Override) data.siloMarketsV3 = siloMarketsV3Override;
205
- if (siloPeripheralsV3Override)
206
- data.siloPeripheralsV3 = siloPeripheralsV3Override;
219
+ if (siloPeripheralsV3Override) data.siloPeripheralsV3 = siloPeripheralsV3Override;
207
220
  if (fluidResolversOverride) data.fluidResolvers = fluidResolversOverride;
208
221
  if (fluidVaultsOverride) data.fluidVaults = fluidVaultsOverride;
209
222
  if (gearboxResolversOverride) data.gearboxResolvers = gearboxResolversOverride;
@@ -294,9 +307,7 @@ var liquityBranchesByChain = (lender, chainId) => getGlobalData2()?.liquityMarke
294
307
  var liquityBranchByIndex = (lender, chainId, collIndex) => liquityBranchesByChain(lender, chainId).find((b) => b.collIndex === Number(collIndex));
295
308
  var liquityBranchByTroveManager = (lender, chainId, troveManager) => {
296
309
  const lower = troveManager.toLowerCase();
297
- return liquityBranchesByChain(lender, chainId).find(
298
- (b) => b.troveManager.toLowerCase() === lower
299
- );
310
+ return liquityBranchesByChain(lender, chainId).find((b) => b.troveManager.toLowerCase() === lower);
300
311
  };
301
312
  var liquityLendersByChain = (chainId) => {
302
313
  const cfg = getGlobalData2()?.liquityConfig ?? {};
@@ -307,12 +318,39 @@ var riverConfig = () => getGlobalData2()?.riverConfig;
307
318
  var riverConfigFor = (lender, chainId) => getGlobalData2()?.riverConfig?.[lender]?.[String(chainId)];
308
319
  var riverMarkets = () => getGlobalData2()?.riverMarkets;
309
320
  var riverChainData = (lender, chainId) => getGlobalData2()?.riverMarkets?.[lender]?.[String(chainId)];
321
+ var inverseConfig = () => getGlobalData2()?.inverseConfig;
322
+ var termMaxConfig = () => getGlobalData2()?.termMaxConfig;
323
+ var termMaxConfigByChain = (chainId) => getGlobalData2()?.termMaxConfig?.[String(chainId)];
324
+ var termMaxChainIds = () => Object.keys(getGlobalData2()?.termMaxConfig ?? {});
325
+ var termMaxApiBaseUrl = (chainId) => termMaxConfigByChain(chainId)?.apiBaseUrl || "https://api.termmax.ts.finance";
326
+ var inverseConfigFor = (lender, chainId) => getGlobalData2()?.inverseConfig?.[lender]?.[String(chainId)];
327
+ var inverseMarkets = () => getGlobalData2()?.inverseMarkets;
328
+ var inverseChainData = (lender, chainId) => getGlobalData2()?.inverseMarkets?.[lender]?.[String(chainId)];
329
+ var inverseMarketByAddress = (lender, chainId, address) => {
330
+ const lower = address.toLowerCase();
331
+ return inverseChainData(lender, chainId)?.markets?.find((m) => m.address.toLowerCase() === lower);
332
+ };
310
333
  var riverMarketByIndex = (lender, chainId, index) => riverChainData(lender, chainId)?.markets?.find((m) => m.index === Number(index));
311
334
  var riverLendersByChain = (chainId) => {
312
335
  const cfg = getGlobalData2()?.riverConfig ?? {};
313
336
  const chain = String(chainId);
314
337
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.xapp);
315
338
  };
339
+ var inverseLendersByChain = (chainId) => {
340
+ const cfg = getGlobalData2()?.inverseConfig ?? {};
341
+ const chain = String(chainId);
342
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
343
+ };
344
+ var usddConfig = () => getGlobalData2()?.usddConfig;
345
+ var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
346
+ var usddMarkets = () => getGlobalData2()?.usddMarkets;
347
+ var usddChainData = (lender, chainId) => getGlobalData2()?.usddMarkets?.[lender]?.[String(chainId)];
348
+ var usddMarketByIlk = (lender, chainId, ilk) => usddChainData(lender, chainId)?.markets?.find((m) => m.ilk === ilk);
349
+ var usddLendersByChain = (chainId) => {
350
+ const cfg = getGlobalData2()?.usddConfig ?? {};
351
+ const chain = String(chainId);
352
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
353
+ };
316
354
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
317
355
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
318
356
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -412,9 +450,7 @@ function getSiloV2MarketEntry(chainId, lenderKey) {
412
450
  if (!parsed) return void 0;
413
451
  const list = getGlobalData2()?.siloMarkets?.[chainId];
414
452
  if (!list) return void 0;
415
- return list.find(
416
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
417
- );
453
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
418
454
  }
419
455
  function siloV3LenderKey(siloConfig) {
420
456
  if (!siloConfig || !siloConfig.startsWith("0x") || siloConfig.length !== 42) {
@@ -432,15 +468,11 @@ function getSiloV3MarketEntry(chainId, lenderKey) {
432
468
  if (!parsed) return void 0;
433
469
  const list = getGlobalData2()?.siloMarketsV3?.[chainId];
434
470
  if (!list) return void 0;
435
- return list.find(
436
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
437
- );
471
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
438
472
  }
439
473
  function gearboxV3LenderKey(creditManager) {
440
474
  if (!creditManager || !creditManager.startsWith("0x") || creditManager.length !== 42) {
441
- throw new Error(
442
- `gearboxV3LenderKey: invalid creditManager address ${creditManager}`
443
- );
475
+ throw new Error(`gearboxV3LenderKey: invalid creditManager address ${creditManager}`);
444
476
  }
445
477
  return `GEARBOX_V3_${creditManager.slice(2).toUpperCase()}`;
446
478
  }
@@ -449,6 +481,17 @@ function parseGearboxV3LenderKey(lenderKey) {
449
481
  if (!match) return void 0;
450
482
  return { creditManagerAddrLower: "0x" + match[1].toLowerCase() };
451
483
  }
484
+ function termMaxLenderKey(market) {
485
+ if (!market || !market.startsWith("0x") || market.length !== 42) {
486
+ throw new Error(`termMaxLenderKey: invalid market address ${market}`);
487
+ }
488
+ return `TERMMAX_${market.slice(2).toUpperCase()}`;
489
+ }
490
+ function parseTermMaxLenderKey(lenderKey) {
491
+ const match = lenderKey.match(/^TERMMAX_([0-9A-Fa-f]{40})$/);
492
+ if (!match) return void 0;
493
+ return { marketAddrLower: "0x" + match[1].toLowerCase() };
494
+ }
452
495
 
453
496
  // src/tokens.ts
454
497
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -465,6 +508,21 @@ async function fetchTokenLists(chainIds) {
465
508
  const results = await Promise.all(promises);
466
509
  return Object.fromEntries(results);
467
510
  }
511
+ async function fetchTokenListFile(chainId) {
512
+ const data = await fetch(getListUrl(chainId));
513
+ if (!data.ok) throw new Error(`HTTP error! status: ${data.status}`);
514
+ const json = await data.json();
515
+ return {
516
+ list: json.list,
517
+ mainTokens: json.mainTokens ?? []
518
+ };
519
+ }
520
+ var MAIN_TOKENS_URL = "https://raw.githubusercontent.com/1delta-DAO/token-lists/main/main-tokens.json";
521
+ async function fetchMainTokensMap() {
522
+ const data = await fetch(MAIN_TOKENS_URL);
523
+ if (!data.ok) return void 0;
524
+ return await data.json();
525
+ }
468
526
 
469
527
  exports.GEARBOX_ACCOUNT_COMPRESSOR_V310 = GEARBOX_ACCOUNT_COMPRESSOR_V310;
470
528
  exports.aaveOracles = aaveOracles;
@@ -501,7 +559,9 @@ exports.exactlyMarketByAddress = exactlyMarketByAddress;
501
559
  exports.exactlyMarketByAsset = exactlyMarketByAsset;
502
560
  exports.exactlyMarkets = exactlyMarkets;
503
561
  exports.exactlyMarketsByChain = exactlyMarketsByChain;
562
+ exports.fetchMainTokensMap = fetchMainTokensMap;
504
563
  exports.fetchTokenList = fetchTokenList;
564
+ exports.fetchTokenListFile = fetchTokenListFile;
505
565
  exports.fetchTokenLists = fetchTokenLists;
506
566
  exports.findAaveV4PositionManager = findAaveV4PositionManager;
507
567
  exports.fluidChains = fluidChains;
@@ -526,6 +586,12 @@ exports.getSiloV3MarketEntry = getSiloV3MarketEntry;
526
586
  exports.initConfig = initConfig;
527
587
  exports.initializeChainData = initializeChainData;
528
588
  exports.initializeLenderData = initializeLenderData;
589
+ exports.inverseChainData = inverseChainData;
590
+ exports.inverseConfig = inverseConfig;
591
+ exports.inverseConfigFor = inverseConfigFor;
592
+ exports.inverseLendersByChain = inverseLendersByChain;
593
+ exports.inverseMarketByAddress = inverseMarketByAddress;
594
+ exports.inverseMarkets = inverseMarkets;
529
595
  exports.liquityBranchByIndex = liquityBranchByIndex;
530
596
  exports.liquityBranchByTroveManager = liquityBranchByTroveManager;
531
597
  exports.liquityBranchesByChain = liquityBranchesByChain;
@@ -549,6 +615,7 @@ exports.parseAaveV4SpokeLenderKey = parseAaveV4SpokeLenderKey;
549
615
  exports.parseGearboxV3LenderKey = parseGearboxV3LenderKey;
550
616
  exports.parseSiloV2LenderKey = parseSiloV2LenderKey;
551
617
  exports.parseSiloV3LenderKey = parseSiloV3LenderKey;
618
+ exports.parseTermMaxLenderKey = parseTermMaxLenderKey;
552
619
  exports.resolveMidnightApiBase = resolveMidnightApiBase;
553
620
  exports.resolveTermApiBase = resolveTermApiBase;
554
621
  exports.riverChainData = riverChainData;
@@ -575,3 +642,14 @@ exports.termConfig = termConfig;
575
642
  exports.termMarketById = termMarketById;
576
643
  exports.termMarkets = termMarkets;
577
644
  exports.termMarketsByChain = termMarketsByChain;
645
+ exports.termMaxApiBaseUrl = termMaxApiBaseUrl;
646
+ exports.termMaxChainIds = termMaxChainIds;
647
+ exports.termMaxConfig = termMaxConfig;
648
+ exports.termMaxConfigByChain = termMaxConfigByChain;
649
+ exports.termMaxLenderKey = termMaxLenderKey;
650
+ exports.usddChainData = usddChainData;
651
+ exports.usddConfig = usddConfig;
652
+ exports.usddConfigFor = usddConfigFor;
653
+ exports.usddLendersByChain = usddLendersByChain;
654
+ exports.usddMarketByIlk = usddMarketByIlk;
655
+ exports.usddMarkets = usddMarkets;
package/dist/index.mjs CHANGED
@@ -75,6 +75,11 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
75
75
  liquityMarkets: {},
76
76
  riverConfig: {},
77
77
  riverMarkets: {},
78
+ inverseConfig: {},
79
+ termMaxConfig: {},
80
+ inverseMarkets: {},
81
+ usddConfig: {},
82
+ usddMarkets: {},
78
83
  compoundV3Bulker: {},
79
84
  eulerConfigs: {},
80
85
  eulerVaults: {},
@@ -135,6 +140,11 @@ function initializeLenderData({
135
140
  liquityMarketsOverride,
136
141
  riverConfigOverride,
137
142
  riverMarketsOverride,
143
+ inverseConfigOverride,
144
+ termMaxConfigOverride,
145
+ inverseMarketsOverride,
146
+ usddConfigOverride,
147
+ usddMarketsOverride,
138
148
  compoundV3BulkerOverride,
139
149
  eulerConfigsOverride,
140
150
  eulerVaultsOverride,
@@ -188,6 +198,11 @@ function initializeLenderData({
188
198
  if (liquityMarketsOverride) data.liquityMarkets = liquityMarketsOverride;
189
199
  if (riverConfigOverride) data.riverConfig = riverConfigOverride;
190
200
  if (riverMarketsOverride) data.riverMarkets = riverMarketsOverride;
201
+ if (inverseConfigOverride) data.inverseConfig = inverseConfigOverride;
202
+ if (termMaxConfigOverride) data.termMaxConfig = termMaxConfigOverride;
203
+ if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
204
+ if (usddConfigOverride) data.usddConfig = usddConfigOverride;
205
+ if (usddMarketsOverride) data.usddMarkets = usddMarketsOverride;
191
206
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
192
207
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
193
208
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -195,13 +210,11 @@ function initializeLenderData({
195
210
  if (dolomiteEmodeOverride) data.dolomiteEmode = dolomiteEmodeOverride;
196
211
  if (aaveV4SpokesOverride) data.aaveV4Spokes = aaveV4SpokesOverride;
197
212
  if (aaveV4OraclesOverride) data.aaveV4Oracles = aaveV4OraclesOverride;
198
- if (aaveV4PeripheralsOverride)
199
- data.aaveV4Peripherals = aaveV4PeripheralsOverride;
213
+ if (aaveV4PeripheralsOverride) data.aaveV4Peripherals = aaveV4PeripheralsOverride;
200
214
  if (siloMarketsOverride) data.siloMarkets = siloMarketsOverride;
201
215
  if (siloPeripheralsOverride) data.siloPeripherals = siloPeripheralsOverride;
202
216
  if (siloMarketsV3Override) data.siloMarketsV3 = siloMarketsV3Override;
203
- if (siloPeripheralsV3Override)
204
- data.siloPeripheralsV3 = siloPeripheralsV3Override;
217
+ if (siloPeripheralsV3Override) data.siloPeripheralsV3 = siloPeripheralsV3Override;
205
218
  if (fluidResolversOverride) data.fluidResolvers = fluidResolversOverride;
206
219
  if (fluidVaultsOverride) data.fluidVaults = fluidVaultsOverride;
207
220
  if (gearboxResolversOverride) data.gearboxResolvers = gearboxResolversOverride;
@@ -292,9 +305,7 @@ var liquityBranchesByChain = (lender, chainId) => getGlobalData2()?.liquityMarke
292
305
  var liquityBranchByIndex = (lender, chainId, collIndex) => liquityBranchesByChain(lender, chainId).find((b) => b.collIndex === Number(collIndex));
293
306
  var liquityBranchByTroveManager = (lender, chainId, troveManager) => {
294
307
  const lower = troveManager.toLowerCase();
295
- return liquityBranchesByChain(lender, chainId).find(
296
- (b) => b.troveManager.toLowerCase() === lower
297
- );
308
+ return liquityBranchesByChain(lender, chainId).find((b) => b.troveManager.toLowerCase() === lower);
298
309
  };
299
310
  var liquityLendersByChain = (chainId) => {
300
311
  const cfg = getGlobalData2()?.liquityConfig ?? {};
@@ -305,12 +316,39 @@ var riverConfig = () => getGlobalData2()?.riverConfig;
305
316
  var riverConfigFor = (lender, chainId) => getGlobalData2()?.riverConfig?.[lender]?.[String(chainId)];
306
317
  var riverMarkets = () => getGlobalData2()?.riverMarkets;
307
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
+ };
308
331
  var riverMarketByIndex = (lender, chainId, index) => riverChainData(lender, chainId)?.markets?.find((m) => m.index === Number(index));
309
332
  var riverLendersByChain = (chainId) => {
310
333
  const cfg = getGlobalData2()?.riverConfig ?? {};
311
334
  const chain = String(chainId);
312
335
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.xapp);
313
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
+ };
342
+ var usddConfig = () => getGlobalData2()?.usddConfig;
343
+ var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
344
+ var usddMarkets = () => getGlobalData2()?.usddMarkets;
345
+ var usddChainData = (lender, chainId) => getGlobalData2()?.usddMarkets?.[lender]?.[String(chainId)];
346
+ var usddMarketByIlk = (lender, chainId, ilk) => usddChainData(lender, chainId)?.markets?.find((m) => m.ilk === ilk);
347
+ var usddLendersByChain = (chainId) => {
348
+ const cfg = getGlobalData2()?.usddConfig ?? {};
349
+ const chain = String(chainId);
350
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
351
+ };
314
352
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
315
353
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
316
354
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -410,9 +448,7 @@ function getSiloV2MarketEntry(chainId, lenderKey) {
410
448
  if (!parsed) return void 0;
411
449
  const list = getGlobalData2()?.siloMarkets?.[chainId];
412
450
  if (!list) return void 0;
413
- return list.find(
414
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
415
- );
451
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
416
452
  }
417
453
  function siloV3LenderKey(siloConfig) {
418
454
  if (!siloConfig || !siloConfig.startsWith("0x") || siloConfig.length !== 42) {
@@ -430,15 +466,11 @@ function getSiloV3MarketEntry(chainId, lenderKey) {
430
466
  if (!parsed) return void 0;
431
467
  const list = getGlobalData2()?.siloMarketsV3?.[chainId];
432
468
  if (!list) return void 0;
433
- return list.find(
434
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
435
- );
469
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
436
470
  }
437
471
  function gearboxV3LenderKey(creditManager) {
438
472
  if (!creditManager || !creditManager.startsWith("0x") || creditManager.length !== 42) {
439
- throw new Error(
440
- `gearboxV3LenderKey: invalid creditManager address ${creditManager}`
441
- );
473
+ throw new Error(`gearboxV3LenderKey: invalid creditManager address ${creditManager}`);
442
474
  }
443
475
  return `GEARBOX_V3_${creditManager.slice(2).toUpperCase()}`;
444
476
  }
@@ -447,6 +479,17 @@ function parseGearboxV3LenderKey(lenderKey) {
447
479
  if (!match) return void 0;
448
480
  return { creditManagerAddrLower: "0x" + match[1].toLowerCase() };
449
481
  }
482
+ function termMaxLenderKey(market) {
483
+ if (!market || !market.startsWith("0x") || market.length !== 42) {
484
+ throw new Error(`termMaxLenderKey: invalid market address ${market}`);
485
+ }
486
+ return `TERMMAX_${market.slice(2).toUpperCase()}`;
487
+ }
488
+ function parseTermMaxLenderKey(lenderKey) {
489
+ const match = lenderKey.match(/^TERMMAX_([0-9A-Fa-f]{40})$/);
490
+ if (!match) return void 0;
491
+ return { marketAddrLower: "0x" + match[1].toLowerCase() };
492
+ }
450
493
 
451
494
  // src/tokens.ts
452
495
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -463,5 +506,20 @@ async function fetchTokenLists(chainIds) {
463
506
  const results = await Promise.all(promises);
464
507
  return Object.fromEntries(results);
465
508
  }
509
+ async function fetchTokenListFile(chainId) {
510
+ const data = await fetch(getListUrl(chainId));
511
+ if (!data.ok) throw new Error(`HTTP error! status: ${data.status}`);
512
+ const json = await data.json();
513
+ return {
514
+ list: json.list,
515
+ mainTokens: json.mainTokens ?? []
516
+ };
517
+ }
518
+ var MAIN_TOKENS_URL = "https://raw.githubusercontent.com/1delta-DAO/token-lists/main/main-tokens.json";
519
+ async function fetchMainTokensMap() {
520
+ const data = await fetch(MAIN_TOKENS_URL);
521
+ if (!data.ok) return void 0;
522
+ return await data.json();
523
+ }
466
524
 
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 };
525
+ 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, usddChainData, usddConfig, usddConfigFor, usddLendersByChain, usddMarketByIlk, usddMarkets };
package/dist/lending.d.ts CHANGED
@@ -457,6 +457,167 @@ 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
+ };
538
+ /** One USDD PSM (1:1 stable swap module; NOT a lending market). */
539
+ export type UsddPsmConfig = {
540
+ ilk: string;
541
+ psm: string;
542
+ /** Approval target for `sellGem` (the PSM's own gem adapter). */
543
+ gemJoin: string;
544
+ gem: string;
545
+ gemSymbol?: string;
546
+ /** 6 on Ethereum (USDT/USDC), 18 on BNB (BSC-USDT). */
547
+ gemDecimals: number;
548
+ };
549
+ /** Per-chain USDD deployment seed (hand-maintained). */
550
+ export type UsddConfigChain = {
551
+ /** Core accounting engine — ilk params + urns live here. */
552
+ vat: string;
553
+ /** Stability-fee module (`ilks(ilk).duty`, per-second ray). */
554
+ jug: string;
555
+ /** Oracle liaison (`ilks(ilk)` → pip + mat). */
556
+ spot: string;
557
+ /** Liquidation module (clip, chop, hole per ilk). */
558
+ dog: string;
559
+ /** DssCdpManager — CDP ids, urn handles, `cdpAllow` grants. */
560
+ cdpManager: string;
561
+ /** DssProxyActions — the atomic one-shot target (via DSProxy.execute). */
562
+ proxyActions: string;
563
+ /** ProxyRegistry — `proxies(user)` / `build()` for the DSProxy route. */
564
+ proxyRegistry: string;
565
+ /** The debt token. */
566
+ usdd: string;
567
+ /** DaiJoin-equivalent for USDD enter/exit. */
568
+ usddJoin: string;
569
+ /** Debt decimals (18). */
570
+ debtDecimals?: number;
571
+ /** The savings Pot (sDAI-style; savings side lives in margin-fetcher's
572
+ * SAVINGS_REGISTRY, carried here for completeness). */
573
+ pot?: string;
574
+ susdd?: string;
575
+ /** 1:1 stable PSMs (swap modules — not lending markets). */
576
+ psms?: UsddPsmConfig[];
577
+ };
578
+ export type UsddConfigType = {
579
+ [lender: string]: {
580
+ [chainId: string]: UsddConfigChain;
581
+ };
582
+ };
583
+ /** One USDD market (= one collateral ilk). */
584
+ export type UsddMarketConfig = {
585
+ /** Ilk string (e.g. `WBTC-A`) — also the per-market key suffix
586
+ * (`USDD_<chainId>_<ILK>`). bytes32-encode via stringToHex(size 32). */
587
+ ilk: string;
588
+ /** Collateral adapter — approval target for deposits. */
589
+ gemJoin: string;
590
+ collToken: string;
591
+ collDecimals: number;
592
+ collSymbol?: string;
593
+ /** Price feed behind the Spot (OSM/Median). */
594
+ pip?: string;
595
+ /** Liquidation ratio, ray (Spot.mat). */
596
+ mat: string;
597
+ /** Per-second stability fee, ray (Jug.duty). */
598
+ duty: string;
599
+ /** Dutch-auction contract (Dog.clip). */
600
+ clip?: string;
601
+ /** Liquidation penalty, wad (Dog.chop; 1e18 = none). */
602
+ chop?: string;
603
+ /** Debt ceiling, rad (Vat.ilks.line). */
604
+ line: string;
605
+ /** Per-CDP debt floor, rad (Vat.ilks.dust). */
606
+ dust: string;
607
+ name?: string;
608
+ };
609
+ /** Generated per-chain data: verified ilk list + the cdpi trigger snapshot. */
610
+ export type UsddChainData = {
611
+ markets: UsddMarketConfig[];
612
+ /** `cdpManager.cdpi()` at generation time — the USDD_PLAN.md
613
+ * re-evaluation trigger (0 = no CDP ever opened on this chain). */
614
+ cdpi?: string;
615
+ };
616
+ export type UsddMarketsType = {
617
+ [lender: string]: {
618
+ [chainId: string]: UsddChainData;
619
+ };
620
+ };
460
621
  type OracleMap = {
461
622
  [lender: string]: {
462
623
  [chainId: string]: string;
@@ -871,7 +1032,7 @@ export type AaveV4PeripheralsType = {
871
1032
  [chainId: string]: AaveV4ChainPeripherals;
872
1033
  };
873
1034
  /** 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, }: {
1035
+ 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, usddConfigOverride, usddMarketsOverride, compoundV3BulkerOverride, eulerConfigsOverride, eulerVaultsOverride, dolomiteConfigsOverride, dolomiteEmodeOverride, aaveV4SpokesOverride, aaveV4OraclesOverride, aaveV4PeripheralsOverride, siloMarketsOverride, siloPeripheralsOverride, siloMarketsV3Override, siloPeripheralsV3Override, fluidResolversOverride, fluidVaultsOverride, gearboxResolversOverride, }: {
875
1036
  aaveTokensOverride?: AaveTokensType;
876
1037
  aavePoolsOverride?: AavePoolsType;
877
1038
  aaveOraclesOverride?: OracleMap;
@@ -908,6 +1069,11 @@ export declare function initializeLenderData({ aaveTokensOverride, aavePoolsOver
908
1069
  liquityMarketsOverride?: LiquityMarketsType;
909
1070
  riverConfigOverride?: RiverConfigType;
910
1071
  riverMarketsOverride?: RiverMarketsType;
1072
+ inverseConfigOverride?: InverseConfigType;
1073
+ termMaxConfigOverride?: TermMaxConfigType;
1074
+ inverseMarketsOverride?: InverseMarketsType;
1075
+ usddConfigOverride?: UsddConfigType;
1076
+ usddMarketsOverride?: UsddMarketsType;
911
1077
  compoundV3BulkerOverride?: CompoundV3BulkerType;
912
1078
  eulerConfigsOverride?: EulerConfigsType;
913
1079
  eulerVaultsOverride?: EulerVaultsType;
@@ -1006,10 +1172,45 @@ export declare const riverConfigFor: (lender: string, chainId: string | number)
1006
1172
  export declare const riverMarkets: () => RiverMarketsType;
1007
1173
  /** Generated chain data (minNetDebt + TroveManager list; undefined if unloaded). */
1008
1174
  export declare const riverChainData: (lender: string, chainId: string | number) => RiverChainData | undefined;
1175
+ export declare const inverseConfig: () => InverseConfigType;
1176
+ /** TermMax per-chain config map (undefined if unloaded). */
1177
+ export declare const termMaxConfig: () => TermMaxConfigType;
1178
+ /** TermMax deployment addresses for one chain (undefined if unloaded). */
1179
+ export declare const termMaxConfigByChain: (chainId: string | number) => TermMaxConfigChain | undefined;
1180
+ /** Chains with a TermMax deployment loaded. */
1181
+ export declare const termMaxChainIds: () => string[];
1182
+ /**
1183
+ * TermMax data API base for a chain. Read through the getter (not a module
1184
+ * constant) for the same reason as Midnight/Term: the per-request metadata
1185
+ * re-init rewrites `termMaxConfig`, so a captured value goes stale.
1186
+ */
1187
+ export declare const termMaxApiBaseUrl: (chainId: string | number) => string;
1188
+ /** Deployment seed for one Inverse lender on a chain (undefined if unloaded). */
1189
+ export declare const inverseConfigFor: (lender: string, chainId: string | number) => InverseConfigChain | undefined;
1190
+ export declare const inverseMarkets: () => InverseMarketsType;
1191
+ /** Generated chain data (curated Market list; undefined if unloaded). */
1192
+ export declare const inverseChainData: (lender: string, chainId: string | number) => InverseChainData | undefined;
1193
+ /** Find one FiRM market by its Market contract address. */
1194
+ export declare const inverseMarketByAddress: (lender: string, chainId: string | number, address: string) => InverseMarketConfig | undefined;
1009
1195
  /** Look up one River market by its factory index (the per-market key suffix). */
1010
1196
  export declare const riverMarketByIndex: (lender: string, chainId: string | number, index: number | string) => RiverMarketConfig | undefined;
1011
1197
  /** All River lender keys with config on a chain (drives getLendersForChain). */
1012
1198
  export declare const riverLendersByChain: (chainId: string | number) => string[];
1199
+ /** All Inverse lender keys with config on a chain (drives getLendersForChain). */
1200
+ export declare const inverseLendersByChain: (chainId: string | number) => string[];
1201
+ export declare const usddConfig: () => UsddConfigType;
1202
+ /** Deployment seed for one USDD lender on a chain (undefined if unloaded). */
1203
+ export declare const usddConfigFor: (lender: string, chainId: string | number) => UsddConfigChain | undefined;
1204
+ export declare const usddMarkets: () => UsddMarketsType;
1205
+ /** Generated chain data (verified ilk list + cdpi snapshot; undefined if unloaded). */
1206
+ export declare const usddChainData: (lender: string, chainId: string | number) => UsddChainData | undefined;
1207
+ /** Look up one USDD market by its ilk string (the per-market key suffix). */
1208
+ export declare const usddMarketByIlk: (lender: string, chainId: string | number, ilk: string) => UsddMarketConfig | undefined;
1209
+ /** All USDD lender keys with config on a chain (drives getLendersForChain).
1210
+ * NB: config presence (`vat`) — not market presence — gates the fan-out, so
1211
+ * the (empty-roster) provider still runs and reports zero markets rather
1212
+ * than being invisible; the per-ilk keys only exist once metadata fills. */
1213
+ export declare const usddLendersByChain: (chainId: string | number) => string[];
1013
1214
  export declare const compoundV3Bulker: () => CompoundV3BulkerType;
1014
1215
  export declare const eulerConfigs: () => EulerConfigsType;
1015
1216
  export declare const eulerVaults: () => EulerVaultsType;
@@ -1221,4 +1422,28 @@ export declare function gearboxV3LenderKey(creditManager: string): string;
1221
1422
  export declare function parseGearboxV3LenderKey(lenderKey: string): {
1222
1423
  creditManagerAddrLower: string;
1223
1424
  } | undefined;
1425
+ /**
1426
+ * Synthesize the per-market lender key for a TermMax market.
1427
+ *
1428
+ * Mirrors `EXACTLY_<MARKET_ADDRESS_HEX>` / `TELLER_<POOL_ADDRESS_HEX>`. One key
1429
+ * per TermMax market, i.e. per (debtToken, collateral, maturity) tuple — the
1430
+ * maturity is baked into the market contract, so unlike Exactly there is NO
1431
+ * `terms[]` menu underneath a key.
1432
+ *
1433
+ * Format: `TERMMAX_${marketAddr.slice(2).toUpperCase()}`
1434
+ *
1435
+ * chainId is intentionally NOT in the token (chain scoping happens at the
1436
+ * marketUid level), matching every other per-market key in this file.
1437
+ *
1438
+ * `isTermMax()` works on this because it matches `startsWith('TERMMAX')`.
1439
+ */
1440
+ export declare function termMaxLenderKey(market: string): string;
1441
+ /**
1442
+ * Inverse of `termMaxLenderKey`: given a per-market lender key, return
1443
+ * `{ marketAddrLower }`. Returns `undefined` if the key isn't a per-market
1444
+ * TermMax key (e.g. someone passed the bare prefix `TERMMAX`).
1445
+ */
1446
+ export declare function parseTermMaxLenderKey(lenderKey: string): {
1447
+ marketAddrLower: string;
1448
+ } | undefined;
1224
1449
  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.37",
8
8
  "description": "Hold and initialize lending protocol data across a stack",
9
9
  "files": [
10
10
  "dist"