@1delta/data-sdk 0.0.37 → 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
@@ -82,6 +82,11 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
82
82
  inverseMarkets: {},
83
83
  usddConfig: {},
84
84
  usddMarkets: {},
85
+ frankencoinConfig: {},
86
+ frankencoinMarkets: {},
87
+ llamaLendConfig: {},
88
+ llamaLendMarkets: {},
89
+ resupplyConfig: {},
85
90
  compoundV3Bulker: {},
86
91
  eulerConfigs: {},
87
92
  eulerVaults: {},
@@ -147,6 +152,11 @@ function initializeLenderData({
147
152
  inverseMarketsOverride,
148
153
  usddConfigOverride,
149
154
  usddMarketsOverride,
155
+ frankencoinConfigOverride,
156
+ frankencoinMarketsOverride,
157
+ llamaLendConfigOverride,
158
+ llamaLendMarketsOverride,
159
+ resupplyConfigOverride,
150
160
  compoundV3BulkerOverride,
151
161
  eulerConfigsOverride,
152
162
  eulerVaultsOverride,
@@ -205,6 +215,11 @@ function initializeLenderData({
205
215
  if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
206
216
  if (usddConfigOverride) data.usddConfig = usddConfigOverride;
207
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;
208
223
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
209
224
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
210
225
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -341,6 +356,41 @@ var inverseLendersByChain = (chainId) => {
341
356
  const chain = String(chainId);
342
357
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
343
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";
344
394
  var usddConfig = () => getGlobalData2()?.usddConfig;
345
395
  var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
346
396
  var usddMarkets = () => getGlobalData2()?.usddMarkets;
@@ -351,6 +401,54 @@ var usddLendersByChain = (chainId) => {
351
401
  const chain = String(chainId);
352
402
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
353
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
+ };
354
452
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
355
453
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
356
454
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -492,6 +590,17 @@ function parseTermMaxLenderKey(lenderKey) {
492
590
  if (!match) return void 0;
493
591
  return { marketAddrLower: "0x" + match[1].toLowerCase() };
494
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
+ }
495
604
 
496
605
  // src/tokens.ts
497
606
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -525,6 +634,7 @@ async function fetchMainTokensMap() {
525
634
  }
526
635
 
527
636
  exports.GEARBOX_ACCOUNT_COMPRESSOR_V310 = GEARBOX_ACCOUNT_COMPRESSOR_V310;
637
+ exports.RESUPPLY_ETHEREUM_CONFIG = RESUPPLY_ETHEREUM_CONFIG;
528
638
  exports.aaveOracles = aaveOracles;
529
639
  exports.aaveOraclesConfig = aaveOraclesConfig;
530
640
  exports.aavePools = aavePools;
@@ -568,6 +678,12 @@ exports.fluidChains = fluidChains;
568
678
  exports.fluidResolvers = fluidResolvers;
569
679
  exports.fluidVaultEntries = fluidVaultEntries;
570
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;
571
687
  exports.gearboxAccountCompressor = gearboxAccountCompressor;
572
688
  exports.gearboxAddressProviderV310 = gearboxAddressProviderV310;
573
689
  exports.gearboxBotListV3 = gearboxBotListV3;
@@ -600,6 +716,18 @@ exports.liquityConfigFor = liquityConfigFor;
600
716
  exports.liquityLendersByChain = liquityLendersByChain;
601
717
  exports.liquityMarkets = liquityMarkets;
602
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;
603
731
  exports.midnightApiBaseOverride = midnightApiBaseOverride;
604
732
  exports.midnightConfig = midnightConfig;
605
733
  exports.midnightMarketById = midnightMarketById;
@@ -613,11 +741,15 @@ exports.morphoTypeOracles = morphoTypeOracles;
613
741
  exports.morphoTypeVaults = morphoTypeVaults;
614
742
  exports.parseAaveV4SpokeLenderKey = parseAaveV4SpokeLenderKey;
615
743
  exports.parseGearboxV3LenderKey = parseGearboxV3LenderKey;
744
+ exports.parseLlamaLendLenderKey = parseLlamaLendLenderKey;
616
745
  exports.parseSiloV2LenderKey = parseSiloV2LenderKey;
617
746
  exports.parseSiloV3LenderKey = parseSiloV3LenderKey;
618
747
  exports.parseTermMaxLenderKey = parseTermMaxLenderKey;
619
748
  exports.resolveMidnightApiBase = resolveMidnightApiBase;
620
749
  exports.resolveTermApiBase = resolveTermApiBase;
750
+ exports.resupplyConfig = resupplyConfig;
751
+ exports.resupplyConfigFor = resupplyConfigFor;
752
+ exports.resupplyLendersByChain = resupplyLendersByChain;
621
753
  exports.riverChainData = riverChainData;
622
754
  exports.riverConfig = riverConfig;
623
755
  exports.riverConfigFor = riverConfigFor;
package/dist/index.mjs CHANGED
@@ -80,6 +80,11 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
80
80
  inverseMarkets: {},
81
81
  usddConfig: {},
82
82
  usddMarkets: {},
83
+ frankencoinConfig: {},
84
+ frankencoinMarkets: {},
85
+ llamaLendConfig: {},
86
+ llamaLendMarkets: {},
87
+ resupplyConfig: {},
83
88
  compoundV3Bulker: {},
84
89
  eulerConfigs: {},
85
90
  eulerVaults: {},
@@ -145,6 +150,11 @@ function initializeLenderData({
145
150
  inverseMarketsOverride,
146
151
  usddConfigOverride,
147
152
  usddMarketsOverride,
153
+ frankencoinConfigOverride,
154
+ frankencoinMarketsOverride,
155
+ llamaLendConfigOverride,
156
+ llamaLendMarketsOverride,
157
+ resupplyConfigOverride,
148
158
  compoundV3BulkerOverride,
149
159
  eulerConfigsOverride,
150
160
  eulerVaultsOverride,
@@ -203,6 +213,11 @@ function initializeLenderData({
203
213
  if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
204
214
  if (usddConfigOverride) data.usddConfig = usddConfigOverride;
205
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;
206
221
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
207
222
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
208
223
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -339,6 +354,41 @@ var inverseLendersByChain = (chainId) => {
339
354
  const chain = String(chainId);
340
355
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
341
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";
342
392
  var usddConfig = () => getGlobalData2()?.usddConfig;
343
393
  var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
344
394
  var usddMarkets = () => getGlobalData2()?.usddMarkets;
@@ -349,6 +399,54 @@ var usddLendersByChain = (chainId) => {
349
399
  const chain = String(chainId);
350
400
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
351
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
+ };
352
450
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
353
451
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
354
452
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -490,6 +588,17 @@ function parseTermMaxLenderKey(lenderKey) {
490
588
  if (!match) return void 0;
491
589
  return { marketAddrLower: "0x" + match[1].toLowerCase() };
492
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
+ }
493
602
 
494
603
  // src/tokens.ts
495
604
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -522,4 +631,4 @@ async function fetchMainTokensMap() {
522
631
  return await data.json();
523
632
  }
524
633
 
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 };
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,245 @@ 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
+ };
538
784
  /** One USDD PSM (1:1 stable swap module; NOT a lending market). */
539
785
  export type UsddPsmConfig = {
540
786
  ilk: string;
@@ -1032,7 +1278,7 @@ export type AaveV4PeripheralsType = {
1032
1278
  [chainId: string]: AaveV4ChainPeripherals;
1033
1279
  };
1034
1280
  /** Override datas used in the SDK - works across all module instances */
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, }: {
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, }: {
1036
1282
  aaveTokensOverride?: AaveTokensType;
1037
1283
  aavePoolsOverride?: AavePoolsType;
1038
1284
  aaveOraclesOverride?: OracleMap;
@@ -1074,6 +1320,11 @@ export declare function initializeLenderData({ aaveTokensOverride, aavePoolsOver
1074
1320
  inverseMarketsOverride?: InverseMarketsType;
1075
1321
  usddConfigOverride?: UsddConfigType;
1076
1322
  usddMarketsOverride?: UsddMarketsType;
1323
+ frankencoinConfigOverride?: FrankencoinConfigType;
1324
+ frankencoinMarketsOverride?: FrankencoinMarketsType;
1325
+ llamaLendConfigOverride?: LlamaLendConfigType;
1326
+ llamaLendMarketsOverride?: LlamaLendMarketsType;
1327
+ resupplyConfigOverride?: ResupplyConfigType;
1077
1328
  compoundV3BulkerOverride?: CompoundV3BulkerType;
1078
1329
  eulerConfigsOverride?: EulerConfigsType;
1079
1330
  eulerVaultsOverride?: EulerVaultsType;
@@ -1198,6 +1449,59 @@ export declare const riverMarketByIndex: (lender: string, chainId: string | numb
1198
1449
  export declare const riverLendersByChain: (chainId: string | number) => string[];
1199
1450
  /** All Inverse lender keys with config on a chain (drives getLendersForChain). */
1200
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;
1201
1505
  export declare const usddConfig: () => UsddConfigType;
1202
1506
  /** Deployment seed for one USDD lender on a chain (undefined if unloaded). */
1203
1507
  export declare const usddConfigFor: (lender: string, chainId: string | number) => UsddConfigChain | undefined;
@@ -1211,6 +1515,49 @@ export declare const usddMarketByIlk: (lender: string, chainId: string | number,
1211
1515
  * the (empty-roster) provider still runs and reports zero markets rather
1212
1516
  * than being invisible; the per-ilk keys only exist once metadata fills. */
1213
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[];
1214
1561
  export declare const compoundV3Bulker: () => CompoundV3BulkerType;
1215
1562
  export declare const eulerConfigs: () => EulerConfigsType;
1216
1563
  export declare const eulerVaults: () => EulerVaultsType;
@@ -1446,4 +1793,28 @@ export declare function termMaxLenderKey(market: string): string;
1446
1793
  export declare function parseTermMaxLenderKey(lenderKey: string): {
1447
1794
  marketAddrLower: string;
1448
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;
1449
1820
  export {};
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.0.37",
7
+ "version": "0.0.38",
8
8
  "description": "Hold and initialize lending protocol data across a stack",
9
9
  "files": [
10
10
  "dist"