@continuumdao/ctm-mpc-defi 0.2.34 → 0.2.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/agent/catalog.cjs +1562 -45
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +5995 -2960
  4. package/dist/agent/catalog.js +1502 -46
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/aave-v4/SKILL.md +19 -4
  7. package/dist/agent/skills/aerodrome/SKILL.md +2 -2
  8. package/dist/agent/skills/compound-v3/SKILL.md +2 -2
  9. package/dist/agent/skills/curve-dao/SKILL.md +14 -0
  10. package/dist/agent/skills/ethena/SKILL.md +3 -1
  11. package/dist/agent/skills/euler-v2/SKILL.md +1 -1
  12. package/dist/agent/skills/gmx/SKILL.md +1 -1
  13. package/dist/agent/skills/hyperliquid/SKILL.md +7 -5
  14. package/dist/agent/skills/lido/SKILL.md +3 -0
  15. package/dist/agent/skills/maple-syrup/SKILL.md +35 -3
  16. package/dist/agent/skills/morpho/SKILL.md +1 -1
  17. package/dist/agent/skills/pendle/SKILL.md +63 -0
  18. package/dist/agent/skills/sky/SKILL.md +2 -0
  19. package/dist/agent/skills/yield-compare/SKILL.md +81 -0
  20. package/dist/core/index.cjs +2 -1
  21. package/dist/core/index.cjs.map +1 -1
  22. package/dist/core/index.js +2 -1
  23. package/dist/core/index.js.map +1 -1
  24. package/dist/index.cjs +257 -29
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +257 -28
  28. package/dist/index.js.map +1 -1
  29. package/dist/protocols/evm/aave-v4/index.cjs +170 -0
  30. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  31. package/dist/protocols/evm/aave-v4/index.d.ts +59 -1
  32. package/dist/protocols/evm/aave-v4/index.js +164 -1
  33. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  34. package/dist/protocols/evm/aerodrome/index.cjs +1308 -901
  35. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  36. package/dist/protocols/evm/aerodrome/index.d.ts +69 -2
  37. package/dist/protocols/evm/aerodrome/index.js +1217 -807
  38. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  39. package/dist/protocols/evm/compound-v3/index.cjs +82 -6
  40. package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
  41. package/dist/protocols/evm/compound-v3/index.d.ts +89 -1
  42. package/dist/protocols/evm/compound-v3/index.js +80 -7
  43. package/dist/protocols/evm/compound-v3/index.js.map +1 -1
  44. package/dist/protocols/evm/curve-dao/index.cjs +447 -18
  45. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  46. package/dist/protocols/evm/curve-dao/index.d.ts +108 -1
  47. package/dist/protocols/evm/curve-dao/index.js +440 -19
  48. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  49. package/dist/protocols/evm/ethena/index.cjs +89 -0
  50. package/dist/protocols/evm/ethena/index.cjs.map +1 -1
  51. package/dist/protocols/evm/ethena/index.d.ts +17 -1
  52. package/dist/protocols/evm/ethena/index.js +89 -2
  53. package/dist/protocols/evm/ethena/index.js.map +1 -1
  54. package/dist/protocols/evm/euler-v2/index.cjs +29 -0
  55. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  56. package/dist/protocols/evm/euler-v2/index.d.ts +21 -1
  57. package/dist/protocols/evm/euler-v2/index.js +29 -1
  58. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  59. package/dist/protocols/evm/gmx/index.cjs +83 -1
  60. package/dist/protocols/evm/gmx/index.cjs.map +1 -1
  61. package/dist/protocols/evm/gmx/index.d.ts +22 -2
  62. package/dist/protocols/evm/gmx/index.js +80 -2
  63. package/dist/protocols/evm/gmx/index.js.map +1 -1
  64. package/dist/protocols/evm/hyperliquid/index.cjs +67 -11
  65. package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
  66. package/dist/protocols/evm/hyperliquid/index.d.ts +39 -2
  67. package/dist/protocols/evm/hyperliquid/index.js +64 -12
  68. package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
  69. package/dist/protocols/evm/lido/index.cjs +13 -0
  70. package/dist/protocols/evm/lido/index.cjs.map +1 -1
  71. package/dist/protocols/evm/lido/index.d.ts +9 -1
  72. package/dist/protocols/evm/lido/index.js +13 -1
  73. package/dist/protocols/evm/lido/index.js.map +1 -1
  74. package/dist/protocols/evm/maple/index.cjs +129 -1
  75. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  76. package/dist/protocols/evm/maple/index.d.ts +45 -1
  77. package/dist/protocols/evm/maple/index.js +124 -3
  78. package/dist/protocols/evm/maple/index.js.map +1 -1
  79. package/dist/protocols/evm/morpho/index.cjs +34 -7
  80. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  81. package/dist/protocols/evm/morpho/index.d.ts +23 -1
  82. package/dist/protocols/evm/morpho/index.js +34 -8
  83. package/dist/protocols/evm/morpho/index.js.map +1 -1
  84. package/dist/protocols/evm/pendle/index.cjs +1530 -0
  85. package/dist/protocols/evm/pendle/index.cjs.map +1 -0
  86. package/dist/protocols/evm/pendle/index.d.ts +463 -0
  87. package/dist/protocols/evm/pendle/index.js +1463 -0
  88. package/dist/protocols/evm/pendle/index.js.map +1 -0
  89. package/dist/protocols/evm/sky/index.cjs +52 -0
  90. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  91. package/dist/protocols/evm/sky/index.d.ts +16 -1
  92. package/dist/protocols/evm/sky/index.js +50 -1
  93. package/dist/protocols/evm/sky/index.js.map +1 -1
  94. package/package.json +6 -1
@@ -379,6 +379,98 @@ var init_midnightApi = __esm({
379
379
  init_midnightConstants();
380
380
  }
381
381
  });
382
+ function isAerodromeChainSupported(chainId) {
383
+ const n = typeof chainId === "number" ? chainId : Number.parseInt(String(chainId), 10);
384
+ return n === AERODROME_CHAIN_ID;
385
+ }
386
+ var AERODROME_PROTOCOL_ID, AERODROME_CHAIN_ID, AERODROME_WETH_BASE, AERODROME_USDC_BASE;
387
+ var init_support2 = __esm({
388
+ "src/protocols/evm/aerodrome/support.ts"() {
389
+ AERODROME_PROTOCOL_ID = "aerodrome";
390
+ AERODROME_CHAIN_ID = 8453;
391
+ AERODROME_WETH_BASE = "0x4200000000000000000000000000000000000006";
392
+ AERODROME_USDC_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
393
+ }
394
+ });
395
+ var AERODROME_BASE_ADDRESSES_FALLBACK;
396
+ var init_addresses = __esm({
397
+ "src/protocols/evm/aerodrome/addresses.ts"() {
398
+ init_support2();
399
+ AERODROME_BASE_ADDRESSES_FALLBACK = {
400
+ chainId: AERODROME_CHAIN_ID,
401
+ aero: "0x940181a94A35A4569E4529A3CDfB74e38FD98631",
402
+ router: "0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43",
403
+ poolFactory: "0x420DD381b31aEf6683db6B902084cB0FFECe40Da",
404
+ factoryRegistry: "0x5C3F18F06CC09CA1910767A34a20F771039E37C0",
405
+ voter: "0x16613524e02ad97eDfeF371bC883F2F5d6C480A5",
406
+ votingEscrow: "0xeBf418Fe2512e7E6bd9b87a8F0f294aCDC67e6B4",
407
+ rewardsDistributor: "0x227f65131A261548b057215bB1D5Ab2997964C7d",
408
+ mixedQuoter: "0x0A5aA5D3a4d28014f967Bf0f29EAA3FF9807D5c6",
409
+ /** MixedRouteQuoterV3 — v2 + all three CL factories (bitmask path encoding). */
410
+ mixedQuoterV3: "0xCd2A7D98e82D6107eac1828ce8DeAA6acB65b555",
411
+ nfpm: "0x827922686190790b37229fd06084350E74485b72",
412
+ /** Oldest Slipstream CL factory (Gauges V1). Path bit 1<<20. */
413
+ clFactory: "0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A",
414
+ /** Slipstream CL factory 2 (gauge caps). Raw tickSpacing in MixedQuoterV3. */
415
+ clFactory2: "0xaDe65c38CD4849aDBA595a4323a8C7DdfE89716a",
416
+ /** Newest Slipstream CL factory (Gauges V3) — Coinbase B20 stock pools. Path bit 1<<19. */
417
+ clFactory3: "0xf8f2eB4940CFE7d13603DDDD87f123820Fc061Ef",
418
+ universalRouter: "0x6Cb442acF35158D5eDa88fe602221b67B400Be3E",
419
+ swapRouter: "0xBE6D8f0d05cC4be24d5167a3eF062215bE6D18a5",
420
+ swapRouter2: "0xcbBb8035cAc7D4B3Ca7aBb74cF7BdF900215Ce0D",
421
+ swapRouter3: "0x698Cb2b6dd822994581fEa6eA4Fc755d1363A92F",
422
+ pricesOracle: "0xee717411f6E44F9feE011835C8E6FAaC5dEfF166",
423
+ slipstreamHelper: "0x0AD09A66af0154a84e86F761313d02d0abB6edd5",
424
+ lpSugar: "0x69dD9db6d8f8E7d83887A704f447b1a584b599A1",
425
+ sugarSlipstreamHelper: "0x9c62ab10577fB3C20A22E231b7703Ed6D456CC7a",
426
+ swapper: "0x91616a7B9CF6D23f8C17845581051EBdC4BcB916",
427
+ weth: AERODROME_WETH_BASE
428
+ };
429
+ }
430
+ });
431
+ var AERODROME_COINBASE_STOCK_TOKENS, AERODROME_COINBASE_STOCK_DECIMALS;
432
+ var init_stockTokens = __esm({
433
+ "src/protocols/evm/aerodrome/stockTokens.ts"() {
434
+ AERODROME_COINBASE_STOCK_TOKENS = [
435
+ { symbol: "AAPLc", name: "Apple Inc.", address: "0xb200000000000000000000C2e324d24d7eEcd1fb" },
436
+ { symbol: "NVDAc", name: "NVIDIA Corporation", address: "0xb20000000000000000000078ee7ce2fE4908108C" },
437
+ { symbol: "METAc", name: "Meta Platforms Inc.", address: "0xb2000000000000000000008bC8786B856E61707C" },
438
+ { symbol: "GOOGLc", name: "Alphabet Inc.", address: "0xb2000000000000000000002D0BA3164cc74f58B7" },
439
+ { symbol: "AMZNc", name: "Amazon.com Inc.", address: "0xb200000000000000000000d9192b6B456483C2E8" },
440
+ { symbol: "TSLAc", name: "Tesla Inc.", address: "0xb2000000000000000000001e800a7f5189430cD0" },
441
+ { symbol: "MSFTc", name: "Microsoft Corporation", address: "0xB200000000000000000000Ab99cFa739E253872B" },
442
+ { symbol: "COINc", name: "Coinbase Global Inc.", address: "0xb200000000000000000000c85a31389D71F3ecfb" },
443
+ { symbol: "MSTRc", name: "Strategy Inc.", address: "0xb2000000000000000000004884b426556b92883d" },
444
+ { symbol: "CRCLc", name: "Circle Internet Group Inc.", address: "0xB20000000000000000000019f6E7C675b73C2e4D" },
445
+ { symbol: "INTCc", name: "Intel Corporation", address: "0xB2000000000000000000004AFF16039bA04bdFBc" },
446
+ { symbol: "SNDKc", name: "Sandisk Corporation", address: "0xb200000000000000000000397293Cb8cda9a10c5" },
447
+ { symbol: "SPCXc", name: "Space Exploration Technologies Corp.", address: "0xb2000000000000000000007b9fcbd005511aCBd5" }
448
+ ];
449
+ AERODROME_COINBASE_STOCK_DECIMALS = 8;
450
+ }
451
+ });
452
+ var init_discover = __esm({
453
+ "src/protocols/evm/aerodrome/discover.ts"() {
454
+ }
455
+ });
456
+ var init_yields = __esm({
457
+ "src/protocols/evm/aerodrome/yields.ts"() {
458
+ init_addresses();
459
+ init_support2();
460
+ new Set(
461
+ [
462
+ AERODROME_WETH_BASE,
463
+ AERODROME_USDC_BASE,
464
+ AERODROME_BASE_ADDRESSES_FALLBACK.aero,
465
+ "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb",
466
+ "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2",
467
+ "0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34",
468
+ "0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22",
469
+ "0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452"
470
+ ].map((a) => a.toLowerCase())
471
+ );
472
+ }
473
+ });
382
474
 
383
475
  // src/core/registry.ts
384
476
  var modules = [];
@@ -746,6 +838,22 @@ var curveDaoProtocolModule = {
746
838
  amountHuman: { type: "string", required: true, description: "Human-readable input amount" },
747
839
  slippagePercent: { type: "number", required: true, description: "Slippage percent (0\u2013100 exclusive)" }
748
840
  }
841
+ },
842
+ {
843
+ id: "curve-dao.add-liquidity",
844
+ protocolId: CURVE_DAO_PROTOCOL_ID,
845
+ chainCategory: "evm",
846
+ description: "Add liquidity to an important Curve pool (optional gauge stake)",
847
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
848
+ params: {}
849
+ },
850
+ {
851
+ id: "curve-dao.remove-liquidity",
852
+ protocolId: CURVE_DAO_PROTOCOL_ID,
853
+ chainCategory: "evm",
854
+ description: "Remove liquidity from an important Curve pool",
855
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
856
+ params: {}
749
857
  }
750
858
  ]
751
859
  };
@@ -990,7 +1098,7 @@ var evmMultisignCommonInputSchema = zod.z.object({
990
1098
  chainDetail: chainDetailSchema.optional().describe("Server-filled gas row from chain registry when keyGenId is set."),
991
1099
  customGasChainDetails: zod.z.record(zod.z.unknown()).optional().describe("Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true."),
992
1100
  expiryDate: zod.z.number().int().positive().optional().describe(
993
- "Optional Unix seconds (UTC) when the MPC sign request expires. Uniswap V4, GMX, Hyperliquid, Curve DAO, and Aerodrome default to 30 minutes when omitted; other protocols use the node default (7 days)."
1101
+ "Optional Unix seconds (UTC) when the MPC sign request expires. Uniswap V4, GMX, Hyperliquid, Curve DAO, Aerodrome, and Pendle default to 30 minutes when omitted; other protocols use the node default (7 days)."
994
1102
  )
995
1103
  });
996
1104
  function withMultisignKeySourceRefine(schema) {
@@ -1726,6 +1834,54 @@ var mcpCurveDaoBuildSwapMultisignInputSchema = withMultisignKeySourceRefine(
1726
1834
  })
1727
1835
  )
1728
1836
  );
1837
+ var mcpCurveDaoFetchImportantPoolsInputSchema = zod.z.object({
1838
+ chainId: agentEvmChainIdSchema,
1839
+ query: zod.z.string().trim().min(1).optional().describe("Optional shrink filter on name, address, or coin symbol.")
1840
+ });
1841
+ var mcpCurveDaoFetchImportantPoolsOutputSchema = jsonObjectSchema.describe(
1842
+ "{ chainId, pools[] (id, address, name, coins, tvlUsd, baseApy, gaugeCrvApy, gaugeAddress), notes }. Hard cap ~100. Not a factory dump."
1843
+ );
1844
+ var mcpCurveDaoFetchLpYieldsInputSchema = mcpCurveDaoFetchImportantPoolsInputSchema.extend({
1845
+ pool: zod.z.string().trim().min(1).optional().describe("Optional pool address or id to shrink the set.")
1846
+ });
1847
+ var mcpCurveDaoFetchLpYieldsOutputSchema = mcpCurveDaoFetchImportantPoolsOutputSchema;
1848
+ var mcpCurveDaoQuoteAddLiquidityInputSchema = zod.z.object({
1849
+ chainId: agentEvmChainIdSchema,
1850
+ rpcUrl: zod.z.string().min(1).optional(),
1851
+ pool: zod.z.string().min(1).describe("Pool address or id from ctm_curve_dao_fetch_important_pools"),
1852
+ amountsHuman: zod.z.array(zod.z.string().min(1)).min(1).describe("Human amounts per underlying coin, same order as coins[]"),
1853
+ stakeInGauge: zod.z.boolean().optional().describe("If true, quote assumes LP is staked for gauge_crv_apy")
1854
+ });
1855
+ var mcpCurveDaoQuoteAddLiquidityOutputSchema = jsonObjectSchema;
1856
+ var mcpCurveDaoQuoteRemoveLiquidityInputSchema = zod.z.object({
1857
+ chainId: agentEvmChainIdSchema,
1858
+ rpcUrl: zod.z.string().min(1).optional(),
1859
+ pool: zod.z.string().min(1),
1860
+ lpAmountHuman: zod.z.string().min(1)
1861
+ });
1862
+ var mcpCurveDaoQuoteRemoveLiquidityOutputSchema = jsonObjectSchema;
1863
+ var mcpCurveDaoBuildAddLiquidityMultisignInputSchema = withMultisignKeySourceRefine(
1864
+ evmMultisignCommonInputSchema.extend({
1865
+ pool: zod.z.string().min(1),
1866
+ amountsHuman: zod.z.array(zod.z.string()).min(1),
1867
+ slippagePercent: zod.z.number().gt(0).lt(100),
1868
+ stakeInGauge: zod.z.boolean().optional()
1869
+ })
1870
+ );
1871
+ var mcpCurveDaoBuildRemoveLiquidityMultisignInputSchema = withMultisignKeySourceRefine(
1872
+ evmMultisignCommonInputSchema.extend({
1873
+ pool: zod.z.string().min(1),
1874
+ lpAmountHuman: zod.z.string().min(1),
1875
+ slippagePercent: zod.z.number().gt(0).lt(100)
1876
+ })
1877
+ );
1878
+ var mcpCurveDaoBuildGaugeDepositMultisignInputSchema = withMultisignKeySourceRefine(
1879
+ evmMultisignCommonInputSchema.extend({
1880
+ pool: zod.z.string().min(1),
1881
+ lpAmountHuman: zod.z.string().min(1),
1882
+ withdraw: zod.z.boolean().optional().describe("If true, withdraw LP from the gauge instead of deposit")
1883
+ })
1884
+ );
1729
1885
  var chain8453 = agentEvmChainIdSchema.describe("Must be 8453 (Base). Aerodrome is Base-only.");
1730
1886
  var rpcUrlOptional = zod.z.string().min(1).optional().describe("JSON-RPC URL; continuum-mcp-server injects from chain registry \u2014 do not pass a public RPC URL");
1731
1887
  var mcpAerodromeDiscoverPoolsInputSchema = zod.z.object({
@@ -1740,10 +1896,23 @@ var mcpAerodromeDiscoverPoolsOutputSchema = jsonObjectSchema.describe(
1740
1896
  var mcpAerodromeFetchPoolsInputSchema = zod.z.object({
1741
1897
  chainId: chain8453,
1742
1898
  rpcUrl: rpcUrlOptional,
1743
- limit: zod.z.number().int().positive().max(200).optional(),
1899
+ query: zod.z.string().trim().min(1).optional().describe("Optional shrink filter. Does not expand beyond the ~100 important pools."),
1900
+ limit: zod.z.number().int().positive().max(100).optional(),
1744
1901
  offset: zod.z.number().int().min(0).optional()
1745
1902
  });
1746
- var mcpAerodromeFetchPoolsOutputSchema = jsonObjectSchema.describe("{ chainId, pools[] }");
1903
+ var mcpAerodromeFetchPoolsOutputSchema = jsonObjectSchema.describe(
1904
+ "{ chainId, pools[], notes }. At most ~100 important Base pairs \u2014 not an LpSugar.all dump."
1905
+ );
1906
+ var mcpAerodromeFetchLpYieldsInputSchema = zod.z.object({
1907
+ chainId: chain8453,
1908
+ rpcUrl: rpcUrlOptional,
1909
+ query: zod.z.string().trim().min(1).optional()
1910
+ });
1911
+ var mcpAerodromeFetchLpYieldsOutputSchema = jsonObjectSchema.describe(
1912
+ "{ chainId, pools[] (lp, feeApr, emissionsApr, totalApr, gauge, kind, tvlUsd), notes }"
1913
+ );
1914
+ var mcpAerodromeFetchStockLpYieldsInputSchema = mcpAerodromeFetchLpYieldsInputSchema;
1915
+ var mcpAerodromeFetchStockLpYieldsOutputSchema = mcpAerodromeFetchLpYieldsOutputSchema;
1747
1916
  var mcpAerodromeFetchPositionsInputSchema = zod.z.object({
1748
1917
  chainId: chain8453,
1749
1918
  rpcUrl: rpcUrlOptional,
@@ -2021,7 +2190,13 @@ var mcpMorphoFetchEarnVaultsOutputSchema = zod.z.object({
2021
2190
  managementFee: zod.z.string().nullable(),
2022
2191
  totalDepositsUsd: zod.z.string(),
2023
2192
  liquidityUsd: zod.z.string(),
2024
- exposure: zod.z.array(morphoExposureRowSchema)
2193
+ exposure: zod.z.array(morphoExposureRowSchema),
2194
+ rewards: zod.z.array(
2195
+ zod.z.object({
2196
+ symbol: zod.z.string(),
2197
+ supplyAprLabel: zod.z.string()
2198
+ })
2199
+ ).describe("Extra vault incentive APR from Morpho GraphQL allRewards (variable).")
2025
2200
  })
2026
2201
  )
2027
2202
  });
@@ -2045,7 +2220,14 @@ var mcpMorphoFetchBlueMarketsOutputSchema = zod.z.object({
2045
2220
  loanTokenSymbol: zod.z.string(),
2046
2221
  loanTokenDecimals: zod.z.number().int(),
2047
2222
  borrowApyLabel: zod.z.string(),
2048
- supplyApyLabel: zod.z.string()
2223
+ supplyApyLabel: zod.z.string(),
2224
+ netSupplyApyLabel: zod.z.string().describe("Blue net supply APY including incentives when Morpho publishes it."),
2225
+ rewards: zod.z.array(
2226
+ zod.z.object({
2227
+ symbol: zod.z.string(),
2228
+ supplyAprLabel: zod.z.string()
2229
+ })
2230
+ )
2049
2231
  })
2050
2232
  )
2051
2233
  });
@@ -3091,6 +3273,70 @@ var mcpContinuumDaoForumSignInInputSchema = mcpMultisignInput({
3091
3273
  username: zod.z.string().min(2).max(16).optional().describe("Required on first login when there is no node key (2\u201316 letters, numbers, . _ -)."),
3092
3274
  forumUrl: zod.z.string().optional()
3093
3275
  });
3276
+ var mcpMapleSyrupMarketSummarySchema = zod.z.object({
3277
+ chainId: zod.z.number(),
3278
+ name: zod.z.string(),
3279
+ pool: zod.z.string().describe("Copy as pool for ctm_maple_build_*_multisign"),
3280
+ syrupRouter: zod.z.string().describe("Copy as syrupRouter for ctm_maple_build_deposit_multisign"),
3281
+ asset: zod.z.string().describe("Copy as asset for ctm_maple_build_deposit_multisign"),
3282
+ assetSymbol: zod.z.string(),
3283
+ assetDecimals: zod.z.number(),
3284
+ weeklyApyPercent: zod.z.string(),
3285
+ monthlyApyPercent: zod.z.string(),
3286
+ totalAssets: zod.z.string()
3287
+ });
3288
+ var mcpMapleFetchMarketsInputSchema = zod.z.object({
3289
+ chainId: agentEvmChainIdSchema,
3290
+ underlying: zod.z.string().trim().min(1).optional().describe("Optional filter: ERC-20 address or ticker (USDT, USDC). Omit to list all Syrup pools.")
3291
+ });
3292
+ var mcpMapleFetchMarketsOutputSchema = zod.z.object({
3293
+ chainId: zod.z.number(),
3294
+ markets: zod.z.array(mcpMapleSyrupMarketSummarySchema),
3295
+ notes: zod.z.string()
3296
+ });
3297
+ var mcpMapleFetchMarketInputSchema = zod.z.object({
3298
+ chainId: agentEvmChainIdSchema,
3299
+ pool: evmAddressSchema.optional().describe("Syrup PoolV2 / share token from fetch_markets."),
3300
+ underlying: zod.z.string().trim().min(1).optional().describe("Deposit asset address or ticker (USDC, USDT, USDG).")
3301
+ });
3302
+ var mcpMapleFetchMarketOutputSchema = mcpMapleFetchMarketsOutputSchema;
3303
+ var mcpAaveV4UiMarketIdSchema = zod.z.enum(["main", "core", "bluechip"]).optional().describe("UI market segment: main (Plus), core, or bluechip (Prime). Omit to list all hubs.");
3304
+ var mcpAaveV4MarketSummarySchema = zod.z.object({
3305
+ chainId: zod.z.number(),
3306
+ hubName: zod.z.string(),
3307
+ marketId: zod.z.enum(["main", "core", "bluechip"]),
3308
+ hubAddress: zod.z.string(),
3309
+ symbol: zod.z.string(),
3310
+ name: zod.z.string(),
3311
+ underlying: zod.z.string().describe("Copy as underlying for ctm_aave_v4_build_*_multisign"),
3312
+ spoke: zod.z.string().nullable(),
3313
+ canSupply: zod.z.boolean(),
3314
+ canBorrow: zod.z.boolean(),
3315
+ canUseAsCollateral: zod.z.boolean(),
3316
+ supplyApyPercent: zod.z.string(),
3317
+ borrowApyPercent: zod.z.string(),
3318
+ supplied: zod.z.string(),
3319
+ borrowed: zod.z.string(),
3320
+ availableLiquidity: zod.z.string(),
3321
+ utilizationPercent: zod.z.string().nullable(),
3322
+ collateralFactorPercent: zod.z.string()
3323
+ });
3324
+ var mcpAaveV4FetchMarketsInputSchema = zod.z.object({
3325
+ chainId: agentEvmChainIdSchema,
3326
+ marketId: mcpAaveV4UiMarketIdSchema,
3327
+ underlying: zod.z.string().trim().min(1).optional().describe("Optional filter: ERC-20 address or ticker (USDT, USDC). Omit to list all reserves.")
3328
+ });
3329
+ var mcpAaveV4FetchMarketsOutputSchema = zod.z.object({
3330
+ chainId: zod.z.number(),
3331
+ markets: zod.z.array(mcpAaveV4MarketSummarySchema),
3332
+ notes: zod.z.string()
3333
+ });
3334
+ var mcpAaveV4FetchMarketInputSchema = zod.z.object({
3335
+ chainId: agentEvmChainIdSchema,
3336
+ underlying: zod.z.string().trim().min(1).describe("Reserve underlying address or ticker (e.g. USDT). Prefer fetch_markets when listing rates."),
3337
+ marketId: mcpAaveV4UiMarketIdSchema
3338
+ });
3339
+ var mcpAaveV4FetchMarketOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
3094
3340
  var mcpEulerV2FetchLendVaultsInputSchema = zod.z.object({
3095
3341
  chainId: agentEvmChainIdSchema,
3096
3342
  underlyingAddress: evmAddressSchema.describe(
@@ -3113,6 +3359,251 @@ var mcpEulerV2FetchLendVaultsOutputSchema = zod.z.object({
3113
3359
  })
3114
3360
  )
3115
3361
  });
3362
+ var mcpEulerV2FetchEarnVaultsInputSchema = zod.z.object({
3363
+ chainId: agentEvmChainIdSchema,
3364
+ underlyingAddress: evmAddressSchema.describe(
3365
+ "Underlying asset address from get_defi_protocol_supported_tokens."
3366
+ ),
3367
+ limit: agentCoercedOptionalIntSchema(zod.z.number().int().min(1).max(100)).describe("Max vault rows (default 30).")
3368
+ });
3369
+ var mcpEulerV2FetchEarnVaultsOutputSchema = zod.z.object({
3370
+ vaults: zod.z.array(
3371
+ zod.z.object({
3372
+ evaultAddress: zod.z.string().describe("Copy as vault for earn deposit multisign"),
3373
+ vaultName: zod.z.string(),
3374
+ curatorDisplayName: zod.z.string(),
3375
+ supplyApyPercentLabel: zod.z.string(),
3376
+ totalAssetsHumanLabel: zod.z.string(),
3377
+ availableLiquidityHumanLabel: zod.z.string(),
3378
+ performanceFeePercentLabel: zod.z.string(),
3379
+ underlyingAddress: zod.z.string(),
3380
+ strategyCount: zod.z.number().int()
3381
+ })
3382
+ )
3383
+ });
3384
+ var mcpLidoFetchStethAprInputSchema = zod.z.object({}).strict();
3385
+ var mcpLidoFetchStethAprOutputSchema = zod.z.object({
3386
+ aprPercent: zod.z.string(),
3387
+ apr: zod.z.number().nullable(),
3388
+ asset: zod.z.string(),
3389
+ source: zod.z.string(),
3390
+ notes: zod.z.string()
3391
+ });
3392
+ var mcpSkyFetchSusdsRateInputSchema = zod.z.object({
3393
+ rpcUrl: zod.z.string().min(1).optional().describe("Server-filled from chain registry. Agents should omit.")
3394
+ }).strict();
3395
+ var mcpSkyFetchSusdsRateOutputSchema = zod.z.object({
3396
+ chainId: zod.z.number(),
3397
+ vault: zod.z.string(),
3398
+ asset: zod.z.string(),
3399
+ assetSymbol: zod.z.string(),
3400
+ apyPercent: zod.z.string(),
3401
+ apy: zod.z.number().nullable(),
3402
+ usdsPerSusdsShare: zod.z.string(),
3403
+ notes: zod.z.string()
3404
+ });
3405
+ var mcpEthenaFetchSusdeApyInputSchema = zod.z.object({
3406
+ rpcUrl: zod.z.string().min(1).optional().describe("Server-filled from chain registry. Agents should omit.")
3407
+ }).strict();
3408
+ var mcpEthenaFetchSusdeApyOutputSchema = zod.z.object({
3409
+ chainId: zod.z.number(),
3410
+ product: zod.z.string(),
3411
+ asset: zod.z.string(),
3412
+ assetSymbol: zod.z.string(),
3413
+ share: zod.z.string(),
3414
+ apyPercent: zod.z.string(),
3415
+ apy: zod.z.number().nullable(),
3416
+ usdePerSusde: zod.z.string(),
3417
+ cooldownDurationSec: zod.z.number().nullable(),
3418
+ notes: zod.z.string()
3419
+ });
3420
+ var mcpPendleFetchMarketsInputSchema = zod.z.object({
3421
+ chainId: agentEvmChainIdSchema,
3422
+ query: zod.z.string().trim().min(1).optional().describe("Optional shrink filter on name, PT/YT/underlying symbol or address."),
3423
+ pointsOnly: zod.z.boolean().optional().describe("If true, only markets with point campaigns.")
3424
+ });
3425
+ var mcpPendleFetchMarketsOutputSchema = jsonObjectSchema.describe(
3426
+ "{ chainId, markets[] (address, pt, yt, sy, underlying, expiry, impliedApy, tvlUsd, points), notes }. Live markets only, hard cap 100 TVL-ranked."
3427
+ );
3428
+ var mcpPendleFetchPricesInputSchema = zod.z.object({
3429
+ chainId: agentEvmChainIdSchema,
3430
+ ids: zod.z.array(zod.z.string().min(1)).optional().describe("Asset ids (chainId-0x\u2026). Omit to price the current live listing."),
3431
+ query: zod.z.string().trim().min(1).optional()
3432
+ });
3433
+ var mcpPendleFetchPricesOutputSchema = jsonObjectSchema.describe(
3434
+ "{ chainId, prices[] ({ id, usd }), notes }"
3435
+ );
3436
+ var mcpPendleSearchAssetsInputSchema = zod.z.object({
3437
+ chainId: agentEvmChainIdSchema,
3438
+ query: zod.z.string().trim().min(1).describe("Ticker, name, 0x address, or chainId-0x asset id.")
3439
+ });
3440
+ var mcpPendleSearchAssetsOutputSchema = jsonObjectSchema.describe(
3441
+ "{ chainId, results[] (live PT/YT/SY/market + expiry, liquidity, points), notes }"
3442
+ );
3443
+ var mcpPendleFetchPositionsInputSchema = zod.z.object({
3444
+ user: evmAddressSchema.describe("KeyGen / wallet to list Pendle LP for."),
3445
+ chainId: agentEvmChainIdSchema.optional().describe("If set, only this chain. Omit for all Core chains."),
3446
+ filterUsd: zod.z.number().min(0).optional().describe("Drop holdings below this USD valuation. Omit to keep dust.")
3447
+ });
3448
+ var mcpPendleFetchPositionsOutputSchema = jsonObjectSchema.describe(
3449
+ "{ user, chainId, lp[] (market, name, expiry, matured, lpAmountHuman, lpUsd), notes }. Includes matured. Not the node token list."
3450
+ );
3451
+ var mcpPendleFetchMerkleRewardsInputSchema = zod.z.object({
3452
+ user: evmAddressSchema.describe("Wallet to list off-chain airdrop rows for (informational; no claim).")
3453
+ });
3454
+ var mcpPendleFetchMerkleRewardsOutputSchema = jsonObjectSchema.describe(
3455
+ "{ user, claimableRewards[], claimedRewards[], notes }. List only \u2014 cannot build a claim from these rows."
3456
+ );
3457
+ var mcpPendleQuoteSwapInputSchema = zod.z.object({
3458
+ chainId: agentEvmChainIdSchema,
3459
+ rpcUrl: zod.z.string().min(1).optional(),
3460
+ tokenIn: zod.z.string().min(1).describe("Underlying, PT, or YT (0xeeee / 0x0 = native)."),
3461
+ tokenOut: zod.z.string().min(1),
3462
+ amountHuman: zod.z.string().min(1),
3463
+ slippagePercent: zod.z.number().gt(0).lt(100),
3464
+ receiver: evmAddressSchema.optional(),
3465
+ enableAggregator: zod.z.boolean().optional(),
3466
+ tokenInDecimals: zod.z.number().int().min(0).max(18).optional()
3467
+ });
3468
+ var mcpPendleQuoteOutputSchema = jsonObjectSchema.describe(
3469
+ "Hosted SDK convert quote: action, outputs, priceImpact, impliedApy, requiredApprovals, tx (do not hardcode tx.to)."
3470
+ );
3471
+ var mcpPendleQuoteMintPyInputSchema = zod.z.object({
3472
+ chainId: agentEvmChainIdSchema,
3473
+ rpcUrl: zod.z.string().min(1).optional(),
3474
+ tokenIn: zod.z.string().min(1),
3475
+ pt: evmAddressSchema,
3476
+ yt: evmAddressSchema,
3477
+ amountHuman: zod.z.string().min(1),
3478
+ slippagePercent: zod.z.number().gt(0).lt(100),
3479
+ receiver: evmAddressSchema.optional()
3480
+ });
3481
+ var mcpPendleQuoteRedeemPyInputSchema = zod.z.object({
3482
+ chainId: agentEvmChainIdSchema,
3483
+ rpcUrl: zod.z.string().min(1).optional(),
3484
+ pt: evmAddressSchema,
3485
+ yt: evmAddressSchema,
3486
+ tokenOut: zod.z.string().min(1),
3487
+ amountPtHuman: zod.z.string().min(1),
3488
+ amountYtHuman: zod.z.string().min(1).optional(),
3489
+ slippagePercent: zod.z.number().gt(0).lt(100),
3490
+ receiver: evmAddressSchema.optional()
3491
+ });
3492
+ var mcpPendleQuoteMintSyInputSchema = zod.z.object({
3493
+ chainId: agentEvmChainIdSchema,
3494
+ rpcUrl: zod.z.string().min(1).optional(),
3495
+ tokenIn: zod.z.string().min(1),
3496
+ sy: evmAddressSchema,
3497
+ amountHuman: zod.z.string().min(1),
3498
+ slippagePercent: zod.z.number().gt(0).lt(100),
3499
+ receiver: evmAddressSchema.optional()
3500
+ });
3501
+ var mcpPendleQuoteRedeemSyInputSchema = zod.z.object({
3502
+ chainId: agentEvmChainIdSchema,
3503
+ rpcUrl: zod.z.string().min(1).optional(),
3504
+ sy: evmAddressSchema,
3505
+ tokenOut: zod.z.string().min(1),
3506
+ amountHuman: zod.z.string().min(1),
3507
+ slippagePercent: zod.z.number().gt(0).lt(100),
3508
+ receiver: evmAddressSchema.optional()
3509
+ });
3510
+ var mcpPendleQuoteAddLiquidityInputSchema = zod.z.object({
3511
+ chainId: agentEvmChainIdSchema,
3512
+ rpcUrl: zod.z.string().min(1).optional(),
3513
+ tokensIn: zod.z.array(zod.z.object({ token: zod.z.string().min(1), amountHuman: zod.z.string().min(1) })).min(1),
3514
+ market: evmAddressSchema,
3515
+ keepYt: zod.z.boolean().optional(),
3516
+ yt: evmAddressSchema.optional(),
3517
+ slippagePercent: zod.z.number().gt(0).lt(100),
3518
+ receiver: evmAddressSchema.optional()
3519
+ });
3520
+ var mcpPendleQuoteRemoveLiquidityInputSchema = zod.z.object({
3521
+ chainId: agentEvmChainIdSchema,
3522
+ rpcUrl: zod.z.string().min(1).optional(),
3523
+ market: evmAddressSchema,
3524
+ lpAmountHuman: zod.z.string().min(1),
3525
+ tokensOut: zod.z.array(zod.z.string().min(1)).min(1),
3526
+ slippagePercent: zod.z.number().gt(0).lt(100),
3527
+ enableAggregator: zod.z.boolean().optional(),
3528
+ receiver: evmAddressSchema.optional()
3529
+ });
3530
+ var mcpPendleBuildSwapMultisignInputSchema = withMultisignKeySourceRefine(
3531
+ evmMultisignCommonInputSchema.extend({
3532
+ tokenIn: zod.z.string().min(1),
3533
+ tokenOut: zod.z.string().min(1),
3534
+ amountHuman: zod.z.string().min(1),
3535
+ slippagePercent: zod.z.number().gt(0).lt(100),
3536
+ enableAggregator: zod.z.boolean().optional(),
3537
+ convertSnapshot: jsonObjectSchema.optional()
3538
+ })
3539
+ );
3540
+ var mcpPendleBuildMintPyMultisignInputSchema = withMultisignKeySourceRefine(
3541
+ evmMultisignCommonInputSchema.extend({
3542
+ tokenIn: zod.z.string().min(1),
3543
+ pt: evmAddressSchema,
3544
+ yt: evmAddressSchema,
3545
+ amountHuman: zod.z.string().min(1),
3546
+ slippagePercent: zod.z.number().gt(0).lt(100),
3547
+ convertSnapshot: jsonObjectSchema.optional()
3548
+ })
3549
+ );
3550
+ var mcpPendleBuildRedeemPyMultisignInputSchema = withMultisignKeySourceRefine(
3551
+ evmMultisignCommonInputSchema.extend({
3552
+ pt: evmAddressSchema,
3553
+ yt: evmAddressSchema,
3554
+ tokenOut: zod.z.string().min(1),
3555
+ amountPtHuman: zod.z.string().min(1),
3556
+ amountYtHuman: zod.z.string().min(1).optional(),
3557
+ slippagePercent: zod.z.number().gt(0).lt(100),
3558
+ convertSnapshot: jsonObjectSchema.optional()
3559
+ })
3560
+ );
3561
+ var mcpPendleBuildMintSyMultisignInputSchema = withMultisignKeySourceRefine(
3562
+ evmMultisignCommonInputSchema.extend({
3563
+ tokenIn: zod.z.string().min(1),
3564
+ sy: evmAddressSchema,
3565
+ amountHuman: zod.z.string().min(1),
3566
+ slippagePercent: zod.z.number().gt(0).lt(100),
3567
+ convertSnapshot: jsonObjectSchema.optional()
3568
+ })
3569
+ );
3570
+ var mcpPendleBuildRedeemSyMultisignInputSchema = withMultisignKeySourceRefine(
3571
+ evmMultisignCommonInputSchema.extend({
3572
+ sy: evmAddressSchema,
3573
+ tokenOut: zod.z.string().min(1),
3574
+ amountHuman: zod.z.string().min(1),
3575
+ slippagePercent: zod.z.number().gt(0).lt(100),
3576
+ convertSnapshot: jsonObjectSchema.optional()
3577
+ })
3578
+ );
3579
+ var mcpPendleBuildAddLiquidityMultisignInputSchema = withMultisignKeySourceRefine(
3580
+ evmMultisignCommonInputSchema.extend({
3581
+ tokensIn: zod.z.array(zod.z.object({ token: zod.z.string().min(1), amountHuman: zod.z.string().min(1) })).min(1),
3582
+ market: evmAddressSchema,
3583
+ keepYt: zod.z.boolean().optional(),
3584
+ yt: evmAddressSchema.optional(),
3585
+ slippagePercent: zod.z.number().gt(0).lt(100),
3586
+ convertSnapshot: jsonObjectSchema.optional()
3587
+ })
3588
+ );
3589
+ var mcpPendleBuildRemoveLiquidityMultisignInputSchema = withMultisignKeySourceRefine(
3590
+ evmMultisignCommonInputSchema.extend({
3591
+ market: evmAddressSchema,
3592
+ lpAmountHuman: zod.z.string().min(1),
3593
+ tokensOut: zod.z.array(zod.z.string().min(1)).min(1),
3594
+ slippagePercent: zod.z.number().gt(0).lt(100),
3595
+ enableAggregator: zod.z.boolean().optional(),
3596
+ convertSnapshot: jsonObjectSchema.optional()
3597
+ })
3598
+ );
3599
+ var mcpPendleBuildRedeemRewardsMultisignInputSchema = withMultisignKeySourceRefine(
3600
+ evmMultisignCommonInputSchema.extend({
3601
+ sys: zod.z.array(evmAddressSchema).optional(),
3602
+ yts: zod.z.array(evmAddressSchema).optional(),
3603
+ markets: zod.z.array(evmAddressSchema).optional(),
3604
+ convertSnapshot: jsonObjectSchema.optional()
3605
+ })
3606
+ );
3116
3607
  var mcpCompoundV3FetchMarketsInputSchema = zod.z.object({
3117
3608
  chainId: agentEvmChainIdSchema,
3118
3609
  rpcUrl: zod.z.string().min(1).optional().describe("Server-filled from chain registry. Agents should omit.")
@@ -3137,6 +3628,8 @@ var mcpCompoundV3MarketSummarySchema = zod.z.object({
3137
3628
  utilization: zod.z.number().nullable(),
3138
3629
  supplyAprPercent: zod.z.string().nullable(),
3139
3630
  borrowAprPercent: zod.z.string().nullable(),
3631
+ supplyRewardAprPercent: zod.z.string().nullable().describe("Forward COMP (or reward-token) supply incentive APR. Extra and variable; null if unpriced."),
3632
+ borrowRewardAprPercent: zod.z.string().nullable().describe("Forward COMP (or reward-token) borrow incentive APR. Extra and variable; null if unpriced."),
3140
3633
  assets: zod.z.array(mcpCompoundV3MarketAssetSchema)
3141
3634
  });
3142
3635
  var mcpCompoundV3FetchMarketsOutputSchema = zod.z.object({
@@ -3381,7 +3874,15 @@ var mcpGmxFetchMarketPricesOutputSchema = zod.z.object({
3381
3874
  indexMarkUsd: zod.z.string().nullable(),
3382
3875
  collateralUsd: zod.z.string().nullable(),
3383
3876
  indexPerCollateral: zod.z.string().nullable(),
3384
- fetchedAtMs: zod.z.number()
3877
+ fetchedAtMs: zod.z.number(),
3878
+ fundingFactorPerSecond: zod.z.string().nullable(),
3879
+ longsPayShorts: zod.z.boolean().nullable(),
3880
+ fundingHourlyPercentLabel: zod.z.string().nullable(),
3881
+ fundingAprPercentLabel: zod.z.string().nullable(),
3882
+ borrowingFactorPerSecondForLongs: zod.z.string().nullable(),
3883
+ borrowingFactorPerSecondForShorts: zod.z.string().nullable(),
3884
+ borrowingHourlyPercentLongLabel: zod.z.string().nullable(),
3885
+ borrowingHourlyPercentShortLabel: zod.z.string().nullable()
3385
3886
  });
3386
3887
  var mcpGmxFetchOhlcvInputSchema = zod.z.object({
3387
3888
  chainId: agentEvmChainIdSchema,
@@ -3452,6 +3953,28 @@ var hyperliquidAccountSummarySchema = zod.z.object({
3452
3953
  var mcpHyperliquidFetchMarketsInputSchema = hyperliquidFetchChainInputSchema.extend({
3453
3954
  dex: zod.z.string().optional()
3454
3955
  });
3956
+ var mcpHyperliquidFetchStockMarketsInputSchema = hyperliquidFetchChainInputSchema;
3957
+ var mcpHyperliquidFetchStockMarketsOutputSchema = zod.z.object({
3958
+ markets: zod.z.array(
3959
+ zod.z.object({
3960
+ name: zod.z.string().describe("HIP-3 coin, e.g. xyz:AAPL"),
3961
+ asset: zod.z.number(),
3962
+ szDecimals: zod.z.number(),
3963
+ maxLeverage: zod.z.number(),
3964
+ onlyIsolated: zod.z.boolean().optional(),
3965
+ dex: zod.z.string().optional(),
3966
+ displayName: zod.z.string().optional(),
3967
+ category: zod.z.string().optional(),
3968
+ keywords: zod.z.array(zod.z.string()).optional()
3969
+ })
3970
+ ),
3971
+ dexes: zod.z.array(
3972
+ zod.z.object({
3973
+ name: zod.z.string(),
3974
+ fullName: zod.z.string()
3975
+ })
3976
+ )
3977
+ });
3455
3978
  var mcpHyperliquidFetchMarketsOutputSchema = zod.z.object({
3456
3979
  markets: zod.z.array(
3457
3980
  zod.z.object({
@@ -3556,6 +4079,7 @@ var mcpHyperliquidFetchMarketSnapshotOutputSchema = zod.z.object({
3556
4079
  dex: zod.z.string().nullable(),
3557
4080
  livePrice: hyperliquidLivePriceSchema,
3558
4081
  midUsd: zod.z.string(),
4082
+ funding: zod.z.string().nullable().describe("Official HyperCore hourly funding from metaAndAssetCtxs"),
3559
4083
  fetchedAtMs: zod.z.number(),
3560
4084
  interval: hyperliquidOhlcvIntervalSchema,
3561
4085
  latestCandle: hyperliquidOhlcvCandleSchema.nullable(),
@@ -3612,6 +4136,10 @@ var mcpHyperliquidFetchVaultsOutputSchema = zod.z.object({
3612
4136
  })
3613
4137
  )
3614
4138
  });
4139
+ var mcpHyperliquidFetchVaultApysInputSchema = mcpHyperliquidFetchVaultsInputSchema;
4140
+ var mcpHyperliquidFetchVaultApysOutputSchema = mcpHyperliquidFetchVaultsOutputSchema.extend({
4141
+ notes: zod.z.string()
4142
+ });
3615
4143
  var mcpHyperliquidFetchUserVaultEquitiesInputSchema = hyperliquidFetchChainInputSchema.extend({
3616
4144
  executorAddress: evmAddressSchema
3617
4145
  });
@@ -5506,6 +6034,84 @@ var CORE_MCP_TOOL_DEFINITIONS = [
5506
6034
  handler: { importPath: "protocols/evm/curve-dao", exportName: "buildEvmMultisignBodyCurveDaoBatch" },
5507
6035
  inputZod: mcpCurveDaoBuildSwapMultisignInputSchema
5508
6036
  }),
6037
+ defineMcpTool({
6038
+ name: "ctm_curve_dao_fetch_important_pools",
6039
+ actionId: "curve-dao.fetch-important-pools",
6040
+ protocolId: "curve-dao",
6041
+ chainCategory: "evm",
6042
+ description: "Official api.curve.fi catalog of ~100 important pools (TVL-ranked, dead/zero-TVL dropped). The only Curve list tool \u2014 do not dump factories or call fetchAllCurvePools. Optional query shrinks the set.",
6043
+ prerequisites: ["chainId"],
6044
+ followUp: ["ctm_curve_dao_fetch_lp_yields", "ctm_curve_dao_quote_add_liquidity"],
6045
+ handler: { importPath: "protocols/evm/curve-dao", exportName: "curveDaoFetchImportantPools" },
6046
+ inputZod: mcpCurveDaoFetchImportantPoolsInputSchema,
6047
+ outputZod: mcpCurveDaoFetchImportantPoolsOutputSchema
6048
+ }),
6049
+ defineMcpTool({
6050
+ name: "ctm_curve_dao_fetch_lp_yields",
6051
+ actionId: "curve-dao.fetch-lp-yields",
6052
+ protocolId: "curve-dao",
6053
+ chainCategory: "evm",
6054
+ description: "LP yields for the same ~100 important Curve pools (baseApy + gauge_crv_apy + TVL). gauge_crv_apy requires staking LP in the gauge.",
6055
+ prerequisites: ["chainId"],
6056
+ followUp: ["ctm_curve_dao_quote_add_liquidity", "ctm_curve_dao_build_gauge_deposit_multisign"],
6057
+ handler: { importPath: "protocols/evm/curve-dao", exportName: "curveDaoFetchLpYields" },
6058
+ inputZod: mcpCurveDaoFetchLpYieldsInputSchema,
6059
+ outputZod: mcpCurveDaoFetchLpYieldsOutputSchema
6060
+ }),
6061
+ defineMcpTool({
6062
+ name: "ctm_curve_dao_quote_add_liquidity",
6063
+ actionId: "curve-dao.quote-add-liquidity",
6064
+ protocolId: "curve-dao",
6065
+ chainCategory: "evm",
6066
+ description: "Quote Curve add_liquidity for an important pool. Copy pool + amountsHuman onto the build tool.",
6067
+ prerequisites: ["pool from ctm_curve_dao_fetch_important_pools"],
6068
+ followUp: ["ctm_curve_dao_build_add_liquidity_multisign"],
6069
+ handler: { importPath: "protocols/evm/curve-dao", exportName: "curveDaoQuoteAddLiquidity" },
6070
+ inputZod: mcpCurveDaoQuoteAddLiquidityInputSchema,
6071
+ outputZod: mcpCurveDaoQuoteAddLiquidityOutputSchema
6072
+ }),
6073
+ defineMcpTool({
6074
+ name: "ctm_curve_dao_quote_remove_liquidity",
6075
+ actionId: "curve-dao.quote-remove-liquidity",
6076
+ protocolId: "curve-dao",
6077
+ chainCategory: "evm",
6078
+ description: "Quote balanced Curve remove_liquidity for an important pool.",
6079
+ prerequisites: ["pool from ctm_curve_dao_fetch_important_pools"],
6080
+ followUp: ["ctm_curve_dao_build_remove_liquidity_multisign"],
6081
+ handler: { importPath: "protocols/evm/curve-dao", exportName: "curveDaoQuoteRemoveLiquidity" },
6082
+ inputZod: mcpCurveDaoQuoteRemoveLiquidityInputSchema,
6083
+ outputZod: mcpCurveDaoQuoteRemoveLiquidityOutputSchema
6084
+ }),
6085
+ defineMultisignSubmitMcpTool({
6086
+ name: "ctm_curve_dao_build_add_liquidity_multisign",
6087
+ actionId: "curve-dao.add-liquidity",
6088
+ protocolId: "curve-dao",
6089
+ chainCategory: "evm",
6090
+ description: "Create mpc-auth multiSignRequest for Curve add_liquidity (optional gauge.deposit when stakeInGauge). Pool must be from fetch_important_pools.",
6091
+ prerequisites: ["ctm_curve_dao_quote_add_liquidity"],
6092
+ handler: { importPath: "protocols/evm/curve-dao", exportName: "buildEvmMultisignBodyCurveAddLiquidity" },
6093
+ inputZod: mcpCurveDaoBuildAddLiquidityMultisignInputSchema
6094
+ }),
6095
+ defineMultisignSubmitMcpTool({
6096
+ name: "ctm_curve_dao_build_remove_liquidity_multisign",
6097
+ actionId: "curve-dao.remove-liquidity",
6098
+ protocolId: "curve-dao",
6099
+ chainCategory: "evm",
6100
+ description: "Create mpc-auth multiSignRequest for Curve remove_liquidity. Unstake from the gauge first if LP is staked.",
6101
+ prerequisites: ["ctm_curve_dao_quote_remove_liquidity"],
6102
+ handler: { importPath: "protocols/evm/curve-dao", exportName: "buildEvmMultisignBodyCurveRemoveLiquidity" },
6103
+ inputZod: mcpCurveDaoBuildRemoveLiquidityMultisignInputSchema
6104
+ }),
6105
+ defineMultisignSubmitMcpTool({
6106
+ name: "ctm_curve_dao_build_gauge_deposit_multisign",
6107
+ actionId: "curve-dao.gauge-deposit",
6108
+ protocolId: "curve-dao",
6109
+ chainCategory: "evm",
6110
+ description: "Stake or unstake Curve LP in the gauge (required for advertised gauge_crv_apy). Set withdraw:true to unstake.",
6111
+ prerequisites: ["pool with gaugeAddress from fetch_important_pools"],
6112
+ handler: { importPath: "protocols/evm/curve-dao", exportName: "buildEvmMultisignBodyCurveGaugeDeposit" },
6113
+ inputZod: mcpCurveDaoBuildGaugeDepositMultisignInputSchema
6114
+ }),
5509
6115
  defineMcpTool({
5510
6116
  name: "ctm_aerodrome_discover_pools",
5511
6117
  actionId: "aerodrome.discover-pools",
@@ -5523,13 +6129,37 @@ var CORE_MCP_TOOL_DEFINITIONS = [
5523
6129
  actionId: "aerodrome.fetch-pools",
5524
6130
  protocolId: "aerodrome",
5525
6131
  chainCategory: "evm",
5526
- description: "Paginated LpSugar.all pool dump on Base. Heavy \u2014 can time out. Not required for swaps: ctm_aerodrome_quote discovers Slipstream 3 / v2 routes itself (including AAPLc/USDC). Use only when browsing LP inventory.",
6132
+ description: "At most ~100 important Aerodrome pools on Base (ETH/WETH, USDC, AERO, major stables; TVL-ranked). Not an LpSugar.all dump. Optional query only shrinks the set. For B20 stock LPs use ctm_aerodrome_fetch_stock_lp_yields.",
5527
6133
  prerequisites: ["chainId 8453"],
5528
6134
  followUp: ["ctm_aerodrome_quote_add_liquidity", "ctm_aerodrome_fetch_positions"],
5529
6135
  handler: { importPath: "protocols/evm/aerodrome", exportName: "aerodromeFetchPoolsSummary" },
5530
6136
  inputZod: mcpAerodromeFetchPoolsInputSchema,
5531
6137
  outputZod: mcpAerodromeFetchPoolsOutputSchema
5532
6138
  }),
6139
+ defineMcpTool({
6140
+ name: "ctm_aerodrome_fetch_lp_yields",
6141
+ actionId: "aerodrome.fetch-lp-yields",
6142
+ protocolId: "aerodrome",
6143
+ chainCategory: "evm",
6144
+ description: "Fee tier + AERO emissions APR for the same ~100 important Aerodrome pairs. feeApr is null (Sugar has no volume). Not a factory dump. B20 stocks: ctm_aerodrome_fetch_stock_lp_yields.",
6145
+ prerequisites: ["chainId 8453"],
6146
+ followUp: ["ctm_aerodrome_quote_add_liquidity", "ctm_aerodrome_build_gauge_stake_multisign"],
6147
+ handler: { importPath: "protocols/evm/aerodrome", exportName: "aerodromeFetchLpYieldsSummary" },
6148
+ inputZod: mcpAerodromeFetchLpYieldsInputSchema,
6149
+ outputZod: mcpAerodromeFetchLpYieldsOutputSchema
6150
+ }),
6151
+ defineMcpTool({
6152
+ name: "ctm_aerodrome_fetch_stock_lp_yields",
6153
+ actionId: "aerodrome.fetch-stock-lp-yields",
6154
+ protocolId: "aerodrome",
6155
+ chainCategory: "evm",
6156
+ description: "Coinbase B20 stock LP yields only (AAPLc/USDC, \u2026). Separate from main-pair fetch_lp_yields. Trading stocks is not this list.",
6157
+ prerequisites: ["chainId 8453"],
6158
+ followUp: ["ctm_aerodrome_quote_add_liquidity"],
6159
+ handler: { importPath: "protocols/evm/aerodrome", exportName: "aerodromeFetchStockLpYieldsSummary" },
6160
+ inputZod: mcpAerodromeFetchStockLpYieldsInputSchema,
6161
+ outputZod: mcpAerodromeFetchStockLpYieldsOutputSchema
6162
+ }),
5533
6163
  defineMcpTool({
5534
6164
  name: "ctm_aerodrome_fetch_positions",
5535
6165
  actionId: "aerodrome.fetch-positions",
@@ -5751,7 +6381,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
5751
6381
  actionId: "gmx.fetch-market-prices",
5752
6382
  protocolId: "gmx",
5753
6383
  chainCategory: "evm",
5754
- description: "Latest GMX index mark and collateral USD prices for a perp market. Read-only via GMX HTTP API.",
6384
+ description: "Latest GMX index mark, collateral USD, and official funding (fundingFactorPerSecond, longsPayShorts, hourly/APR labels). Borrow-per-second is a cost caveat, not a second yield. Read-only via GMX HTTP API + MarketInfo.",
5755
6385
  prerequisites: ["chainId", "symbol from ctm_gmx_fetch_markets", "collateralSymbol e.g. USDC"],
5756
6386
  followUp: ["ctm_gmx_fetch_ohlcv", "ctm_gmx_build_increase_multisign"],
5757
6387
  handler: { importPath: "protocols/evm/gmx", exportName: "gmxFetchMarketPrices" },
@@ -5811,13 +6441,25 @@ var CORE_MCP_TOOL_DEFINITIONS = [
5811
6441
  actionId: "hyperliquid.fetch-markets",
5812
6442
  protocolId: "hyperliquid",
5813
6443
  chainCategory: "evm",
5814
- description: "List Hyperliquid perp markets (native + all HIP-3 dexes when dex omitted). Each market has coin name, maxLeverage, szDecimals, and optional dex (e.g. xyz for xyz:AAPL). chainId 999 mainnet or 998 testnet.",
6444
+ description: "List native Hyperliquid crypto perp markets. HIP-3 stocks (xyz:AAPL) are ctm_hyperliquid_fetch_stock_markets. Pass dex to list one builder. chainId 999 mainnet or 998 testnet.",
5815
6445
  prerequisites: ["chainId 999 or 998"],
5816
6446
  followUp: ["ctm_hyperliquid_fetch_open_context", "ctm_hyperliquid_build_limit_order_multisign", "ctm_hyperliquid_build_update_leverage_multisign"],
5817
6447
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchMarketsSummary" },
5818
6448
  inputZod: mcpHyperliquidFetchMarketsInputSchema,
5819
6449
  outputZod: mcpHyperliquidFetchMarketsOutputSchema
5820
6450
  }),
6451
+ defineMcpTool({
6452
+ name: "ctm_hyperliquid_fetch_stock_markets",
6453
+ actionId: "hyperliquid.fetch-stock-markets",
6454
+ protocolId: "hyperliquid",
6455
+ chainCategory: "evm",
6456
+ description: "HIP-3 / equity stock perps (xyz:AAPL, TSLA, \u2026) with dex, displayName, and category. Trading only \u2014 not a savings APR. Native crypto: ctm_hyperliquid_fetch_markets.",
6457
+ prerequisites: ["chainId 999 or 998"],
6458
+ followUp: ["ctm_hyperliquid_search_markets", "ctm_hyperliquid_build_limit_order_multisign"],
6459
+ handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchStockMarketsSummary" },
6460
+ inputZod: mcpHyperliquidFetchStockMarketsInputSchema,
6461
+ outputZod: mcpHyperliquidFetchStockMarketsOutputSchema
6462
+ }),
5821
6463
  defineMcpTool({
5822
6464
  name: "ctm_hyperliquid_search_markets",
5823
6465
  actionId: "hyperliquid.search-markets",
@@ -5871,7 +6513,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
5871
6513
  actionId: "hyperliquid.fetch-market-snapshot",
5872
6514
  protocolId: "hyperliquid",
5873
6515
  chainCategory: "evm",
5874
- description: "Live mark/mid price plus recent OHLCV candles for a Hyperliquid perp. Uses metaAndAssetCtxs for live prices (not stale candle close). Default interval 15m, 48 bars. Throws if live price unavailable.",
6516
+ description: "Live mark/mid price, official hourly funding, plus recent OHLCV candles for a Hyperliquid perp. Uses metaAndAssetCtxs for live prices and funding (not stale candle close). Default interval 15m, 48 bars. Throws if live price unavailable.",
5875
6517
  prerequisites: ["chainId", "coin"],
5876
6518
  followUp: ["ctm_hyperliquid_fetch_open_context", "ctm_hyperliquid_build_limit_order_multisign", "ctm_hyperliquid_build_update_leverage_multisign"],
5877
6519
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchMarketSnapshotSummary" },
@@ -5914,6 +6556,18 @@ var CORE_MCP_TOOL_DEFINITIONS = [
5914
6556
  inputZod: mcpHyperliquidFetchVaultsInputSchema,
5915
6557
  outputZod: mcpHyperliquidFetchVaultsOutputSchema
5916
6558
  }),
6559
+ defineMcpTool({
6560
+ name: "ctm_hyperliquid_fetch_vault_apys",
6561
+ actionId: "hyperliquid.fetch-vault-apys",
6562
+ protocolId: "hyperliquid",
6563
+ chainCategory: "evm",
6564
+ description: "Hyperliquid vault APRs sorted descending (HLP first). Use this for idle USDC yield compare \u2014 not HIP-3 stocks. Same catalog cap as fetch_vaults.",
6565
+ prerequisites: ["chainId 999 for catalog"],
6566
+ followUp: ["ctm_hyperliquid_build_vault_deposit_multisign"],
6567
+ handler: { importPath: "protocols/evm/hyperliquid", exportName: "hyperliquidFetchVaultApysSummary" },
6568
+ inputZod: mcpHyperliquidFetchVaultApysInputSchema,
6569
+ outputZod: mcpHyperliquidFetchVaultApysOutputSchema
6570
+ }),
5917
6571
  defineMcpTool({
5918
6572
  name: "ctm_hyperliquid_fetch_user_vault_equities",
5919
6573
  actionId: "hyperliquid.fetch-user-vault-equities",
@@ -6187,6 +6841,18 @@ var CORE_MCP_TOOL_DEFINITIONS = [
6187
6841
  inputZod: mcpEulerV2FetchLendVaultsInputSchema,
6188
6842
  outputZod: mcpEulerV2FetchLendVaultsOutputSchema
6189
6843
  }),
6844
+ defineMcpTool({
6845
+ name: "ctm_euler_v2_fetch_earn_vaults",
6846
+ actionId: "euler-v2.fetch-earn-vaults",
6847
+ protocolId: "euler-v2",
6848
+ chainCategory: "evm",
6849
+ description: "Euler Earn vaults (curated, not isolated lend) for an underlying with live supply APY. Use this (not web search) for Euler earn rates. Copy evaultAddress for deposit.",
6850
+ prerequisites: ["chainId", "underlyingAddress from get_defi_protocol_supported_tokens"],
6851
+ followUp: ["ctm_euler_v2_build_isolated_lend_multisign"],
6852
+ handler: { importPath: "protocols/evm/euler-v2", exportName: "eulerV2FetchEarnVaultsSummary" },
6853
+ inputZod: mcpEulerV2FetchEarnVaultsInputSchema,
6854
+ outputZod: mcpEulerV2FetchEarnVaultsOutputSchema
6855
+ }),
6190
6856
  defineMcpTool({
6191
6857
  name: "ctm_cctp_fetch_supported_routes",
6192
6858
  actionId: "circle-cctp.fetch-routes",
@@ -6638,6 +7304,103 @@ var CORE_MCP_TOOL_DEFINITIONS = [
6638
7304
  inputZod: mcpContinuumDaoForumSectionsInputSchema,
6639
7305
  outputZod: mcpContinuumDaoForumSectionsOutputSchema
6640
7306
  }),
7307
+ defineMcpTool({
7308
+ name: "ctm_maple_fetch_markets",
7309
+ actionId: "maple-syrup.fetch-markets",
7310
+ protocolId: "maple-syrup",
7311
+ chainCategory: "evm",
7312
+ description: "List Maple Syrup pools on a chain with live weekly/monthly APY and TVL. Use this (not web search) for Maple lending rates. Copy pool + syrupRouter + asset for build_deposit_multisign / build_request_redeem_multisign. Optional underlying filter.",
7313
+ prerequisites: ["chainId", "get_defi_protocol_supported_chains"],
7314
+ followUp: [
7315
+ "ctm_maple_fetch_market",
7316
+ "ctm_maple_build_deposit_multisign",
7317
+ "ctm_maple_build_request_redeem_multisign"
7318
+ ],
7319
+ handler: { importPath: "protocols/evm/maple", exportName: "mapleSyrupFetchMarketsSummary" },
7320
+ inputZod: mcpMapleFetchMarketsInputSchema,
7321
+ outputZod: mcpMapleFetchMarketsOutputSchema
7322
+ }),
7323
+ defineMcpTool({
7324
+ name: "ctm_maple_fetch_market",
7325
+ actionId: "maple-syrup.fetch-market",
7326
+ protocolId: "maple-syrup",
7327
+ chainCategory: "evm",
7328
+ description: "One Maple Syrup pool (by pool address or underlying) with weekly/monthly APY and TVL. Copy pool + syrupRouter + asset for deposit/redeem. Do not web-search Maple rates.",
7329
+ prerequisites: ["chainId", "pool or underlying from ctm_maple_fetch_markets"],
7330
+ followUp: ["ctm_maple_build_deposit_multisign", "ctm_maple_build_request_redeem_multisign"],
7331
+ handler: { importPath: "protocols/evm/maple", exportName: "mapleSyrupFetchMarketSummary" },
7332
+ inputZod: mcpMapleFetchMarketInputSchema,
7333
+ outputZod: mcpMapleFetchMarketOutputSchema
7334
+ }),
7335
+ defineMcpTool({
7336
+ name: "ctm_aave_v4_fetch_markets",
7337
+ actionId: "aave-v4.fetch-markets",
7338
+ protocolId: "aave-v4",
7339
+ chainCategory: "evm",
7340
+ description: "List Aave v4 hub reserves on a chain with live supply/borrow APY, liquidity, and collateral factor. Use this (not web search) to compare lending rates or pick an underlying + marketId for build_*_multisign. Optional marketId (main/core/bluechip) or underlying filter.",
7341
+ prerequisites: ["chainId", "get_defi_protocol_supported_chains"],
7342
+ followUp: [
7343
+ "ctm_aave_v4_fetch_market",
7344
+ "ctm_aave_v4_build_deposit_multisign",
7345
+ "ctm_aave_v4_build_borrow_multisign"
7346
+ ],
7347
+ handler: { importPath: "protocols/evm/aave-v4", exportName: "aaveV4FetchMarketsSummary" },
7348
+ inputZod: mcpAaveV4FetchMarketsInputSchema,
7349
+ outputZod: mcpAaveV4FetchMarketsOutputSchema
7350
+ }),
7351
+ defineMcpTool({
7352
+ name: "ctm_aave_v4_fetch_market",
7353
+ actionId: "aave-v4.fetch-market",
7354
+ protocolId: "aave-v4",
7355
+ chainCategory: "evm",
7356
+ description: "One Aave v4 reserve (or the same underlying across hubs) with supply/borrow APY and liquidity. Copy underlying + marketId for deposit/borrow/repay. Do not web-search Aave rates.",
7357
+ prerequisites: ["chainId", "underlying from ctm_aave_v4_fetch_markets or get_defi_protocol_supported_tokens"],
7358
+ followUp: [
7359
+ "ctm_aave_v4_build_deposit_multisign",
7360
+ "ctm_aave_v4_build_withdraw_multisign",
7361
+ "ctm_aave_v4_build_borrow_multisign",
7362
+ "ctm_aave_v4_build_repay_multisign"
7363
+ ],
7364
+ handler: { importPath: "protocols/evm/aave-v4", exportName: "aaveV4FetchMarketSummary" },
7365
+ inputZod: mcpAaveV4FetchMarketInputSchema,
7366
+ outputZod: mcpAaveV4FetchMarketOutputSchema
7367
+ }),
7368
+ defineMcpTool({
7369
+ name: "ctm_lido_fetch_steth_apr",
7370
+ actionId: "lido.fetch-steth-apr",
7371
+ protocolId: "lido",
7372
+ chainCategory: "evm",
7373
+ description: "Recent stETH staking APR from the official Lido API. Use this (not web search) when comparing ETH staking vs lending. Ethereum mainnet.",
7374
+ prerequisites: ["load_defi_protocol lido"],
7375
+ followUp: ["ctm_lido_build_submit_multisign"],
7376
+ handler: { importPath: "protocols/evm/lido", exportName: "lidoFetchStethAprSummary" },
7377
+ inputZod: mcpLidoFetchStethAprInputSchema,
7378
+ outputZod: mcpLidoFetchStethAprOutputSchema
7379
+ }),
7380
+ defineMcpTool({
7381
+ name: "ctm_sky_fetch_susds_rate",
7382
+ actionId: "sky.fetch-susds-rate",
7383
+ protocolId: "sky",
7384
+ chainCategory: "evm",
7385
+ description: "Sky Savings Rate (sUSDS APY) from on-chain ssr(). Use this (not web search) for USDS savings. Ethereum mainnet. rpcUrl is injected.",
7386
+ prerequisites: ["chainId 1", "get_chain_registry rpcGateway"],
7387
+ followUp: ["ctm_sky_build_susds_deposit_multisign"],
7388
+ handler: { importPath: "protocols/evm/sky", exportName: "skyFetchSusdsRateSummary" },
7389
+ inputZod: mcpSkyFetchSusdsRateInputSchema,
7390
+ outputZod: mcpSkyFetchSusdsRateOutputSchema
7391
+ }),
7392
+ defineMcpTool({
7393
+ name: "ctm_ethena_fetch_susde_apy",
7394
+ actionId: "ethena.fetch-susde-apy",
7395
+ protocolId: "ethena",
7396
+ chainCategory: "evm",
7397
+ description: "sUSDe staking APY plus USDe-per-share from the vault. Use this (not web search) for USDe yield. Ethereum mainnet. rpcUrl is injected.",
7398
+ prerequisites: ["chainId 1", "get_chain_registry rpcGateway"],
7399
+ followUp: ["ctm_ethena_build_stake_multisign"],
7400
+ handler: { importPath: "protocols/evm/ethena", exportName: "ethenaFetchSusdeApySummary" },
7401
+ inputZod: mcpEthenaFetchSusdeApyInputSchema,
7402
+ outputZod: mcpEthenaFetchSusdeApyOutputSchema
7403
+ }),
6641
7404
  defineMcpTool({
6642
7405
  name: "ctm_compound_v3_fetch_markets",
6643
7406
  actionId: "compound-v3.fetch-markets",
@@ -6678,6 +7441,238 @@ var CORE_MCP_TOOL_DEFINITIONS = [
6678
7441
  handler: { importPath: "protocols/evm/compound-v3", exportName: "compoundV3FetchAccountSummary" },
6679
7442
  inputZod: mcpCompoundV3FetchAccountInputSchema,
6680
7443
  outputZod: mcpCompoundV3FetchAccountOutputSchema
7444
+ }),
7445
+ defineMcpTool({
7446
+ name: "ctm_pendle_fetch_markets",
7447
+ actionId: "pendle.fetch-markets",
7448
+ protocolId: "pendle",
7449
+ chainCategory: "evm",
7450
+ description: "Pendle V2: live (unexpired) markets on chainId, scanned from Core, TVL-ranked, hard cap 100. Matured YT markets are omitted. Includes points[] campaigns. Use ctm_pendle_search_assets for long-tail or a specific expired market (PT redeem / remove LP). Never Convert. load_defi_protocol pendle activates this pack.",
7451
+ prerequisites: ["chainId in get_chain_registry \u2229 Pendle GET /v1/chains"],
7452
+ followUp: ["ctm_pendle_search_assets", "ctm_pendle_fetch_prices", "ctm_pendle_quote_swap"],
7453
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleFetchMarketsSummary" },
7454
+ inputZod: mcpPendleFetchMarketsInputSchema,
7455
+ outputZod: mcpPendleFetchMarketsOutputSchema
7456
+ }),
7457
+ defineMcpTool({
7458
+ name: "ctm_pendle_fetch_prices",
7459
+ actionId: "pendle.fetch-prices",
7460
+ protocolId: "pendle",
7461
+ chainCategory: "evm",
7462
+ description: "Pendle V2: USD prices for listed or searched asset ids (GET /v1/prices/assets). Do not use Convert as a ticker.",
7463
+ prerequisites: ["chainId", "ids from fetch_markets / search_assets (or omit to price the current live listing)"],
7464
+ followUp: ["ctm_pendle_quote_swap"],
7465
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleFetchPricesSummary" },
7466
+ inputZod: mcpPendleFetchPricesInputSchema,
7467
+ outputZod: mcpPendleFetchPricesOutputSchema
7468
+ }),
7469
+ defineMcpTool({
7470
+ name: "ctm_pendle_search_assets",
7471
+ actionId: "pendle.search-assets",
7472
+ protocolId: "pendle",
7473
+ chainCategory: "evm",
7474
+ description: "Pendle V2: search live markets by ticker, 0x, or chainId-0x. Prefers unexpired hits; returns a matured market only if nothing live matched or you looked up that address (PT redeem / remove LP). Returns expiry, APY, TVL, points.",
7475
+ prerequisites: ["chainId", "query (ticker, 0x, or chainId-0x)"],
7476
+ followUp: ["ctm_pendle_quote_swap", "ctm_pendle_quote_mint_py", "ctm_pendle_quote_add_liquidity"],
7477
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleSearchAssets" },
7478
+ inputZod: mcpPendleSearchAssetsInputSchema,
7479
+ outputZod: mcpPendleSearchAssetsOutputSchema
7480
+ }),
7481
+ defineMcpTool({
7482
+ name: "ctm_pendle_quote_swap",
7483
+ actionId: "pendle.quote-swap",
7484
+ protocolId: "pendle",
7485
+ chainCategory: "evm",
7486
+ description: "Pendle V2 Hosted SDK Convert quote: token \u2194 PT or YT (this is also how you trade points). Fresh calldata; do not cache as a price ticker.",
7487
+ prerequisites: ["ctm_pendle_fetch_markets or ctm_pendle_search_assets", "activate_tool_group pendle:swap"],
7488
+ followUp: ["ctm_pendle_build_swap_multisign"],
7489
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleQuoteSwap" },
7490
+ inputZod: mcpPendleQuoteSwapInputSchema,
7491
+ outputZod: mcpPendleQuoteOutputSchema
7492
+ }),
7493
+ defineMcpTool({
7494
+ name: "ctm_pendle_quote_mint_py",
7495
+ actionId: "pendle.quote-mint-py",
7496
+ protocolId: "pendle",
7497
+ chainCategory: "evm",
7498
+ description: "Pendle V2 Convert quote: mint PT+YT from an underlying or SY.",
7499
+ prerequisites: ["activate_tool_group pendle:mint"],
7500
+ followUp: ["ctm_pendle_build_mint_py_multisign"],
7501
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleQuoteMintPy" },
7502
+ inputZod: mcpPendleQuoteMintPyInputSchema,
7503
+ outputZod: mcpPendleQuoteOutputSchema
7504
+ }),
7505
+ defineMcpTool({
7506
+ name: "ctm_pendle_quote_redeem_py",
7507
+ actionId: "pendle.quote-redeem-py",
7508
+ protocolId: "pendle",
7509
+ chainCategory: "evm",
7510
+ description: "Pendle V2 Convert quote: redeem PT+YT to underlying or SY. After expiry, pass amountYtHuman 0 (PT only).",
7511
+ prerequisites: ["activate_tool_group pendle:mint"],
7512
+ followUp: ["ctm_pendle_build_redeem_py_multisign"],
7513
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleQuoteRedeemPy" },
7514
+ inputZod: mcpPendleQuoteRedeemPyInputSchema,
7515
+ outputZod: mcpPendleQuoteOutputSchema
7516
+ }),
7517
+ defineMcpTool({
7518
+ name: "ctm_pendle_quote_mint_sy",
7519
+ actionId: "pendle.quote-mint-sy",
7520
+ protocolId: "pendle",
7521
+ chainCategory: "evm",
7522
+ description: "Pendle V2 Convert quote: wrap underlying into SY.",
7523
+ prerequisites: ["activate_tool_group pendle:mint"],
7524
+ followUp: ["ctm_pendle_build_mint_sy_multisign"],
7525
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleQuoteMintSy" },
7526
+ inputZod: mcpPendleQuoteMintSyInputSchema,
7527
+ outputZod: mcpPendleQuoteOutputSchema
7528
+ }),
7529
+ defineMcpTool({
7530
+ name: "ctm_pendle_quote_redeem_sy",
7531
+ actionId: "pendle.quote-redeem-sy",
7532
+ protocolId: "pendle",
7533
+ chainCategory: "evm",
7534
+ description: "Pendle V2 Convert quote: unwrap SY to underlying.",
7535
+ prerequisites: ["activate_tool_group pendle:mint"],
7536
+ followUp: ["ctm_pendle_build_redeem_sy_multisign"],
7537
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleQuoteRedeemSy" },
7538
+ inputZod: mcpPendleQuoteRedeemSyInputSchema,
7539
+ outputZod: mcpPendleQuoteOutputSchema
7540
+ }),
7541
+ defineMcpTool({
7542
+ name: "ctm_pendle_quote_add_liquidity",
7543
+ actionId: "pendle.quote-add-liquidity",
7544
+ protocolId: "pendle",
7545
+ chainCategory: "evm",
7546
+ description: "Pendle V2 Convert quote: add LP. keepYt+yt = zero-price-impact (keep YT in the wallet instead of selling it into the AMM).",
7547
+ prerequisites: ["activate_tool_group pendle:lp"],
7548
+ followUp: ["ctm_pendle_build_add_liquidity_multisign"],
7549
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleQuoteAddLiquidity" },
7550
+ inputZod: mcpPendleQuoteAddLiquidityInputSchema,
7551
+ outputZod: mcpPendleQuoteOutputSchema
7552
+ }),
7553
+ defineMcpTool({
7554
+ name: "ctm_pendle_quote_remove_liquidity",
7555
+ actionId: "pendle.quote-remove-liquidity",
7556
+ protocolId: "pendle",
7557
+ chainCategory: "evm",
7558
+ description: "Pendle V2 Convert quote: remove LP to tokensOut (use underlying). After expiry still works. Copy market + lpAmountHuman from ctm_pendle_fetch_positions.",
7559
+ prerequisites: ["activate_tool_group pendle:lp", "market + lpAmountHuman from fetch_positions or the user"],
7560
+ followUp: ["ctm_pendle_build_remove_liquidity_multisign"],
7561
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleQuoteRemoveLiquidity" },
7562
+ inputZod: mcpPendleQuoteRemoveLiquidityInputSchema,
7563
+ outputZod: mcpPendleQuoteOutputSchema
7564
+ }),
7565
+ defineMcpTool({
7566
+ name: "ctm_pendle_fetch_positions",
7567
+ actionId: "pendle.fetch-positions",
7568
+ protocolId: "pendle",
7569
+ chainCategory: "evm",
7570
+ description: "Pendle V2: this wallet\u2019s LP holdings from official Core dashboard (including matured). Not the node token list. Use before remove LP. ~4 CU. Do not treat claimable amounts here as a live redeem quote.",
7571
+ prerequisites: ["activate_tool_group pendle:lp", "user address", "optional chainId"],
7572
+ followUp: ["ctm_pendle_quote_remove_liquidity"],
7573
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleFetchPositions" },
7574
+ inputZod: mcpPendleFetchPositionsInputSchema,
7575
+ outputZod: mcpPendleFetchPositionsOutputSchema
7576
+ }),
7577
+ defineMultisignSubmitMcpTool({
7578
+ name: "ctm_pendle_build_swap_multisign",
7579
+ actionId: "pendle.swap",
7580
+ protocolId: "pendle",
7581
+ chainCategory: "evm",
7582
+ description: "Pendle V2: approve Convert tx.to then swap token \u2194 PT/YT. 30-min multiSign expiry unless expiryDate is set. Fresh Convert at build time.",
7583
+ prerequisites: [
7584
+ "ctm_pendle_quote_swap",
7585
+ "get_multi_sign_gas_options + user confirms useCustomGas and 30-minute deadline",
7586
+ "keyGenId + chainId + purposeText + slippagePercent"
7587
+ ],
7588
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleSwapBatch" },
7589
+ inputZod: mcpPendleBuildSwapMultisignInputSchema
7590
+ }),
7591
+ defineMultisignSubmitMcpTool({
7592
+ name: "ctm_pendle_build_mint_py_multisign",
7593
+ actionId: "pendle.mint-py",
7594
+ protocolId: "pendle",
7595
+ chainCategory: "evm",
7596
+ description: "Pendle V2: mint PT+YT multiSign (approve + Convert). 30-min expiry default.",
7597
+ prerequisites: ["ctm_pendle_quote_mint_py", "keyGenId + purposeText + slippagePercent"],
7598
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleMintPyBatch" },
7599
+ inputZod: mcpPendleBuildMintPyMultisignInputSchema
7600
+ }),
7601
+ defineMultisignSubmitMcpTool({
7602
+ name: "ctm_pendle_build_redeem_py_multisign",
7603
+ actionId: "pendle.redeem-py",
7604
+ protocolId: "pendle",
7605
+ chainCategory: "evm",
7606
+ description: "Pendle V2: redeem PT+YT multiSign. After expiry, pass amountYtHuman 0 (PT only). 30-min expiry default.",
7607
+ prerequisites: ["ctm_pendle_quote_redeem_py", "keyGenId + purposeText + slippagePercent"],
7608
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleRedeemPyBatch" },
7609
+ inputZod: mcpPendleBuildRedeemPyMultisignInputSchema
7610
+ }),
7611
+ defineMultisignSubmitMcpTool({
7612
+ name: "ctm_pendle_build_mint_sy_multisign",
7613
+ actionId: "pendle.mint-sy",
7614
+ protocolId: "pendle",
7615
+ chainCategory: "evm",
7616
+ description: "Pendle V2: mint SY multiSign. 30-min expiry default.",
7617
+ prerequisites: ["ctm_pendle_quote_mint_sy", "keyGenId + purposeText + slippagePercent"],
7618
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleMintSyBatch" },
7619
+ inputZod: mcpPendleBuildMintSyMultisignInputSchema
7620
+ }),
7621
+ defineMultisignSubmitMcpTool({
7622
+ name: "ctm_pendle_build_redeem_sy_multisign",
7623
+ actionId: "pendle.redeem-sy",
7624
+ protocolId: "pendle",
7625
+ chainCategory: "evm",
7626
+ description: "Pendle V2: redeem SY multiSign. 30-min expiry default.",
7627
+ prerequisites: ["ctm_pendle_quote_redeem_sy", "keyGenId + purposeText + slippagePercent"],
7628
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleRedeemSyBatch" },
7629
+ inputZod: mcpPendleBuildRedeemSyMultisignInputSchema
7630
+ }),
7631
+ defineMultisignSubmitMcpTool({
7632
+ name: "ctm_pendle_build_add_liquidity_multisign",
7633
+ actionId: "pendle.add-liquidity",
7634
+ protocolId: "pendle",
7635
+ chainCategory: "evm",
7636
+ description: "Pendle V2: add LP multiSign. 30-min expiry default.",
7637
+ prerequisites: ["ctm_pendle_quote_add_liquidity", "keyGenId + purposeText + slippagePercent"],
7638
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleAddLiquidityBatch" },
7639
+ inputZod: mcpPendleBuildAddLiquidityMultisignInputSchema
7640
+ }),
7641
+ defineMultisignSubmitMcpTool({
7642
+ name: "ctm_pendle_build_remove_liquidity_multisign",
7643
+ actionId: "pendle.remove-liquidity",
7644
+ protocolId: "pendle",
7645
+ chainCategory: "evm",
7646
+ description: "Pendle V2: remove LP multiSign. 30-min expiry default.",
7647
+ prerequisites: ["ctm_pendle_quote_remove_liquidity", "keyGenId + purposeText + slippagePercent"],
7648
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleRemoveLiquidityBatch" },
7649
+ inputZod: mcpPendleBuildRemoveLiquidityMultisignInputSchema
7650
+ }),
7651
+ defineMcpTool({
7652
+ name: "ctm_pendle_fetch_merkle_rewards",
7653
+ actionId: "pendle.fetch-merkle-rewards",
7654
+ protocolId: "pendle",
7655
+ chainCategory: "evm",
7656
+ description: "Pendle V2: list off-chain airdrop rows for a wallet (token, amount). Informational only \u2014 Core has no claim proofs. Tell the user to claim airdrops on app.pendle.finance. Do not invent a claim tx. On-chain SY/YT/LP incentives use ctm_pendle_build_redeem_rewards_multisign.",
7657
+ prerequisites: ["activate_tool_group pendle:rewards", "user address"],
7658
+ followUp: [],
7659
+ handler: { importPath: "protocols/evm/pendle", exportName: "pendleFetchMerkleRewards" },
7660
+ inputZod: mcpPendleFetchMerkleRewardsInputSchema,
7661
+ outputZod: mcpPendleFetchMerkleRewardsOutputSchema
7662
+ }),
7663
+ defineMultisignSubmitMcpTool({
7664
+ name: "ctm_pendle_build_redeem_rewards_multisign",
7665
+ actionId: "pendle.redeem-rewards",
7666
+ protocolId: "pendle",
7667
+ chainCategory: "evm",
7668
+ description: "Pendle V2: redeem on-chain interest and incentives from SY, YT, and LP (usually PENDLE) via Hosted SDK. Not merkle airdrops. 30-min expiry default.",
7669
+ prerequisites: [
7670
+ "activate_tool_group pendle:rewards",
7671
+ "sys / yts / markets from fetch_markets or search",
7672
+ "keyGenId + purposeText"
7673
+ ],
7674
+ handler: { importPath: "protocols/evm/pendle", exportName: "buildEvmMultisignBodyPendleRedeemRewardsBatch" },
7675
+ inputZod: mcpPendleBuildRedeemRewardsMultisignInputSchema
6681
7676
  })
6682
7677
  ];
6683
7678
  var MCP_TOOL_DEFINITIONS = [
@@ -6928,6 +7923,17 @@ registerProtocolModule(ethenaProtocolModule);
6928
7923
  function isMapleSyrupSupportedChain(chainId) {
6929
7924
  return chainId === 1 || chainId === 11155111;
6930
7925
  }
7926
+ function matchesAssetFilter(opts) {
7927
+ const f = (opts.filter ?? "").trim();
7928
+ if (!f) return true;
7929
+ const addr = (opts.address ?? "").trim();
7930
+ if (viem.isAddress(f) && viem.isAddress(addr)) {
7931
+ return viem.getAddress(addr) === viem.getAddress(f);
7932
+ }
7933
+ const sym = (opts.symbol ?? "").trim();
7934
+ if (!sym) return false;
7935
+ return sym.toLowerCase() === f.toLowerCase();
7936
+ }
6931
7937
 
6932
7938
  // src/protocols/evm/maple/index.ts
6933
7939
  var MAPLE_PROTOCOL_ID = "maple-syrup";
@@ -8295,34 +9301,14 @@ var veniceProtocolModule = {
8295
9301
  ]
8296
9302
  };
8297
9303
  registerProtocolModule(veniceProtocolModule);
8298
- var AERODROME_PROTOCOL_ID = "aerodrome";
8299
- var AERODROME_CHAIN_ID = 8453;
8300
- var AERODROME_WETH_BASE = "0x4200000000000000000000000000000000000006";
8301
- var AERODROME_USDC_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
8302
- function isAerodromeChainSupported(chainId) {
8303
- const n = typeof chainId === "number" ? chainId : Number.parseInt(String(chainId), 10);
8304
- return n === AERODROME_CHAIN_ID;
8305
- }
8306
- var AERODROME_BASE_ADDRESSES_FALLBACK = {
8307
- aero: "0x940181a94A35A4569E4529A3CDfB74e38FD98631"};
8308
- var AERODROME_COINBASE_STOCK_TOKENS = [
8309
- { symbol: "AAPLc", name: "Apple Inc.", address: "0xb200000000000000000000C2e324d24d7eEcd1fb" },
8310
- { symbol: "NVDAc", name: "NVIDIA Corporation", address: "0xb20000000000000000000078ee7ce2fE4908108C" },
8311
- { symbol: "METAc", name: "Meta Platforms Inc.", address: "0xb2000000000000000000008bC8786B856E61707C" },
8312
- { symbol: "GOOGLc", name: "Alphabet Inc.", address: "0xb2000000000000000000002D0BA3164cc74f58B7" },
8313
- { symbol: "AMZNc", name: "Amazon.com Inc.", address: "0xb200000000000000000000d9192b6B456483C2E8" },
8314
- { symbol: "TSLAc", name: "Tesla Inc.", address: "0xb2000000000000000000001e800a7f5189430cD0" },
8315
- { symbol: "MSFTc", name: "Microsoft Corporation", address: "0xB200000000000000000000Ab99cFa739E253872B" },
8316
- { symbol: "COINc", name: "Coinbase Global Inc.", address: "0xb200000000000000000000c85a31389D71F3ecfb" },
8317
- { symbol: "MSTRc", name: "Strategy Inc.", address: "0xb2000000000000000000004884b426556b92883d" },
8318
- { symbol: "CRCLc", name: "Circle Internet Group Inc.", address: "0xB20000000000000000000019f6E7C675b73C2e4D" },
8319
- { symbol: "INTCc", name: "Intel Corporation", address: "0xB2000000000000000000004AFF16039bA04bdFBc" },
8320
- { symbol: "SNDKc", name: "Sandisk Corporation", address: "0xb200000000000000000000397293Cb8cda9a10c5" },
8321
- { symbol: "SPCXc", name: "Space Exploration Technologies Corp.", address: "0xb2000000000000000000007b9fcbd005511aCBd5" }
8322
- ];
8323
- var AERODROME_COINBASE_STOCK_DECIMALS = 8;
8324
9304
 
8325
9305
  // src/protocols/evm/aerodrome/index.ts
9306
+ init_support2();
9307
+ init_support2();
9308
+ init_addresses();
9309
+ init_stockTokens();
9310
+ init_discover();
9311
+ init_yields();
8326
9312
  var aerodromeProtocolModule = {
8327
9313
  id: AERODROME_PROTOCOL_ID,
8328
9314
  chainCategory: "evm",
@@ -8867,11 +9853,18 @@ var cometInterfaceAbi = viem.parseAbi([
8867
9853
  "function isBorrowCollateralized(address account) view returns (bool)",
8868
9854
  "function isLiquidatable(address account) view returns (bool)",
8869
9855
  "function getAssetInfo(uint8 i) view returns ((uint8 offset, address asset, address priceFeed, uint64 scale, uint64 borrowCollateralFactor, uint64 liquidateCollateralFactor, uint64 liquidationFactor, uint128 supplyCap))",
8870
- "function getAssetInfoByAddress(address asset) view returns ((uint8 offset, address asset, address priceFeed, uint64 scale, uint64 borrowCollateralFactor, uint64 liquidateCollateralFactor, uint64 liquidationFactor, uint128 supplyCap))"
9856
+ "function getAssetInfoByAddress(address asset) view returns ((uint8 offset, address asset, address priceFeed, uint64 scale, uint64 borrowCollateralFactor, uint64 liquidateCollateralFactor, uint64 liquidationFactor, uint128 supplyCap))",
9857
+ "function baseTrackingSupplySpeed() view returns (uint256)",
9858
+ "function baseTrackingBorrowSpeed() view returns (uint256)",
9859
+ "function baseIndexScale() view returns (uint64)",
9860
+ "function trackingIndexScale() view returns (uint256)",
9861
+ "function totalSupply() view returns (uint256)",
9862
+ "function totalBorrow() view returns (uint256)"
8871
9863
  ]);
8872
- viem.parseAbi([
9864
+ var cometRewardsAbi = viem.parseAbi([
8873
9865
  "function getRewardOwed(address comet, address account) view returns ((address token, uint256 owed))",
8874
- "function claim(address comet, address src, bool shouldAccrue)"
9866
+ "function claim(address comet, address src, bool shouldAccrue)",
9867
+ "function rewardConfig(address comet) view returns ((address token, uint64 rescaleFactor, bool shouldUpscale))"
8875
9868
  ]);
8876
9869
  viem.parseAbi([
8877
9870
  "function invoke(bytes32[] actions, bytes[] data) payable"
@@ -8913,6 +9906,22 @@ function compoundV3UtilizationToDecimal(utilization) {
8913
9906
  function compoundV3FactorToPercent(factor) {
8914
9907
  return Number(factor) / 1e16;
8915
9908
  }
9909
+ var COMPOUND_V3_PRICE_SCALE = 1e8;
9910
+ var COMPOUND_V3_TRACKING_INDEX_SCALE = 1e15;
9911
+ function compoundV3TrackingSpeedToRewardAprPercent(args) {
9912
+ if (args.trackingSpeed <= 0n || args.totalBase <= 0n || args.basePrice <= 0n || args.rewardPrice <= 0n) {
9913
+ return null;
9914
+ }
9915
+ const scale = Number(args.trackingIndexScale > 0n ? args.trackingIndexScale : BigInt(COMPOUND_V3_TRACKING_INDEX_SCALE));
9916
+ if (!Number.isFinite(scale) || scale <= 0) return null;
9917
+ const tokensPerYear = Number(args.trackingSpeed) / scale * COMPOUND_V3_SECONDS_PER_YEAR;
9918
+ const rewardUsdPerYear = tokensPerYear * (Number(args.rewardPrice) / COMPOUND_V3_PRICE_SCALE);
9919
+ const totalUsd = Number(args.totalBase) / 10 ** args.baseDecimals * (Number(args.basePrice) / COMPOUND_V3_PRICE_SCALE);
9920
+ if (!Number.isFinite(rewardUsdPerYear) || !Number.isFinite(totalUsd) || totalUsd <= 0) return null;
9921
+ const pct = rewardUsdPerYear / totalUsd * 100;
9922
+ if (!Number.isFinite(pct) || pct < 0) return null;
9923
+ return pct;
9924
+ }
8916
9925
 
8917
9926
  // src/protocols/evm/compound-v3/subgraph.ts
8918
9927
  var COMPOUND_V3_SUBGRAPH_BY_CHAIN = {
@@ -8971,7 +9980,7 @@ async function enrichMarketOnChain(client, market) {
8971
9980
  client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "numAssets" }),
8972
9981
  client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "decimals" })
8973
9982
  ]);
8974
- const [supplyRate, borrowRate, baseMeta, baseFeed] = await Promise.all([
9983
+ const [supplyRate, borrowRate, baseMeta, baseFeed, supplySpeed, borrowSpeed, totalSupply, totalBorrow, trackingScale] = await Promise.all([
8975
9984
  client.readContract({
8976
9985
  address: comet,
8977
9986
  abi: cometInterfaceAbi,
@@ -8985,7 +9994,12 @@ async function enrichMarketOnChain(client, market) {
8985
9994
  args: [utilization]
8986
9995
  }),
8987
9996
  readTokenMeta(client, viem.getAddress(baseToken)),
8988
- client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "baseTokenPriceFeed" })
9997
+ client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "baseTokenPriceFeed" }),
9998
+ client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "baseTrackingSupplySpeed" }).catch(() => 0n),
9999
+ client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "baseTrackingBorrowSpeed" }).catch(() => 0n),
10000
+ client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "totalSupply" }).catch(() => 0n),
10001
+ client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "totalBorrow" }).catch(() => 0n),
10002
+ client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "trackingIndexScale" }).catch(() => BigInt(COMPOUND_V3_TRACKING_INDEX_SCALE))
8989
10003
  ]);
8990
10004
  const basePrice = await client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "getPrice", args: [baseFeed] }).catch(() => 0n);
8991
10005
  const assets = [
@@ -9020,6 +10034,47 @@ async function enrichMarketOnChain(client, market) {
9020
10034
  role: "collateral"
9021
10035
  });
9022
10036
  }
10037
+ let rewardPrice = 0n;
10038
+ try {
10039
+ const cfg = await client.readContract({
10040
+ address: viem.getAddress(market.rewards),
10041
+ abi: cometRewardsAbi,
10042
+ functionName: "rewardConfig",
10043
+ args: [comet]
10044
+ });
10045
+ const rewardToken = viem.getAddress(cfg.token);
10046
+ const listed = assets.find((a) => a.asset.toLowerCase() === rewardToken.toLowerCase());
10047
+ if (listed && listed.priceRaw !== "0") {
10048
+ rewardPrice = BigInt(listed.priceRaw);
10049
+ } else {
10050
+ const info = await client.readContract({
10051
+ address: comet,
10052
+ abi: cometInterfaceAbi,
10053
+ functionName: "getAssetInfoByAddress",
10054
+ args: [rewardToken]
10055
+ });
10056
+ rewardPrice = await client.readContract({ address: comet, abi: cometInterfaceAbi, functionName: "getPrice", args: [info.priceFeed] }).catch(() => 0n);
10057
+ }
10058
+ } catch {
10059
+ rewardPrice = 0n;
10060
+ }
10061
+ const baseDecimals = Number(decimals) || baseMeta.decimals;
10062
+ const supplyRewardApr = compoundV3TrackingSpeedToRewardAprPercent({
10063
+ trackingSpeed: supplySpeed,
10064
+ trackingIndexScale: trackingScale,
10065
+ totalBase: totalSupply,
10066
+ baseDecimals,
10067
+ basePrice,
10068
+ rewardPrice
10069
+ });
10070
+ const borrowRewardApr = compoundV3TrackingSpeedToRewardAprPercent({
10071
+ trackingSpeed: borrowSpeed,
10072
+ trackingIndexScale: trackingScale,
10073
+ totalBase: totalBorrow,
10074
+ baseDecimals,
10075
+ basePrice,
10076
+ rewardPrice
10077
+ });
9023
10078
  return {
9024
10079
  chainId: market.chainId,
9025
10080
  slug: market.slug,
@@ -9031,6 +10086,8 @@ async function enrichMarketOnChain(client, market) {
9031
10086
  utilization: compoundV3UtilizationToDecimal(utilization),
9032
10087
  supplyAprPercent: compoundV3AprToPercentLabel(compoundV3RatePerSecondToAprDecimal(supplyRate)),
9033
10088
  borrowAprPercent: compoundV3AprToPercentLabel(compoundV3RatePerSecondToAprDecimal(borrowRate)),
10089
+ supplyRewardAprPercent: supplyRewardApr == null ? null : compoundV3AprToPercentLabel(supplyRewardApr / 100),
10090
+ borrowRewardAprPercent: borrowRewardApr == null ? null : compoundV3AprToPercentLabel(borrowRewardApr / 100),
9034
10091
  assets
9035
10092
  };
9036
10093
  }
@@ -9046,6 +10103,8 @@ function registryMarketRow(market) {
9046
10103
  utilization: null,
9047
10104
  supplyAprPercent: null,
9048
10105
  borrowAprPercent: null,
10106
+ supplyRewardAprPercent: null,
10107
+ borrowRewardAprPercent: null,
9049
10108
  assets: market.baseToken ? [
9050
10109
  {
9051
10110
  asset: market.baseToken,
@@ -9072,7 +10131,7 @@ async function compoundV3FetchMarketsSummary(args) {
9072
10131
  if (!args.rpcUrl?.trim()) {
9073
10132
  return {
9074
10133
  markets: registry.map(registryMarketRow),
9075
- notes: "Registry from official comet deployments. Pass rpcUrl (MCP server injects it) to enrich APRs and collaterals." + subgraphNote
10134
+ notes: "Registry from official comet deployments. Pass rpcUrl (MCP server injects it) to enrich APRs, reward APRs, and collaterals." + subgraphNote
9076
10135
  };
9077
10136
  }
9078
10137
  const client = publicClient(args.rpcUrl, args.chainId);
@@ -9086,7 +10145,7 @@ async function compoundV3FetchMarketsSummary(args) {
9086
10145
  }
9087
10146
  return {
9088
10147
  markets,
9089
- notes: "Comet proxy addresses from official deployments; rates and collaterals from on-chain CometInterface." + subgraphNote
10148
+ notes: "Comet proxy addresses from official deployments; base supply/borrow APR and COMP incentive APR from on-chain CometInterface. Incentive APR is extra and variable; null when the reward token has no on-chain price feed." + subgraphNote
9090
10149
  };
9091
10150
  }
9092
10151
  var chainAssetCache2 = /* @__PURE__ */ new Map();
@@ -9173,6 +10232,347 @@ var compoundV3ProtocolModule = {
9173
10232
  ]
9174
10233
  };
9175
10234
  registerProtocolModule(compoundV3ProtocolModule);
10235
+
10236
+ // src/protocols/evm/pendle/support.ts
10237
+ var PENDLE_PROTOCOL_ID = "pendle";
10238
+ var PENDLE_CORE_API_BASE = "https://api-v2.pendle.finance/core";
10239
+ var PENDLE_LISTING_CAP = 100;
10240
+ var PENDLE_LISTING_MAX_PAGES = 8;
10241
+ var PENDLE_ICON_CACHE_MS = 12 * 60 * 1e3;
10242
+ var PENDLE_CHAIN_CACHE_MS = 30 * 60 * 1e3;
10243
+ function parsePendleAssetId(id) {
10244
+ const raw = (id ?? "").trim();
10245
+ const dash = raw.indexOf("-");
10246
+ if (dash <= 0) return null;
10247
+ const chainId = Number.parseInt(raw.slice(0, dash), 10);
10248
+ const address = raw.slice(dash + 1).trim();
10249
+ if (!Number.isFinite(chainId) || chainId <= 0 || !address) return null;
10250
+ return { chainId, address };
10251
+ }
10252
+
10253
+ // src/protocols/evm/pendle/api.ts
10254
+ var FETCH_TIMEOUT_MS = 12e4;
10255
+ var PendleApiError = class extends Error {
10256
+ status;
10257
+ path;
10258
+ constructor(message, status, path) {
10259
+ super(message);
10260
+ this.name = "PendleApiError";
10261
+ this.status = status;
10262
+ this.path = path;
10263
+ }
10264
+ };
10265
+ function sleep(ms) {
10266
+ return new Promise((resolve) => setTimeout(resolve, ms));
10267
+ }
10268
+ function queryString(params) {
10269
+ const q = new URLSearchParams();
10270
+ for (const [k, v] of Object.entries(params)) {
10271
+ if (v === void 0 || v === "") continue;
10272
+ q.set(k, String(v));
10273
+ }
10274
+ const s = q.toString();
10275
+ return s ? `?${s}` : "";
10276
+ }
10277
+ async function pendleCoreFetch(args) {
10278
+ const path = args.path.startsWith("/") ? args.path : `/${args.path}`;
10279
+ const url = `${PENDLE_CORE_API_BASE}${path}${queryString(args.query ?? {})}`;
10280
+ const headers = { Accept: "application/json" };
10281
+ if (args.apiKey?.trim()) headers.Authorization = `Bearer ${args.apiKey.trim()}`;
10282
+ if (args.body !== void 0) headers["Content-Type"] = "application/json";
10283
+ let lastError;
10284
+ for (let attempt = 0; attempt < 4; attempt++) {
10285
+ const ac = new AbortController();
10286
+ const timer = setTimeout(() => ac.abort(), FETCH_TIMEOUT_MS);
10287
+ try {
10288
+ const res = await fetch(url, {
10289
+ method: args.method ?? "GET",
10290
+ headers,
10291
+ body: args.body === void 0 ? void 0 : JSON.stringify(args.body),
10292
+ signal: ac.signal
10293
+ });
10294
+ if (res.status === 429) {
10295
+ const wait = Math.min(8e3, 500 * 2 ** attempt);
10296
+ await sleep(wait);
10297
+ lastError = new PendleApiError(`Pendle API rate limited (429) on ${path}`, 429, path);
10298
+ continue;
10299
+ }
10300
+ const text = await res.text();
10301
+ if (!res.ok) {
10302
+ throw new PendleApiError(
10303
+ `Pendle API ${res.status} ${path}: ${text.slice(0, 400)}`,
10304
+ res.status,
10305
+ path
10306
+ );
10307
+ }
10308
+ if (!text.trim()) return {};
10309
+ return JSON.parse(text);
10310
+ } catch (err) {
10311
+ lastError = err;
10312
+ if (err instanceof PendleApiError && err.status !== 429) throw err;
10313
+ if (attempt < 3 && (err instanceof PendleApiError || err?.name === "AbortError")) {
10314
+ await sleep(Math.min(8e3, 400 * 2 ** attempt));
10315
+ continue;
10316
+ }
10317
+ throw err;
10318
+ } finally {
10319
+ clearTimeout(timer);
10320
+ }
10321
+ }
10322
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
10323
+ }
10324
+
10325
+ // src/protocols/evm/pendle/discover.ts
10326
+ var marketsCacheByChain = /* @__PURE__ */ new Map();
10327
+ var chainIdsCache = null;
10328
+ function asRecord(v) {
10329
+ return v && typeof v === "object" && !Array.isArray(v) ? v : null;
10330
+ }
10331
+ function asNumber(v) {
10332
+ if (typeof v === "number" && Number.isFinite(v)) return v;
10333
+ if (typeof v === "string" && v.trim()) {
10334
+ const n = Number.parseFloat(v);
10335
+ return Number.isFinite(n) ? n : null;
10336
+ }
10337
+ return null;
10338
+ }
10339
+ function asString(v) {
10340
+ if (typeof v === "string" && v.trim()) return v.trim();
10341
+ return null;
10342
+ }
10343
+ function asExpiry(v) {
10344
+ const s = asString(v);
10345
+ if (s) return s;
10346
+ const n = asNumber(v);
10347
+ if (n == null) return null;
10348
+ const ms = n < 1e12 ? n * 1e3 : n;
10349
+ return new Date(ms).toISOString();
10350
+ }
10351
+ function pendleMarketExpiryMs(expiry) {
10352
+ const raw = (expiry ?? "").trim();
10353
+ if (!raw) return null;
10354
+ if (/^\d+$/.test(raw)) {
10355
+ const n = Number(raw);
10356
+ return n < 1e12 ? n * 1e3 : n;
10357
+ }
10358
+ const t = Date.parse(raw);
10359
+ return Number.isFinite(t) ? t : null;
10360
+ }
10361
+ function isPendleMarketExpired(row, nowMs = Date.now()) {
10362
+ const t = pendleMarketExpiryMs(row.expiry);
10363
+ if (t == null) return false;
10364
+ return t <= nowMs;
10365
+ }
10366
+ function marketMatchesPin(row, address) {
10367
+ const a = address.trim().toLowerCase();
10368
+ if (!a) return false;
10369
+ return [row.address, row.pt, row.yt, row.sy].some((x) => x.toLowerCase() === a);
10370
+ }
10371
+ function selectPendleListingMarkets(rows, args = {}) {
10372
+ const nowMs = args.nowMs ?? Date.now();
10373
+ const cap = args.cap ?? PENDLE_LISTING_CAP;
10374
+ const pins = (args.includeAddresses ?? []).map((a) => a.trim().toLowerCase()).filter(Boolean);
10375
+ const q = (args.query ?? "").trim();
10376
+ let out = rows.filter((r) => {
10377
+ const pinned = pins.some((p) => marketMatchesPin(r, p));
10378
+ if (!args.includeExpired && !pinned && isPendleMarketExpired(r, nowMs)) return false;
10379
+ if (args.pointsOnly && r.points.length === 0) return false;
10380
+ if (q && !marketMatchesQuery(r, q)) return false;
10381
+ return true;
10382
+ });
10383
+ out.sort(sortPendleMarketsByTvl);
10384
+ return out.slice(0, cap);
10385
+ }
10386
+ function addressFromAssetIdOrHex(raw, fallbackChainId) {
10387
+ if (typeof raw !== "string" || !raw.trim()) return null;
10388
+ const parsed = parsePendleAssetId(raw);
10389
+ if (parsed) {
10390
+ try {
10391
+ return viem.getAddress(parsed.address);
10392
+ } catch {
10393
+ return parsed.address.toLowerCase();
10394
+ }
10395
+ }
10396
+ if (viem.isAddress(raw)) return viem.getAddress(raw);
10397
+ if (raw.startsWith(`${fallbackChainId}-`)) {
10398
+ const rest = raw.slice(String(fallbackChainId).length + 1);
10399
+ if (viem.isAddress(rest)) return viem.getAddress(rest);
10400
+ }
10401
+ return null;
10402
+ }
10403
+ function parsePoints(raw) {
10404
+ if (!Array.isArray(raw)) return [];
10405
+ const out = [];
10406
+ for (const item of raw) {
10407
+ const o = asRecord(item);
10408
+ if (!o) continue;
10409
+ const name = asString(o.name) ?? asString(o.key) ?? asString(o.pointName);
10410
+ if (!name) continue;
10411
+ out.push({
10412
+ name,
10413
+ type: asString(o.type),
10414
+ pendleAsset: asString(o.pendleAsset),
10415
+ value: asNumber(o.value)
10416
+ });
10417
+ }
10418
+ return out;
10419
+ }
10420
+ function marketTvlUsd(row) {
10421
+ return row.tvlUsd ?? row.liquidityUsd ?? 0;
10422
+ }
10423
+ function sortPendleMarketsByTvl(a, b) {
10424
+ const d = marketTvlUsd(b) - marketTvlUsd(a);
10425
+ if (d !== 0) return d;
10426
+ return a.name.localeCompare(b.name, void 0, { sensitivity: "base" });
10427
+ }
10428
+ function parsePendleMarket(raw) {
10429
+ const o = asRecord(raw);
10430
+ if (!o) return null;
10431
+ const chainId = asNumber(o.chainId);
10432
+ const address = addressFromAssetIdOrHex(o.address, chainId ?? 0);
10433
+ if (chainId == null || !address) return null;
10434
+ const details = asRecord(o.details);
10435
+ const tvl = asNumber(o.tvl) ?? asNumber(details?.tvl) ?? asNumber(details?.totalTvl) ?? asNumber(asRecord(details?.liquidity)?.usd);
10436
+ const liquidity = asNumber(o.liquidity) ?? asNumber(details?.liquidity) ?? asNumber(asRecord(details?.liquidity)?.usd);
10437
+ const impliedApy = asNumber(o.impliedApy) ?? asNumber(details?.impliedApy) ?? asNumber(asRecord(o.pt)?.impliedApy);
10438
+ const pt = addressFromAssetIdOrHex(o.pt ?? asRecord(o.pt)?.address ?? asRecord(o.pt)?.id, chainId);
10439
+ const yt = addressFromAssetIdOrHex(o.yt ?? asRecord(o.yt)?.address ?? asRecord(o.yt)?.id, chainId);
10440
+ const sy = addressFromAssetIdOrHex(o.sy ?? asRecord(o.sy)?.address ?? asRecord(o.sy)?.id, chainId);
10441
+ const underlying = addressFromAssetIdOrHex(
10442
+ o.underlyingAsset ?? o.underlying ?? asRecord(o.underlyingAsset)?.address,
10443
+ chainId
10444
+ );
10445
+ if (!pt || !yt || !sy || !underlying) return null;
10446
+ const expired = asExpiry(o.expiry) ?? asExpiry(details?.expiry);
10447
+ return {
10448
+ chainId,
10449
+ name: asString(o.name) ?? asString(o.proSymbol) ?? `${address.slice(0, 8)}\u2026`,
10450
+ address,
10451
+ expiry: expired,
10452
+ pt,
10453
+ yt,
10454
+ sy,
10455
+ underlying,
10456
+ underlyingSymbol: asString(asRecord(o.underlyingAsset)?.symbol) ?? asString(o.underlyingSymbol),
10457
+ ptSymbol: asString(asRecord(o.pt)?.symbol) ?? asString(o.ptSymbol),
10458
+ ytSymbol: asString(asRecord(o.yt)?.symbol) ?? asString(o.ytSymbol),
10459
+ impliedApy,
10460
+ tvlUsd: tvl,
10461
+ liquidityUsd: liquidity,
10462
+ points: parsePoints(o.points ?? details?.points)
10463
+ };
10464
+ }
10465
+ async function pendleFetchSupportedChainIds() {
10466
+ const now = Date.now();
10467
+ if (chainIdsCache && now - chainIdsCache.at < PENDLE_CHAIN_CACHE_MS) return chainIdsCache.chainIds;
10468
+ const json = await pendleCoreFetch({ path: "/v1/chains" });
10469
+ const ids = Array.isArray(json.chainIds) ? json.chainIds.map((n) => Number(n)).filter((n) => Number.isFinite(n) && n > 0) : [];
10470
+ chainIdsCache = { at: now, chainIds: ids };
10471
+ return ids;
10472
+ }
10473
+ async function isPendleChainSupported(chainId) {
10474
+ try {
10475
+ const ids = await pendleFetchSupportedChainIds();
10476
+ if (ids.length === 0) return true;
10477
+ return ids.includes(chainId);
10478
+ } catch {
10479
+ return true;
10480
+ }
10481
+ }
10482
+ async function pendleFetchMarketsPage(args) {
10483
+ const limit = Math.min(PENDLE_LISTING_CAP, Math.max(1, args.limit));
10484
+ const json = await pendleCoreFetch({
10485
+ path: "/v2/markets/all",
10486
+ query: {
10487
+ skip: args.skip ?? 0,
10488
+ limit,
10489
+ ...args.chainId != null ? { chainId: args.chainId } : {}
10490
+ }
10491
+ });
10492
+ const raw = Array.isArray(json.markets) ? json.markets : Array.isArray(json.results) ? json.results : [];
10493
+ const rows = [];
10494
+ for (const item of raw) {
10495
+ const row = parsePendleMarket(item);
10496
+ if (row) rows.push(row);
10497
+ }
10498
+ return rows;
10499
+ }
10500
+ async function pendleFetchMarketsForChain(chainId) {
10501
+ const now = Date.now();
10502
+ const cached2 = marketsCacheByChain.get(chainId);
10503
+ if (cached2 && now - cached2.at < PENDLE_ICON_CACHE_MS) return cached2.rows;
10504
+ const rows = [];
10505
+ for (let page = 0; page < PENDLE_LISTING_MAX_PAGES; page++) {
10506
+ const batch = await pendleFetchMarketsPage({
10507
+ skip: page * PENDLE_LISTING_CAP,
10508
+ limit: PENDLE_LISTING_CAP,
10509
+ chainId
10510
+ });
10511
+ const onChain = batch.filter((r) => r.chainId === chainId);
10512
+ rows.push(...onChain);
10513
+ if (batch.length < PENDLE_LISTING_CAP || onChain.length === 0) break;
10514
+ }
10515
+ marketsCacheByChain.set(chainId, { at: now, rows });
10516
+ return rows;
10517
+ }
10518
+ function marketMatchesQuery(row, query) {
10519
+ const q = query.trim();
10520
+ if (!q) return true;
10521
+ if (matchesAssetFilter({ address: row.address, symbol: row.name, filter: q }) || matchesAssetFilter({ address: row.pt, symbol: row.ptSymbol ?? void 0, filter: q }) || matchesAssetFilter({ address: row.yt, symbol: row.ytSymbol ?? void 0, filter: q }) || matchesAssetFilter({ address: row.sy, filter: q }) || matchesAssetFilter({ address: row.underlying, symbol: row.underlyingSymbol ?? void 0, filter: q })) {
10522
+ return true;
10523
+ }
10524
+ const hay = `${row.name} ${row.ptSymbol ?? ""} ${row.ytSymbol ?? ""} ${row.underlyingSymbol ?? ""}`.toLowerCase();
10525
+ return hay.includes(q.toLowerCase());
10526
+ }
10527
+ async function pendleFetchMarketsSummary(args) {
10528
+ if (!await isPendleChainSupported(args.chainId)) {
10529
+ return {
10530
+ chainId: args.chainId,
10531
+ markets: [],
10532
+ notes: `Pendle Core API does not list chain ${args.chainId}.`
10533
+ };
10534
+ }
10535
+ const scanned = await pendleFetchMarketsForChain(args.chainId);
10536
+ const rows = selectPendleListingMarkets(scanned, {
10537
+ query: args.query,
10538
+ pointsOnly: args.pointsOnly,
10539
+ includeAddresses: args.includeAddresses
10540
+ });
10541
+ const expiredOmitted = scanned.filter((r) => isPendleMarketExpired(r)).length;
10542
+ return {
10543
+ chainId: args.chainId,
10544
+ markets: rows,
10545
+ notes: `Top ${rows.length} active Pendle markets on chain ${args.chainId} by TVL/liquidity (scanned ${scanned.length}, omitted ${expiredOmitted} matured). Use ctm_pendle_search_assets for long-tail or expired markets (PT redeem / remove LP). Do not web-search Pendle APYs.`
10546
+ };
10547
+ }
10548
+
10549
+ // src/protocols/evm/pendle/index.ts
10550
+ var pendleProtocolModule = {
10551
+ id: PENDLE_PROTOCOL_ID,
10552
+ chainCategory: "evm",
10553
+ isChainSupported(ctx) {
10554
+ if (ctx.chainCategory !== "evm") return false;
10555
+ const n = typeof ctx.chainId === "number" ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10);
10556
+ if (!Number.isFinite(n)) return false;
10557
+ return isPendleChainSupported(n);
10558
+ },
10559
+ isTokenSupported(token) {
10560
+ if (token.category !== "evm") return false;
10561
+ return token.kind === "native" || token.kind === "erc20";
10562
+ },
10563
+ actions: [
10564
+ { id: "pendle.fetch-markets", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "List live Pendle markets (TVL-ranked, cap 100, matured omitted)", commonParams: [], params: {} },
10565
+ { id: "pendle.search-assets", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "Search live PT/YT/SY/underlying (matured only if address-pinned)", commonParams: [], params: {} },
10566
+ { id: "pendle.swap", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "Swap token \u2194 PT/YT via Hosted SDK convert", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
10567
+ { id: "pendle.mint-py", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "Mint PT + YT", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
10568
+ { id: "pendle.redeem-py", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "Redeem PT + YT (PT only after expiry)", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
10569
+ { id: "pendle.add-liquidity", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "Add Pendle AMM liquidity", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
10570
+ { id: "pendle.fetch-positions", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "List this wallet\u2019s Pendle LP (including matured)", commonParams: [], params: {} },
10571
+ { id: "pendle.remove-liquidity", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "Remove Pendle AMM liquidity", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
10572
+ { id: "pendle.redeem-rewards", protocolId: PENDLE_PROTOCOL_ID, chainCategory: "evm", description: "Redeem on-chain SY/YT/LP interest and incentives (not merkle airdrops)", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} }
10573
+ ]
10574
+ };
10575
+ registerProtocolModule(pendleProtocolModule);
9176
10576
  var skillsDir = path.join(path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('catalog.cjs', document.baseURI).href)))), "skills");
9177
10577
  var SKILL_PROTOCOL_IDS = [
9178
10578
  "aave-v4",
@@ -9189,8 +10589,10 @@ var SKILL_PROTOCOL_IDS = [
9189
10589
  "morpho",
9190
10590
  "circle-cctp",
9191
10591
  "aerodrome",
10592
+ "pendle",
9192
10593
  "continuum-dao",
9193
- "compound-v3"
10594
+ "compound-v3",
10595
+ "yield-compare"
9194
10596
  ];
9195
10597
  function getToolsForProtocol(protocolId) {
9196
10598
  return MCP_TOOL_DEFINITIONS.filter((t) => t.protocolId === protocolId);
@@ -9239,6 +10641,9 @@ function getProtocolDiscoverySummary(protocolId) {
9239
10641
  };
9240
10642
  }
9241
10643
  init_support();
10644
+ init_support2();
10645
+ init_addresses();
10646
+ init_stockTokens();
9242
10647
  function advisor(protocolId, tokenFilter, impl) {
9243
10648
  return { protocolId, tokenFilter, ...impl };
9244
10649
  }
@@ -9509,7 +10914,7 @@ var PROTOCOL_SUPPORT_ADVISORS = {
9509
10914
  async supportedTokens() {
9510
10915
  return {
9511
10916
  tokens: [],
9512
- notes: "Maple Syrup pools are discovered via GraphQL; pass syrupRouter, pool, and asset from Maple UI."
10917
+ notes: "Maple Syrup pools and APYs come from ctm_maple_fetch_markets. Copy syrupRouter, pool, and asset from the fetch row."
9513
10918
  };
9514
10919
  }
9515
10920
  }),
@@ -9665,6 +11070,55 @@ var PROTOCOL_SUPPORT_ADVISORS = {
9665
11070
  return cache.has(normalized);
9666
11071
  }
9667
11072
  }),
11073
+ [PENDLE_PROTOCOL_ID]: advisor(PENDLE_PROTOCOL_ID, "api_underlyings", {
11074
+ async supportedChainIds() {
11075
+ try {
11076
+ return [...await pendleFetchSupportedChainIds()].sort((a, b) => a - b);
11077
+ } catch {
11078
+ return [];
11079
+ }
11080
+ },
11081
+ async supportedTokens(chainId) {
11082
+ if (!await isPendleChainSupported(chainId)) {
11083
+ return { tokens: [], notes: `Pendle Core API does not list chain ${chainId}.` };
11084
+ }
11085
+ const listed = await pendleFetchMarketsSummary({ chainId });
11086
+ const byAddr = /* @__PURE__ */ new Map();
11087
+ const add = (address, symbol, roles) => {
11088
+ const key = address.toLowerCase();
11089
+ const prev = byAddr.get(key);
11090
+ byAddr.set(key, {
11091
+ address,
11092
+ symbol: symbol ?? prev?.symbol,
11093
+ roles: [.../* @__PURE__ */ new Set([...prev?.roles ?? [], ...roles])]
11094
+ });
11095
+ };
11096
+ for (const m of listed.markets) {
11097
+ add(m.underlying, m.underlyingSymbol, ["underlying"]);
11098
+ add(m.pt, m.ptSymbol, ["pt"]);
11099
+ add(m.yt, m.ytSymbol, ["yt"]);
11100
+ add(m.sy, null, ["sy"]);
11101
+ add(m.address, m.name, ["lp", "market"]);
11102
+ }
11103
+ return {
11104
+ tokens: [...byAddr.values()],
11105
+ notes: "Official Pendle live (unexpired) TVL-ranked markets on this chain, cap 100 (PT/YT/SY/LP + underlyings). Use ctm_pendle_search_assets for long-tail or matured markets. Use ctm_pendle_fetch_positions for this wallet\u2019s LP (including matured). Do not hardcode routers."
11106
+ };
11107
+ },
11108
+ async isTokenSupported(chainId, address) {
11109
+ if (!await isPendleChainSupported(chainId)) return false;
11110
+ let normalized;
11111
+ try {
11112
+ normalized = viem.getAddress(address).toLowerCase();
11113
+ } catch {
11114
+ return false;
11115
+ }
11116
+ const listed = await pendleFetchMarketsSummary({ chainId });
11117
+ return listed.markets.some(
11118
+ (m) => m.address.toLowerCase() === normalized || m.pt.toLowerCase() === normalized || m.yt.toLowerCase() === normalized || m.sy.toLowerCase() === normalized || m.underlying.toLowerCase() === normalized
11119
+ );
11120
+ }
11121
+ }),
9668
11122
  arcus: advisor("arcus", "api_underlyings", {
9669
11123
  async supportedChainIds() {
9670
11124
  return [...ARCUS_SUPPORTED_CHAIN_IDS];
@@ -9702,6 +11156,7 @@ registerProtocolModule(veniceProtocolModule);
9702
11156
  registerProtocolModule(aerodromeProtocolModule);
9703
11157
  registerProtocolModule(continuumDaoProtocolModule);
9704
11158
  registerProtocolModule(compoundV3ProtocolModule);
11159
+ registerProtocolModule(pendleProtocolModule);
9705
11160
  function getAgentCatalog() {
9706
11161
  return {
9707
11162
  protocols: getProtocolModules(),
@@ -9727,6 +11182,7 @@ function getAgentCatalog() {
9727
11182
  aerodrome: aerodromeProtocolModule,
9728
11183
  continuumDao: continuumDaoProtocolModule,
9729
11184
  compoundV3: compoundV3ProtocolModule,
11185
+ pendle: pendleProtocolModule,
9730
11186
  /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */
9731
11187
  mcp: getAgentCatalogForMcp()
9732
11188
  };
@@ -9762,6 +11218,10 @@ exports.listProtocolSupportAdvisorIds = listProtocolSupportAdvisorIds;
9762
11218
  exports.listProtocolsWithSkills = listProtocolsWithSkills;
9763
11219
  exports.mcpAaveV4BorrowInputSchema = mcpAaveV4BorrowInputSchema;
9764
11220
  exports.mcpAaveV4DepositInputSchema = mcpAaveV4DepositInputSchema;
11221
+ exports.mcpAaveV4FetchMarketInputSchema = mcpAaveV4FetchMarketInputSchema;
11222
+ exports.mcpAaveV4FetchMarketOutputSchema = mcpAaveV4FetchMarketOutputSchema;
11223
+ exports.mcpAaveV4FetchMarketsInputSchema = mcpAaveV4FetchMarketsInputSchema;
11224
+ exports.mcpAaveV4FetchMarketsOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
9765
11225
  exports.mcpAaveV4RepayInputSchema = mcpAaveV4RepayInputSchema;
9766
11226
  exports.mcpAaveV4WithdrawInputSchema = mcpAaveV4WithdrawInputSchema;
9767
11227
  exports.mcpAerodromeBuildAddLiquidityMultisignInputSchema = mcpAerodromeBuildAddLiquidityMultisignInputSchema;
@@ -9778,10 +11238,14 @@ exports.mcpAerodromeBuildRemoveLiquidityMultisignInputSchema = mcpAerodromeBuild
9778
11238
  exports.mcpAerodromeBuildSwapMultisignInputSchema = mcpAerodromeBuildSwapMultisignInputSchema;
9779
11239
  exports.mcpAerodromeDiscoverPoolsInputSchema = mcpAerodromeDiscoverPoolsInputSchema;
9780
11240
  exports.mcpAerodromeDiscoverPoolsOutputSchema = mcpAerodromeDiscoverPoolsOutputSchema;
11241
+ exports.mcpAerodromeFetchLpYieldsInputSchema = mcpAerodromeFetchLpYieldsInputSchema;
11242
+ exports.mcpAerodromeFetchLpYieldsOutputSchema = mcpAerodromeFetchLpYieldsOutputSchema;
9781
11243
  exports.mcpAerodromeFetchPoolsInputSchema = mcpAerodromeFetchPoolsInputSchema;
9782
11244
  exports.mcpAerodromeFetchPoolsOutputSchema = mcpAerodromeFetchPoolsOutputSchema;
9783
11245
  exports.mcpAerodromeFetchPositionsInputSchema = mcpAerodromeFetchPositionsInputSchema;
9784
11246
  exports.mcpAerodromeFetchPositionsOutputSchema = mcpAerodromeFetchPositionsOutputSchema;
11247
+ exports.mcpAerodromeFetchStockLpYieldsInputSchema = mcpAerodromeFetchStockLpYieldsInputSchema;
11248
+ exports.mcpAerodromeFetchStockLpYieldsOutputSchema = mcpAerodromeFetchStockLpYieldsOutputSchema;
9785
11249
  exports.mcpAerodromeQuoteAddLiquidityInputSchema = mcpAerodromeQuoteAddLiquidityInputSchema;
9786
11250
  exports.mcpAerodromeQuoteAddLiquidityOutputSchema = mcpAerodromeQuoteAddLiquidityOutputSchema;
9787
11251
  exports.mcpAerodromeQuoteClDepositInputSchema = mcpAerodromeQuoteClDepositInputSchema;
@@ -9900,16 +11364,31 @@ exports.mcpContinuumDaoSplitInputSchema = mcpContinuumDaoSplitInputSchema;
9900
11364
  exports.mcpContinuumDaoTokenIdInputSchema = mcpContinuumDaoTokenIdInputSchema;
9901
11365
  exports.mcpContinuumDaoTransferInputSchema = mcpContinuumDaoTransferInputSchema;
9902
11366
  exports.mcpContinuumDaoUndelegateInputSchema = mcpContinuumDaoUndelegateInputSchema;
11367
+ exports.mcpCurveDaoBuildAddLiquidityMultisignInputSchema = mcpCurveDaoBuildAddLiquidityMultisignInputSchema;
11368
+ exports.mcpCurveDaoBuildGaugeDepositMultisignInputSchema = mcpCurveDaoBuildGaugeDepositMultisignInputSchema;
11369
+ exports.mcpCurveDaoBuildRemoveLiquidityMultisignInputSchema = mcpCurveDaoBuildRemoveLiquidityMultisignInputSchema;
9903
11370
  exports.mcpCurveDaoBuildSwapMultisignInputSchema = mcpCurveDaoBuildSwapMultisignInputSchema;
11371
+ exports.mcpCurveDaoFetchImportantPoolsInputSchema = mcpCurveDaoFetchImportantPoolsInputSchema;
11372
+ exports.mcpCurveDaoFetchImportantPoolsOutputSchema = mcpCurveDaoFetchImportantPoolsOutputSchema;
11373
+ exports.mcpCurveDaoFetchLpYieldsInputSchema = mcpCurveDaoFetchLpYieldsInputSchema;
11374
+ exports.mcpCurveDaoFetchLpYieldsOutputSchema = mcpCurveDaoFetchLpYieldsOutputSchema;
11375
+ exports.mcpCurveDaoQuoteAddLiquidityInputSchema = mcpCurveDaoQuoteAddLiquidityInputSchema;
11376
+ exports.mcpCurveDaoQuoteAddLiquidityOutputSchema = mcpCurveDaoQuoteAddLiquidityOutputSchema;
9904
11377
  exports.mcpCurveDaoQuoteInputSchema = mcpCurveDaoQuoteInputSchema;
9905
11378
  exports.mcpCurveDaoQuoteOutputSchema = mcpCurveDaoQuoteOutputSchema;
11379
+ exports.mcpCurveDaoQuoteRemoveLiquidityInputSchema = mcpCurveDaoQuoteRemoveLiquidityInputSchema;
11380
+ exports.mcpCurveDaoQuoteRemoveLiquidityOutputSchema = mcpCurveDaoQuoteRemoveLiquidityOutputSchema;
9906
11381
  exports.mcpEthenaClaimInputSchema = mcpEthenaClaimInputSchema;
9907
11382
  exports.mcpEthenaCooldownInputSchema = mcpEthenaCooldownInputSchema;
11383
+ exports.mcpEthenaFetchSusdeApyInputSchema = mcpEthenaFetchSusdeApyInputSchema;
11384
+ exports.mcpEthenaFetchSusdeApyOutputSchema = mcpEthenaFetchSusdeApyOutputSchema;
9908
11385
  exports.mcpEthenaRedeemInputSchema = mcpEthenaRedeemInputSchema;
9909
11386
  exports.mcpEthenaStakeInputSchema = mcpEthenaStakeInputSchema;
9910
11387
  exports.mcpEulerV2BorrowRepayInputSchema = mcpEulerV2BorrowRepayInputSchema;
9911
11388
  exports.mcpEulerV2CollateralDepositInputSchema = mcpEulerV2CollateralDepositInputSchema;
9912
11389
  exports.mcpEulerV2CollateralWithdrawInputSchema = mcpEulerV2CollateralWithdrawInputSchema;
11390
+ exports.mcpEulerV2FetchEarnVaultsInputSchema = mcpEulerV2FetchEarnVaultsInputSchema;
11391
+ exports.mcpEulerV2FetchEarnVaultsOutputSchema = mcpEulerV2FetchEarnVaultsOutputSchema;
9913
11392
  exports.mcpEulerV2FetchLendVaultsInputSchema = mcpEulerV2FetchLendVaultsInputSchema;
9914
11393
  exports.mcpEulerV2FetchLendVaultsOutputSchema = mcpEulerV2FetchLendVaultsOutputSchema;
9915
11394
  exports.mcpEulerV2IsolatedBorrowInputSchema = mcpEulerV2IsolatedBorrowInputSchema;
@@ -9960,10 +11439,14 @@ exports.mcpHyperliquidFetchPositionsInputSchema = mcpHyperliquidFetchPositionsIn
9960
11439
  exports.mcpHyperliquidFetchPositionsOutputSchema = mcpHyperliquidFetchPositionsOutputSchema;
9961
11440
  exports.mcpHyperliquidFetchStakingSummaryInputSchema = mcpHyperliquidFetchStakingSummaryInputSchema;
9962
11441
  exports.mcpHyperliquidFetchStakingSummaryOutputSchema = mcpHyperliquidFetchStakingSummaryOutputSchema;
11442
+ exports.mcpHyperliquidFetchStockMarketsInputSchema = mcpHyperliquidFetchStockMarketsInputSchema;
11443
+ exports.mcpHyperliquidFetchStockMarketsOutputSchema = mcpHyperliquidFetchStockMarketsOutputSchema;
9963
11444
  exports.mcpHyperliquidFetchUsdClassBalancesInputSchema = mcpHyperliquidFetchUsdClassBalancesInputSchema;
9964
11445
  exports.mcpHyperliquidFetchUsdClassBalancesOutputSchema = mcpHyperliquidFetchUsdClassBalancesOutputSchema;
9965
11446
  exports.mcpHyperliquidFetchUserVaultEquitiesInputSchema = mcpHyperliquidFetchUserVaultEquitiesInputSchema;
9966
11447
  exports.mcpHyperliquidFetchUserVaultEquitiesOutputSchema = mcpHyperliquidFetchUserVaultEquitiesOutputSchema;
11448
+ exports.mcpHyperliquidFetchVaultApysInputSchema = mcpHyperliquidFetchVaultApysInputSchema;
11449
+ exports.mcpHyperliquidFetchVaultApysOutputSchema = mcpHyperliquidFetchVaultApysOutputSchema;
9967
11450
  exports.mcpHyperliquidFetchVaultsInputSchema = mcpHyperliquidFetchVaultsInputSchema;
9968
11451
  exports.mcpHyperliquidFetchVaultsOutputSchema = mcpHyperliquidFetchVaultsOutputSchema;
9969
11452
  exports.mcpHyperliquidLimitOrderInputSchema = mcpHyperliquidLimitOrderInputSchema;
@@ -9977,11 +11460,17 @@ exports.mcpHyperliquidUsdTransferInputSchema = mcpHyperliquidUsdTransferInputSch
9977
11460
  exports.mcpHyperliquidVaultDepositInputSchema = mcpHyperliquidVaultDepositInputSchema;
9978
11461
  exports.mcpHyperliquidVaultWithdrawInputSchema = mcpHyperliquidVaultWithdrawInputSchema;
9979
11462
  exports.mcpLidoClaimWithdrawalInputSchema = mcpLidoClaimWithdrawalInputSchema;
11463
+ exports.mcpLidoFetchStethAprInputSchema = mcpLidoFetchStethAprInputSchema;
11464
+ exports.mcpLidoFetchStethAprOutputSchema = mcpLidoFetchStethAprOutputSchema;
9980
11465
  exports.mcpLidoRequestWithdrawalsInputSchema = mcpLidoRequestWithdrawalsInputSchema;
9981
11466
  exports.mcpLidoSubmitInputSchema = mcpLidoSubmitInputSchema;
9982
11467
  exports.mcpLidoUnwrapWstEthInputSchema = mcpLidoUnwrapWstEthInputSchema;
9983
11468
  exports.mcpLidoWrapStEthInputSchema = mcpLidoWrapStEthInputSchema;
9984
11469
  exports.mcpMapleDepositInputSchema = mcpMapleDepositInputSchema;
11470
+ exports.mcpMapleFetchMarketInputSchema = mcpMapleFetchMarketInputSchema;
11471
+ exports.mcpMapleFetchMarketOutputSchema = mcpMapleFetchMarketOutputSchema;
11472
+ exports.mcpMapleFetchMarketsInputSchema = mcpMapleFetchMarketsInputSchema;
11473
+ exports.mcpMapleFetchMarketsOutputSchema = mcpMapleFetchMarketsOutputSchema;
9985
11474
  exports.mcpMapleRequestRedeemInputSchema = mcpMapleRequestRedeemInputSchema;
9986
11475
  exports.mcpMorphoBlueBorrowInputSchema = mcpMorphoBlueBorrowInputSchema;
9987
11476
  exports.mcpMorphoBlueCollateralDepositInputSchema = mcpMorphoBlueCollateralDepositInputSchema;
@@ -10010,9 +11499,37 @@ exports.mcpMorphoVaultWithdrawInputSchema = mcpMorphoVaultWithdrawInputSchema;
10010
11499
  exports.mcpMultisignInput = mcpMultisignInput;
10011
11500
  exports.mcpMultisignOutputSchema = multisignOutputSchema;
10012
11501
  exports.mcpMultisignSubmitOutputSchema = mcpServerSubmitOutputSchema;
11502
+ exports.mcpPendleBuildAddLiquidityMultisignInputSchema = mcpPendleBuildAddLiquidityMultisignInputSchema;
11503
+ exports.mcpPendleBuildMintPyMultisignInputSchema = mcpPendleBuildMintPyMultisignInputSchema;
11504
+ exports.mcpPendleBuildMintSyMultisignInputSchema = mcpPendleBuildMintSyMultisignInputSchema;
11505
+ exports.mcpPendleBuildRedeemPyMultisignInputSchema = mcpPendleBuildRedeemPyMultisignInputSchema;
11506
+ exports.mcpPendleBuildRedeemRewardsMultisignInputSchema = mcpPendleBuildRedeemRewardsMultisignInputSchema;
11507
+ exports.mcpPendleBuildRedeemSyMultisignInputSchema = mcpPendleBuildRedeemSyMultisignInputSchema;
11508
+ exports.mcpPendleBuildRemoveLiquidityMultisignInputSchema = mcpPendleBuildRemoveLiquidityMultisignInputSchema;
11509
+ exports.mcpPendleBuildSwapMultisignInputSchema = mcpPendleBuildSwapMultisignInputSchema;
11510
+ exports.mcpPendleFetchMarketsInputSchema = mcpPendleFetchMarketsInputSchema;
11511
+ exports.mcpPendleFetchMarketsOutputSchema = mcpPendleFetchMarketsOutputSchema;
11512
+ exports.mcpPendleFetchMerkleRewardsInputSchema = mcpPendleFetchMerkleRewardsInputSchema;
11513
+ exports.mcpPendleFetchMerkleRewardsOutputSchema = mcpPendleFetchMerkleRewardsOutputSchema;
11514
+ exports.mcpPendleFetchPositionsInputSchema = mcpPendleFetchPositionsInputSchema;
11515
+ exports.mcpPendleFetchPositionsOutputSchema = mcpPendleFetchPositionsOutputSchema;
11516
+ exports.mcpPendleFetchPricesInputSchema = mcpPendleFetchPricesInputSchema;
11517
+ exports.mcpPendleFetchPricesOutputSchema = mcpPendleFetchPricesOutputSchema;
11518
+ exports.mcpPendleQuoteAddLiquidityInputSchema = mcpPendleQuoteAddLiquidityInputSchema;
11519
+ exports.mcpPendleQuoteMintPyInputSchema = mcpPendleQuoteMintPyInputSchema;
11520
+ exports.mcpPendleQuoteMintSyInputSchema = mcpPendleQuoteMintSyInputSchema;
11521
+ exports.mcpPendleQuoteOutputSchema = mcpPendleQuoteOutputSchema;
11522
+ exports.mcpPendleQuoteRedeemPyInputSchema = mcpPendleQuoteRedeemPyInputSchema;
11523
+ exports.mcpPendleQuoteRedeemSyInputSchema = mcpPendleQuoteRedeemSyInputSchema;
11524
+ exports.mcpPendleQuoteRemoveLiquidityInputSchema = mcpPendleQuoteRemoveLiquidityInputSchema;
11525
+ exports.mcpPendleQuoteSwapInputSchema = mcpPendleQuoteSwapInputSchema;
11526
+ exports.mcpPendleSearchAssetsInputSchema = mcpPendleSearchAssetsInputSchema;
11527
+ exports.mcpPendleSearchAssetsOutputSchema = mcpPendleSearchAssetsOutputSchema;
10013
11528
  exports.mcpServerCommonInputSchema = mcpServerCommonInputSchema;
10014
11529
  exports.mcpServerMultisignInput = mcpServerMultisignInput;
10015
11530
  exports.mcpServerSubmitOutputSchema = mcpServerSubmitOutputSchema;
11531
+ exports.mcpSkyFetchSusdsRateInputSchema = mcpSkyFetchSusdsRateInputSchema;
11532
+ exports.mcpSkyFetchSusdsRateOutputSchema = mcpSkyFetchSusdsRateOutputSchema;
10016
11533
  exports.mcpSkyLockstakeCloseInputSchema = mcpSkyLockstakeCloseInputSchema;
10017
11534
  exports.mcpSkyLockstakeDrawInputSchema = mcpSkyLockstakeDrawInputSchema;
10018
11535
  exports.mcpSkyLockstakeGetRewardInputSchema = mcpSkyLockstakeGetRewardInputSchema;