@1delta/data-sdk 0.0.36 → 0.0.38

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
@@ -80,6 +80,13 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
80
80
  inverseConfig: {},
81
81
  termMaxConfig: {},
82
82
  inverseMarkets: {},
83
+ usddConfig: {},
84
+ usddMarkets: {},
85
+ frankencoinConfig: {},
86
+ frankencoinMarkets: {},
87
+ llamaLendConfig: {},
88
+ llamaLendMarkets: {},
89
+ resupplyConfig: {},
83
90
  compoundV3Bulker: {},
84
91
  eulerConfigs: {},
85
92
  eulerVaults: {},
@@ -143,6 +150,13 @@ function initializeLenderData({
143
150
  inverseConfigOverride,
144
151
  termMaxConfigOverride,
145
152
  inverseMarketsOverride,
153
+ usddConfigOverride,
154
+ usddMarketsOverride,
155
+ frankencoinConfigOverride,
156
+ frankencoinMarketsOverride,
157
+ llamaLendConfigOverride,
158
+ llamaLendMarketsOverride,
159
+ resupplyConfigOverride,
146
160
  compoundV3BulkerOverride,
147
161
  eulerConfigsOverride,
148
162
  eulerVaultsOverride,
@@ -199,6 +213,13 @@ function initializeLenderData({
199
213
  if (inverseConfigOverride) data.inverseConfig = inverseConfigOverride;
200
214
  if (termMaxConfigOverride) data.termMaxConfig = termMaxConfigOverride;
201
215
  if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
216
+ if (usddConfigOverride) data.usddConfig = usddConfigOverride;
217
+ if (usddMarketsOverride) data.usddMarkets = usddMarketsOverride;
218
+ if (frankencoinConfigOverride) data.frankencoinConfig = frankencoinConfigOverride;
219
+ if (frankencoinMarketsOverride) data.frankencoinMarkets = frankencoinMarketsOverride;
220
+ if (llamaLendConfigOverride) data.llamaLendConfig = llamaLendConfigOverride;
221
+ if (llamaLendMarketsOverride) data.llamaLendMarkets = llamaLendMarketsOverride;
222
+ if (resupplyConfigOverride) data.resupplyConfig = resupplyConfigOverride;
202
223
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
203
224
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
204
225
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -206,13 +227,11 @@ function initializeLenderData({
206
227
  if (dolomiteEmodeOverride) data.dolomiteEmode = dolomiteEmodeOverride;
207
228
  if (aaveV4SpokesOverride) data.aaveV4Spokes = aaveV4SpokesOverride;
208
229
  if (aaveV4OraclesOverride) data.aaveV4Oracles = aaveV4OraclesOverride;
209
- if (aaveV4PeripheralsOverride)
210
- data.aaveV4Peripherals = aaveV4PeripheralsOverride;
230
+ if (aaveV4PeripheralsOverride) data.aaveV4Peripherals = aaveV4PeripheralsOverride;
211
231
  if (siloMarketsOverride) data.siloMarkets = siloMarketsOverride;
212
232
  if (siloPeripheralsOverride) data.siloPeripherals = siloPeripheralsOverride;
213
233
  if (siloMarketsV3Override) data.siloMarketsV3 = siloMarketsV3Override;
214
- if (siloPeripheralsV3Override)
215
- data.siloPeripheralsV3 = siloPeripheralsV3Override;
234
+ if (siloPeripheralsV3Override) data.siloPeripheralsV3 = siloPeripheralsV3Override;
216
235
  if (fluidResolversOverride) data.fluidResolvers = fluidResolversOverride;
217
236
  if (fluidVaultsOverride) data.fluidVaults = fluidVaultsOverride;
218
237
  if (gearboxResolversOverride) data.gearboxResolvers = gearboxResolversOverride;
@@ -303,9 +322,7 @@ var liquityBranchesByChain = (lender, chainId) => getGlobalData2()?.liquityMarke
303
322
  var liquityBranchByIndex = (lender, chainId, collIndex) => liquityBranchesByChain(lender, chainId).find((b) => b.collIndex === Number(collIndex));
304
323
  var liquityBranchByTroveManager = (lender, chainId, troveManager) => {
305
324
  const lower = troveManager.toLowerCase();
306
- return liquityBranchesByChain(lender, chainId).find(
307
- (b) => b.troveManager.toLowerCase() === lower
308
- );
325
+ return liquityBranchesByChain(lender, chainId).find((b) => b.troveManager.toLowerCase() === lower);
309
326
  };
310
327
  var liquityLendersByChain = (chainId) => {
311
328
  const cfg = getGlobalData2()?.liquityConfig ?? {};
@@ -339,6 +356,99 @@ var inverseLendersByChain = (chainId) => {
339
356
  const chain = String(chainId);
340
357
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
341
358
  };
359
+ var llamaLendConfig = () => getGlobalData2()?.llamaLendConfig;
360
+ var llamaLendConfigFor = (lender, chainId) => getGlobalData2()?.llamaLendConfig?.[lender]?.[String(chainId)];
361
+ var llamaLendMarkets = () => getGlobalData2()?.llamaLendMarkets;
362
+ var llamaLendChainData = (lender, chainId) => getGlobalData2()?.llamaLendMarkets?.[lender]?.[String(chainId)];
363
+ var llamaLendMarketByController = (lender, chainId, controller) => {
364
+ const lower = controller.toLowerCase();
365
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.controller.toLowerCase() === lower);
366
+ };
367
+ var llamaLendMarketByVault = (lender, chainId, vault) => {
368
+ const lower = vault.toLowerCase();
369
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.vault.toLowerCase() === lower);
370
+ };
371
+ var llamaLendLendersByChain = (chainId) => {
372
+ const cfg = getGlobalData2()?.llamaLendConfig ?? {};
373
+ const chain = String(chainId);
374
+ return Object.keys(cfg).filter(
375
+ (lender) => !!(cfg[lender]?.[chain]?.oneWayFactory || cfg[lender]?.[chain]?.lendFactory)
376
+ );
377
+ };
378
+ var llamaLendSupportsDelegation = (lender, chainId, controller) => llamaLendMarketByController(lender, chainId, controller)?.supportsDelegation === true;
379
+ var llamaLendLeverageZap = (lender, chainId, aggregator) => {
380
+ const cfg = llamaLendConfigFor(lender, chainId);
381
+ if (!cfg) return void 0;
382
+ const zap = aggregator === "odos" ? cfg.leverageZapOdos : cfg.leverageZap1inch;
383
+ const router = aggregator === "odos" ? cfg.leverageZapOdosRouter : cfg.leverageZap1inchRouter;
384
+ if (!zap || !router) return void 0;
385
+ return { zap, router };
386
+ };
387
+ var llamaLendSupportsLeverage = (lender, chainId, controller) => {
388
+ const m = llamaLendMarketByController(lender, chainId, controller);
389
+ if (!m?.supportsLeverage) return false;
390
+ const cfg = llamaLendConfigFor(lender, chainId);
391
+ return Boolean(cfg?.leverageZapOdos || cfg?.leverageZap1inch);
392
+ };
393
+ var llamaLendApiBaseUrl = (lender, chainId) => llamaLendConfigFor(lender, chainId)?.apiBaseUrl || "https://api.curve.finance";
394
+ var usddConfig = () => getGlobalData2()?.usddConfig;
395
+ var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
396
+ var usddMarkets = () => getGlobalData2()?.usddMarkets;
397
+ var usddChainData = (lender, chainId) => getGlobalData2()?.usddMarkets?.[lender]?.[String(chainId)];
398
+ var usddMarketByIlk = (lender, chainId, ilk) => usddChainData(lender, chainId)?.markets?.find((m) => m.ilk === ilk);
399
+ var usddLendersByChain = (chainId) => {
400
+ const cfg = getGlobalData2()?.usddConfig ?? {};
401
+ const chain = String(chainId);
402
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
403
+ };
404
+ var frankencoinConfig = () => getGlobalData2()?.frankencoinConfig;
405
+ var frankencoinConfigFor = (lender, chainId) => getGlobalData2()?.frankencoinConfig?.[lender]?.[String(chainId)];
406
+ var frankencoinMarkets = () => getGlobalData2()?.frankencoinMarkets;
407
+ var frankencoinChainData = (lender, chainId) => getGlobalData2()?.frankencoinMarkets?.[lender]?.[String(chainId)];
408
+ var frankencoinMarketByPosition = (lender, chainId, position) => {
409
+ const lower = position.toLowerCase();
410
+ return frankencoinChainData(lender, chainId)?.markets?.find((m) => m.position.toLowerCase() === lower);
411
+ };
412
+ var frankencoinLendersByChain = (chainId) => {
413
+ const cfg = getGlobalData2()?.frankencoinConfig ?? {};
414
+ const chain = String(chainId);
415
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.mintingHub);
416
+ };
417
+ var RESUPPLY_ETHEREUM_CONFIG = {
418
+ registry: "0x10101010E0C3171D894B71B3400668aF311e7D94",
419
+ reusd: "0x57aB1E0003F623289CD798B1824Be09a793e4Bec",
420
+ utilities: "0x5f896C250DA6b462873813ceEc47F3e4D8CBA464",
421
+ curveSwapper: "0x042f48346be16Be381190a7397A80808243f3b2e",
422
+ ensoSwapper: "0x181c98113ce60BA75A0f72d8901Eb17e5065043D",
423
+ lifiSwapper: "0x597Db76794c75E588D3a70534FB34B7780941fCe",
424
+ redemptionHandler: "0x5eeB063d0abefBBc78F576E28d762a16b637A025",
425
+ liquidationHandler: "0x88888888c227c36401493Ed9F3e3Dcc3800B2634",
426
+ insurancePool: "0x00000000efe883b3304aFf71eaCf72Dbc3e1b577",
427
+ sreusd: "0x557AB1e003951A73c12D16F0fEA8490E39C33C35",
428
+ priceWatcher: "0xAaaa0013e2ec451F76816d1e0a02ABA596dd9251",
429
+ debtDecimals: 18
430
+ };
431
+ var RESUPPLY_BUILTIN = {
432
+ RESUPPLY: { "1": RESUPPLY_ETHEREUM_CONFIG }
433
+ };
434
+ var resupplyConfig = () => getGlobalData2()?.resupplyConfig;
435
+ var resupplyConfigFor = (lender, chainId) => {
436
+ const published = getGlobalData2()?.resupplyConfig?.[lender]?.[String(chainId)];
437
+ if (published?.registry) return published;
438
+ return RESUPPLY_BUILTIN[lender]?.[String(chainId)];
439
+ };
440
+ var resupplyLendersByChain = (chainId) => {
441
+ const chain = String(chainId);
442
+ const cfg = getGlobalData2()?.resupplyConfig ?? {};
443
+ const keys = /* @__PURE__ */ new Set();
444
+ for (const lender of Object.keys(cfg)) {
445
+ if (cfg[lender]?.[chain]?.registry) keys.add(lender);
446
+ }
447
+ for (const lender of Object.keys(RESUPPLY_BUILTIN)) {
448
+ if (RESUPPLY_BUILTIN[lender]?.[chain]?.registry) keys.add(lender);
449
+ }
450
+ return [...keys];
451
+ };
342
452
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
343
453
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
344
454
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -438,9 +548,7 @@ function getSiloV2MarketEntry(chainId, lenderKey) {
438
548
  if (!parsed) return void 0;
439
549
  const list = getGlobalData2()?.siloMarkets?.[chainId];
440
550
  if (!list) return void 0;
441
- return list.find(
442
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
443
- );
551
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
444
552
  }
445
553
  function siloV3LenderKey(siloConfig) {
446
554
  if (!siloConfig || !siloConfig.startsWith("0x") || siloConfig.length !== 42) {
@@ -458,15 +566,11 @@ function getSiloV3MarketEntry(chainId, lenderKey) {
458
566
  if (!parsed) return void 0;
459
567
  const list = getGlobalData2()?.siloMarketsV3?.[chainId];
460
568
  if (!list) return void 0;
461
- return list.find(
462
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
463
- );
569
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
464
570
  }
465
571
  function gearboxV3LenderKey(creditManager) {
466
572
  if (!creditManager || !creditManager.startsWith("0x") || creditManager.length !== 42) {
467
- throw new Error(
468
- `gearboxV3LenderKey: invalid creditManager address ${creditManager}`
469
- );
573
+ throw new Error(`gearboxV3LenderKey: invalid creditManager address ${creditManager}`);
470
574
  }
471
575
  return `GEARBOX_V3_${creditManager.slice(2).toUpperCase()}`;
472
576
  }
@@ -486,6 +590,17 @@ function parseTermMaxLenderKey(lenderKey) {
486
590
  if (!match) return void 0;
487
591
  return { marketAddrLower: "0x" + match[1].toLowerCase() };
488
592
  }
593
+ function llamaLendLenderKey(controller) {
594
+ if (!controller || !controller.startsWith("0x") || controller.length !== 42) {
595
+ throw new Error(`llamaLendLenderKey: invalid controller address ${controller}`);
596
+ }
597
+ return `LLAMALEND_${controller.slice(2).toUpperCase()}`;
598
+ }
599
+ function parseLlamaLendLenderKey(lenderKey) {
600
+ const match = lenderKey.match(/^LLAMALEND_([0-9A-Fa-f]{40})$/);
601
+ if (!match) return void 0;
602
+ return { controllerAddrLower: "0x" + match[1].toLowerCase() };
603
+ }
489
604
 
490
605
  // src/tokens.ts
491
606
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -519,6 +634,7 @@ async function fetchMainTokensMap() {
519
634
  }
520
635
 
521
636
  exports.GEARBOX_ACCOUNT_COMPRESSOR_V310 = GEARBOX_ACCOUNT_COMPRESSOR_V310;
637
+ exports.RESUPPLY_ETHEREUM_CONFIG = RESUPPLY_ETHEREUM_CONFIG;
522
638
  exports.aaveOracles = aaveOracles;
523
639
  exports.aaveOraclesConfig = aaveOraclesConfig;
524
640
  exports.aavePools = aavePools;
@@ -562,6 +678,12 @@ exports.fluidChains = fluidChains;
562
678
  exports.fluidResolvers = fluidResolvers;
563
679
  exports.fluidVaultEntries = fluidVaultEntries;
564
680
  exports.fluidVaults = fluidVaults;
681
+ exports.frankencoinChainData = frankencoinChainData;
682
+ exports.frankencoinConfig = frankencoinConfig;
683
+ exports.frankencoinConfigFor = frankencoinConfigFor;
684
+ exports.frankencoinLendersByChain = frankencoinLendersByChain;
685
+ exports.frankencoinMarketByPosition = frankencoinMarketByPosition;
686
+ exports.frankencoinMarkets = frankencoinMarkets;
565
687
  exports.gearboxAccountCompressor = gearboxAccountCompressor;
566
688
  exports.gearboxAddressProviderV310 = gearboxAddressProviderV310;
567
689
  exports.gearboxBotListV3 = gearboxBotListV3;
@@ -594,6 +716,18 @@ exports.liquityConfigFor = liquityConfigFor;
594
716
  exports.liquityLendersByChain = liquityLendersByChain;
595
717
  exports.liquityMarkets = liquityMarkets;
596
718
  exports.listaNativeProvider = listaNativeProvider;
719
+ exports.llamaLendApiBaseUrl = llamaLendApiBaseUrl;
720
+ exports.llamaLendChainData = llamaLendChainData;
721
+ exports.llamaLendConfig = llamaLendConfig;
722
+ exports.llamaLendConfigFor = llamaLendConfigFor;
723
+ exports.llamaLendLenderKey = llamaLendLenderKey;
724
+ exports.llamaLendLendersByChain = llamaLendLendersByChain;
725
+ exports.llamaLendLeverageZap = llamaLendLeverageZap;
726
+ exports.llamaLendMarketByController = llamaLendMarketByController;
727
+ exports.llamaLendMarketByVault = llamaLendMarketByVault;
728
+ exports.llamaLendMarkets = llamaLendMarkets;
729
+ exports.llamaLendSupportsDelegation = llamaLendSupportsDelegation;
730
+ exports.llamaLendSupportsLeverage = llamaLendSupportsLeverage;
597
731
  exports.midnightApiBaseOverride = midnightApiBaseOverride;
598
732
  exports.midnightConfig = midnightConfig;
599
733
  exports.midnightMarketById = midnightMarketById;
@@ -607,11 +741,15 @@ exports.morphoTypeOracles = morphoTypeOracles;
607
741
  exports.morphoTypeVaults = morphoTypeVaults;
608
742
  exports.parseAaveV4SpokeLenderKey = parseAaveV4SpokeLenderKey;
609
743
  exports.parseGearboxV3LenderKey = parseGearboxV3LenderKey;
744
+ exports.parseLlamaLendLenderKey = parseLlamaLendLenderKey;
610
745
  exports.parseSiloV2LenderKey = parseSiloV2LenderKey;
611
746
  exports.parseSiloV3LenderKey = parseSiloV3LenderKey;
612
747
  exports.parseTermMaxLenderKey = parseTermMaxLenderKey;
613
748
  exports.resolveMidnightApiBase = resolveMidnightApiBase;
614
749
  exports.resolveTermApiBase = resolveTermApiBase;
750
+ exports.resupplyConfig = resupplyConfig;
751
+ exports.resupplyConfigFor = resupplyConfigFor;
752
+ exports.resupplyLendersByChain = resupplyLendersByChain;
615
753
  exports.riverChainData = riverChainData;
616
754
  exports.riverConfig = riverConfig;
617
755
  exports.riverConfigFor = riverConfigFor;
@@ -641,3 +779,9 @@ exports.termMaxChainIds = termMaxChainIds;
641
779
  exports.termMaxConfig = termMaxConfig;
642
780
  exports.termMaxConfigByChain = termMaxConfigByChain;
643
781
  exports.termMaxLenderKey = termMaxLenderKey;
782
+ exports.usddChainData = usddChainData;
783
+ exports.usddConfig = usddConfig;
784
+ exports.usddConfigFor = usddConfigFor;
785
+ exports.usddLendersByChain = usddLendersByChain;
786
+ exports.usddMarketByIlk = usddMarketByIlk;
787
+ exports.usddMarkets = usddMarkets;
package/dist/index.mjs CHANGED
@@ -78,6 +78,13 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
78
78
  inverseConfig: {},
79
79
  termMaxConfig: {},
80
80
  inverseMarkets: {},
81
+ usddConfig: {},
82
+ usddMarkets: {},
83
+ frankencoinConfig: {},
84
+ frankencoinMarkets: {},
85
+ llamaLendConfig: {},
86
+ llamaLendMarkets: {},
87
+ resupplyConfig: {},
81
88
  compoundV3Bulker: {},
82
89
  eulerConfigs: {},
83
90
  eulerVaults: {},
@@ -141,6 +148,13 @@ function initializeLenderData({
141
148
  inverseConfigOverride,
142
149
  termMaxConfigOverride,
143
150
  inverseMarketsOverride,
151
+ usddConfigOverride,
152
+ usddMarketsOverride,
153
+ frankencoinConfigOverride,
154
+ frankencoinMarketsOverride,
155
+ llamaLendConfigOverride,
156
+ llamaLendMarketsOverride,
157
+ resupplyConfigOverride,
144
158
  compoundV3BulkerOverride,
145
159
  eulerConfigsOverride,
146
160
  eulerVaultsOverride,
@@ -197,6 +211,13 @@ function initializeLenderData({
197
211
  if (inverseConfigOverride) data.inverseConfig = inverseConfigOverride;
198
212
  if (termMaxConfigOverride) data.termMaxConfig = termMaxConfigOverride;
199
213
  if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
214
+ if (usddConfigOverride) data.usddConfig = usddConfigOverride;
215
+ if (usddMarketsOverride) data.usddMarkets = usddMarketsOverride;
216
+ if (frankencoinConfigOverride) data.frankencoinConfig = frankencoinConfigOverride;
217
+ if (frankencoinMarketsOverride) data.frankencoinMarkets = frankencoinMarketsOverride;
218
+ if (llamaLendConfigOverride) data.llamaLendConfig = llamaLendConfigOverride;
219
+ if (llamaLendMarketsOverride) data.llamaLendMarkets = llamaLendMarketsOverride;
220
+ if (resupplyConfigOverride) data.resupplyConfig = resupplyConfigOverride;
200
221
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
201
222
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
202
223
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -204,13 +225,11 @@ function initializeLenderData({
204
225
  if (dolomiteEmodeOverride) data.dolomiteEmode = dolomiteEmodeOverride;
205
226
  if (aaveV4SpokesOverride) data.aaveV4Spokes = aaveV4SpokesOverride;
206
227
  if (aaveV4OraclesOverride) data.aaveV4Oracles = aaveV4OraclesOverride;
207
- if (aaveV4PeripheralsOverride)
208
- data.aaveV4Peripherals = aaveV4PeripheralsOverride;
228
+ if (aaveV4PeripheralsOverride) data.aaveV4Peripherals = aaveV4PeripheralsOverride;
209
229
  if (siloMarketsOverride) data.siloMarkets = siloMarketsOverride;
210
230
  if (siloPeripheralsOverride) data.siloPeripherals = siloPeripheralsOverride;
211
231
  if (siloMarketsV3Override) data.siloMarketsV3 = siloMarketsV3Override;
212
- if (siloPeripheralsV3Override)
213
- data.siloPeripheralsV3 = siloPeripheralsV3Override;
232
+ if (siloPeripheralsV3Override) data.siloPeripheralsV3 = siloPeripheralsV3Override;
214
233
  if (fluidResolversOverride) data.fluidResolvers = fluidResolversOverride;
215
234
  if (fluidVaultsOverride) data.fluidVaults = fluidVaultsOverride;
216
235
  if (gearboxResolversOverride) data.gearboxResolvers = gearboxResolversOverride;
@@ -301,9 +320,7 @@ var liquityBranchesByChain = (lender, chainId) => getGlobalData2()?.liquityMarke
301
320
  var liquityBranchByIndex = (lender, chainId, collIndex) => liquityBranchesByChain(lender, chainId).find((b) => b.collIndex === Number(collIndex));
302
321
  var liquityBranchByTroveManager = (lender, chainId, troveManager) => {
303
322
  const lower = troveManager.toLowerCase();
304
- return liquityBranchesByChain(lender, chainId).find(
305
- (b) => b.troveManager.toLowerCase() === lower
306
- );
323
+ return liquityBranchesByChain(lender, chainId).find((b) => b.troveManager.toLowerCase() === lower);
307
324
  };
308
325
  var liquityLendersByChain = (chainId) => {
309
326
  const cfg = getGlobalData2()?.liquityConfig ?? {};
@@ -337,6 +354,99 @@ var inverseLendersByChain = (chainId) => {
337
354
  const chain = String(chainId);
338
355
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
339
356
  };
357
+ var llamaLendConfig = () => getGlobalData2()?.llamaLendConfig;
358
+ var llamaLendConfigFor = (lender, chainId) => getGlobalData2()?.llamaLendConfig?.[lender]?.[String(chainId)];
359
+ var llamaLendMarkets = () => getGlobalData2()?.llamaLendMarkets;
360
+ var llamaLendChainData = (lender, chainId) => getGlobalData2()?.llamaLendMarkets?.[lender]?.[String(chainId)];
361
+ var llamaLendMarketByController = (lender, chainId, controller) => {
362
+ const lower = controller.toLowerCase();
363
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.controller.toLowerCase() === lower);
364
+ };
365
+ var llamaLendMarketByVault = (lender, chainId, vault) => {
366
+ const lower = vault.toLowerCase();
367
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.vault.toLowerCase() === lower);
368
+ };
369
+ var llamaLendLendersByChain = (chainId) => {
370
+ const cfg = getGlobalData2()?.llamaLendConfig ?? {};
371
+ const chain = String(chainId);
372
+ return Object.keys(cfg).filter(
373
+ (lender) => !!(cfg[lender]?.[chain]?.oneWayFactory || cfg[lender]?.[chain]?.lendFactory)
374
+ );
375
+ };
376
+ var llamaLendSupportsDelegation = (lender, chainId, controller) => llamaLendMarketByController(lender, chainId, controller)?.supportsDelegation === true;
377
+ var llamaLendLeverageZap = (lender, chainId, aggregator) => {
378
+ const cfg = llamaLendConfigFor(lender, chainId);
379
+ if (!cfg) return void 0;
380
+ const zap = aggregator === "odos" ? cfg.leverageZapOdos : cfg.leverageZap1inch;
381
+ const router = aggregator === "odos" ? cfg.leverageZapOdosRouter : cfg.leverageZap1inchRouter;
382
+ if (!zap || !router) return void 0;
383
+ return { zap, router };
384
+ };
385
+ var llamaLendSupportsLeverage = (lender, chainId, controller) => {
386
+ const m = llamaLendMarketByController(lender, chainId, controller);
387
+ if (!m?.supportsLeverage) return false;
388
+ const cfg = llamaLendConfigFor(lender, chainId);
389
+ return Boolean(cfg?.leverageZapOdos || cfg?.leverageZap1inch);
390
+ };
391
+ var llamaLendApiBaseUrl = (lender, chainId) => llamaLendConfigFor(lender, chainId)?.apiBaseUrl || "https://api.curve.finance";
392
+ var usddConfig = () => getGlobalData2()?.usddConfig;
393
+ var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
394
+ var usddMarkets = () => getGlobalData2()?.usddMarkets;
395
+ var usddChainData = (lender, chainId) => getGlobalData2()?.usddMarkets?.[lender]?.[String(chainId)];
396
+ var usddMarketByIlk = (lender, chainId, ilk) => usddChainData(lender, chainId)?.markets?.find((m) => m.ilk === ilk);
397
+ var usddLendersByChain = (chainId) => {
398
+ const cfg = getGlobalData2()?.usddConfig ?? {};
399
+ const chain = String(chainId);
400
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
401
+ };
402
+ var frankencoinConfig = () => getGlobalData2()?.frankencoinConfig;
403
+ var frankencoinConfigFor = (lender, chainId) => getGlobalData2()?.frankencoinConfig?.[lender]?.[String(chainId)];
404
+ var frankencoinMarkets = () => getGlobalData2()?.frankencoinMarkets;
405
+ var frankencoinChainData = (lender, chainId) => getGlobalData2()?.frankencoinMarkets?.[lender]?.[String(chainId)];
406
+ var frankencoinMarketByPosition = (lender, chainId, position) => {
407
+ const lower = position.toLowerCase();
408
+ return frankencoinChainData(lender, chainId)?.markets?.find((m) => m.position.toLowerCase() === lower);
409
+ };
410
+ var frankencoinLendersByChain = (chainId) => {
411
+ const cfg = getGlobalData2()?.frankencoinConfig ?? {};
412
+ const chain = String(chainId);
413
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.mintingHub);
414
+ };
415
+ var RESUPPLY_ETHEREUM_CONFIG = {
416
+ registry: "0x10101010E0C3171D894B71B3400668aF311e7D94",
417
+ reusd: "0x57aB1E0003F623289CD798B1824Be09a793e4Bec",
418
+ utilities: "0x5f896C250DA6b462873813ceEc47F3e4D8CBA464",
419
+ curveSwapper: "0x042f48346be16Be381190a7397A80808243f3b2e",
420
+ ensoSwapper: "0x181c98113ce60BA75A0f72d8901Eb17e5065043D",
421
+ lifiSwapper: "0x597Db76794c75E588D3a70534FB34B7780941fCe",
422
+ redemptionHandler: "0x5eeB063d0abefBBc78F576E28d762a16b637A025",
423
+ liquidationHandler: "0x88888888c227c36401493Ed9F3e3Dcc3800B2634",
424
+ insurancePool: "0x00000000efe883b3304aFf71eaCf72Dbc3e1b577",
425
+ sreusd: "0x557AB1e003951A73c12D16F0fEA8490E39C33C35",
426
+ priceWatcher: "0xAaaa0013e2ec451F76816d1e0a02ABA596dd9251",
427
+ debtDecimals: 18
428
+ };
429
+ var RESUPPLY_BUILTIN = {
430
+ RESUPPLY: { "1": RESUPPLY_ETHEREUM_CONFIG }
431
+ };
432
+ var resupplyConfig = () => getGlobalData2()?.resupplyConfig;
433
+ var resupplyConfigFor = (lender, chainId) => {
434
+ const published = getGlobalData2()?.resupplyConfig?.[lender]?.[String(chainId)];
435
+ if (published?.registry) return published;
436
+ return RESUPPLY_BUILTIN[lender]?.[String(chainId)];
437
+ };
438
+ var resupplyLendersByChain = (chainId) => {
439
+ const chain = String(chainId);
440
+ const cfg = getGlobalData2()?.resupplyConfig ?? {};
441
+ const keys = /* @__PURE__ */ new Set();
442
+ for (const lender of Object.keys(cfg)) {
443
+ if (cfg[lender]?.[chain]?.registry) keys.add(lender);
444
+ }
445
+ for (const lender of Object.keys(RESUPPLY_BUILTIN)) {
446
+ if (RESUPPLY_BUILTIN[lender]?.[chain]?.registry) keys.add(lender);
447
+ }
448
+ return [...keys];
449
+ };
340
450
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
341
451
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
342
452
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -436,9 +546,7 @@ function getSiloV2MarketEntry(chainId, lenderKey) {
436
546
  if (!parsed) return void 0;
437
547
  const list = getGlobalData2()?.siloMarkets?.[chainId];
438
548
  if (!list) return void 0;
439
- return list.find(
440
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
441
- );
549
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
442
550
  }
443
551
  function siloV3LenderKey(siloConfig) {
444
552
  if (!siloConfig || !siloConfig.startsWith("0x") || siloConfig.length !== 42) {
@@ -456,15 +564,11 @@ function getSiloV3MarketEntry(chainId, lenderKey) {
456
564
  if (!parsed) return void 0;
457
565
  const list = getGlobalData2()?.siloMarketsV3?.[chainId];
458
566
  if (!list) return void 0;
459
- return list.find(
460
- (m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower
461
- );
567
+ return list.find((m) => m.siloConfig.toLowerCase() === parsed.siloConfigAddrLower);
462
568
  }
463
569
  function gearboxV3LenderKey(creditManager) {
464
570
  if (!creditManager || !creditManager.startsWith("0x") || creditManager.length !== 42) {
465
- throw new Error(
466
- `gearboxV3LenderKey: invalid creditManager address ${creditManager}`
467
- );
571
+ throw new Error(`gearboxV3LenderKey: invalid creditManager address ${creditManager}`);
468
572
  }
469
573
  return `GEARBOX_V3_${creditManager.slice(2).toUpperCase()}`;
470
574
  }
@@ -484,6 +588,17 @@ function parseTermMaxLenderKey(lenderKey) {
484
588
  if (!match) return void 0;
485
589
  return { marketAddrLower: "0x" + match[1].toLowerCase() };
486
590
  }
591
+ function llamaLendLenderKey(controller) {
592
+ if (!controller || !controller.startsWith("0x") || controller.length !== 42) {
593
+ throw new Error(`llamaLendLenderKey: invalid controller address ${controller}`);
594
+ }
595
+ return `LLAMALEND_${controller.slice(2).toUpperCase()}`;
596
+ }
597
+ function parseLlamaLendLenderKey(lenderKey) {
598
+ const match = lenderKey.match(/^LLAMALEND_([0-9A-Fa-f]{40})$/);
599
+ if (!match) return void 0;
600
+ return { controllerAddrLower: "0x" + match[1].toLowerCase() };
601
+ }
487
602
 
488
603
  // src/tokens.ts
489
604
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -516,4 +631,4 @@ async function fetchMainTokensMap() {
516
631
  return await data.json();
517
632
  }
518
633
 
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 };
634
+ export { GEARBOX_ACCOUNT_COMPRESSOR_V310, RESUPPLY_ETHEREUM_CONFIG, 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, frankencoinChainData, frankencoinConfig, frankencoinConfigFor, frankencoinLendersByChain, frankencoinMarketByPosition, frankencoinMarkets, 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, llamaLendApiBaseUrl, llamaLendChainData, llamaLendConfig, llamaLendConfigFor, llamaLendLenderKey, llamaLendLendersByChain, llamaLendLeverageZap, llamaLendMarketByController, llamaLendMarketByVault, llamaLendMarkets, llamaLendSupportsDelegation, llamaLendSupportsLeverage, midnightApiBaseOverride, midnightConfig, midnightMarketById, midnightMarkets, midnightMarketsByChain, morphoBundler3, morphoOracles, morphoPools, morphoTypeMarkets, morphoTypeOracles, morphoTypeVaults, parseAaveV4SpokeLenderKey, parseGearboxV3LenderKey, parseLlamaLendLenderKey, parseSiloV2LenderKey, parseSiloV3LenderKey, parseTermMaxLenderKey, resolveMidnightApiBase, resolveTermApiBase, resupplyConfig, resupplyConfigFor, resupplyLendersByChain, 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
@@ -208,7 +208,10 @@ export type ExactlyConfigChain = {
208
208
  marketETHRouter?: string | null;
209
209
  /** The WETH Market the ETH router wraps (optional convenience). */
210
210
  wethMarket?: string | null;
211
- /** DebtManager — rollover/leverage periphery (optional, not used yet). */
211
+ /** Debt-rollover periphery — Optimism `DebtManager` (all three roll
212
+ * directions + leverage), Base `DebtRoller` (`rollFixed` ONLY). Same
213
+ * field, different deployment name per chain; consumed by the Exactly
214
+ * rollover builder. */
212
215
  debtManager?: string | null;
213
216
  /** RewardsController — EXA/OP rewards (optional, not used yet). */
214
217
  rewardsController?: string | null;
@@ -519,6 +522,10 @@ export type InverseMarketConfig = {
519
522
  collateralFactorBps: string;
520
523
  liquidationIncentiveBps: string;
521
524
  liquidationFactorBps: string;
525
+ /** Replenisher's cut of a force-replenish (1000 = 10%). Optional: older
526
+ * metadata snapshots predate it, and it is bot-side economics — the
527
+ * borrower always pays the full `DBR.replenishmentPriceBps`. */
528
+ replenishmentIncentiveBps?: string;
522
529
  /** Smaller borrows revert (DOLA units, human number as string). */
523
530
  minDebt: string;
524
531
  /** Per-market daily borrow cap (DOLA, human number as string). */
@@ -535,6 +542,328 @@ export type InverseMarketsType = {
535
542
  [chainId: string]: InverseChainData;
536
543
  };
537
544
  };
545
+ /** Per-chain Frankencoin deployment seed (hand-maintained). */
546
+ export type FrankencoinConfigChain = {
547
+ /** ZCHF — the only debt asset. */
548
+ zchf: string;
549
+ /** MintingHub V2 — clone/challenge entry point. */
550
+ mintingHub: string;
551
+ /** Equity (FPS) — first-loss tranche holding the withheld reserve. */
552
+ equity: string;
553
+ /** PositionRoller (carries a protocol-native ZCHF flash loan). */
554
+ roller?: string;
555
+ /** Leadrate module — the protocol-wide base rate. */
556
+ leadrate?: string;
557
+ /** Savings module (the savings vault leg lives in SAVINGS_REGISTRY;
558
+ * carried here for completeness). */
559
+ savings?: string;
560
+ /** Chainlink-shaped CHF/USD feed — required for USD normalisation. */
561
+ chfUsdFeed?: string;
562
+ /** Debt decimals (18). */
563
+ debtDecimals?: number;
564
+ /** Legacy MintingHub V1 — dead but deployed; positions carrying this hub
565
+ * must never reach the V2 builders. */
566
+ mintingHubV1?: string;
567
+ };
568
+ export type FrankencoinConfigType = {
569
+ [lender: string]: {
570
+ [chainId: string]: FrankencoinConfigChain;
571
+ };
572
+ };
573
+ /** One Frankencoin market (= one ORIGINAL position). */
574
+ export type FrankencoinMarketConfig = {
575
+ /** The original position contract — also the per-market key suffix
576
+ * (`FRANKENCOIN_<chainId>_<ADDR>`). */
577
+ position: string;
578
+ collToken: string;
579
+ collDecimals: number;
580
+ collSymbol?: string;
581
+ /** Owner-declared liquidation price, 36-dec scaled against the
582
+ * collateral's decimals. NOT an oracle quote. */
583
+ price: string;
584
+ /** ppm — risk premium on top of the hub lead rate. */
585
+ riskPremiumPPM: string;
586
+ /** ppm — withheld into the equity reserve at mint (10-40% observed). */
587
+ reserveContribution: string;
588
+ /** Minimum collateral for a clone (raw collateral units). */
589
+ minimumCollateral: string;
590
+ /** Total ZCHF this original + its clones may mint. */
591
+ limitForClones?: string;
592
+ /** Unix seconds — positions EXPIRE (forced sale after). */
593
+ expiration: string;
594
+ start?: string;
595
+ challengePeriod?: string;
596
+ /** Position version — only 2 is supported; V1 is dead. */
597
+ version?: number;
598
+ name?: string;
599
+ };
600
+ /** Generated per-chain data: the curated original-position roster. */
601
+ export type FrankencoinChainData = {
602
+ markets: FrankencoinMarketConfig[];
603
+ };
604
+ export type FrankencoinMarketsType = {
605
+ [lender: string]: {
606
+ [chainId: string]: FrankencoinChainData;
607
+ };
608
+ };
609
+ /** Per-chain, protocol-level (evergreen) Resupply addresses. */
610
+ export type ResupplyConfigChain = {
611
+ /** ResupplyRegistry — `getAllPairAddresses()` IS the market discovery, and
612
+ * `getAddress(key)` resolves every other singleton. */
613
+ registry: string;
614
+ /** reUSD — the only debt asset. */
615
+ reusd: string;
616
+ /** Utilities lens — `getPairInterestRate`, `getUnderlyingSupplyRate`,
617
+ * `getSwapRouteAmountOut`, `isSolventAfterLeverage`. Optional, but every
618
+ * rate and every leverage pre-flight is far cheaper with it. */
619
+ utilities?: string | null;
620
+ /** The built-in Curve `Swapper` — every leg for every pair is already
621
+ * registered on it, so a leverage route needs no aggregator at all. This
622
+ * is THE DEFAULT leverage swapper. */
623
+ curveSwapper?: string | null;
624
+ /** `RouterSwapper` wrapping the Enso router. Whitelisted on every pair, and
625
+ * it executes ARBITRARY router calldata packed into the `address[] path` —
626
+ * which is what makes aggregator-quoted looping possible at all. */
627
+ ensoSwapper?: string | null;
628
+ /** Same, wrapping the LI.FI Diamond. No LI.FI fetcher on our side yet. */
629
+ lifiSwapper?: string | null;
630
+ /** RedemptionHandler — the (communal) peg mechanism. Read-only for us. */
631
+ redemptionHandler?: string | null;
632
+ /** LiquidationHandler — liquidations are insurance-pool-funded, whole-position. */
633
+ liquidationHandler?: string | null;
634
+ /** InsurancePool — reUSD staked as first-loss capital. */
635
+ insurancePool?: string | null;
636
+ /** sreUSD — the savings leg (belongs to SAVINGS_REGISTRY; carried here for
637
+ * completeness so one config row describes the whole protocol). */
638
+ sreusd?: string | null;
639
+ /** PriceWatcher — supplies the off-peg weight the borrow rate is scaled by. */
640
+ priceWatcher?: string | null;
641
+ /** reUSD decimals (18). */
642
+ debtDecimals?: number;
643
+ /** Optional allowlist of pair addresses. When set, on-chain discovery is
644
+ * INTERSECTED with it; when absent (the default) every registered pair
645
+ * with a non-zero `borrowLimit` is published. */
646
+ pairAllowlist?: string[] | null;
647
+ };
648
+ export type ResupplyConfigType = {
649
+ [lender: string]: {
650
+ [chainId: string]: ResupplyConfigChain;
651
+ };
652
+ };
653
+ /** Per-chain LlamaLend deployment seed (hand-maintained). */
654
+ export type LlamaLendConfigChain = {
655
+ /** v1 `OneWayLendingFactory` — parallel index getters. Absent on chains
656
+ * that only ever got v2. */
657
+ oneWayFactory?: string;
658
+ /** v2 `LendFactory` — struct-returning `markets(i)`; `version()` = `2.0.0`. */
659
+ lendFactory?: string;
660
+ /** v2 LendConfigurator (admin surface; carried for completeness). */
661
+ configurator?: string;
662
+ /**
663
+ * Curve's deployed v1 LeverageZap for this chain, and the aggregator router
664
+ * it is hard-wired to. THIS is how leverage works here — we do not deploy a
665
+ * callbacker.
666
+ *
667
+ * The zap's router is an IMMUTABLE with no allowlist, and `callback_bytes`
668
+ * is forwarded to it verbatim, so arbitrary aggregator calldata is already
669
+ * permitted. Two are deployed per chain (Odos and 1inch); pick whichever
670
+ * aggregator is quoting, and ALWAYS check the quote's target against
671
+ * `*Router` before encoding — the zap forwards mismatched calldata to the
672
+ * wrong contract rather than rejecting it.
673
+ */
674
+ leverageZapOdos?: string;
675
+ leverageZapOdosRouter?: string;
676
+ leverageZap1inch?: string;
677
+ leverageZap1inchRouter?: string;
678
+ /**
679
+ * Lowest `factoryIndex` the zaps accept — markets below it were deployed
680
+ * from a blueprint the zap does not recognise. 9 on Ethereum and Arbitrum,
681
+ * 0 on Optimism. This is a WIDER gate than delegation: 84.9% of borrows
682
+ * qualify, including markets that are not delegation-capable, because
683
+ * leverage is EOA-direct and needs no grant.
684
+ */
685
+ leverageStartId?: number;
686
+ /**
687
+ * The crvUSD mint (CDP) factory, when the chain's zap indexes it as
688
+ * `factoryId = 1`. Present on Ethereum only. Recorded because the SAME zap
689
+ * serves those markets — see LLAMALEND_PLAN.md.
690
+ */
691
+ crvUsdFactory?: string;
692
+ /** Curve data API base. Overridable so a self-hosted indexer can be
693
+ * swapped in; the default serves every chain and both generations from
694
+ * one call. */
695
+ apiBaseUrl?: string | null;
696
+ /** The chain's slug in the Curve API's `blockchainId` field
697
+ * (`ethereum` / `optimism` / `arbitrum` / `fraxtal` / `sonic`). */
698
+ apiChainSlug?: string;
699
+ };
700
+ export type LlamaLendConfigType = {
701
+ [lender: string]: {
702
+ [chainId: string]: LlamaLendConfigChain;
703
+ };
704
+ };
705
+ /** One LlamaLend market (= one Controller). */
706
+ export type LlamaLendMarketConfig = {
707
+ /** Controller contract — also the per-market key suffix
708
+ * (`LLAMALEND_<CONTROLLER_ADDR>`). */
709
+ controller: string;
710
+ /** ERC-4626 vault — the lender side. TRAP: shares run ~1000x the asset
711
+ * scale (`DEAD_SHARES`), so never assume 1:1. */
712
+ vault: string;
713
+ /** LLAMMA. MUST be excluded from any leverage swap route — the Controller
714
+ * asserts the AMM's band state is unchanged across a callback. */
715
+ amm: string;
716
+ collateralToken: string;
717
+ collateralDecimals: number;
718
+ collateralSymbol?: string;
719
+ borrowedToken: string;
720
+ borrowedDecimals: number;
721
+ borrowedSymbol?: string;
722
+ monetaryPolicy: string;
723
+ priceOracle?: string;
724
+ /** 1 = `oneway` (v1, `*_extended` leverage), 2 = `oneway-v2` (v2, callbacker
725
+ * folded into the base functions). Branch every encoder on this. */
726
+ version: 1 | 2;
727
+ /**
728
+ * Whether this Controller carries the boolean delegation grant
729
+ * (`approve(spender, allow)` + `_for` on the writes).
730
+ *
731
+ * PER-MARKET, not per-protocol: only newer-blueprint controllers have it
732
+ * (48 of 98 markets at 2026-08, and 0 of 22 on Arbitrum). Derived by the
733
+ * metadata generator from a runtime-bytecode selector scan, because an
734
+ * `eth_call` probe cannot distinguish "no such method" from a node hiccup
735
+ * on most public RPCs. FAIL CLOSED — treat `undefined` as `false`.
736
+ */
737
+ supportsDelegation: boolean;
738
+ /** Band-geometry parameter `A` from the AMM. With `loanDiscount` and the
739
+ * chosen `N` this fixes the effective collateral factor. */
740
+ ammA: string;
741
+ /** WAD haircut used when sizing a loan. */
742
+ loanDiscount: string;
743
+ /** WAD hard-liquidation bonus (applies only BELOW the whole band range —
744
+ * inside it the position soft-liquidates with no penalty). */
745
+ liquidationDiscount: string;
746
+ /**
747
+ * The market's index in its factory — `controllers(i)`. Doubles as the
748
+ * `controller_id` the leverage zap's `callback_args` requires, so it is
749
+ * mandatory for any leveraged encode. The Curve API exposes it as the
750
+ * numeric suffix of `id` (`oneway-41`).
751
+ */
752
+ factoryIndex: number;
753
+ /**
754
+ * Whether Curve's v1 leverage zap accepts this market
755
+ * (`factoryIndex >= leverageStartId`, and v1 only — v2 markets live in a
756
+ * factory the zap does not index). Independent of `supportsDelegation`.
757
+ */
758
+ supportsLeverage: boolean;
759
+ /** Band count offered by default in the UI (Curve's own default is 10).
760
+ * There is no single LTV — the collateral factor is a function of N — so
761
+ * public data reports `collateralFactor` at this N and exposes the rest
762
+ * of the curve alongside. */
763
+ defaultBands?: number;
764
+ /** Monetary-policy family: `semilog` (v1) or `hyperbolic` (v2). The
765
+ * `hyperbolic-dynamic` variant pulls its target rate from an external
766
+ * rate calculator tracking a yield-bearing asset, so its curve moves
767
+ * under a cache — never serve it from stale params. */
768
+ rateModel?: 'semilog' | 'hyperbolic' | 'hyperbolic-dynamic';
769
+ /** Gauge (CRV emissions on the vault side), v1 only. */
770
+ gauge?: string | null;
771
+ /** v2 only: 0 DISABLES borrowing. A fresh v2 market looks live but is not. */
772
+ borrowCap?: string;
773
+ name?: string;
774
+ };
775
+ /** Generated per-chain data: the curated market roster. */
776
+ export type LlamaLendChainData = {
777
+ markets: LlamaLendMarketConfig[];
778
+ };
779
+ export type LlamaLendMarketsType = {
780
+ [lender: string]: {
781
+ [chainId: string]: LlamaLendChainData;
782
+ };
783
+ };
784
+ /** One USDD PSM (1:1 stable swap module; NOT a lending market). */
785
+ export type UsddPsmConfig = {
786
+ ilk: string;
787
+ psm: string;
788
+ /** Approval target for `sellGem` (the PSM's own gem adapter). */
789
+ gemJoin: string;
790
+ gem: string;
791
+ gemSymbol?: string;
792
+ /** 6 on Ethereum (USDT/USDC), 18 on BNB (BSC-USDT). */
793
+ gemDecimals: number;
794
+ };
795
+ /** Per-chain USDD deployment seed (hand-maintained). */
796
+ export type UsddConfigChain = {
797
+ /** Core accounting engine — ilk params + urns live here. */
798
+ vat: string;
799
+ /** Stability-fee module (`ilks(ilk).duty`, per-second ray). */
800
+ jug: string;
801
+ /** Oracle liaison (`ilks(ilk)` → pip + mat). */
802
+ spot: string;
803
+ /** Liquidation module (clip, chop, hole per ilk). */
804
+ dog: string;
805
+ /** DssCdpManager — CDP ids, urn handles, `cdpAllow` grants. */
806
+ cdpManager: string;
807
+ /** DssProxyActions — the atomic one-shot target (via DSProxy.execute). */
808
+ proxyActions: string;
809
+ /** ProxyRegistry — `proxies(user)` / `build()` for the DSProxy route. */
810
+ proxyRegistry: string;
811
+ /** The debt token. */
812
+ usdd: string;
813
+ /** DaiJoin-equivalent for USDD enter/exit. */
814
+ usddJoin: string;
815
+ /** Debt decimals (18). */
816
+ debtDecimals?: number;
817
+ /** The savings Pot (sDAI-style; savings side lives in margin-fetcher's
818
+ * SAVINGS_REGISTRY, carried here for completeness). */
819
+ pot?: string;
820
+ susdd?: string;
821
+ /** 1:1 stable PSMs (swap modules — not lending markets). */
822
+ psms?: UsddPsmConfig[];
823
+ };
824
+ export type UsddConfigType = {
825
+ [lender: string]: {
826
+ [chainId: string]: UsddConfigChain;
827
+ };
828
+ };
829
+ /** One USDD market (= one collateral ilk). */
830
+ export type UsddMarketConfig = {
831
+ /** Ilk string (e.g. `WBTC-A`) — also the per-market key suffix
832
+ * (`USDD_<chainId>_<ILK>`). bytes32-encode via stringToHex(size 32). */
833
+ ilk: string;
834
+ /** Collateral adapter — approval target for deposits. */
835
+ gemJoin: string;
836
+ collToken: string;
837
+ collDecimals: number;
838
+ collSymbol?: string;
839
+ /** Price feed behind the Spot (OSM/Median). */
840
+ pip?: string;
841
+ /** Liquidation ratio, ray (Spot.mat). */
842
+ mat: string;
843
+ /** Per-second stability fee, ray (Jug.duty). */
844
+ duty: string;
845
+ /** Dutch-auction contract (Dog.clip). */
846
+ clip?: string;
847
+ /** Liquidation penalty, wad (Dog.chop; 1e18 = none). */
848
+ chop?: string;
849
+ /** Debt ceiling, rad (Vat.ilks.line). */
850
+ line: string;
851
+ /** Per-CDP debt floor, rad (Vat.ilks.dust). */
852
+ dust: string;
853
+ name?: string;
854
+ };
855
+ /** Generated per-chain data: verified ilk list + the cdpi trigger snapshot. */
856
+ export type UsddChainData = {
857
+ markets: UsddMarketConfig[];
858
+ /** `cdpManager.cdpi()` at generation time — the USDD_PLAN.md
859
+ * re-evaluation trigger (0 = no CDP ever opened on this chain). */
860
+ cdpi?: string;
861
+ };
862
+ export type UsddMarketsType = {
863
+ [lender: string]: {
864
+ [chainId: string]: UsddChainData;
865
+ };
866
+ };
538
867
  type OracleMap = {
539
868
  [lender: string]: {
540
869
  [chainId: string]: string;
@@ -949,7 +1278,7 @@ export type AaveV4PeripheralsType = {
949
1278
  [chainId: string]: AaveV4ChainPeripherals;
950
1279
  };
951
1280
  /** Override datas used in the SDK - works across all module instances */
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, }: {
1281
+ 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, frankencoinConfigOverride, frankencoinMarketsOverride, llamaLendConfigOverride, llamaLendMarketsOverride, resupplyConfigOverride, compoundV3BulkerOverride, eulerConfigsOverride, eulerVaultsOverride, dolomiteConfigsOverride, dolomiteEmodeOverride, aaveV4SpokesOverride, aaveV4OraclesOverride, aaveV4PeripheralsOverride, siloMarketsOverride, siloPeripheralsOverride, siloMarketsV3Override, siloPeripheralsV3Override, fluidResolversOverride, fluidVaultsOverride, gearboxResolversOverride, }: {
953
1282
  aaveTokensOverride?: AaveTokensType;
954
1283
  aavePoolsOverride?: AavePoolsType;
955
1284
  aaveOraclesOverride?: OracleMap;
@@ -989,6 +1318,13 @@ export declare function initializeLenderData({ aaveTokensOverride, aavePoolsOver
989
1318
  inverseConfigOverride?: InverseConfigType;
990
1319
  termMaxConfigOverride?: TermMaxConfigType;
991
1320
  inverseMarketsOverride?: InverseMarketsType;
1321
+ usddConfigOverride?: UsddConfigType;
1322
+ usddMarketsOverride?: UsddMarketsType;
1323
+ frankencoinConfigOverride?: FrankencoinConfigType;
1324
+ frankencoinMarketsOverride?: FrankencoinMarketsType;
1325
+ llamaLendConfigOverride?: LlamaLendConfigType;
1326
+ llamaLendMarketsOverride?: LlamaLendMarketsType;
1327
+ resupplyConfigOverride?: ResupplyConfigType;
992
1328
  compoundV3BulkerOverride?: CompoundV3BulkerType;
993
1329
  eulerConfigsOverride?: EulerConfigsType;
994
1330
  eulerVaultsOverride?: EulerVaultsType;
@@ -1113,6 +1449,115 @@ export declare const riverMarketByIndex: (lender: string, chainId: string | numb
1113
1449
  export declare const riverLendersByChain: (chainId: string | number) => string[];
1114
1450
  /** All Inverse lender keys with config on a chain (drives getLendersForChain). */
1115
1451
  export declare const inverseLendersByChain: (chainId: string | number) => string[];
1452
+ export declare const llamaLendConfig: () => LlamaLendConfigType;
1453
+ /** Deployment seed for one LlamaLend lender on a chain (undefined if unloaded). */
1454
+ export declare const llamaLendConfigFor: (lender: string, chainId: string | number) => LlamaLendConfigChain | undefined;
1455
+ export declare const llamaLendMarkets: () => LlamaLendMarketsType;
1456
+ /** Generated chain data (curated market roster; undefined if unloaded). */
1457
+ export declare const llamaLendChainData: (lender: string, chainId: string | number) => LlamaLendChainData | undefined;
1458
+ /** Find one LlamaLend market by its Controller address. */
1459
+ export declare const llamaLendMarketByController: (lender: string, chainId: string | number, controller: string) => LlamaLendMarketConfig | undefined;
1460
+ /**
1461
+ * Find one LlamaLend market by its ERC-4626 VAULT address (the lender side).
1462
+ *
1463
+ * The roster is keyed on the Controller because that is the borrow surface,
1464
+ * but other protocols reference LlamaLend by its vault — Resupply, for
1465
+ * instance, custodies the vault SHARE as collateral, so the vault is the only
1466
+ * handle it exposes. This is the join for "which LlamaLend market does that
1467
+ * wrapper actually sit on top of".
1468
+ */
1469
+ export declare const llamaLendMarketByVault: (lender: string, chainId: string | number, vault: string) => LlamaLendMarketConfig | undefined;
1470
+ /**
1471
+ * All LlamaLend lender keys with config on a chain (drives getLendersForChain).
1472
+ * Gated on a factory being present — a chain entry with neither factory is a
1473
+ * placeholder, not a live deployment.
1474
+ */
1475
+ export declare const llamaLendLendersByChain: (chainId: string | number) => string[];
1476
+ /**
1477
+ * Whether a LlamaLend market accepts on-behalf calls (`_for` + the boolean
1478
+ * `approve` grant). FAILS CLOSED: an unknown market, an unloaded roster or an
1479
+ * explicit `false` all return `false`, because calling `approve` on an older
1480
+ * controller reverts with no usable reason string.
1481
+ */
1482
+ export declare const llamaLendSupportsDelegation: (lender: string, chainId: string | number, controller: string) => boolean;
1483
+ /**
1484
+ * Resolve the leverage zap + its hard-wired router for a chain and aggregator.
1485
+ * `undefined` means leverage is unavailable there for that aggregator, which
1486
+ * callers must report rather than silently falling back — there is no Composer
1487
+ * route that can be funded.
1488
+ */
1489
+ export declare const llamaLendLeverageZap: (lender: string, chainId: string | number, aggregator: "odos" | "1inch") => {
1490
+ zap: string;
1491
+ router: string;
1492
+ } | undefined;
1493
+ /**
1494
+ * Whether a market can be leveraged at all: it must be v1, at or above the
1495
+ * chain's `leverageStartId`, and the chain must have a zap deployed. Fails
1496
+ * closed on an unknown market.
1497
+ */
1498
+ export declare const llamaLendSupportsLeverage: (lender: string, chainId: string | number, controller: string) => boolean;
1499
+ /**
1500
+ * Curve data API base. Read through the getter (not a module constant) for the
1501
+ * same reason as TermMax/Midnight: the per-request metadata re-init rewrites
1502
+ * `llamaLendConfig`, so a captured value goes stale.
1503
+ */
1504
+ export declare const llamaLendApiBaseUrl: (lender: string, chainId: string | number) => string;
1505
+ export declare const usddConfig: () => UsddConfigType;
1506
+ /** Deployment seed for one USDD lender on a chain (undefined if unloaded). */
1507
+ export declare const usddConfigFor: (lender: string, chainId: string | number) => UsddConfigChain | undefined;
1508
+ export declare const usddMarkets: () => UsddMarketsType;
1509
+ /** Generated chain data (verified ilk list + cdpi snapshot; undefined if unloaded). */
1510
+ export declare const usddChainData: (lender: string, chainId: string | number) => UsddChainData | undefined;
1511
+ /** Look up one USDD market by its ilk string (the per-market key suffix). */
1512
+ export declare const usddMarketByIlk: (lender: string, chainId: string | number, ilk: string) => UsddMarketConfig | undefined;
1513
+ /** All USDD lender keys with config on a chain (drives getLendersForChain).
1514
+ * NB: config presence (`vat`) — not market presence — gates the fan-out, so
1515
+ * the (empty-roster) provider still runs and reports zero markets rather
1516
+ * than being invisible; the per-ilk keys only exist once metadata fills. */
1517
+ export declare const usddLendersByChain: (chainId: string | number) => string[];
1518
+ export declare const frankencoinConfig: () => FrankencoinConfigType;
1519
+ /** Deployment seed for one Frankencoin lender on a chain. */
1520
+ export declare const frankencoinConfigFor: (lender: string, chainId: string | number) => FrankencoinConfigChain | undefined;
1521
+ export declare const frankencoinMarkets: () => FrankencoinMarketsType;
1522
+ /** Generated chain data (curated original-position roster). */
1523
+ export declare const frankencoinChainData: (lender: string, chainId: string | number) => FrankencoinChainData | undefined;
1524
+ /** Look up one market by its ORIGINAL position address (the key suffix). */
1525
+ export declare const frankencoinMarketByPosition: (lender: string, chainId: string | number, position: string) => FrankencoinMarketConfig | undefined;
1526
+ /** All Frankencoin lender keys with config on a chain (drives
1527
+ * getLendersForChain). Gated on the MintingHub, the one address every
1528
+ * flow needs. */
1529
+ export declare const frankencoinLendersByChain: (chainId: string | number) => string[];
1530
+ /**
1531
+ * Built-in Ethereum deployment seed for Resupply.
1532
+ *
1533
+ * Every other lender's config comes exclusively from `lender-metadata`, and a
1534
+ * published `config/resupply.json` still WINS over this (see
1535
+ * `resupplyConfigFor`). The fallback exists because these are immutable
1536
+ * protocol singletons — `RouterSwapper` even hardcodes the registry address in
1537
+ * its own bytecode — and because the whole market roster is discovered from
1538
+ * `registry` at runtime. So the integration is live with nothing to publish,
1539
+ * and publishing later is a pure override.
1540
+ *
1541
+ * Verified on-chain 2026-08-04 (block ~25,683,400). Deliberately NOT taken
1542
+ * from the docs' `faq/contract-addresses` page or the repo's
1543
+ * `deployment/contracts.json`: both are stale and list a REVOKED Odos swapper.
1544
+ * Resolved via `Registry.getAddress(key)` over `getAllKeys()`.
1545
+ */
1546
+ export declare const RESUPPLY_ETHEREUM_CONFIG: ResupplyConfigChain;
1547
+ export declare const resupplyConfig: () => ResupplyConfigType;
1548
+ /**
1549
+ * Deployment seed for one Resupply lender on a chain. Published metadata wins;
1550
+ * the built-in Ethereum row is the fallback so the provider works before
1551
+ * `config/resupply.json` exists.
1552
+ */
1553
+ export declare const resupplyConfigFor: (lender: string, chainId: string | number) => ResupplyConfigChain | undefined;
1554
+ /**
1555
+ * All Resupply lender keys with config on a chain (drives getLendersForChain).
1556
+ * Gated on the REGISTRY — the one address the whole provider is bootstrapped
1557
+ * from. Union of published metadata and the built-in row, so the fan-out
1558
+ * happens with or without a publish.
1559
+ */
1560
+ export declare const resupplyLendersByChain: (chainId: string | number) => string[];
1116
1561
  export declare const compoundV3Bulker: () => CompoundV3BulkerType;
1117
1562
  export declare const eulerConfigs: () => EulerConfigsType;
1118
1563
  export declare const eulerVaults: () => EulerVaultsType;
@@ -1348,4 +1793,28 @@ export declare function termMaxLenderKey(market: string): string;
1348
1793
  export declare function parseTermMaxLenderKey(lenderKey: string): {
1349
1794
  marketAddrLower: string;
1350
1795
  } | undefined;
1796
+ /**
1797
+ * Per-market lender key for one LlamaLend market, keyed by its CONTROLLER (the
1798
+ * borrow-side contract), not the vault — the Controller is what every write
1799
+ * and every user read targets.
1800
+ *
1801
+ * Format: `LLAMALEND_${controllerAddr.slice(2).toUpperCase()}`
1802
+ *
1803
+ * Both generations share this key space deliberately: they are one brand to the
1804
+ * user, and the Curve API returns them in one list. The `version` field on the
1805
+ * market row is what encoders branch on. chainId is intentionally NOT in the
1806
+ * token (chain scoping happens at the marketUid level), matching every other
1807
+ * per-market key in this file.
1808
+ *
1809
+ * `isLlamaLend()` works on this because it matches `startsWith('LLAMALEND')`.
1810
+ */
1811
+ export declare function llamaLendLenderKey(controller: string): string;
1812
+ /**
1813
+ * Inverse of `llamaLendLenderKey`: given a per-market lender key, return
1814
+ * `{ controllerAddrLower }`. Returns `undefined` if the key isn't a per-market
1815
+ * LlamaLend key (e.g. someone passed the bare prefix `LLAMALEND`).
1816
+ */
1817
+ export declare function parseLlamaLendLenderKey(lenderKey: string): {
1818
+ controllerAddrLower: string;
1819
+ } | undefined;
1351
1820
  export {};
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.0.36",
7
+ "version": "0.0.38",
8
8
  "description": "Hold and initialize lending protocol data across a stack",
9
9
  "files": [
10
10
  "dist"