@continuumdao/ctm-mpc-defi 0.2.56 → 0.2.57

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 (49) hide show
  1. package/dist/agent/catalog.cjs +304 -134
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +162 -42
  4. package/dist/agent/catalog.js +304 -136
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/aave-v4/SKILL.md +26 -3
  7. package/dist/agent/skills/aerodrome/SKILL.md +3 -1
  8. package/dist/agent/skills/curve-dao/SKILL.md +2 -2
  9. package/dist/agent/skills/uniswap-v4/SKILL.md +2 -2
  10. package/dist/index.cjs +165 -19
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +166 -20
  13. package/dist/index.js.map +1 -1
  14. package/dist/protocols/evm/aave-v4/index.cjs +198 -15
  15. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  16. package/dist/protocols/evm/aave-v4/index.d.ts +62 -7
  17. package/dist/protocols/evm/aave-v4/index.js +189 -16
  18. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  19. package/dist/protocols/evm/aerodrome/index.cjs +152 -63
  20. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  21. package/dist/protocols/evm/aerodrome/index.d.ts +30 -58
  22. package/dist/protocols/evm/aerodrome/index.js +151 -64
  23. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  24. package/dist/protocols/evm/compound-v3/index.cjs +115 -2
  25. package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
  26. package/dist/protocols/evm/compound-v3/index.js +116 -3
  27. package/dist/protocols/evm/compound-v3/index.js.map +1 -1
  28. package/dist/protocols/evm/curve-dao/index.cjs +120 -5
  29. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  30. package/dist/protocols/evm/curve-dao/index.js +120 -5
  31. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  32. package/dist/protocols/evm/euler-v2/index.cjs +121 -6
  33. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  34. package/dist/protocols/evm/euler-v2/index.js +121 -6
  35. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  36. package/dist/protocols/evm/morpho/index.cjs +129 -57
  37. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  38. package/dist/protocols/evm/morpho/index.d.ts +2 -1
  39. package/dist/protocols/evm/morpho/index.js +129 -58
  40. package/dist/protocols/evm/morpho/index.js.map +1 -1
  41. package/dist/protocols/evm/pendle/index.cjs +129 -10
  42. package/dist/protocols/evm/pendle/index.cjs.map +1 -1
  43. package/dist/protocols/evm/pendle/index.js +129 -10
  44. package/dist/protocols/evm/pendle/index.js.map +1 -1
  45. package/dist/protocols/evm/uniswap-v4/index.cjs +164 -17
  46. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  47. package/dist/protocols/evm/uniswap-v4/index.js +165 -18
  48. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  49. package/package.json +1 -1
@@ -48,6 +48,111 @@ var init_chainIdParse = __esm({
48
48
  "src/chains/evm/chainIdParse.ts"() {
49
49
  }
50
50
  });
51
+ function isCoinbaseB20AssetToken(address) {
52
+ try {
53
+ return viem.getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+ function looksLikeCoinbaseStockSymbol(symbol) {
59
+ return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
60
+ }
61
+ function indexCatalog(rows) {
62
+ catalogRows = rows;
63
+ catalogAt = Date.now();
64
+ catalogBySymbol.clear();
65
+ catalogByAddress.clear();
66
+ for (const row of rows) {
67
+ catalogBySymbol.set(row.symbol.toLowerCase(), row);
68
+ catalogByAddress.set(row.address.toLowerCase(), row);
69
+ }
70
+ }
71
+ function parseCoinbaseTokenizedStocksPayload(payload) {
72
+ const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
73
+ const out = [];
74
+ const seen = /* @__PURE__ */ new Set();
75
+ for (const row of tokens) {
76
+ if (!row || typeof row !== "object") continue;
77
+ const rec = row;
78
+ const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
79
+ const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
80
+ if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
81
+ const address = viem.getAddress(addressRaw);
82
+ const key = address.toLowerCase();
83
+ if (seen.has(key)) continue;
84
+ seen.add(key);
85
+ const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
86
+ const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
87
+ const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : COINBASE_B20_STOCK_DECIMALS;
88
+ out.push({ address, symbol, name, decimals, iconUrl });
89
+ if (out.length >= CATALOG_MAX) break;
90
+ }
91
+ return out;
92
+ }
93
+ async function fetchCoinbaseB20StockCatalog() {
94
+ const merged = [];
95
+ const seen = /* @__PURE__ */ new Set();
96
+ let pageToken = "";
97
+ for (let page = 0; page < 4; page++) {
98
+ const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
99
+ url.searchParams.set("page_size", "500");
100
+ if (pageToken) url.searchParams.set("page_token", pageToken);
101
+ const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
102
+ if (!res.ok) break;
103
+ const json = await res.json();
104
+ for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
105
+ const key = row.address.toLowerCase();
106
+ if (seen.has(key)) continue;
107
+ seen.add(key);
108
+ merged.push(row);
109
+ if (merged.length >= CATALOG_MAX) break;
110
+ }
111
+ pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
112
+ if (!pageToken || merged.length >= CATALOG_MAX) break;
113
+ }
114
+ if (merged.length > 0) indexCatalog(merged);
115
+ return catalogRows ?? [];
116
+ }
117
+ async function ensureCoinbaseB20StockCatalog() {
118
+ if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
119
+ if (!catalogInflight) {
120
+ catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
121
+ catalogInflight = null;
122
+ });
123
+ }
124
+ try {
125
+ return await catalogInflight;
126
+ } catch {
127
+ return catalogRows ?? [];
128
+ }
129
+ }
130
+ function lookupCoinbaseB20StockToken(token) {
131
+ const key = (token ?? "").trim();
132
+ if (!key) return null;
133
+ const fromCatalog = catalogBySymbol.get(key.toLowerCase());
134
+ if (fromCatalog) return fromCatalog;
135
+ try {
136
+ return catalogByAddress.get(viem.getAddress(key).toLowerCase()) ?? null;
137
+ } catch {
138
+ return null;
139
+ }
140
+ }
141
+ var COINBASE_B20_STOCK_DECIMALS, COINBASE_B20_ASSET_PREFIX, COINBASE_TOKENIZED_STOCKS_API_URL, CATALOG_TTL_MS, CATALOG_MAX, catalogRows, catalogAt, catalogInflight, catalogBySymbol, catalogByAddress;
142
+ var init_coinbaseB20 = __esm({
143
+ "src/protocols/evm/shared/coinbaseB20.ts"() {
144
+ COINBASE_B20_STOCK_DECIMALS = 8;
145
+ COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
146
+ COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
147
+ CATALOG_TTL_MS = 15 * 60 * 1e3;
148
+ CATALOG_MAX = 500;
149
+ catalogRows = null;
150
+ catalogAt = 0;
151
+ catalogInflight = null;
152
+ catalogBySymbol = /* @__PURE__ */ new Map();
153
+ catalogByAddress = /* @__PURE__ */ new Map();
154
+ }
155
+ });
51
156
  function defiEvmTransport(rpcUrl, opts) {
52
157
  const url = rpcUrl.trim();
53
158
  return viem.http(url, opts);
@@ -520,27 +625,6 @@ var init_midnightApi = __esm({
520
625
  init_midnightConstants();
521
626
  }
522
627
  });
523
- var COINBASE_B20_STOCK_TOKENS, COINBASE_B20_STOCK_DECIMALS;
524
- var init_coinbaseB20 = __esm({
525
- "src/protocols/evm/shared/coinbaseB20.ts"() {
526
- COINBASE_B20_STOCK_TOKENS = [
527
- { symbol: "AAPLc", name: "Apple Inc.", address: "0xb200000000000000000000C2e324d24d7eEcd1fb" },
528
- { symbol: "NVDAc", name: "NVIDIA Corporation", address: "0xb20000000000000000000078ee7ce2fE4908108C" },
529
- { symbol: "METAc", name: "Meta Platforms Inc.", address: "0xb2000000000000000000008bC8786B856E61707C" },
530
- { symbol: "GOOGLc", name: "Alphabet Inc.", address: "0xb2000000000000000000002D0BA3164cc74f58B7" },
531
- { symbol: "AMZNc", name: "Amazon.com Inc.", address: "0xb200000000000000000000d9192b6B456483C2E8" },
532
- { symbol: "TSLAc", name: "Tesla Inc.", address: "0xb2000000000000000000001e800a7f5189430cD0" },
533
- { symbol: "MSFTc", name: "Microsoft Corporation", address: "0xB200000000000000000000Ab99cFa739E253872B" },
534
- { symbol: "COINc", name: "Coinbase Global Inc.", address: "0xb200000000000000000000c85a31389D71F3ecfb" },
535
- { symbol: "MSTRc", name: "Strategy Inc.", address: "0xb2000000000000000000004884b426556b92883d" },
536
- { symbol: "CRCLc", name: "Circle Internet Group Inc.", address: "0xB20000000000000000000019f6E7C675b73C2e4D" },
537
- { symbol: "INTCc", name: "Intel Corporation", address: "0xB2000000000000000000004AFF16039bA04bdFBc" },
538
- { symbol: "SNDKc", name: "Sandisk Corporation", address: "0xb200000000000000000000397293Cb8cda9a10c5" },
539
- { symbol: "SPCXc", name: "Space Exploration Technologies Corp.", address: "0xb2000000000000000000007b9fcbd005511aCBd5" }
540
- ];
541
- COINBASE_B20_STOCK_DECIMALS = 8;
542
- }
543
- });
544
628
  function isAerodromeChainSupported(chainId) {
545
629
  const n = typeof chainId === "number" ? chainId : Number.parseInt(String(chainId), 10);
546
630
  return n === AERODROME_CHAIN_ID;
@@ -1309,7 +1393,108 @@ function parseMultisignBuilderOutput(data) {
1309
1393
  return multisignOutputSchema.parse(data);
1310
1394
  }
1311
1395
 
1396
+ // src/protocols/evm/aave-v4/api.ts
1397
+ init_defiProxy();
1398
+ init_coinbaseB20();
1399
+ var AAVE_V4_GRAPHQL_URL = "https://api.v4.aave.com/graphql";
1400
+ async function aaveV4Gql(query, variables) {
1401
+ const body = { query, variables: variables ?? {} };
1402
+ const j = await postJsonViaOptionalProxy({
1403
+ directUrl: AAVE_V4_GRAPHQL_URL,
1404
+ body,
1405
+ proxyUrl: getAaveGraphqlProxyUrl(),
1406
+ proxyEnvelope: body
1407
+ });
1408
+ if (j.errors?.length) {
1409
+ const msg = j.errors.map((e) => e.message ?? "Unknown").join("; ");
1410
+ throw new Error(msg);
1411
+ }
1412
+ if (j.data == null) {
1413
+ throw new Error("Aave V4 API: empty response");
1414
+ }
1415
+ return j.data;
1416
+ }
1417
+ async function fetchAaveV4Chains() {
1418
+ const d = await aaveV4Gql(`
1419
+ query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }
1420
+ `, { c: { query: { filter: "ALL" } } });
1421
+ return d.chains ?? [];
1422
+ }
1423
+ async function loadAaveV4SupportedChainIdsFromV4Api() {
1424
+ const rows = await fetchAaveV4Chains();
1425
+ const s = /* @__PURE__ */ new Set();
1426
+ for (const c of rows) s.add(c.chainId);
1427
+ return s;
1428
+ }
1429
+ var RESERVES_ADDRESS_FRAGMENT = `
1430
+ asset { underlying { address } }
1431
+ `;
1432
+ async function fetchAaveV4NativeWrappedToken(chainId) {
1433
+ const all = await fetchAaveV4Chains();
1434
+ const c = all.find((x) => x.chainId === chainId);
1435
+ const t = (c?.nativeWrappedToken ?? "").trim();
1436
+ if (t && viem.isAddress(t)) return viem.getAddress(t);
1437
+ return null;
1438
+ }
1439
+ async function fetchAaveV4SupportedUnderlyingAddressSet(chainId) {
1440
+ const d = await aaveV4Gql(
1441
+ `
1442
+ query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }
1443
+ `,
1444
+ {
1445
+ r: {
1446
+ query: { chainIds: [chainId] },
1447
+ filter: "ALL",
1448
+ orderBy: { supplyApy: "DESC" }
1449
+ }
1450
+ }
1451
+ );
1452
+ const s = /* @__PURE__ */ new Set();
1453
+ for (const r of d.reserves ?? []) {
1454
+ const a = (r.asset?.underlying?.address ?? "").trim();
1455
+ if (a && viem.isAddress(a)) s.add(a.toLowerCase());
1456
+ }
1457
+ return s;
1458
+ }
1459
+ var aaveV4ChainTokenCache = /* @__PURE__ */ new Map();
1460
+ function ensureAaveV4ChainTokenCache(chainId) {
1461
+ const hit = aaveV4ChainTokenCache.get(chainId);
1462
+ if (hit) return hit;
1463
+ const p = (async () => {
1464
+ const [nativeWrapped, supportedUnderlying] = await Promise.all([
1465
+ fetchAaveV4NativeWrappedToken(chainId),
1466
+ fetchAaveV4SupportedUnderlyingAddressSet(chainId)
1467
+ ]);
1468
+ return { supportedUnderlying, nativeWrapped };
1469
+ })();
1470
+ aaveV4ChainTokenCache.set(chainId, p);
1471
+ return p;
1472
+ }
1473
+ function parseAaveV4UiMarketId(raw) {
1474
+ const t = (raw ?? "").trim().toLowerCase().replace(/\s+/g, " ");
1475
+ if (!t) return void 0;
1476
+ if (t === "core") return "core";
1477
+ if (t === "bluechip" || t === "prime" || t === "institutional") return "bluechip";
1478
+ if (t === "main" || t === "plus" || t === "default") return "main";
1479
+ if (t === "bstocks" || t === "bstock" || t === "b stocks" || t === "stocks" || t === "stock" || t === "equities" || t === "equity" || t === "coinbase stocks" || t === "tokenized stocks" || t === "tokenised stocks") {
1480
+ return "bstocks";
1481
+ }
1482
+ return void 0;
1483
+ }
1484
+ function resolveAaveV4UnderlyingAddress(token) {
1485
+ const raw = (token ?? "").trim();
1486
+ if (!raw) return null;
1487
+ if (viem.isAddress(raw)) return viem.getAddress(raw);
1488
+ return lookupCoinbaseB20StockToken(raw)?.address ?? null;
1489
+ }
1490
+
1312
1491
  // src/agent/schemas/chainPreprocess.ts
1492
+ function rewriteAaveV4AssetField(o, key) {
1493
+ const raw = String(o[key] ?? "").trim();
1494
+ if (!raw || viem.isAddress(raw)) return;
1495
+ const resolved = resolveAaveV4UnderlyingAddress(raw);
1496
+ if (resolved) o[key] = resolved;
1497
+ }
1313
1498
  function preprocessObject(raw) {
1314
1499
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) return null;
1315
1500
  return { ...raw };
@@ -1651,6 +1836,12 @@ function preprocessAaveMultisignInput(action) {
1651
1836
  return (raw) => {
1652
1837
  const o = preprocessObject(raw);
1653
1838
  if (!o) return raw;
1839
+ rewriteAaveV4AssetField(o, "underlying");
1840
+ rewriteAaveV4AssetField(o, "collateralUnderlying");
1841
+ if (typeof o.marketId === "string") {
1842
+ const id = parseAaveV4UiMarketId(o.marketId);
1843
+ if (id) o.marketId = id;
1844
+ }
1654
1845
  derivePurposeIfMissing(o, (x) => {
1655
1846
  const amt = String(x.amountHuman ?? "").trim();
1656
1847
  const asset = String(x.underlying ?? "").trim();
@@ -1667,8 +1858,8 @@ var uniswapQuoteTradeTypeSchema = zod.z.enum(["EXACT_INPUT", "EXACT_OUTPUT"]);
1667
1858
  var mcpUniswapV4QuoteInputSchema = zod.z.object({
1668
1859
  type: uniswapQuoteTradeTypeSchema.describe("EXACT_INPUT or EXACT_OUTPUT"),
1669
1860
  amount: zod.z.string().min(1).describe("Amount in token-in base units (wei string for ERC-20)"),
1670
- tokenIn: zod.z.string().min(1).describe("Input token; 0x0 for native ETH"),
1671
- tokenOut: zod.z.string().min(1).describe("Output token address"),
1861
+ tokenIn: zod.z.string().min(1).describe("Input token address or Coinbase stock ticker (AAPLc); 0x0 for native ETH"),
1862
+ tokenOut: zod.z.string().min(1).describe("Output token address or Coinbase stock ticker (AAPLc)"),
1672
1863
  chainId: agentEvmChainIdSchema.describe("tokenInChainId / same-chain default"),
1673
1864
  uniswapApiKey: zod.z.string().min(1).describe("Uniswap Trade API x-api-key"),
1674
1865
  swapper: evmAddressSchema.optional().describe("MPC executor; omit if keyGen + managementNodeUrl provided"),
@@ -1704,7 +1895,9 @@ var mcpUniswapV4BuildSwapMultisignInputSchema = withMultisignKeySourceRefine(
1704
1895
  zod.z.preprocess(
1705
1896
  preprocessUniswapBuildSwapInput,
1706
1897
  evmMultisignCommonInputSchema.extend({
1707
- tokenIn: evmAddressSchema.describe("Token in; 0x0 for native ETH"),
1898
+ tokenIn: evmAddressSchema.describe(
1899
+ "Token in address or Coinbase stock ticker (AAPLc); 0x0 for native ETH"
1900
+ ),
1708
1901
  swap: swapTxRequestSchema,
1709
1902
  createSwapResponse: zod.z.object({
1710
1903
  swap: swapTxRequestSchema,
@@ -1721,8 +1914,8 @@ var mcpUniswapV4LimitOrderQuoteInputSchema = zod.z.object({
1721
1914
  type: uniswapQuoteTradeTypeSchema.describe("EXACT_INPUT or EXACT_OUTPUT"),
1722
1915
  amount: zod.z.string().min(1).describe("Amount in token-in base units (wei string for ERC-20)"),
1723
1916
  limitPrice: zod.z.string().min(1).describe("Limit price string from Trade API (pair exchange rate)"),
1724
- tokenIn: zod.z.string().min(1).describe("Input token; 0x0 for native ETH"),
1725
- tokenOut: zod.z.string().min(1).describe("Output token address"),
1917
+ tokenIn: zod.z.string().min(1).describe("Input token address or Coinbase stock ticker (AAPLc); 0x0 for native ETH"),
1918
+ tokenOut: zod.z.string().min(1).describe("Output token address or Coinbase stock ticker (AAPLc)"),
1726
1919
  chainId: agentEvmChainIdSchema.describe("Must be 1 (Ethereum mainnet) for limit orders"),
1727
1920
  orderDeadline: agentCoercedIntSchema(zod.z.number().int().positive()).describe("Unix seconds when unfilled order expires"),
1728
1921
  uniswapApiKey: zod.z.string().min(1).describe("Uniswap Trade API x-api-key"),
@@ -2069,8 +2262,8 @@ var mcpUniswapV4BuildAllowlistFinalizeMultisignInputSchema = withMultisignKeySou
2069
2262
  var mcpCurveDaoQuoteInputSchema = zod.z.object({
2070
2263
  chainId: agentEvmChainIdSchema.describe("EVM chain id (rpcUrl resolved from get_chain_registry rpcGateway)"),
2071
2264
  rpcUrl: 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"),
2072
- tokenIn: zod.z.string().min(1).describe("Input token address, or 0xeeee\u2026 / 0x0 / eth for native"),
2073
- tokenOut: zod.z.string().min(1).describe("Output token address or 0xeeee\u2026 native placeholder"),
2265
+ tokenIn: zod.z.string().min(1).describe("Input token address, Coinbase stock ticker (AAPLc), or 0xeeee\u2026 / 0x0 / eth for native"),
2266
+ tokenOut: zod.z.string().min(1).describe("Output token address, Coinbase stock ticker (AAPLc), or 0xeeee\u2026 native placeholder"),
2074
2267
  amountHuman: zod.z.string().min(1).describe("Human-readable amount of tokenIn"),
2075
2268
  tokenInDecimals: zod.z.number().int().min(0).max(18).optional().describe("Token-in decimals; omit to read on-chain (native uses 18)")
2076
2269
  });
@@ -2081,8 +2274,10 @@ var mcpCurveDaoBuildSwapMultisignInputSchema = withMultisignKeySourceRefine(
2081
2274
  zod.z.preprocess(
2082
2275
  preprocessCurveBuildSwapInput,
2083
2276
  evmMultisignCommonInputSchema.extend({
2084
- tokenIn: evmAddressSchema.describe("ERC-20 sold (native in uses WETH path in UI)"),
2085
- tokenOut: zod.z.string().min(1).describe("Output token or 0xeeee\u2026 native placeholder"),
2277
+ tokenIn: evmAddressSchema.describe(
2278
+ "ERC-20 sold, or a Coinbase stock ticker (AAPLc). Native in uses the WETH path in the UI."
2279
+ ),
2280
+ tokenOut: zod.z.string().min(1).describe("Output token, Coinbase stock ticker (AAPLc), or 0xeeee\u2026 native placeholder"),
2086
2281
  amountHuman: zod.z.string().min(1).describe("Human-readable amount of tokenIn"),
2087
2282
  slippagePercent: zod.z.number().gt(0).lt(100).describe("Slippage 0\u2013100 exclusive"),
2088
2283
  quoteSnapshot: jsonObjectSchema.optional().describe("Optional quote row from ctm_curve_dao_quote \u2014 aliases tokenIn/tokenOut/amountHuman")
@@ -3033,7 +3228,9 @@ var mcpSkySusdsDepositInputSchema = mcpMultisignInput({
3033
3228
  var mcpSkySusdsRedeemInputSchema = mcpMultisignInput({
3034
3229
  sharesHuman: zod.z.string().min(1)
3035
3230
  });
3036
- var mcpAaveV4MarketIdSchema = zod.z.string().min(1).optional().describe("UI market segment: main (Plus), core, or bluechip (Prime). Default main.");
3231
+ var mcpAaveV4MarketIdSchema = zod.z.string().min(1).optional().describe(
3232
+ "UI market segment: main (Plus), core, bluechip (Prime), or bstocks (Base Coinbase tokenized stocks). Aliases: stocks, equities. Default main."
3233
+ );
3037
3234
  function mcpAaveV4MultisignInput(fields, action) {
3038
3235
  return withMultisignKeySourceRefine(
3039
3236
  zod.z.preprocess(preprocessAaveMultisignInput(action), evmMultisignCommonInputSchema.extend(fields))
@@ -3051,7 +3248,7 @@ var mcpAaveV4DepositInputSchema = mcpAaveV4MultisignInput(
3051
3248
  {
3052
3249
  spoke: evmAddressSchema.optional().describe("Omit \u2014 continuum-mcp-server resolves spoke from Aave v4 API."),
3053
3250
  underlying: evmAddressSchema.describe(
3054
- "Asset to supply. Native ETH: 0x0 or wrapped native with isNativeIn true."
3251
+ "Asset to supply. Address, or a Base bStock ticker (AAPLc). Native ETH: 0x0 or wrapped native with isNativeIn true."
3055
3252
  ),
3056
3253
  amountHuman: zod.z.string().min(1),
3057
3254
  marketId: mcpAaveV4MarketIdSchema,
@@ -3067,7 +3264,7 @@ var mcpAaveV4DepositInputSchema = mcpAaveV4MultisignInput(
3067
3264
  var mcpAaveV4WithdrawInputSchema = mcpAaveV4MultisignInput(
3068
3265
  {
3069
3266
  spoke: evmAddressSchema.optional().describe("Omit \u2014 server resolves from Aave v4 API."),
3070
- underlying: evmAddressSchema.describe("Supplied asset to withdraw."),
3267
+ underlying: evmAddressSchema.describe("Supplied asset to withdraw. Address or bStock ticker (AAPLc)."),
3071
3268
  amountHuman: zod.z.string().min(1),
3072
3269
  marketId: mcpAaveV4MarketIdSchema,
3073
3270
  ...mcpAaveV4HealthPreviewFields
@@ -3077,10 +3274,14 @@ var mcpAaveV4WithdrawInputSchema = mcpAaveV4MultisignInput(
3077
3274
  var mcpAaveV4BorrowInputSchema = mcpAaveV4MultisignInput(
3078
3275
  {
3079
3276
  spoke: evmAddressSchema.optional().describe("Omit \u2014 server resolves from Aave v4 API."),
3080
- underlying: evmAddressSchema.describe("Debt asset to borrow (e.g. USDC), not collateral."),
3277
+ underlying: evmAddressSchema.describe(
3278
+ "Debt asset to borrow (e.g. USDC), not collateral. On bstocks the equities are not borrowable."
3279
+ ),
3081
3280
  amountHuman: zod.z.string().min(1),
3082
3281
  marketId: mcpAaveV4MarketIdSchema,
3083
- collateralUnderlying: evmAddressSchema.optional().describe("Collateral token already supplied; helps pick hub when debt exists on multiple hubs."),
3282
+ collateralUnderlying: evmAddressSchema.optional().describe(
3283
+ "Collateral token already supplied (address or bStock ticker such as AAPLc). Helps pick the hub when debt exists on multiple hubs."
3284
+ ),
3084
3285
  ...mcpAaveV4HealthPreviewFields
3085
3286
  },
3086
3287
  "borrow"
@@ -3088,7 +3289,7 @@ var mcpAaveV4BorrowInputSchema = mcpAaveV4MultisignInput(
3088
3289
  var mcpAaveV4RepayInputSchema = mcpAaveV4MultisignInput(
3089
3290
  {
3090
3291
  spoke: evmAddressSchema.optional().describe("Omit \u2014 server resolves from Aave v4 API."),
3091
- underlying: evmAddressSchema.describe("Debt token to repay."),
3292
+ underlying: evmAddressSchema.describe("Debt token to repay. On bstocks this is USDC."),
3092
3293
  amountHuman: zod.z.string().min(1),
3093
3294
  marketId: mcpAaveV4MarketIdSchema,
3094
3295
  ...mcpAaveV4HealthPreviewFields
@@ -4266,11 +4467,18 @@ var mcpMapleFetchMarketInputSchema = zod.z.object({
4266
4467
  underlying: zod.z.string().trim().min(1).optional().describe("Deposit asset address or ticker (USDC, USDT, USDG).")
4267
4468
  });
4268
4469
  var mcpMapleFetchMarketOutputSchema = mcpMapleFetchMarketsOutputSchema;
4269
- var mcpAaveV4UiMarketIdSchema = zod.z.enum(["main", "core", "bluechip"]).optional().describe("UI market segment: main (Plus), core, or bluechip (Prime). Omit to list all hubs.");
4470
+ var aaveV4UiMarketIdEnum = zod.z.enum(["main", "core", "bluechip", "bstocks"]);
4471
+ function preprocessAaveV4MarketId(value) {
4472
+ if (typeof value !== "string") return value;
4473
+ return parseAaveV4UiMarketId(value) ?? value;
4474
+ }
4475
+ var mcpAaveV4UiMarketIdSchema = zod.z.preprocess(preprocessAaveV4MarketId, aaveV4UiMarketIdEnum.optional()).describe(
4476
+ "UI market segment: main (Plus), core, bluechip (Prime), or bstocks (Base Coinbase tokenized stocks). Aliases: stocks, equities. Omit to list all hubs."
4477
+ );
4270
4478
  var mcpAaveV4MarketSummarySchema = zod.z.object({
4271
4479
  chainId: zod.z.number(),
4272
4480
  hubName: zod.z.string(),
4273
- marketId: zod.z.enum(["main", "core", "bluechip"]),
4481
+ marketId: aaveV4UiMarketIdEnum,
4274
4482
  hubAddress: zod.z.string(),
4275
4483
  symbol: zod.z.string(),
4276
4484
  name: zod.z.string(),
@@ -4290,7 +4498,9 @@ var mcpAaveV4MarketSummarySchema = zod.z.object({
4290
4498
  var mcpAaveV4FetchMarketsInputSchema = zod.z.object({
4291
4499
  chainId: agentEvmChainIdSchema,
4292
4500
  marketId: mcpAaveV4UiMarketIdSchema,
4293
- underlying: zod.z.string().trim().min(1).optional().describe("Optional filter: ERC-20 address or ticker (USDT, USDC). Omit to list all reserves.")
4501
+ underlying: zod.z.string().trim().min(1).optional().describe(
4502
+ 'Optional filter: ERC-20 address or ticker (USDT, USDC, AAPLc). "stock" lists bStock collateral. Omit to list all reserves.'
4503
+ )
4294
4504
  });
4295
4505
  var mcpAaveV4FetchMarketsOutputSchema = zod.z.object({
4296
4506
  chainId: zod.z.number(),
@@ -4299,14 +4509,21 @@ var mcpAaveV4FetchMarketsOutputSchema = zod.z.object({
4299
4509
  });
4300
4510
  var mcpAaveV4FetchMarketInputSchema = zod.z.object({
4301
4511
  chainId: agentEvmChainIdSchema,
4302
- underlying: zod.z.string().trim().min(1).describe("Reserve underlying address or ticker (e.g. USDT). Prefer fetch_markets when listing rates."),
4512
+ underlying: zod.z.string().trim().min(1).describe(
4513
+ "Reserve underlying address or ticker (USDT, AAPLc). Prefer fetch_markets or fetch_stock_markets when listing rates."
4514
+ ),
4303
4515
  marketId: mcpAaveV4UiMarketIdSchema
4304
4516
  });
4305
4517
  var mcpAaveV4FetchMarketOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
4518
+ var mcpAaveV4FetchStockMarketsInputSchema = zod.z.object({
4519
+ chainId: agentEvmChainIdSchema.optional().describe("Defaults to Base 8453 (Coinbase Stocks hub)."),
4520
+ underlying: zod.z.string().trim().min(1).optional().describe("B20 ticker or address (AAPLc), or USDC. Omit to list the whole Coinbase Stocks hub.")
4521
+ });
4522
+ var mcpAaveV4FetchStockMarketsOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
4306
4523
  var mcpEulerV2FetchLendVaultsInputSchema = zod.z.object({
4307
4524
  chainId: agentEvmChainIdSchema,
4308
4525
  underlyingAddress: evmAddressSchema.describe(
4309
- "Underlying asset address from get_defi_protocol_supported_tokens."
4526
+ "Underlying asset address, or a Coinbase stock ticker (AAPLc) from the live catalog."
4310
4527
  ),
4311
4528
  limit: agentCoercedOptionalIntSchema(zod.z.number().int().min(1).max(100)).describe("Max vault rows (default 30).")
4312
4529
  });
@@ -4328,7 +4545,7 @@ var mcpEulerV2FetchLendVaultsOutputSchema = zod.z.object({
4328
4545
  var mcpEulerV2FetchEarnVaultsInputSchema = zod.z.object({
4329
4546
  chainId: agentEvmChainIdSchema,
4330
4547
  underlyingAddress: evmAddressSchema.describe(
4331
- "Underlying asset address from get_defi_protocol_supported_tokens."
4548
+ "Underlying asset address, or a Coinbase stock ticker (AAPLc) from the live catalog."
4332
4549
  ),
4333
4550
  limit: agentCoercedOptionalIntSchema(zod.z.number().int().min(1).max(100)).describe("Max vault rows (default 30).")
4334
4551
  });
@@ -4423,7 +4640,7 @@ var mcpPendleFetchMerkleRewardsOutputSchema = jsonObjectSchema.describe(
4423
4640
  var mcpPendleQuoteSwapInputSchema = zod.z.object({
4424
4641
  chainId: agentEvmChainIdSchema,
4425
4642
  rpcUrl: zod.z.string().min(1).optional(),
4426
- tokenIn: zod.z.string().min(1).describe("Underlying, PT, or YT (0xeeee / 0x0 = native)."),
4643
+ tokenIn: zod.z.string().min(1).describe("Underlying, PT, YT, or Coinbase stock ticker (AAPLc). 0xeeee / 0x0 = native."),
4427
4644
  tokenOut: zod.z.string().min(1),
4428
4645
  amountHuman: zod.z.string().min(1),
4429
4646
  slippagePercent: zod.z.number().gt(0).lt(100),
@@ -6558,7 +6775,7 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
6558
6775
  actionId: "aave-v4.deposit",
6559
6776
  protocolId: "aave-v4",
6560
6777
  chainCategory: "evm",
6561
- description: "Build Aave v4 Spoke supply/deposit batch (wrap native, approve, supply).",
6778
+ description: "Build Aave v4 Spoke supply/deposit batch (wrap native, approve, supply). Base bStocks: marketId bstocks and underlying ticker (AAPLc) or address.",
6562
6779
  prerequisites: ["keyGenId", "chainId", "underlying", "amountHuman", "get_defi_protocol_skill for hubs/spokes"],
6563
6780
  handler: { importPath: "protocols/evm/aave-v4", exportName: "buildEvmMultisignBodyAaveV4DepositBatch" },
6564
6781
  inputZod: mcpAaveV4DepositInputSchema
@@ -6578,7 +6795,7 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
6578
6795
  actionId: "aave-v4.borrow",
6579
6796
  protocolId: "aave-v4",
6580
6797
  chainCategory: "evm",
6581
- description: "Build Aave v4 Spoke borrow; underlying is debt asset; collateral must be supplied first.",
6798
+ description: "Build Aave v4 Spoke borrow; underlying is the debt asset (USDC on bstocks). Equities are collateral-only. collateralUnderlying may be a bStock ticker (AAPLc).",
6582
6799
  prerequisites: [
6583
6800
  "keyGenId",
6584
6801
  "chainId",
@@ -10012,10 +10229,11 @@ var CORE_MCP_TOOL_DEFINITIONS = [
10012
10229
  actionId: "aave-v4.fetch-markets",
10013
10230
  protocolId: "aave-v4",
10014
10231
  chainCategory: "evm",
10015
- 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.",
10232
+ 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/bstocks) or underlying filter. Base tokenized stocks: marketId bstocks or ctm_aave_v4_fetch_stock_markets. Tickers (AAPLc) OK.",
10016
10233
  prerequisites: ["chainId", "get_defi_protocol_supported_chains"],
10017
10234
  followUp: [
10018
10235
  "ctm_aave_v4_fetch_market",
10236
+ "ctm_aave_v4_fetch_stock_markets",
10019
10237
  "ctm_aave_v4_build_deposit_multisign",
10020
10238
  "ctm_aave_v4_build_borrow_multisign"
10021
10239
  ],
@@ -10028,7 +10246,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
10028
10246
  actionId: "aave-v4.fetch-market",
10029
10247
  protocolId: "aave-v4",
10030
10248
  chainCategory: "evm",
10031
- 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.",
10249
+ description: "One Aave v4 reserve (or the same underlying across hubs) with supply/borrow APY and liquidity. Copy underlying + marketId for deposit/borrow/repay. Tickers OK (USDT, AAPLc). Do not web-search Aave rates.",
10032
10250
  prerequisites: ["chainId", "underlying from ctm_aave_v4_fetch_markets or get_defi_protocol_supported_tokens"],
10033
10251
  followUp: [
10034
10252
  "ctm_aave_v4_build_deposit_multisign",
@@ -10040,6 +10258,23 @@ var CORE_MCP_TOOL_DEFINITIONS = [
10040
10258
  inputZod: mcpAaveV4FetchMarketInputSchema,
10041
10259
  outputZod: mcpAaveV4FetchMarketOutputSchema
10042
10260
  }),
10261
+ defineMcpTool({
10262
+ name: "ctm_aave_v4_fetch_stock_markets",
10263
+ actionId: "aave-v4.fetch-stock-markets",
10264
+ protocolId: "aave-v4",
10265
+ chainCategory: "evm",
10266
+ description: "Coinbase tokenized stocks (bStocks) on the Aave v4 Coinbase Stocks hub, Base chainId 8453 by default. Equities (AAPLc, NVDAc, \u2026) are collateral-only; USDC is the borrow asset. Tickers OK. Same rows as ctm_aave_v4_fetch_markets with marketId bstocks. Chainlink feeds are 24/5. Not for U.S. persons.",
10267
+ prerequisites: ["chainId 8453 or omit"],
10268
+ followUp: [
10269
+ "ctm_aave_v4_build_deposit_multisign",
10270
+ "ctm_aave_v4_build_borrow_multisign",
10271
+ "ctm_aave_v4_build_repay_multisign",
10272
+ "ctm_aave_v4_build_withdraw_multisign"
10273
+ ],
10274
+ handler: { importPath: "protocols/evm/aave-v4", exportName: "aaveV4FetchStockMarketsSummary" },
10275
+ inputZod: mcpAaveV4FetchStockMarketsInputSchema,
10276
+ outputZod: mcpAaveV4FetchStockMarketsOutputSchema
10277
+ }),
10043
10278
  defineMcpTool({
10044
10279
  name: "ctm_aave_v4_fetch_merkl_rewards",
10045
10280
  actionId: "aave-v4.fetch-merkl-rewards",
@@ -11033,83 +11268,6 @@ var skyProtocolModule = {
11033
11268
  };
11034
11269
  registerProtocolModule(skyProtocolModule);
11035
11270
 
11036
- // src/protocols/evm/aave-v4/api.ts
11037
- init_defiProxy();
11038
- var AAVE_V4_GRAPHQL_URL = "https://api.v4.aave.com/graphql";
11039
- async function aaveV4Gql(query, variables) {
11040
- const body = { query, variables: variables ?? {} };
11041
- const j = await postJsonViaOptionalProxy({
11042
- directUrl: AAVE_V4_GRAPHQL_URL,
11043
- body,
11044
- proxyUrl: getAaveGraphqlProxyUrl(),
11045
- proxyEnvelope: body
11046
- });
11047
- if (j.errors?.length) {
11048
- const msg = j.errors.map((e) => e.message ?? "Unknown").join("; ");
11049
- throw new Error(msg);
11050
- }
11051
- if (j.data == null) {
11052
- throw new Error("Aave V4 API: empty response");
11053
- }
11054
- return j.data;
11055
- }
11056
- async function fetchAaveV4Chains() {
11057
- const d = await aaveV4Gql(`
11058
- query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }
11059
- `, { c: { query: { filter: "ALL" } } });
11060
- return d.chains ?? [];
11061
- }
11062
- async function loadAaveV4SupportedChainIdsFromV4Api() {
11063
- const rows = await fetchAaveV4Chains();
11064
- const s = /* @__PURE__ */ new Set();
11065
- for (const c of rows) s.add(c.chainId);
11066
- return s;
11067
- }
11068
- var RESERVES_ADDRESS_FRAGMENT = `
11069
- asset { underlying { address } }
11070
- `;
11071
- async function fetchAaveV4NativeWrappedToken(chainId) {
11072
- const all = await fetchAaveV4Chains();
11073
- const c = all.find((x) => x.chainId === chainId);
11074
- const t = (c?.nativeWrappedToken ?? "").trim();
11075
- if (t && viem.isAddress(t)) return viem.getAddress(t);
11076
- return null;
11077
- }
11078
- async function fetchAaveV4SupportedUnderlyingAddressSet(chainId) {
11079
- const d = await aaveV4Gql(
11080
- `
11081
- query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }
11082
- `,
11083
- {
11084
- r: {
11085
- query: { chainIds: [chainId] },
11086
- filter: "ALL",
11087
- orderBy: { supplyApy: "DESC" }
11088
- }
11089
- }
11090
- );
11091
- const s = /* @__PURE__ */ new Set();
11092
- for (const r of d.reserves ?? []) {
11093
- const a = (r.asset?.underlying?.address ?? "").trim();
11094
- if (a && viem.isAddress(a)) s.add(a.toLowerCase());
11095
- }
11096
- return s;
11097
- }
11098
- var aaveV4ChainTokenCache = /* @__PURE__ */ new Map();
11099
- function ensureAaveV4ChainTokenCache(chainId) {
11100
- const hit = aaveV4ChainTokenCache.get(chainId);
11101
- if (hit) return hit;
11102
- const p = (async () => {
11103
- const [nativeWrapped, supportedUnderlying] = await Promise.all([
11104
- fetchAaveV4NativeWrappedToken(chainId),
11105
- fetchAaveV4SupportedUnderlyingAddressSet(chainId)
11106
- ]);
11107
- return { supportedUnderlying, nativeWrapped };
11108
- })();
11109
- aaveV4ChainTokenCache.set(chainId, p);
11110
- return p;
11111
- }
11112
-
11113
11271
  // src/protocols/evm/aave-v4/index.ts
11114
11272
  var AAVE_V4_PROTOCOL_ID = "aave-v4";
11115
11273
  var aaveV4ProtocolModule = {
@@ -14209,6 +14367,7 @@ function getProtocolDiscoverySummary(protocolId) {
14209
14367
  }))
14210
14368
  };
14211
14369
  }
14370
+ init_coinbaseB20();
14212
14371
  init_support();
14213
14372
  init_support2();
14214
14373
  init_addresses();
@@ -14217,7 +14376,8 @@ init_constants();
14217
14376
  function advisor(protocolId, tokenFilter, impl) {
14218
14377
  return { protocolId, tokenFilter, ...impl };
14219
14378
  }
14220
- function aerodromeAdvisorPriorityTokens() {
14379
+ async function aerodromeAdvisorPriorityTokens() {
14380
+ const stocks = await ensureCoinbaseB20StockCatalog().catch(() => []);
14221
14381
  return [
14222
14382
  {
14223
14383
  address: "0x0000000000000000000000000000000000000000",
@@ -14243,11 +14403,11 @@ function aerodromeAdvisorPriorityTokens() {
14243
14403
  decimals: 18,
14244
14404
  roles: ["swappable"]
14245
14405
  },
14246
- ...COINBASE_B20_STOCK_TOKENS.map((t) => ({
14406
+ ...stocks.map((t) => ({
14247
14407
  address: t.address,
14248
14408
  symbol: t.symbol,
14249
14409
  name: t.name,
14250
- decimals: COINBASE_B20_STOCK_DECIMALS,
14410
+ decimals: t.decimals || COINBASE_B20_STOCK_DECIMALS,
14251
14411
  roles: ["swappable", "listed", "coinbase_b20"]
14252
14412
  }))
14253
14413
  ];
@@ -14260,10 +14420,18 @@ var PROTOCOL_SUPPORT_ADVISORS = {
14260
14420
  },
14261
14421
  async supportedTokens(chainId) {
14262
14422
  const cache = await ensureAaveV4ChainTokenCache(chainId);
14263
- const tokens = [...cache.supportedUnderlying].map((address) => ({
14264
- address,
14265
- roles: ["underlying"]
14266
- }));
14423
+ await ensureCoinbaseB20StockCatalog().catch(() => []);
14424
+ const tokens = [...cache.supportedUnderlying].map((address) => {
14425
+ const known = lookupCoinbaseB20StockToken(address);
14426
+ if (!known) return { address, roles: ["underlying"] };
14427
+ return {
14428
+ address,
14429
+ symbol: known.symbol,
14430
+ name: "name" in known ? known.name : void 0,
14431
+ decimals: COINBASE_B20_STOCK_DECIMALS,
14432
+ roles: ["underlying", "coinbase_b20", "collateral"]
14433
+ };
14434
+ });
14267
14435
  if (cache.nativeWrapped) {
14268
14436
  tokens.unshift({
14269
14437
  address: cache.nativeWrapped,
@@ -14274,7 +14442,7 @@ var PROTOCOL_SUPPORT_ADVISORS = {
14274
14442
  return {
14275
14443
  tokens,
14276
14444
  nativeWrapped: cache.nativeWrapped ?? void 0,
14277
- notes: "Native ETH deposits use wrapped native token address from Aave v4 API."
14445
+ notes: "Native ETH deposits use wrapped native token address from Aave v4 API. Base chainId 8453 Coinbase Stocks hub is marketId bstocks. Listed equities come from the Aave v4 API; tickers resolve from the live Coinbase catalog. Equities are collateral-only; USDC is the borrow asset."
14278
14446
  };
14279
14447
  },
14280
14448
  async isTokenSupported(chainId, address) {
@@ -14560,9 +14728,9 @@ var PROTOCOL_SUPPORT_ADVISORS = {
14560
14728
  return { tokens: [], notes: "Aerodrome is Base-only (chainId 8453)." };
14561
14729
  }
14562
14730
  return {
14563
- tokens: aerodromeAdvisorPriorityTokens(),
14731
+ tokens: await aerodromeAdvisorPriorityTokens(),
14564
14732
  nativeWrapped: AERODROME_WETH_BASE,
14565
- notes: "Slim directory: ETH, WETH, USDC, AERO, and Coinbase B20 stocks (AAPLc, \u2026). For a price call ctm_aerodrome_quote with tickers. To see pools for one token call ctm_aerodrome_discover_pools. Do not dump LpSugar."
14733
+ notes: "ETH, WETH, USDC, AERO, plus the live Coinbase B20 catalog. For a price call ctm_aerodrome_quote with a ticker. To see pools for one token call ctm_aerodrome_discover_pools. Do not dump LpSugar."
14566
14734
  };
14567
14735
  }
14568
14736
  }),
@@ -14872,6 +15040,8 @@ exports.mcpAaveV4FetchMarketInputSchema = mcpAaveV4FetchMarketInputSchema;
14872
15040
  exports.mcpAaveV4FetchMarketOutputSchema = mcpAaveV4FetchMarketOutputSchema;
14873
15041
  exports.mcpAaveV4FetchMarketsInputSchema = mcpAaveV4FetchMarketsInputSchema;
14874
15042
  exports.mcpAaveV4FetchMarketsOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
15043
+ exports.mcpAaveV4FetchStockMarketsInputSchema = mcpAaveV4FetchStockMarketsInputSchema;
15044
+ exports.mcpAaveV4FetchStockMarketsOutputSchema = mcpAaveV4FetchStockMarketsOutputSchema;
14875
15045
  exports.mcpAaveV4MerklClaimInputSchema = mcpAaveV4MerklClaimInputSchema;
14876
15046
  exports.mcpAaveV4RepayInputSchema = mcpAaveV4RepayInputSchema;
14877
15047
  exports.mcpAaveV4WithdrawInputSchema = mcpAaveV4WithdrawInputSchema;