@1delta/data-sdk 0.0.37 → 0.0.39

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,12 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
82
82
  inverseMarkets: {},
83
83
  usddConfig: {},
84
84
  usddMarkets: {},
85
+ frankencoinConfig: {},
86
+ frankencoinMarkets: {},
87
+ llamaLendConfig: {},
88
+ llamaLendMarkets: {},
89
+ resupplyConfig: {},
90
+ curvanceConfig: {},
85
91
  compoundV3Bulker: {},
86
92
  eulerConfigs: {},
87
93
  eulerVaults: {},
@@ -147,6 +153,12 @@ function initializeLenderData({
147
153
  inverseMarketsOverride,
148
154
  usddConfigOverride,
149
155
  usddMarketsOverride,
156
+ frankencoinConfigOverride,
157
+ frankencoinMarketsOverride,
158
+ llamaLendConfigOverride,
159
+ llamaLendMarketsOverride,
160
+ resupplyConfigOverride,
161
+ curvanceConfigOverride,
150
162
  compoundV3BulkerOverride,
151
163
  eulerConfigsOverride,
152
164
  eulerVaultsOverride,
@@ -205,6 +217,12 @@ function initializeLenderData({
205
217
  if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
206
218
  if (usddConfigOverride) data.usddConfig = usddConfigOverride;
207
219
  if (usddMarketsOverride) data.usddMarkets = usddMarketsOverride;
220
+ if (frankencoinConfigOverride) data.frankencoinConfig = frankencoinConfigOverride;
221
+ if (frankencoinMarketsOverride) data.frankencoinMarkets = frankencoinMarketsOverride;
222
+ if (llamaLendConfigOverride) data.llamaLendConfig = llamaLendConfigOverride;
223
+ if (llamaLendMarketsOverride) data.llamaLendMarkets = llamaLendMarketsOverride;
224
+ if (resupplyConfigOverride) data.resupplyConfig = resupplyConfigOverride;
225
+ if (curvanceConfigOverride) data.curvanceConfig = curvanceConfigOverride;
208
226
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
209
227
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
210
228
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -341,6 +359,41 @@ var inverseLendersByChain = (chainId) => {
341
359
  const chain = String(chainId);
342
360
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
343
361
  };
362
+ var llamaLendConfig = () => getGlobalData2()?.llamaLendConfig;
363
+ var llamaLendConfigFor = (lender, chainId) => getGlobalData2()?.llamaLendConfig?.[lender]?.[String(chainId)];
364
+ var llamaLendMarkets = () => getGlobalData2()?.llamaLendMarkets;
365
+ var llamaLendChainData = (lender, chainId) => getGlobalData2()?.llamaLendMarkets?.[lender]?.[String(chainId)];
366
+ var llamaLendMarketByController = (lender, chainId, controller) => {
367
+ const lower = controller.toLowerCase();
368
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.controller.toLowerCase() === lower);
369
+ };
370
+ var llamaLendMarketByVault = (lender, chainId, vault) => {
371
+ const lower = vault.toLowerCase();
372
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.vault.toLowerCase() === lower);
373
+ };
374
+ var llamaLendLendersByChain = (chainId) => {
375
+ const cfg = getGlobalData2()?.llamaLendConfig ?? {};
376
+ const chain = String(chainId);
377
+ return Object.keys(cfg).filter(
378
+ (lender) => !!(cfg[lender]?.[chain]?.oneWayFactory || cfg[lender]?.[chain]?.lendFactory)
379
+ );
380
+ };
381
+ var llamaLendSupportsDelegation = (lender, chainId, controller) => llamaLendMarketByController(lender, chainId, controller)?.supportsDelegation === true;
382
+ var llamaLendLeverageZap = (lender, chainId, aggregator) => {
383
+ const cfg = llamaLendConfigFor(lender, chainId);
384
+ if (!cfg) return void 0;
385
+ const zap = aggregator === "odos" ? cfg.leverageZapOdos : cfg.leverageZap1inch;
386
+ const router = aggregator === "odos" ? cfg.leverageZapOdosRouter : cfg.leverageZap1inchRouter;
387
+ if (!zap || !router) return void 0;
388
+ return { zap, router };
389
+ };
390
+ var llamaLendSupportsLeverage = (lender, chainId, controller) => {
391
+ const m = llamaLendMarketByController(lender, chainId, controller);
392
+ if (!m?.supportsLeverage) return false;
393
+ const cfg = llamaLendConfigFor(lender, chainId);
394
+ return Boolean(cfg?.leverageZapOdos || cfg?.leverageZap1inch);
395
+ };
396
+ var llamaLendApiBaseUrl = (lender, chainId) => llamaLendConfigFor(lender, chainId)?.apiBaseUrl || "https://api.curve.finance";
344
397
  var usddConfig = () => getGlobalData2()?.usddConfig;
345
398
  var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
346
399
  var usddMarkets = () => getGlobalData2()?.usddMarkets;
@@ -351,6 +404,160 @@ var usddLendersByChain = (chainId) => {
351
404
  const chain = String(chainId);
352
405
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
353
406
  };
407
+ var frankencoinConfig = () => getGlobalData2()?.frankencoinConfig;
408
+ var frankencoinConfigFor = (lender, chainId) => getGlobalData2()?.frankencoinConfig?.[lender]?.[String(chainId)];
409
+ var frankencoinMarkets = () => getGlobalData2()?.frankencoinMarkets;
410
+ var frankencoinChainData = (lender, chainId) => getGlobalData2()?.frankencoinMarkets?.[lender]?.[String(chainId)];
411
+ var frankencoinMarketByPosition = (lender, chainId, position) => {
412
+ const lower = position.toLowerCase();
413
+ return frankencoinChainData(lender, chainId)?.markets?.find((m) => m.position.toLowerCase() === lower);
414
+ };
415
+ var frankencoinLendersByChain = (chainId) => {
416
+ const cfg = getGlobalData2()?.frankencoinConfig ?? {};
417
+ const chain = String(chainId);
418
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.mintingHub);
419
+ };
420
+ var RESUPPLY_ETHEREUM_CONFIG = {
421
+ registry: "0x10101010E0C3171D894B71B3400668aF311e7D94",
422
+ reusd: "0x57aB1E0003F623289CD798B1824Be09a793e4Bec",
423
+ utilities: "0x5f896C250DA6b462873813ceEc47F3e4D8CBA464",
424
+ curveSwapper: "0x042f48346be16Be381190a7397A80808243f3b2e",
425
+ ensoSwapper: "0x181c98113ce60BA75A0f72d8901Eb17e5065043D",
426
+ lifiSwapper: "0x597Db76794c75E588D3a70534FB34B7780941fCe",
427
+ redemptionHandler: "0x5eeB063d0abefBBc78F576E28d762a16b637A025",
428
+ liquidationHandler: "0x88888888c227c36401493Ed9F3e3Dcc3800B2634",
429
+ insurancePool: "0x00000000efe883b3304aFf71eaCf72Dbc3e1b577",
430
+ sreusd: "0x557AB1e003951A73c12D16F0fEA8490E39C33C35",
431
+ priceWatcher: "0xAaaa0013e2ec451F76816d1e0a02ABA596dd9251",
432
+ debtDecimals: 18
433
+ };
434
+ var RESUPPLY_BUILTIN = {
435
+ RESUPPLY: { "1": RESUPPLY_ETHEREUM_CONFIG }
436
+ };
437
+ var resupplyConfig = () => getGlobalData2()?.resupplyConfig;
438
+ var resupplyConfigFor = (lender, chainId) => {
439
+ const published = getGlobalData2()?.resupplyConfig?.[lender]?.[String(chainId)];
440
+ if (published?.registry) return published;
441
+ return RESUPPLY_BUILTIN[lender]?.[String(chainId)];
442
+ };
443
+ var resupplyLendersByChain = (chainId) => {
444
+ const chain = String(chainId);
445
+ const cfg = getGlobalData2()?.resupplyConfig ?? {};
446
+ const keys = /* @__PURE__ */ new Set();
447
+ for (const lender of Object.keys(cfg)) {
448
+ if (cfg[lender]?.[chain]?.registry) keys.add(lender);
449
+ }
450
+ for (const lender of Object.keys(RESUPPLY_BUILTIN)) {
451
+ if (RESUPPLY_BUILTIN[lender]?.[chain]?.registry) keys.add(lender);
452
+ }
453
+ return [...keys];
454
+ };
455
+ var CURVANCE_MONAD_CONFIG = {
456
+ centralRegistry: "0x1310f352f1389969Ece6741671c4B919523912fF",
457
+ oracleManager: "0x65ADF8aE8420A58278De066593E6fF1713A137c5",
458
+ protocolReader: "0xC5E6DD26095Cc1fa2369f7885dF263e150228D8b",
459
+ optimizerReader: "0x821a4a2Be28888917106B3A628c8edaffEbF2e2F",
460
+ optimizers: {
461
+ // `hyAUSD` — 6-dec shares over AUSD; itself collateral in 2 markets.
462
+ hyAUSD: "0xaD663aC84052b52BE4ed1b27BA416505e84a00Bf"
463
+ },
464
+ // Only KyberSwap's MetaAggregationRouterV2 has a registered checker on Monad
465
+ // (2026-08). 1inch / Odos / OogaBooga all return the zero address even
466
+ // though checker contracts for them exist in the Curvance repo — registering
467
+ // OogaBooga is a single DAO call. Probe live before relying on any of this.
468
+ swapTargets: {
469
+ kyberswap: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
470
+ },
471
+ positionManagers: {
472
+ // muBOND | AUSD
473
+ "0x830D40CDFdc494BC1A2729a7381bfCe44326c944": { simplePositionManager: "0xA3d212D4705caf42C35d6EaE0C85E94c4cd329E4" },
474
+ // loAZND | AUSD
475
+ "0x7C822B093A116654F824Ec2A35CD23a3749E4f90": { simplePositionManager: "0x9e4638fd67bE15360bfebC5e07AECfF33dfda917" },
476
+ // ezETH | WETH
477
+ "0x83840d837E7A3E00bBb0B8501E60E989A8987c37": { simplePositionManager: "0xd8d3E46E52C3AB8FD98D04143984C763B4Bbc584" },
478
+ // shMON | WMON
479
+ "0xE1C24B2E93230FBe33d32Ba38ECA3218284143e2": {
480
+ nativeVaultPositionManager: "0x2fAA792502aC5a329DcCc1580C5308fCc0a772fe",
481
+ simplePositionManager: "0x7E8705a164DA7Cc5a4119C750b1F79837AD89D5E"
482
+ },
483
+ // aprMON | WMON
484
+ "0x5EA0a1Cf3501C954b64902c5e92100b8A2CaB1Ac": {
485
+ nativeVaultPositionManager: "0x82f88A810E86a730699231F5fBF5686c643467C8",
486
+ simplePositionManager: "0x669786FF3da7544c98FE74eE1006D787118d1770"
487
+ },
488
+ // sMON | WMON
489
+ "0xe5970cDB1916B2cCF6185C86C174EEE2d330D05B": { simplePositionManager: "0x3d6ba6C90E1738cb01C46E72F284C7Bd57eB11EC" },
490
+ // sAUSD | AUSD
491
+ "0xBBE7A3c45aDBb16F6490767b663428c34aA341Eb": {
492
+ simplePositionManager: "0x491e8712885E4e0b98864F13393ced8c1a61FD57",
493
+ vaultPositionManager: "0xe94AC990873C3B59A417d25C1ec1398807FB41A1"
494
+ },
495
+ // earnAUSD | AUSD
496
+ "0xd6365555f6a697C7C295bA741100AA644cE28545": { simplePositionManager: "0xd807efC94376618B4d9CE6eAaf89607006d3B881" },
497
+ // WMON | AUSD
498
+ "0x05e70717fA8BD0F21a9F826d093d99f6Da4f1554": { simplePositionManager: "0x2619BB5Acfe51317c4C36a63578FD56148e68C74" },
499
+ // WMON | USDC
500
+ "0xa6A2A92F126b79Ee0804845ee6B52899b4491093": { simplePositionManager: "0x960c49E523e6A87282D2bC5032d0AeCb35Dc20ef" },
501
+ // WBTC | USDC
502
+ "0x01C4a0d396EFE982B1B103BE9910321d34e1aEA9": { simplePositionManager: "0x8cA51d155C07e91B206Cf11C8D52d5aB082657F6" },
503
+ // WETH | USDC
504
+ "0xb3E9E0134354cc91b7FB9F9d6C3ab0dE7854BB49": { simplePositionManager: "0x3A1B2Dc11a81Fe106eC667BaB4056fC72498ff73" },
505
+ // gMON | WMON
506
+ "0xb00aFF53a4Df2b4E2f97a3d9ffaDb55564C8E42F": { simplePositionManager: "0x77B90040E6dFE8A62293Cd91CAeE35296EC266Ee" },
507
+ // syzUSD | AUSD
508
+ "0x90fc1A4abC4ee5f8a9560dE069067D9606d2909C": { simplePositionManager: "0x9352318f75e8Cb7C47C5B086D56d3e6D761b7419" },
509
+ // wsrUSD | AUSD
510
+ "0x627a15859d09C1550e2934991AA95aFc6896e3Ef": { simplePositionManager: "0xF8613b7b4e8bFb5E7155fb4D3bc9f9B93d895C31" },
511
+ // YZM | AUSD
512
+ "0x4409e2161B6f9A25ACbC471a37390654Ed272249": { simplePositionManager: "0xb85dEf309F7eEEb8f581909c7afB623dDf59AdD9" },
513
+ // vUSD | AUSD
514
+ "0x2DB9AB1bB00d7000b21A2EbcE7D1a9b91F351E72": { simplePositionManager: "0xCb1709fAF66A73b4f6026b531Bef9AF971368f50" },
515
+ // eBTC | WBTC
516
+ "0xBc4cd7bbd8d38027A88838B88BA04561FA778C35": { simplePositionManager: "0x5e339724818c4b46E1Bc6966FeB4ea2924Ca17D9" },
517
+ // savUSD | USDC
518
+ "0x38104e87Eb96ce5ef1C23a06878dB0D657B4a699": { simplePositionManager: "0x7B918FF5EDc44B29ced4d3dc52Fb8b859025325c" },
519
+ // savUSD | AUSD
520
+ "0x4B0a39eCC3e5A5dA3ce6D492D4D255cD1F0209F7": { simplePositionManager: "0xb8F6f480E645dBa96Df9eD3948D900725bA9e9Ec" }
521
+ }
522
+ };
523
+ var CURVANCE_BUILTIN = {
524
+ CURVANCE: { "143": CURVANCE_MONAD_CONFIG }
525
+ };
526
+ var curvanceConfig = () => getGlobalData2()?.curvanceConfig;
527
+ var curvanceConfigFor = (lender, chainId) => {
528
+ const published = getGlobalData2()?.curvanceConfig?.[lender]?.[String(chainId)];
529
+ if (published?.centralRegistry) return published;
530
+ return CURVANCE_BUILTIN[lender]?.[String(chainId)];
531
+ };
532
+ var curvanceLendersByChain = (chainId) => {
533
+ const chain = String(chainId);
534
+ const cfg = getGlobalData2()?.curvanceConfig ?? {};
535
+ const keys = /* @__PURE__ */ new Set();
536
+ for (const lender of Object.keys(cfg)) {
537
+ if (cfg[lender]?.[chain]?.centralRegistry) keys.add(lender);
538
+ }
539
+ for (const lender of Object.keys(CURVANCE_BUILTIN)) {
540
+ if (CURVANCE_BUILTIN[lender]?.[chain]?.centralRegistry) keys.add(lender);
541
+ }
542
+ return [...keys];
543
+ };
544
+ var curvancePositionManagersFor = (lender, chainId, marketManager) => {
545
+ const map = curvanceConfigFor(lender, chainId)?.positionManagers;
546
+ if (!map || !marketManager) return void 0;
547
+ const direct = map[marketManager];
548
+ if (direct) return direct;
549
+ const target = marketManager.toLowerCase();
550
+ for (const key of Object.keys(map)) {
551
+ if (key.toLowerCase() === target) return map[key];
552
+ }
553
+ return void 0;
554
+ };
555
+ var curvancePositionManager = (lender, chainId, marketManager, kind) => {
556
+ const pms = curvancePositionManagersFor(lender, chainId, marketManager);
557
+ if (!pms) return void 0;
558
+ if (kind) return pms[kind];
559
+ return pms.simplePositionManager ?? pms.vaultPositionManager ?? pms.nativeVaultPositionManager ?? pms.pendlePtPositionManager;
560
+ };
354
561
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
355
562
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
356
563
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -492,6 +699,17 @@ function parseTermMaxLenderKey(lenderKey) {
492
699
  if (!match) return void 0;
493
700
  return { marketAddrLower: "0x" + match[1].toLowerCase() };
494
701
  }
702
+ function llamaLendLenderKey(controller) {
703
+ if (!controller || !controller.startsWith("0x") || controller.length !== 42) {
704
+ throw new Error(`llamaLendLenderKey: invalid controller address ${controller}`);
705
+ }
706
+ return `LLAMALEND_${controller.slice(2).toUpperCase()}`;
707
+ }
708
+ function parseLlamaLendLenderKey(lenderKey) {
709
+ const match = lenderKey.match(/^LLAMALEND_([0-9A-Fa-f]{40})$/);
710
+ if (!match) return void 0;
711
+ return { controllerAddrLower: "0x" + match[1].toLowerCase() };
712
+ }
495
713
 
496
714
  // src/tokens.ts
497
715
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -524,7 +742,9 @@ async function fetchMainTokensMap() {
524
742
  return await data.json();
525
743
  }
526
744
 
745
+ exports.CURVANCE_MONAD_CONFIG = CURVANCE_MONAD_CONFIG;
527
746
  exports.GEARBOX_ACCOUNT_COMPRESSOR_V310 = GEARBOX_ACCOUNT_COMPRESSOR_V310;
747
+ exports.RESUPPLY_ETHEREUM_CONFIG = RESUPPLY_ETHEREUM_CONFIG;
528
748
  exports.aaveOracles = aaveOracles;
529
749
  exports.aaveOraclesConfig = aaveOraclesConfig;
530
750
  exports.aavePools = aavePools;
@@ -548,6 +768,11 @@ exports.compoundV3Bulker = compoundV3Bulker;
548
768
  exports.compoundV3OraclesData = compoundV3OraclesData;
549
769
  exports.compoundV3Pools = compoundV3Pools;
550
770
  exports.compoundV3Reserves = compoundV3Reserves;
771
+ exports.curvanceConfig = curvanceConfig;
772
+ exports.curvanceConfigFor = curvanceConfigFor;
773
+ exports.curvanceLendersByChain = curvanceLendersByChain;
774
+ exports.curvancePositionManager = curvancePositionManager;
775
+ exports.curvancePositionManagersFor = curvancePositionManagersFor;
551
776
  exports.dolomiteChains = dolomiteChains;
552
777
  exports.dolomiteConfigs = dolomiteConfigs;
553
778
  exports.dolomiteEmode = dolomiteEmode;
@@ -568,6 +793,12 @@ exports.fluidChains = fluidChains;
568
793
  exports.fluidResolvers = fluidResolvers;
569
794
  exports.fluidVaultEntries = fluidVaultEntries;
570
795
  exports.fluidVaults = fluidVaults;
796
+ exports.frankencoinChainData = frankencoinChainData;
797
+ exports.frankencoinConfig = frankencoinConfig;
798
+ exports.frankencoinConfigFor = frankencoinConfigFor;
799
+ exports.frankencoinLendersByChain = frankencoinLendersByChain;
800
+ exports.frankencoinMarketByPosition = frankencoinMarketByPosition;
801
+ exports.frankencoinMarkets = frankencoinMarkets;
571
802
  exports.gearboxAccountCompressor = gearboxAccountCompressor;
572
803
  exports.gearboxAddressProviderV310 = gearboxAddressProviderV310;
573
804
  exports.gearboxBotListV3 = gearboxBotListV3;
@@ -600,6 +831,18 @@ exports.liquityConfigFor = liquityConfigFor;
600
831
  exports.liquityLendersByChain = liquityLendersByChain;
601
832
  exports.liquityMarkets = liquityMarkets;
602
833
  exports.listaNativeProvider = listaNativeProvider;
834
+ exports.llamaLendApiBaseUrl = llamaLendApiBaseUrl;
835
+ exports.llamaLendChainData = llamaLendChainData;
836
+ exports.llamaLendConfig = llamaLendConfig;
837
+ exports.llamaLendConfigFor = llamaLendConfigFor;
838
+ exports.llamaLendLenderKey = llamaLendLenderKey;
839
+ exports.llamaLendLendersByChain = llamaLendLendersByChain;
840
+ exports.llamaLendLeverageZap = llamaLendLeverageZap;
841
+ exports.llamaLendMarketByController = llamaLendMarketByController;
842
+ exports.llamaLendMarketByVault = llamaLendMarketByVault;
843
+ exports.llamaLendMarkets = llamaLendMarkets;
844
+ exports.llamaLendSupportsDelegation = llamaLendSupportsDelegation;
845
+ exports.llamaLendSupportsLeverage = llamaLendSupportsLeverage;
603
846
  exports.midnightApiBaseOverride = midnightApiBaseOverride;
604
847
  exports.midnightConfig = midnightConfig;
605
848
  exports.midnightMarketById = midnightMarketById;
@@ -613,11 +856,15 @@ exports.morphoTypeOracles = morphoTypeOracles;
613
856
  exports.morphoTypeVaults = morphoTypeVaults;
614
857
  exports.parseAaveV4SpokeLenderKey = parseAaveV4SpokeLenderKey;
615
858
  exports.parseGearboxV3LenderKey = parseGearboxV3LenderKey;
859
+ exports.parseLlamaLendLenderKey = parseLlamaLendLenderKey;
616
860
  exports.parseSiloV2LenderKey = parseSiloV2LenderKey;
617
861
  exports.parseSiloV3LenderKey = parseSiloV3LenderKey;
618
862
  exports.parseTermMaxLenderKey = parseTermMaxLenderKey;
619
863
  exports.resolveMidnightApiBase = resolveMidnightApiBase;
620
864
  exports.resolveTermApiBase = resolveTermApiBase;
865
+ exports.resupplyConfig = resupplyConfig;
866
+ exports.resupplyConfigFor = resupplyConfigFor;
867
+ exports.resupplyLendersByChain = resupplyLendersByChain;
621
868
  exports.riverChainData = riverChainData;
622
869
  exports.riverConfig = riverConfig;
623
870
  exports.riverConfigFor = riverConfigFor;
package/dist/index.mjs CHANGED
@@ -80,6 +80,12 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
80
80
  inverseMarkets: {},
81
81
  usddConfig: {},
82
82
  usddMarkets: {},
83
+ frankencoinConfig: {},
84
+ frankencoinMarkets: {},
85
+ llamaLendConfig: {},
86
+ llamaLendMarkets: {},
87
+ resupplyConfig: {},
88
+ curvanceConfig: {},
83
89
  compoundV3Bulker: {},
84
90
  eulerConfigs: {},
85
91
  eulerVaults: {},
@@ -145,6 +151,12 @@ function initializeLenderData({
145
151
  inverseMarketsOverride,
146
152
  usddConfigOverride,
147
153
  usddMarketsOverride,
154
+ frankencoinConfigOverride,
155
+ frankencoinMarketsOverride,
156
+ llamaLendConfigOverride,
157
+ llamaLendMarketsOverride,
158
+ resupplyConfigOverride,
159
+ curvanceConfigOverride,
148
160
  compoundV3BulkerOverride,
149
161
  eulerConfigsOverride,
150
162
  eulerVaultsOverride,
@@ -203,6 +215,12 @@ function initializeLenderData({
203
215
  if (inverseMarketsOverride) data.inverseMarkets = inverseMarketsOverride;
204
216
  if (usddConfigOverride) data.usddConfig = usddConfigOverride;
205
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;
223
+ if (curvanceConfigOverride) data.curvanceConfig = curvanceConfigOverride;
206
224
  if (compoundV3BulkerOverride) data.compoundV3Bulker = compoundV3BulkerOverride;
207
225
  if (eulerConfigsOverride) data.eulerConfigs = eulerConfigsOverride;
208
226
  if (eulerVaultsOverride) data.eulerVaults = eulerVaultsOverride;
@@ -339,6 +357,41 @@ var inverseLendersByChain = (chainId) => {
339
357
  const chain = String(chainId);
340
358
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.dola);
341
359
  };
360
+ var llamaLendConfig = () => getGlobalData2()?.llamaLendConfig;
361
+ var llamaLendConfigFor = (lender, chainId) => getGlobalData2()?.llamaLendConfig?.[lender]?.[String(chainId)];
362
+ var llamaLendMarkets = () => getGlobalData2()?.llamaLendMarkets;
363
+ var llamaLendChainData = (lender, chainId) => getGlobalData2()?.llamaLendMarkets?.[lender]?.[String(chainId)];
364
+ var llamaLendMarketByController = (lender, chainId, controller) => {
365
+ const lower = controller.toLowerCase();
366
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.controller.toLowerCase() === lower);
367
+ };
368
+ var llamaLendMarketByVault = (lender, chainId, vault) => {
369
+ const lower = vault.toLowerCase();
370
+ return llamaLendChainData(lender, chainId)?.markets?.find((m) => m.vault.toLowerCase() === lower);
371
+ };
372
+ var llamaLendLendersByChain = (chainId) => {
373
+ const cfg = getGlobalData2()?.llamaLendConfig ?? {};
374
+ const chain = String(chainId);
375
+ return Object.keys(cfg).filter(
376
+ (lender) => !!(cfg[lender]?.[chain]?.oneWayFactory || cfg[lender]?.[chain]?.lendFactory)
377
+ );
378
+ };
379
+ var llamaLendSupportsDelegation = (lender, chainId, controller) => llamaLendMarketByController(lender, chainId, controller)?.supportsDelegation === true;
380
+ var llamaLendLeverageZap = (lender, chainId, aggregator) => {
381
+ const cfg = llamaLendConfigFor(lender, chainId);
382
+ if (!cfg) return void 0;
383
+ const zap = aggregator === "odos" ? cfg.leverageZapOdos : cfg.leverageZap1inch;
384
+ const router = aggregator === "odos" ? cfg.leverageZapOdosRouter : cfg.leverageZap1inchRouter;
385
+ if (!zap || !router) return void 0;
386
+ return { zap, router };
387
+ };
388
+ var llamaLendSupportsLeverage = (lender, chainId, controller) => {
389
+ const m = llamaLendMarketByController(lender, chainId, controller);
390
+ if (!m?.supportsLeverage) return false;
391
+ const cfg = llamaLendConfigFor(lender, chainId);
392
+ return Boolean(cfg?.leverageZapOdos || cfg?.leverageZap1inch);
393
+ };
394
+ var llamaLendApiBaseUrl = (lender, chainId) => llamaLendConfigFor(lender, chainId)?.apiBaseUrl || "https://api.curve.finance";
342
395
  var usddConfig = () => getGlobalData2()?.usddConfig;
343
396
  var usddConfigFor = (lender, chainId) => getGlobalData2()?.usddConfig?.[lender]?.[String(chainId)];
344
397
  var usddMarkets = () => getGlobalData2()?.usddMarkets;
@@ -349,6 +402,160 @@ var usddLendersByChain = (chainId) => {
349
402
  const chain = String(chainId);
350
403
  return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.vat);
351
404
  };
405
+ var frankencoinConfig = () => getGlobalData2()?.frankencoinConfig;
406
+ var frankencoinConfigFor = (lender, chainId) => getGlobalData2()?.frankencoinConfig?.[lender]?.[String(chainId)];
407
+ var frankencoinMarkets = () => getGlobalData2()?.frankencoinMarkets;
408
+ var frankencoinChainData = (lender, chainId) => getGlobalData2()?.frankencoinMarkets?.[lender]?.[String(chainId)];
409
+ var frankencoinMarketByPosition = (lender, chainId, position) => {
410
+ const lower = position.toLowerCase();
411
+ return frankencoinChainData(lender, chainId)?.markets?.find((m) => m.position.toLowerCase() === lower);
412
+ };
413
+ var frankencoinLendersByChain = (chainId) => {
414
+ const cfg = getGlobalData2()?.frankencoinConfig ?? {};
415
+ const chain = String(chainId);
416
+ return Object.keys(cfg).filter((lender) => !!cfg[lender]?.[chain]?.mintingHub);
417
+ };
418
+ var RESUPPLY_ETHEREUM_CONFIG = {
419
+ registry: "0x10101010E0C3171D894B71B3400668aF311e7D94",
420
+ reusd: "0x57aB1E0003F623289CD798B1824Be09a793e4Bec",
421
+ utilities: "0x5f896C250DA6b462873813ceEc47F3e4D8CBA464",
422
+ curveSwapper: "0x042f48346be16Be381190a7397A80808243f3b2e",
423
+ ensoSwapper: "0x181c98113ce60BA75A0f72d8901Eb17e5065043D",
424
+ lifiSwapper: "0x597Db76794c75E588D3a70534FB34B7780941fCe",
425
+ redemptionHandler: "0x5eeB063d0abefBBc78F576E28d762a16b637A025",
426
+ liquidationHandler: "0x88888888c227c36401493Ed9F3e3Dcc3800B2634",
427
+ insurancePool: "0x00000000efe883b3304aFf71eaCf72Dbc3e1b577",
428
+ sreusd: "0x557AB1e003951A73c12D16F0fEA8490E39C33C35",
429
+ priceWatcher: "0xAaaa0013e2ec451F76816d1e0a02ABA596dd9251",
430
+ debtDecimals: 18
431
+ };
432
+ var RESUPPLY_BUILTIN = {
433
+ RESUPPLY: { "1": RESUPPLY_ETHEREUM_CONFIG }
434
+ };
435
+ var resupplyConfig = () => getGlobalData2()?.resupplyConfig;
436
+ var resupplyConfigFor = (lender, chainId) => {
437
+ const published = getGlobalData2()?.resupplyConfig?.[lender]?.[String(chainId)];
438
+ if (published?.registry) return published;
439
+ return RESUPPLY_BUILTIN[lender]?.[String(chainId)];
440
+ };
441
+ var resupplyLendersByChain = (chainId) => {
442
+ const chain = String(chainId);
443
+ const cfg = getGlobalData2()?.resupplyConfig ?? {};
444
+ const keys = /* @__PURE__ */ new Set();
445
+ for (const lender of Object.keys(cfg)) {
446
+ if (cfg[lender]?.[chain]?.registry) keys.add(lender);
447
+ }
448
+ for (const lender of Object.keys(RESUPPLY_BUILTIN)) {
449
+ if (RESUPPLY_BUILTIN[lender]?.[chain]?.registry) keys.add(lender);
450
+ }
451
+ return [...keys];
452
+ };
453
+ var CURVANCE_MONAD_CONFIG = {
454
+ centralRegistry: "0x1310f352f1389969Ece6741671c4B919523912fF",
455
+ oracleManager: "0x65ADF8aE8420A58278De066593E6fF1713A137c5",
456
+ protocolReader: "0xC5E6DD26095Cc1fa2369f7885dF263e150228D8b",
457
+ optimizerReader: "0x821a4a2Be28888917106B3A628c8edaffEbF2e2F",
458
+ optimizers: {
459
+ // `hyAUSD` — 6-dec shares over AUSD; itself collateral in 2 markets.
460
+ hyAUSD: "0xaD663aC84052b52BE4ed1b27BA416505e84a00Bf"
461
+ },
462
+ // Only KyberSwap's MetaAggregationRouterV2 has a registered checker on Monad
463
+ // (2026-08). 1inch / Odos / OogaBooga all return the zero address even
464
+ // though checker contracts for them exist in the Curvance repo — registering
465
+ // OogaBooga is a single DAO call. Probe live before relying on any of this.
466
+ swapTargets: {
467
+ kyberswap: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
468
+ },
469
+ positionManagers: {
470
+ // muBOND | AUSD
471
+ "0x830D40CDFdc494BC1A2729a7381bfCe44326c944": { simplePositionManager: "0xA3d212D4705caf42C35d6EaE0C85E94c4cd329E4" },
472
+ // loAZND | AUSD
473
+ "0x7C822B093A116654F824Ec2A35CD23a3749E4f90": { simplePositionManager: "0x9e4638fd67bE15360bfebC5e07AECfF33dfda917" },
474
+ // ezETH | WETH
475
+ "0x83840d837E7A3E00bBb0B8501E60E989A8987c37": { simplePositionManager: "0xd8d3E46E52C3AB8FD98D04143984C763B4Bbc584" },
476
+ // shMON | WMON
477
+ "0xE1C24B2E93230FBe33d32Ba38ECA3218284143e2": {
478
+ nativeVaultPositionManager: "0x2fAA792502aC5a329DcCc1580C5308fCc0a772fe",
479
+ simplePositionManager: "0x7E8705a164DA7Cc5a4119C750b1F79837AD89D5E"
480
+ },
481
+ // aprMON | WMON
482
+ "0x5EA0a1Cf3501C954b64902c5e92100b8A2CaB1Ac": {
483
+ nativeVaultPositionManager: "0x82f88A810E86a730699231F5fBF5686c643467C8",
484
+ simplePositionManager: "0x669786FF3da7544c98FE74eE1006D787118d1770"
485
+ },
486
+ // sMON | WMON
487
+ "0xe5970cDB1916B2cCF6185C86C174EEE2d330D05B": { simplePositionManager: "0x3d6ba6C90E1738cb01C46E72F284C7Bd57eB11EC" },
488
+ // sAUSD | AUSD
489
+ "0xBBE7A3c45aDBb16F6490767b663428c34aA341Eb": {
490
+ simplePositionManager: "0x491e8712885E4e0b98864F13393ced8c1a61FD57",
491
+ vaultPositionManager: "0xe94AC990873C3B59A417d25C1ec1398807FB41A1"
492
+ },
493
+ // earnAUSD | AUSD
494
+ "0xd6365555f6a697C7C295bA741100AA644cE28545": { simplePositionManager: "0xd807efC94376618B4d9CE6eAaf89607006d3B881" },
495
+ // WMON | AUSD
496
+ "0x05e70717fA8BD0F21a9F826d093d99f6Da4f1554": { simplePositionManager: "0x2619BB5Acfe51317c4C36a63578FD56148e68C74" },
497
+ // WMON | USDC
498
+ "0xa6A2A92F126b79Ee0804845ee6B52899b4491093": { simplePositionManager: "0x960c49E523e6A87282D2bC5032d0AeCb35Dc20ef" },
499
+ // WBTC | USDC
500
+ "0x01C4a0d396EFE982B1B103BE9910321d34e1aEA9": { simplePositionManager: "0x8cA51d155C07e91B206Cf11C8D52d5aB082657F6" },
501
+ // WETH | USDC
502
+ "0xb3E9E0134354cc91b7FB9F9d6C3ab0dE7854BB49": { simplePositionManager: "0x3A1B2Dc11a81Fe106eC667BaB4056fC72498ff73" },
503
+ // gMON | WMON
504
+ "0xb00aFF53a4Df2b4E2f97a3d9ffaDb55564C8E42F": { simplePositionManager: "0x77B90040E6dFE8A62293Cd91CAeE35296EC266Ee" },
505
+ // syzUSD | AUSD
506
+ "0x90fc1A4abC4ee5f8a9560dE069067D9606d2909C": { simplePositionManager: "0x9352318f75e8Cb7C47C5B086D56d3e6D761b7419" },
507
+ // wsrUSD | AUSD
508
+ "0x627a15859d09C1550e2934991AA95aFc6896e3Ef": { simplePositionManager: "0xF8613b7b4e8bFb5E7155fb4D3bc9f9B93d895C31" },
509
+ // YZM | AUSD
510
+ "0x4409e2161B6f9A25ACbC471a37390654Ed272249": { simplePositionManager: "0xb85dEf309F7eEEb8f581909c7afB623dDf59AdD9" },
511
+ // vUSD | AUSD
512
+ "0x2DB9AB1bB00d7000b21A2EbcE7D1a9b91F351E72": { simplePositionManager: "0xCb1709fAF66A73b4f6026b531Bef9AF971368f50" },
513
+ // eBTC | WBTC
514
+ "0xBc4cd7bbd8d38027A88838B88BA04561FA778C35": { simplePositionManager: "0x5e339724818c4b46E1Bc6966FeB4ea2924Ca17D9" },
515
+ // savUSD | USDC
516
+ "0x38104e87Eb96ce5ef1C23a06878dB0D657B4a699": { simplePositionManager: "0x7B918FF5EDc44B29ced4d3dc52Fb8b859025325c" },
517
+ // savUSD | AUSD
518
+ "0x4B0a39eCC3e5A5dA3ce6D492D4D255cD1F0209F7": { simplePositionManager: "0xb8F6f480E645dBa96Df9eD3948D900725bA9e9Ec" }
519
+ }
520
+ };
521
+ var CURVANCE_BUILTIN = {
522
+ CURVANCE: { "143": CURVANCE_MONAD_CONFIG }
523
+ };
524
+ var curvanceConfig = () => getGlobalData2()?.curvanceConfig;
525
+ var curvanceConfigFor = (lender, chainId) => {
526
+ const published = getGlobalData2()?.curvanceConfig?.[lender]?.[String(chainId)];
527
+ if (published?.centralRegistry) return published;
528
+ return CURVANCE_BUILTIN[lender]?.[String(chainId)];
529
+ };
530
+ var curvanceLendersByChain = (chainId) => {
531
+ const chain = String(chainId);
532
+ const cfg = getGlobalData2()?.curvanceConfig ?? {};
533
+ const keys = /* @__PURE__ */ new Set();
534
+ for (const lender of Object.keys(cfg)) {
535
+ if (cfg[lender]?.[chain]?.centralRegistry) keys.add(lender);
536
+ }
537
+ for (const lender of Object.keys(CURVANCE_BUILTIN)) {
538
+ if (CURVANCE_BUILTIN[lender]?.[chain]?.centralRegistry) keys.add(lender);
539
+ }
540
+ return [...keys];
541
+ };
542
+ var curvancePositionManagersFor = (lender, chainId, marketManager) => {
543
+ const map = curvanceConfigFor(lender, chainId)?.positionManagers;
544
+ if (!map || !marketManager) return void 0;
545
+ const direct = map[marketManager];
546
+ if (direct) return direct;
547
+ const target = marketManager.toLowerCase();
548
+ for (const key of Object.keys(map)) {
549
+ if (key.toLowerCase() === target) return map[key];
550
+ }
551
+ return void 0;
552
+ };
553
+ var curvancePositionManager = (lender, chainId, marketManager, kind) => {
554
+ const pms = curvancePositionManagersFor(lender, chainId, marketManager);
555
+ if (!pms) return void 0;
556
+ if (kind) return pms[kind];
557
+ return pms.simplePositionManager ?? pms.vaultPositionManager ?? pms.nativeVaultPositionManager ?? pms.pendlePtPositionManager;
558
+ };
352
559
  var compoundV3Bulker = () => getGlobalData2()?.compoundV3Bulker;
353
560
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
354
561
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
@@ -490,6 +697,17 @@ function parseTermMaxLenderKey(lenderKey) {
490
697
  if (!match) return void 0;
491
698
  return { marketAddrLower: "0x" + match[1].toLowerCase() };
492
699
  }
700
+ function llamaLendLenderKey(controller) {
701
+ if (!controller || !controller.startsWith("0x") || controller.length !== 42) {
702
+ throw new Error(`llamaLendLenderKey: invalid controller address ${controller}`);
703
+ }
704
+ return `LLAMALEND_${controller.slice(2).toUpperCase()}`;
705
+ }
706
+ function parseLlamaLendLenderKey(lenderKey) {
707
+ const match = lenderKey.match(/^LLAMALEND_([0-9A-Fa-f]{40})$/);
708
+ if (!match) return void 0;
709
+ return { controllerAddrLower: "0x" + match[1].toLowerCase() };
710
+ }
493
711
 
494
712
  // src/tokens.ts
495
713
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
@@ -522,4 +740,4 @@ async function fetchMainTokensMap() {
522
740
  return await data.json();
523
741
  }
524
742
 
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 };
743
+ export { CURVANCE_MONAD_CONFIG, 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, curvanceConfig, curvanceConfigFor, curvanceLendersByChain, curvancePositionManager, curvancePositionManagersFor, 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,308 @@ 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
+ /** The Position Manager variants Curvance deploys, keyed as the app keys them. */
654
+ export type CurvancePositionManagers = {
655
+ /** Generic non-native ERC-20 legs. The common case (20 of 20 PM'd markets). */
656
+ simplePositionManager?: string;
657
+ /** ERC-4626-style collateral that is entered on leverage. */
658
+ vaultPositionManager?: string;
659
+ /** Wrapped-native collateral — unwraps / swaps into native before depositing. */
660
+ nativeVaultPositionManager?: string;
661
+ /** Pendle principal-token collateral. */
662
+ pendlePtPositionManager?: string;
663
+ };
664
+ /** Per-chain, protocol-level (evergreen) Curvance addresses. */
665
+ export type CurvanceConfigChain = {
666
+ /** `CentralRegistry` — `marketManagers()` IS the market discovery, and every
667
+ * other singleton hangs off it. The one address the provider bootstraps
668
+ * from. */
669
+ centralRegistry: string;
670
+ /** `OracleManager` — `getPrice(asset, inUSD, getLower)`. Prices are WAD USD
671
+ * and carry an `errorCode` that GATES actions (see the abis header). */
672
+ oracleManager?: string;
673
+ /** `ProtocolReader` — `getStaticMarketData()` + `getAllDynamicState(account)`
674
+ * return the entire public book and one account's whole portfolio in two
675
+ * calls. Optional: the fetchers fall back to a plain multicall over the
676
+ * MarketManagers when it is absent. */
677
+ protocolReader?: string;
678
+ /** `OptimizerReader` — lens for the LendingOptimizer ("Vaults") surface. */
679
+ optimizerReader?: string;
680
+ /**
681
+ * Native-leverage Position Managers, keyed by MARKET MANAGER address
682
+ * (lowercase-insensitive on read). A market absent here has no native
683
+ * leverage — which is a real state, not a gap: 5 of 25 markets on Monad
684
+ * have none registered.
685
+ */
686
+ positionManagers?: {
687
+ [marketManager: string]: CurvancePositionManagers;
688
+ };
689
+ /**
690
+ * `LendingOptimizer` vaults by symbol. Their shares are collateralisable
691
+ * through `LendingOptimizerShareCToken`, which is why `hyAUSD` appears as
692
+ * collateral in two markets.
693
+ */
694
+ optimizers?: {
695
+ [symbol: string]: string;
696
+ };
697
+ /**
698
+ * Swap targets with a registered `externalCalldataChecker`, i.e. the ONLY
699
+ * routers the native leverage path will accept. Cached here as a hint; the
700
+ * mapping is DAO-mutable in both directions, so a builder must still probe
701
+ * `externalCalldataChecker(target)` live and fail closed.
702
+ */
703
+ swapTargets?: {
704
+ [aggregator: string]: string;
705
+ };
706
+ /** Optional allowlist of MarketManager addresses. When set, on-chain
707
+ * discovery is INTERSECTED with it; absent (the default) publishes every
708
+ * listed market. */
709
+ marketAllowlist?: string[] | null;
710
+ };
711
+ export type CurvanceConfigType = {
712
+ [lender: string]: {
713
+ [chainId: string]: CurvanceConfigChain;
714
+ };
715
+ };
716
+ /** Per-chain LlamaLend deployment seed (hand-maintained). */
717
+ export type LlamaLendConfigChain = {
718
+ /** v1 `OneWayLendingFactory` — parallel index getters. Absent on chains
719
+ * that only ever got v2. */
720
+ oneWayFactory?: string;
721
+ /** v2 `LendFactory` — struct-returning `markets(i)`; `version()` = `2.0.0`. */
722
+ lendFactory?: string;
723
+ /** v2 LendConfigurator (admin surface; carried for completeness). */
724
+ configurator?: string;
725
+ /**
726
+ * Curve's deployed v1 LeverageZap for this chain, and the aggregator router
727
+ * it is hard-wired to. THIS is how leverage works here — we do not deploy a
728
+ * callbacker.
729
+ *
730
+ * The zap's router is an IMMUTABLE with no allowlist, and `callback_bytes`
731
+ * is forwarded to it verbatim, so arbitrary aggregator calldata is already
732
+ * permitted. Two are deployed per chain (Odos and 1inch); pick whichever
733
+ * aggregator is quoting, and ALWAYS check the quote's target against
734
+ * `*Router` before encoding — the zap forwards mismatched calldata to the
735
+ * wrong contract rather than rejecting it.
736
+ */
737
+ leverageZapOdos?: string;
738
+ leverageZapOdosRouter?: string;
739
+ leverageZap1inch?: string;
740
+ leverageZap1inchRouter?: string;
741
+ /**
742
+ * Lowest `factoryIndex` the zaps accept — markets below it were deployed
743
+ * from a blueprint the zap does not recognise. 9 on Ethereum and Arbitrum,
744
+ * 0 on Optimism. This is a WIDER gate than delegation: 84.9% of borrows
745
+ * qualify, including markets that are not delegation-capable, because
746
+ * leverage is EOA-direct and needs no grant.
747
+ */
748
+ leverageStartId?: number;
749
+ /**
750
+ * The crvUSD mint (CDP) factory, when the chain's zap indexes it as
751
+ * `factoryId = 1`. Present on Ethereum only. Recorded because the SAME zap
752
+ * serves those markets — see LLAMALEND_PLAN.md.
753
+ */
754
+ crvUsdFactory?: string;
755
+ /** Curve data API base. Overridable so a self-hosted indexer can be
756
+ * swapped in; the default serves every chain and both generations from
757
+ * one call. */
758
+ apiBaseUrl?: string | null;
759
+ /** The chain's slug in the Curve API's `blockchainId` field
760
+ * (`ethereum` / `optimism` / `arbitrum` / `fraxtal` / `sonic`). */
761
+ apiChainSlug?: string;
762
+ };
763
+ export type LlamaLendConfigType = {
764
+ [lender: string]: {
765
+ [chainId: string]: LlamaLendConfigChain;
766
+ };
767
+ };
768
+ /** One LlamaLend market (= one Controller). */
769
+ export type LlamaLendMarketConfig = {
770
+ /** Controller contract — also the per-market key suffix
771
+ * (`LLAMALEND_<CONTROLLER_ADDR>`). */
772
+ controller: string;
773
+ /** ERC-4626 vault — the lender side. TRAP: shares run ~1000x the asset
774
+ * scale (`DEAD_SHARES`), so never assume 1:1. */
775
+ vault: string;
776
+ /** LLAMMA. MUST be excluded from any leverage swap route — the Controller
777
+ * asserts the AMM's band state is unchanged across a callback. */
778
+ amm: string;
779
+ collateralToken: string;
780
+ collateralDecimals: number;
781
+ collateralSymbol?: string;
782
+ borrowedToken: string;
783
+ borrowedDecimals: number;
784
+ borrowedSymbol?: string;
785
+ monetaryPolicy: string;
786
+ priceOracle?: string;
787
+ /** 1 = `oneway` (v1, `*_extended` leverage), 2 = `oneway-v2` (v2, callbacker
788
+ * folded into the base functions). Branch every encoder on this. */
789
+ version: 1 | 2;
790
+ /**
791
+ * Whether this Controller carries the boolean delegation grant
792
+ * (`approve(spender, allow)` + `_for` on the writes).
793
+ *
794
+ * PER-MARKET, not per-protocol: only newer-blueprint controllers have it
795
+ * (48 of 98 markets at 2026-08, and 0 of 22 on Arbitrum). Derived by the
796
+ * metadata generator from a runtime-bytecode selector scan, because an
797
+ * `eth_call` probe cannot distinguish "no such method" from a node hiccup
798
+ * on most public RPCs. FAIL CLOSED — treat `undefined` as `false`.
799
+ */
800
+ supportsDelegation: boolean;
801
+ /** Band-geometry parameter `A` from the AMM. With `loanDiscount` and the
802
+ * chosen `N` this fixes the effective collateral factor. */
803
+ ammA: string;
804
+ /** WAD haircut used when sizing a loan. */
805
+ loanDiscount: string;
806
+ /** WAD hard-liquidation bonus (applies only BELOW the whole band range —
807
+ * inside it the position soft-liquidates with no penalty). */
808
+ liquidationDiscount: string;
809
+ /**
810
+ * The market's index in its factory — `controllers(i)`. Doubles as the
811
+ * `controller_id` the leverage zap's `callback_args` requires, so it is
812
+ * mandatory for any leveraged encode. The Curve API exposes it as the
813
+ * numeric suffix of `id` (`oneway-41`).
814
+ */
815
+ factoryIndex: number;
816
+ /**
817
+ * Whether Curve's v1 leverage zap accepts this market
818
+ * (`factoryIndex >= leverageStartId`, and v1 only — v2 markets live in a
819
+ * factory the zap does not index). Independent of `supportsDelegation`.
820
+ */
821
+ supportsLeverage: boolean;
822
+ /** Band count offered by default in the UI (Curve's own default is 10).
823
+ * There is no single LTV — the collateral factor is a function of N — so
824
+ * public data reports `collateralFactor` at this N and exposes the rest
825
+ * of the curve alongside. */
826
+ defaultBands?: number;
827
+ /** Monetary-policy family: `semilog` (v1) or `hyperbolic` (v2). The
828
+ * `hyperbolic-dynamic` variant pulls its target rate from an external
829
+ * rate calculator tracking a yield-bearing asset, so its curve moves
830
+ * under a cache — never serve it from stale params. */
831
+ rateModel?: 'semilog' | 'hyperbolic' | 'hyperbolic-dynamic';
832
+ /** Gauge (CRV emissions on the vault side), v1 only. */
833
+ gauge?: string | null;
834
+ /** v2 only: 0 DISABLES borrowing. A fresh v2 market looks live but is not. */
835
+ borrowCap?: string;
836
+ name?: string;
837
+ };
838
+ /** Generated per-chain data: the curated market roster. */
839
+ export type LlamaLendChainData = {
840
+ markets: LlamaLendMarketConfig[];
841
+ };
842
+ export type LlamaLendMarketsType = {
843
+ [lender: string]: {
844
+ [chainId: string]: LlamaLendChainData;
845
+ };
846
+ };
538
847
  /** One USDD PSM (1:1 stable swap module; NOT a lending market). */
539
848
  export type UsddPsmConfig = {
540
849
  ilk: string;
@@ -1032,7 +1341,7 @@ export type AaveV4PeripheralsType = {
1032
1341
  [chainId: string]: AaveV4ChainPeripherals;
1033
1342
  };
1034
1343
  /** 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, }: {
1344
+ 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, curvanceConfigOverride, compoundV3BulkerOverride, eulerConfigsOverride, eulerVaultsOverride, dolomiteConfigsOverride, dolomiteEmodeOverride, aaveV4SpokesOverride, aaveV4OraclesOverride, aaveV4PeripheralsOverride, siloMarketsOverride, siloPeripheralsOverride, siloMarketsV3Override, siloPeripheralsV3Override, fluidResolversOverride, fluidVaultsOverride, gearboxResolversOverride, }: {
1036
1345
  aaveTokensOverride?: AaveTokensType;
1037
1346
  aavePoolsOverride?: AavePoolsType;
1038
1347
  aaveOraclesOverride?: OracleMap;
@@ -1074,6 +1383,12 @@ export declare function initializeLenderData({ aaveTokensOverride, aavePoolsOver
1074
1383
  inverseMarketsOverride?: InverseMarketsType;
1075
1384
  usddConfigOverride?: UsddConfigType;
1076
1385
  usddMarketsOverride?: UsddMarketsType;
1386
+ frankencoinConfigOverride?: FrankencoinConfigType;
1387
+ frankencoinMarketsOverride?: FrankencoinMarketsType;
1388
+ llamaLendConfigOverride?: LlamaLendConfigType;
1389
+ llamaLendMarketsOverride?: LlamaLendMarketsType;
1390
+ resupplyConfigOverride?: ResupplyConfigType;
1391
+ curvanceConfigOverride?: CurvanceConfigType;
1077
1392
  compoundV3BulkerOverride?: CompoundV3BulkerType;
1078
1393
  eulerConfigsOverride?: EulerConfigsType;
1079
1394
  eulerVaultsOverride?: EulerVaultsType;
@@ -1198,6 +1513,59 @@ export declare const riverMarketByIndex: (lender: string, chainId: string | numb
1198
1513
  export declare const riverLendersByChain: (chainId: string | number) => string[];
1199
1514
  /** All Inverse lender keys with config on a chain (drives getLendersForChain). */
1200
1515
  export declare const inverseLendersByChain: (chainId: string | number) => string[];
1516
+ export declare const llamaLendConfig: () => LlamaLendConfigType;
1517
+ /** Deployment seed for one LlamaLend lender on a chain (undefined if unloaded). */
1518
+ export declare const llamaLendConfigFor: (lender: string, chainId: string | number) => LlamaLendConfigChain | undefined;
1519
+ export declare const llamaLendMarkets: () => LlamaLendMarketsType;
1520
+ /** Generated chain data (curated market roster; undefined if unloaded). */
1521
+ export declare const llamaLendChainData: (lender: string, chainId: string | number) => LlamaLendChainData | undefined;
1522
+ /** Find one LlamaLend market by its Controller address. */
1523
+ export declare const llamaLendMarketByController: (lender: string, chainId: string | number, controller: string) => LlamaLendMarketConfig | undefined;
1524
+ /**
1525
+ * Find one LlamaLend market by its ERC-4626 VAULT address (the lender side).
1526
+ *
1527
+ * The roster is keyed on the Controller because that is the borrow surface,
1528
+ * but other protocols reference LlamaLend by its vault — Resupply, for
1529
+ * instance, custodies the vault SHARE as collateral, so the vault is the only
1530
+ * handle it exposes. This is the join for "which LlamaLend market does that
1531
+ * wrapper actually sit on top of".
1532
+ */
1533
+ export declare const llamaLendMarketByVault: (lender: string, chainId: string | number, vault: string) => LlamaLendMarketConfig | undefined;
1534
+ /**
1535
+ * All LlamaLend lender keys with config on a chain (drives getLendersForChain).
1536
+ * Gated on a factory being present — a chain entry with neither factory is a
1537
+ * placeholder, not a live deployment.
1538
+ */
1539
+ export declare const llamaLendLendersByChain: (chainId: string | number) => string[];
1540
+ /**
1541
+ * Whether a LlamaLend market accepts on-behalf calls (`_for` + the boolean
1542
+ * `approve` grant). FAILS CLOSED: an unknown market, an unloaded roster or an
1543
+ * explicit `false` all return `false`, because calling `approve` on an older
1544
+ * controller reverts with no usable reason string.
1545
+ */
1546
+ export declare const llamaLendSupportsDelegation: (lender: string, chainId: string | number, controller: string) => boolean;
1547
+ /**
1548
+ * Resolve the leverage zap + its hard-wired router for a chain and aggregator.
1549
+ * `undefined` means leverage is unavailable there for that aggregator, which
1550
+ * callers must report rather than silently falling back — there is no Composer
1551
+ * route that can be funded.
1552
+ */
1553
+ export declare const llamaLendLeverageZap: (lender: string, chainId: string | number, aggregator: "odos" | "1inch") => {
1554
+ zap: string;
1555
+ router: string;
1556
+ } | undefined;
1557
+ /**
1558
+ * Whether a market can be leveraged at all: it must be v1, at or above the
1559
+ * chain's `leverageStartId`, and the chain must have a zap deployed. Fails
1560
+ * closed on an unknown market.
1561
+ */
1562
+ export declare const llamaLendSupportsLeverage: (lender: string, chainId: string | number, controller: string) => boolean;
1563
+ /**
1564
+ * Curve data API base. Read through the getter (not a module constant) for the
1565
+ * same reason as TermMax/Midnight: the per-request metadata re-init rewrites
1566
+ * `llamaLendConfig`, so a captured value goes stale.
1567
+ */
1568
+ export declare const llamaLendApiBaseUrl: (lender: string, chainId: string | number) => string;
1201
1569
  export declare const usddConfig: () => UsddConfigType;
1202
1570
  /** Deployment seed for one USDD lender on a chain (undefined if unloaded). */
1203
1571
  export declare const usddConfigFor: (lender: string, chainId: string | number) => UsddConfigChain | undefined;
@@ -1211,6 +1579,98 @@ export declare const usddMarketByIlk: (lender: string, chainId: string | number,
1211
1579
  * the (empty-roster) provider still runs and reports zero markets rather
1212
1580
  * than being invisible; the per-ilk keys only exist once metadata fills. */
1213
1581
  export declare const usddLendersByChain: (chainId: string | number) => string[];
1582
+ export declare const frankencoinConfig: () => FrankencoinConfigType;
1583
+ /** Deployment seed for one Frankencoin lender on a chain. */
1584
+ export declare const frankencoinConfigFor: (lender: string, chainId: string | number) => FrankencoinConfigChain | undefined;
1585
+ export declare const frankencoinMarkets: () => FrankencoinMarketsType;
1586
+ /** Generated chain data (curated original-position roster). */
1587
+ export declare const frankencoinChainData: (lender: string, chainId: string | number) => FrankencoinChainData | undefined;
1588
+ /** Look up one market by its ORIGINAL position address (the key suffix). */
1589
+ export declare const frankencoinMarketByPosition: (lender: string, chainId: string | number, position: string) => FrankencoinMarketConfig | undefined;
1590
+ /** All Frankencoin lender keys with config on a chain (drives
1591
+ * getLendersForChain). Gated on the MintingHub, the one address every
1592
+ * flow needs. */
1593
+ export declare const frankencoinLendersByChain: (chainId: string | number) => string[];
1594
+ /**
1595
+ * Built-in Ethereum deployment seed for Resupply.
1596
+ *
1597
+ * Every other lender's config comes exclusively from `lender-metadata`, and a
1598
+ * published `config/resupply.json` still WINS over this (see
1599
+ * `resupplyConfigFor`). The fallback exists because these are immutable
1600
+ * protocol singletons — `RouterSwapper` even hardcodes the registry address in
1601
+ * its own bytecode — and because the whole market roster is discovered from
1602
+ * `registry` at runtime. So the integration is live with nothing to publish,
1603
+ * and publishing later is a pure override.
1604
+ *
1605
+ * Verified on-chain 2026-08-04 (block ~25,683,400). Deliberately NOT taken
1606
+ * from the docs' `faq/contract-addresses` page or the repo's
1607
+ * `deployment/contracts.json`: both are stale and list a REVOKED Odos swapper.
1608
+ * Resolved via `Registry.getAddress(key)` over `getAllKeys()`.
1609
+ */
1610
+ export declare const RESUPPLY_ETHEREUM_CONFIG: ResupplyConfigChain;
1611
+ export declare const resupplyConfig: () => ResupplyConfigType;
1612
+ /**
1613
+ * Deployment seed for one Resupply lender on a chain. Published metadata wins;
1614
+ * the built-in Ethereum row is the fallback so the provider works before
1615
+ * `config/resupply.json` exists.
1616
+ */
1617
+ export declare const resupplyConfigFor: (lender: string, chainId: string | number) => ResupplyConfigChain | undefined;
1618
+ /**
1619
+ * All Resupply lender keys with config on a chain (drives getLendersForChain).
1620
+ * Gated on the REGISTRY — the one address the whole provider is bootstrapped
1621
+ * from. Union of published metadata and the built-in row, so the fan-out
1622
+ * happens with or without a publish.
1623
+ */
1624
+ export declare const resupplyLendersByChain: (chainId: string | number) => string[];
1625
+ /**
1626
+ * Built-in Monad deployment seed for Curvance.
1627
+ *
1628
+ * Same arrangement as Resupply: a published `config/curvance.json` still WINS
1629
+ * (see `curvanceConfigFor`), but the provider is live with nothing to publish
1630
+ * because `centralRegistry` is an immutable protocol singleton and the whole
1631
+ * market roster is discovered from it at runtime.
1632
+ *
1633
+ * The `positionManagers` map is the exception and the reason this seed carries
1634
+ * more than one address: PM registration is an un-enumerable mapping, and Monad
1635
+ * public RPCs cap `eth_getLogs` at 100 blocks so `PositionManagerUpdated`
1636
+ * cannot be scanned. Every entry below was verified on-chain 2026-08-07 —
1637
+ * 23/23 answered `isPositionManager == true` on their market AND reported that
1638
+ * same market back from `marketManager()`.
1639
+ *
1640
+ * FIVE live markets have NO Position Manager and therefore no native leverage:
1641
+ * `PT-AUSD-8OCT2026 | AUSD` (the largest market at ~$45M), `PT-earnAUSD | AUSD`,
1642
+ * both `High Yield AUSD Vault` markets, and `aguaUSDCgc | USDC`. Their absence
1643
+ * here is the truth, not a gap to fill in.
1644
+ */
1645
+ export declare const CURVANCE_MONAD_CONFIG: CurvanceConfigChain;
1646
+ export declare const curvanceConfig: () => CurvanceConfigType;
1647
+ /**
1648
+ * Deployment seed for one Curvance lender on a chain. Published metadata wins;
1649
+ * the built-in Monad row is the fallback so the provider works before
1650
+ * `config/curvance.json` exists.
1651
+ */
1652
+ export declare const curvanceConfigFor: (lender: string, chainId: string | number) => CurvanceConfigChain | undefined;
1653
+ /**
1654
+ * All Curvance lender keys with config on a chain (drives getLendersForChain).
1655
+ * Gated on the CENTRAL REGISTRY — the one address the provider bootstraps from.
1656
+ */
1657
+ export declare const curvanceLendersByChain: (chainId: string | number) => string[];
1658
+ /**
1659
+ * Position Managers registered for one Curvance market. Returns `undefined`
1660
+ * when the market has none — a real state (5 of 25 on Monad, including the
1661
+ * largest market), and the signal that native leverage is unavailable there.
1662
+ *
1663
+ * Lookup is case-insensitive because market-manager addresses arrive from
1664
+ * `queryTokensListed`/config in mixed checksum forms.
1665
+ */
1666
+ export declare const curvancePositionManagersFor: (lender: string, chainId: string | number, marketManager: string) => CurvancePositionManagers | undefined;
1667
+ /**
1668
+ * The Position Manager to drive for a market, preferring an explicit `kind` and
1669
+ * otherwise falling back to `simplePositionManager` — which is the right default
1670
+ * because every PM'd market has one, and the vault/native variants exist only as
1671
+ * ALTERNATIVES for legs whose collateral needs an extra wrap step.
1672
+ */
1673
+ export declare const curvancePositionManager: (lender: string, chainId: string | number, marketManager: string, kind?: keyof CurvancePositionManagers) => string | undefined;
1214
1674
  export declare const compoundV3Bulker: () => CompoundV3BulkerType;
1215
1675
  export declare const eulerConfigs: () => EulerConfigsType;
1216
1676
  export declare const eulerVaults: () => EulerVaultsType;
@@ -1446,4 +1906,28 @@ export declare function termMaxLenderKey(market: string): string;
1446
1906
  export declare function parseTermMaxLenderKey(lenderKey: string): {
1447
1907
  marketAddrLower: string;
1448
1908
  } | undefined;
1909
+ /**
1910
+ * Per-market lender key for one LlamaLend market, keyed by its CONTROLLER (the
1911
+ * borrow-side contract), not the vault — the Controller is what every write
1912
+ * and every user read targets.
1913
+ *
1914
+ * Format: `LLAMALEND_${controllerAddr.slice(2).toUpperCase()}`
1915
+ *
1916
+ * Both generations share this key space deliberately: they are one brand to the
1917
+ * user, and the Curve API returns them in one list. The `version` field on the
1918
+ * market row is what encoders branch on. chainId is intentionally NOT in the
1919
+ * token (chain scoping happens at the marketUid level), matching every other
1920
+ * per-market key in this file.
1921
+ *
1922
+ * `isLlamaLend()` works on this because it matches `startsWith('LLAMALEND')`.
1923
+ */
1924
+ export declare function llamaLendLenderKey(controller: string): string;
1925
+ /**
1926
+ * Inverse of `llamaLendLenderKey`: given a per-market lender key, return
1927
+ * `{ controllerAddrLower }`. Returns `undefined` if the key isn't a per-market
1928
+ * LlamaLend key (e.g. someone passed the bare prefix `LLAMALEND`).
1929
+ */
1930
+ export declare function parseLlamaLendLenderKey(lenderKey: string): {
1931
+ controllerAddrLower: string;
1932
+ } | undefined;
1449
1933
  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.39",
8
8
  "description": "Hold and initialize lending protocol data across a stack",
9
9
  "files": [
10
10
  "dist"