@continuumdao/ctm-mpc-defi 0.2.24 → 0.2.26

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 (40) hide show
  1. package/dist/agent/catalog.cjs +1070 -19
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +2384 -1
  4. package/dist/agent/catalog.js +1027 -20
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/arcus/SKILL.md +76 -0
  7. package/dist/agent/skills/gmx/SKILL.md +2 -0
  8. package/dist/agent/skills/hyperliquid/SKILL.md +12 -3
  9. package/dist/agent/skills/morpho/SKILL.md +39 -0
  10. package/dist/agent/skills/uniswap-v4/SKILL.md +5 -0
  11. package/dist/agent/skills/venice/SKILL.md +29 -0
  12. package/dist/core/index.cjs +55 -0
  13. package/dist/core/index.cjs.map +1 -1
  14. package/dist/core/index.d.ts +28 -2
  15. package/dist/core/index.js +54 -1
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/index.cjs +55 -0
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +54 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/protocols/evm/arcus/index.cjs +2068 -0
  23. package/dist/protocols/evm/arcus/index.cjs.map +1 -0
  24. package/dist/protocols/evm/arcus/index.d.ts +728 -0
  25. package/dist/protocols/evm/arcus/index.js +1970 -0
  26. package/dist/protocols/evm/arcus/index.js.map +1 -0
  27. package/dist/protocols/evm/morpho/index.cjs +76 -2
  28. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  29. package/dist/protocols/evm/morpho/index.d.ts +22 -1
  30. package/dist/protocols/evm/morpho/index.js +68 -3
  31. package/dist/protocols/evm/morpho/index.js.map +1 -1
  32. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  33. package/dist/protocols/evm/uniswap-v4/index.d.ts +1 -1
  34. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  35. package/dist/protocols/evm/venice/index.cjs +936 -0
  36. package/dist/protocols/evm/venice/index.cjs.map +1 -0
  37. package/dist/protocols/evm/venice/index.d.ts +238 -0
  38. package/dist/protocols/evm/venice/index.js +901 -0
  39. package/dist/protocols/evm/venice/index.js.map +1 -0
  40. package/package.json +11 -1
@@ -9,6 +9,36 @@ var fs = require('fs');
9
9
  var path = require('path');
10
10
 
11
11
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __esm = (fn, res) => function __init() {
14
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
15
+ };
16
+
17
+ // src/protocols/evm/arcus/support.ts
18
+ function isArcusChainSupported(chainId) {
19
+ return ARCUS_SUPPORTED_CHAIN_IDS.includes(chainId);
20
+ }
21
+ var ARCUS_SUPPORTED_CHAIN_IDS;
22
+ var init_support = __esm({
23
+ "src/protocols/evm/arcus/support.ts"() {
24
+ ARCUS_SUPPORTED_CHAIN_IDS = [4663];
25
+ }
26
+ });
27
+
28
+ // src/protocols/evm/arcus/constants.ts
29
+ var ARCUS_PROTOCOL_ID;
30
+ var init_constants = __esm({
31
+ "src/protocols/evm/arcus/constants.ts"() {
32
+ ARCUS_PROTOCOL_ID = "arcus";
33
+ }
34
+ });
35
+
36
+ // src/protocols/evm/arcus/api.ts
37
+ var init_api = __esm({
38
+ "src/protocols/evm/arcus/api.ts"() {
39
+ }
40
+ });
41
+
12
42
  // src/core/registry.ts
13
43
  var modules = [];
14
44
  function registerProtocolModule(mod) {
@@ -1324,6 +1354,54 @@ var mcpCurveDaoBuildSwapMultisignInputSchema = withMultisignKeySourceRefine(
1324
1354
  })
1325
1355
  )
1326
1356
  );
1357
+
1358
+ // src/protocols/evm/morpho/robinhoodEarn.ts
1359
+ var ROBINHOOD_CHAIN_ID = 4663;
1360
+ var ROBINHOOD_EARN_VAULT_ADDRESS = "0xBeEff033F34C046626B8D0A041844C5d1A5409dd";
1361
+ var ROBINHOOD_EARN_VAULT_SYMBOL = "steakUSDG";
1362
+ var ROBINHOOD_EARN_VAULT_NAME = "Steakhouse USDG";
1363
+ var ROBINHOOD_EARN_USDG_ADDRESS = "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168";
1364
+ var ROBINHOOD_EARN_QUERY_ALIASES = [
1365
+ "robinhood earn",
1366
+ "robinhood-earn",
1367
+ "robinhood",
1368
+ "earn usdg",
1369
+ "steakhouse usdg",
1370
+ "steakusd g"
1371
+ ];
1372
+ function normalizeRobinhoodEarnQuery(query) {
1373
+ return query.trim().toLowerCase().replace(/\s+/g, " ");
1374
+ }
1375
+ function isRobinhoodEarnQuery(query) {
1376
+ if (!query?.trim()) return false;
1377
+ const q = normalizeRobinhoodEarnQuery(query);
1378
+ if (q === ROBINHOOD_EARN_VAULT_ADDRESS.toLowerCase()) return true;
1379
+ return ROBINHOOD_EARN_QUERY_ALIASES.some((alias) => q === alias || q.includes(alias));
1380
+ }
1381
+ function isRobinhoodEarnProductFlag(raw) {
1382
+ if (raw === true || raw === "true") return true;
1383
+ if (typeof raw !== "string") return false;
1384
+ const v = raw.trim().toLowerCase();
1385
+ return v === "robinhood-earn" || v === "robinhood_earn" || v === "robinhood earn";
1386
+ }
1387
+ function applyRobinhoodEarnMultisignDefaults(o) {
1388
+ const flagged = o.robinhoodEarn === true || isRobinhoodEarnProductFlag(o.robinhoodEarn) || isRobinhoodEarnProductFlag(o.product) || isRobinhoodEarnQuery(String(o.query ?? o.vaultName ?? ""));
1389
+ if (!flagged) return;
1390
+ const chainRaw = o.chainId;
1391
+ const chainId = chainRaw == null || chainRaw === "" ? ROBINHOOD_CHAIN_ID : typeof chainRaw === "number" ? chainRaw : Number.parseInt(String(chainRaw), chainRaw.toString().startsWith("0x") ? 16 : 10);
1392
+ if (!Number.isFinite(chainId) || chainId !== ROBINHOOD_CHAIN_ID) return;
1393
+ if (chainRaw == null || chainRaw === "") o.chainId = ROBINHOOD_CHAIN_ID;
1394
+ const vaultAddr = o.vaultAddress ?? o.vault ?? ROBINHOOD_EARN_VAULT_ADDRESS;
1395
+ o.vaultAddress = vaultAddr;
1396
+ o.vault = vaultAddr;
1397
+ const underlyingAddr = o.underlyingAddress ?? o.underlying ?? ROBINHOOD_EARN_USDG_ADDRESS;
1398
+ o.underlyingAddress = underlyingAddr;
1399
+ o.underlying = underlyingAddr;
1400
+ o.vaultName = o.vaultName ?? ROBINHOOD_EARN_VAULT_NAME;
1401
+ o.vaultSymbol = o.vaultSymbol ?? ROBINHOOD_EARN_VAULT_SYMBOL;
1402
+ }
1403
+
1404
+ // src/agent/schemas/morpho.ts
1327
1405
  var morphoExposureRowSchema = zod.z.object({
1328
1406
  label: zod.z.string(),
1329
1407
  allocatedUsdLabel: zod.z.string(),
@@ -1332,6 +1410,7 @@ var morphoExposureRowSchema = zod.z.object({
1332
1410
  function preprocessMorphoVaultDepositInput(raw) {
1333
1411
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) return raw;
1334
1412
  const o = { ...raw };
1413
+ applyRobinhoodEarnMultisignDefaults(o);
1335
1414
  const vaultAddr = o.vaultAddress ?? o.vault;
1336
1415
  if (vaultAddr != null) {
1337
1416
  o.vaultAddress = vaultAddr;
@@ -1354,6 +1433,7 @@ function preprocessMorphoVaultDepositInput(raw) {
1354
1433
  function preprocessMorphoVaultWithdrawInput(raw) {
1355
1434
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) return raw;
1356
1435
  const o = { ...raw };
1436
+ applyRobinhoodEarnMultisignDefaults(o);
1357
1437
  const vaultAddr = o.vaultAddress ?? o.vault;
1358
1438
  if (vaultAddr != null) {
1359
1439
  o.vaultAddress = vaultAddr;
@@ -1371,7 +1451,9 @@ function preprocessMorphoVaultWithdrawInput(raw) {
1371
1451
  var mcpMorphoFetchEarnVaultsInputSchema = zod.z.object({
1372
1452
  chainId: agentEvmChainIdSchema,
1373
1453
  underlying: zod.z.string().trim().min(1).optional().describe("Deposit asset symbol (e.g. USDC) or ERC-20 address. Omit to search all listed vaults on the chain."),
1374
- query: zod.z.string().trim().min(1).optional().describe("Case-insensitive filter on vault name, symbol, address, or underlying symbol (e.g. Steakhouse, bbqUSDC)."),
1454
+ query: zod.z.string().trim().min(1).optional().describe(
1455
+ 'Case-insensitive filter on vault name, symbol, address, or underlying symbol (e.g. Steakhouse, bbqUSDC). On chain 4663, "robinhood earn" resolves to Steakhouse USDG (Robinhood Earn vault).'
1456
+ ),
1375
1457
  limit: agentCoercedOptionalIntSchema(zod.z.number().int().min(1).max(200)).describe("Max rows (default 50).")
1376
1458
  });
1377
1459
  var mcpMorphoFetchEarnVaultsOutputSchema = zod.z.object({
@@ -1616,6 +1698,79 @@ var mcpEulerV2CollateralWithdrawInputSchema = mcpMultisignInput({
1616
1698
  collateralAsset: evmAddressSchema,
1617
1699
  amountHuman: zod.z.string().min(1)
1618
1700
  });
1701
+ var mcpVeniceStakeVvvInputSchema = mcpMultisignInput({
1702
+ amountHuman: zod.z.string().min(1)
1703
+ });
1704
+ var mcpVeniceInitiateUnstakeSvvvInputSchema = mcpMultisignInput({
1705
+ amountHuman: zod.z.string().min(1)
1706
+ });
1707
+ var mcpVeniceCompleteUnstakeSvvvInputSchema = mcpMultisignInput({});
1708
+ var mcpVeniceMintDiemInputSchema = mcpMultisignInput({
1709
+ svvvLockAmountHuman: zod.z.string().min(1),
1710
+ slippageBps: zod.z.number().int().min(0).max(1e4).optional()
1711
+ });
1712
+ var mcpVeniceBurnDiemInputSchema = mcpMultisignInput({
1713
+ amountHuman: zod.z.string().min(1)
1714
+ });
1715
+ var mcpVeniceStakeDiemInputSchema = mcpMultisignInput({
1716
+ amountHuman: zod.z.string().min(1)
1717
+ });
1718
+ var mcpVeniceInitiateUnstakeDiemInputSchema = mcpMultisignInput({
1719
+ amountHuman: zod.z.string().min(1)
1720
+ });
1721
+ var mcpVeniceCompleteUnstakeDiemInputSchema = mcpMultisignInput({});
1722
+ var mcpVeniceListModelsInputSchema = zod.z.object({
1723
+ type: zod.z.string().optional().describe("Model type filter: text, image, video, all, etc."),
1724
+ apiKey: zod.z.string().min(1).optional().describe("Injected from VENICE_API_KEY node Variable \u2014 do not pass")
1725
+ });
1726
+ var mcpVeniceReadStakingStateInputSchema = zod.z.object({
1727
+ rpcUrl: zod.z.string().min(1),
1728
+ executorAddress: evmAddressSchema,
1729
+ chainId: agentEvmChainIdSchema.optional().describe("Default 8453 (Base)")
1730
+ });
1731
+ var mcpVeniceReadMintDiemPreviewInputSchema = zod.z.object({
1732
+ rpcUrl: zod.z.string().min(1),
1733
+ svvvLockAmountHuman: zod.z.string().min(1)
1734
+ });
1735
+ var mcpVeniceListModelsOutputSchema = zod.z.object({
1736
+ type: zod.z.string(),
1737
+ count: zod.z.number(),
1738
+ models: zod.z.array(
1739
+ zod.z.object({
1740
+ id: zod.z.string(),
1741
+ type: zod.z.string().optional(),
1742
+ offline: zod.z.boolean().optional(),
1743
+ beta: zod.z.boolean().optional()
1744
+ })
1745
+ )
1746
+ });
1747
+ var mcpVeniceReadStakingStateOutputSchema = zod.z.object({
1748
+ chainId: zod.z.number(),
1749
+ wallet: zod.z.string(),
1750
+ balances: zod.z.object({
1751
+ vvvWei: zod.z.string(),
1752
+ svvvWei: zod.z.string(),
1753
+ diemWei: zod.z.string(),
1754
+ diemStakedWei: zod.z.string()
1755
+ }),
1756
+ diemCooldown: zod.z.object({
1757
+ pendingUnstakeWei: zod.z.string(),
1758
+ unlockAtSec: zod.z.string(),
1759
+ cooldownDurationSec: zod.z.string()
1760
+ }),
1761
+ svvvCooldownDurationSec: zod.z.string(),
1762
+ mintRateSvvcPerDiem: zod.z.number(),
1763
+ diemTotalSupplyWei: zod.z.string(),
1764
+ estimatedApiCreditUsdPerDay: zod.z.string()
1765
+ });
1766
+ var mcpVeniceReadMintDiemPreviewOutputSchema = zod.z.object({
1767
+ svvvLockAmountHuman: zod.z.string(),
1768
+ svvvLockWei: zod.z.string(),
1769
+ mintRateSvvcPerDiem: zod.z.number(),
1770
+ expectedDiemWei: zod.z.string(),
1771
+ diemTotalSupplyWei: zod.z.string(),
1772
+ stakingContract: zod.z.string()
1773
+ });
1619
1774
  var mcpMorphoVaultDepositInputSchema = withMultisignKeySourceRefine(
1620
1775
  zod.z.preprocess(
1621
1776
  preprocessMorphoVaultDepositInput,
@@ -1629,6 +1784,9 @@ var mcpMorphoVaultDepositInputSchema = withMultisignKeySourceRefine(
1629
1784
  amountHuman: zod.z.string().min(1).describe('Human-readable deposit amount (e.g. "1000" USDC).'),
1630
1785
  vaultName: zod.z.string().optional().describe("Optional vaultName from fetch row (fills purposeText when omitted)."),
1631
1786
  vaultSymbol: zod.z.string().optional().describe("Optional vaultSymbol from fetch row."),
1787
+ robinhoodEarn: agentOptionalBooleanSchema().describe(
1788
+ "When true on chain 4663, pre-fills Robinhood Earn vault (Steakhouse USDG / steakUSDG) and USDG underlying."
1789
+ ),
1632
1790
  isNativeIn: agentOptionalBooleanSchema()
1633
1791
  })
1634
1792
  )
@@ -1642,7 +1800,10 @@ var mcpMorphoVaultWithdrawInputSchema = withMultisignKeySourceRefine(
1642
1800
  ),
1643
1801
  amountHuman: zod.z.string().min(1),
1644
1802
  vaultName: zod.z.string().optional(),
1645
- vaultSymbol: zod.z.string().optional()
1803
+ vaultSymbol: zod.z.string().optional(),
1804
+ robinhoodEarn: agentOptionalBooleanSchema().describe(
1805
+ "When true on chain 4663, pre-fills Robinhood Earn vault (Steakhouse USDG / steakUSDG)."
1806
+ )
1646
1807
  })
1647
1808
  )
1648
1809
  );
@@ -2239,6 +2400,213 @@ var mcpHyperliquidUpdateLeverageInputSchema = mcpHyperliquidMultisignInput(
2239
2400
  },
2240
2401
  preprocessHyperliquidCoinInput
2241
2402
  );
2403
+ var arcusFetchChainInputSchema = zod.z.object({
2404
+ chainId: zod.z.coerce.number().int().positive().default(4663).describe("Robinhood Chain (4663).")
2405
+ });
2406
+ var arcusOhlcvCandleSchema = zod.z.object({
2407
+ timestampMs: zod.z.number(),
2408
+ open: zod.z.string(),
2409
+ high: zod.z.string(),
2410
+ low: zod.z.string(),
2411
+ close: zod.z.string(),
2412
+ volume: zod.z.string()
2413
+ });
2414
+ var arcusOhlcvEnvelopeSchema = zod.z.object({
2415
+ ohlcv: zod.z.object({
2416
+ market: zod.z.string().optional(),
2417
+ coin: zod.z.string().optional(),
2418
+ tokenAddress: zod.z.string().optional(),
2419
+ interval: zod.z.string(),
2420
+ marketKind: zod.z.enum(["perp", "spot"]).optional(),
2421
+ candles: zod.z.array(arcusOhlcvCandleSchema),
2422
+ candleCount: zod.z.number().optional(),
2423
+ latestCandle: arcusOhlcvCandleSchema.nullable().optional(),
2424
+ dataSource: zod.z.literal("arcus").optional()
2425
+ }),
2426
+ dataSource: zod.z.literal("arcus").optional(),
2427
+ chainId: zod.z.number().optional(),
2428
+ resolvedMarket: zod.z.string().optional()
2429
+ });
2430
+ function mcpArcusMultisignInput(fields) {
2431
+ return withMultisignKeySourceRefine(
2432
+ evmMultisignCommonInputSchema.extend({
2433
+ secp256k1KeyGenId: zod.z.string().min(1).describe("Custody secp256k1 KeyGen id (billing + executor address)."),
2434
+ ed25519KeyGenId: zod.z.string().min(1).describe("Paired ed25519 KeyGen id (same GroupId) for Arcus API signing."),
2435
+ ...fields
2436
+ })
2437
+ );
2438
+ }
2439
+ var mcpArcusFetchMarketsInputSchema = arcusFetchChainInputSchema;
2440
+ var mcpArcusFetchMarketsOutputSchema = zod.z.object({
2441
+ markets: zod.z.array(
2442
+ zod.z.object({
2443
+ marketDisplayName: zod.z.string(),
2444
+ marketId: zod.z.number(),
2445
+ baseAsset: zod.z.string().optional(),
2446
+ category: zod.z.string().optional(),
2447
+ status: zod.z.string().optional(),
2448
+ markPrice: zod.z.string().nullable().optional()
2449
+ })
2450
+ ),
2451
+ marketKind: zod.z.literal("perp")
2452
+ });
2453
+ var mcpArcusSearchMarketsInputSchema = arcusFetchChainInputSchema.extend({
2454
+ query: zod.z.string().min(1),
2455
+ limit: zod.z.coerce.number().int().positive().max(50).optional()
2456
+ });
2457
+ var mcpArcusSearchMarketsOutputSchema = mcpArcusFetchMarketsOutputSchema;
2458
+ var mcpArcusFetchOhlcvInputSchema = arcusFetchChainInputSchema.extend({
2459
+ market: zod.z.string().optional(),
2460
+ coin: zod.z.string().optional(),
2461
+ interval: zod.z.string().optional(),
2462
+ lookbackDays: zod.z.coerce.number().positive().optional(),
2463
+ lookbackHours: zod.z.coerce.number().positive().optional(),
2464
+ candleCount: zod.z.coerce.number().int().positive().max(1500).optional()
2465
+ });
2466
+ var mcpArcusFetchOhlcvOutputSchema = arcusOhlcvEnvelopeSchema;
2467
+ var mcpArcusSpotFetchMarketsInputSchema = arcusFetchChainInputSchema;
2468
+ var mcpArcusSpotFetchMarketsOutputSchema = zod.z.object({
2469
+ tokens: zod.z.array(
2470
+ zod.z.object({
2471
+ ticker: zod.z.string(),
2472
+ contractAddress: zod.z.string(),
2473
+ name: zod.z.string(),
2474
+ logoUrl: zod.z.string().nullable().optional(),
2475
+ price: zod.z.string().nullable().optional()
2476
+ })
2477
+ ),
2478
+ marketKind: zod.z.literal("spot")
2479
+ });
2480
+ var mcpArcusSpotFetchOhlcvInputSchema = arcusFetchChainInputSchema.extend({
2481
+ ticker: zod.z.string().optional(),
2482
+ tokenAddress: zod.z.string().optional(),
2483
+ currencySymbol: zod.z.string().optional(),
2484
+ interval: zod.z.string().optional(),
2485
+ lookbackDays: zod.z.coerce.number().positive().optional(),
2486
+ candleCount: zod.z.coerce.number().int().positive().optional()
2487
+ });
2488
+ var mcpArcusSpotFetchOhlcvOutputSchema = arcusOhlcvEnvelopeSchema;
2489
+ var mcpArcusFetchMarketSnapshotInputSchema = arcusFetchChainInputSchema.extend({
2490
+ market: zod.z.string().optional(),
2491
+ coin: zod.z.string().optional(),
2492
+ interval: zod.z.string().optional(),
2493
+ candleLimit: zod.z.coerce.number().int().positive().optional()
2494
+ });
2495
+ var mcpArcusFetchMarketSnapshotOutputSchema = zod.z.object({
2496
+ snapshot: zod.z.object({
2497
+ market: zod.z.string(),
2498
+ midUsd: zod.z.string(),
2499
+ interval: zod.z.string(),
2500
+ latestCandle: arcusOhlcvCandleSchema.nullable().optional(),
2501
+ candles: zod.z.array(arcusOhlcvCandleSchema),
2502
+ candleCount: zod.z.number(),
2503
+ fetchedAtMs: zod.z.number()
2504
+ }),
2505
+ resolvedMarket: zod.z.string()
2506
+ });
2507
+ var mcpArcusFetchAccountInputSchema = arcusFetchChainInputSchema.extend({
2508
+ executorAddress: evmAddressSchema
2509
+ });
2510
+ var mcpArcusFetchAccountOutputSchema = zod.z.object({
2511
+ account: jsonObjectSchema,
2512
+ executorAddress: evmAddressSchema
2513
+ });
2514
+ var mcpArcusFetchPositionsInputSchema = mcpArcusFetchAccountInputSchema;
2515
+ var mcpArcusFetchPositionsOutputSchema = zod.z.object({
2516
+ positions: zod.z.array(jsonObjectSchema),
2517
+ executorAddress: evmAddressSchema
2518
+ });
2519
+ var mcpArcusFetchOpenOrdersInputSchema = mcpArcusFetchAccountInputSchema;
2520
+ var mcpArcusFetchOpenOrdersOutputSchema = zod.z.object({
2521
+ orders: zod.z.array(jsonObjectSchema),
2522
+ executorAddress: evmAddressSchema
2523
+ });
2524
+ var mcpArcusFetchOpenContextInputSchema = mcpArcusFetchAccountInputSchema.extend({
2525
+ market: zod.z.string().optional().describe("Perp market display name (e.g. BTC-USD) to include activeAsset leverage context.")
2526
+ });
2527
+ var mcpArcusFetchOpenContextOutputSchema = zod.z.object({
2528
+ account: jsonObjectSchema.nullable(),
2529
+ positions: zod.z.array(jsonObjectSchema),
2530
+ orders: zod.z.array(jsonObjectSchema),
2531
+ apiKeys: zod.z.array(jsonObjectSchema),
2532
+ leverages: zod.z.array(
2533
+ zod.z.object({
2534
+ marketId: zod.z.number(),
2535
+ marketDisplayName: zod.z.string(),
2536
+ leverage: zod.z.number()
2537
+ })
2538
+ ).optional(),
2539
+ activeAsset: zod.z.object({
2540
+ market: zod.z.string(),
2541
+ leverage: zod.z.number().nullable(),
2542
+ leverageLabel: zod.z.string().nullable(),
2543
+ maxLeverage: zod.z.number().nullable(),
2544
+ markPrice: zod.z.string().nullable()
2545
+ }).nullable().optional(),
2546
+ executorAddress: evmAddressSchema,
2547
+ hasRegisteredApiKey: zod.z.boolean()
2548
+ });
2549
+ var mcpArcusSpotFetchBalancesInputSchema = mcpArcusFetchAccountInputSchema;
2550
+ var mcpArcusSpotFetchBalancesOutputSchema = zod.z.object({
2551
+ balances: zod.z.array(
2552
+ zod.z.object({
2553
+ ticker: zod.z.string(),
2554
+ contractAddress: zod.z.string(),
2555
+ balanceHuman: zod.z.string(),
2556
+ balanceRaw: zod.z.string()
2557
+ })
2558
+ ),
2559
+ executorAddress: evmAddressSchema
2560
+ });
2561
+ var mcpArcusBuildCreateApiKeyMultisignInputSchema = mcpArcusMultisignInput({
2562
+ ed25519PubKeyHex: zod.z.string().min(64).max(66).describe("Ed25519 public key (64 hex) from paired ed25519 KeyGen."),
2563
+ apiWalletName: zod.z.string().optional()
2564
+ });
2565
+ var mcpArcusBuildPlaceOrderMultisignInputSchema = mcpArcusMultisignInput({
2566
+ market: zod.z.string().min(1),
2567
+ isBuy: agentBooleanSchema(),
2568
+ limitPxHuman: zod.z.string().min(1),
2569
+ szHuman: zod.z.string().min(1),
2570
+ takeProfitTriggerPxHuman: zod.z.string().optional(),
2571
+ stopLossTriggerPxHuman: zod.z.string().optional(),
2572
+ leverageHuman: zod.z.string().optional().describe("Effective leverage label for purpose/audit (e.g. 10x). Fetch from open_context.activeAsset."),
2573
+ timeInForce: zod.z.coerce.number().int().min(0).max(3).optional().describe("Wire t: 0 GTT (default), 1 FOK, 2 IOC, 3 ALO."),
2574
+ clientId: zod.z.string().optional()
2575
+ });
2576
+ var mcpArcusBuildCloseMultisignInputSchema = mcpArcusMultisignInput({
2577
+ market: zod.z.string().min(1),
2578
+ isLong: agentBooleanSchema().describe("true when closing a long position (submits sell reduce-only IoC)."),
2579
+ limitPxHuman: zod.z.string().min(1),
2580
+ szHuman: zod.z.string().min(1),
2581
+ timeInForce: zod.z.coerce.number().int().min(0).max(3).optional().describe("Default 2 (IOC) for closes.")
2582
+ });
2583
+ var mcpArcusBuildCancelOrderMultisignInputSchema = mcpArcusMultisignInput({
2584
+ market: zod.z.string().min(1),
2585
+ orderId: zod.z.string().min(1)
2586
+ });
2587
+ var mcpArcusBuildSetLeverageMultisignInputSchema = mcpArcusMultisignInput({
2588
+ market: zod.z.string().min(1),
2589
+ leverage: zod.z.coerce.number().int().positive().max(100)
2590
+ });
2591
+ var mcpArcusSpotBuildRfqMultisignInputSchema = mcpArcusMultisignInput({
2592
+ ticker: zod.z.string().min(1),
2593
+ isBuy: agentBooleanSchema(),
2594
+ sizeHuman: zod.z.string().min(1),
2595
+ limitPxHuman: zod.z.string().optional()
2596
+ });
2597
+ var arcusFundProductSchema = zod.z.enum(["perp", "spot"]).default("perp").describe("perp = accountIndex 0; spot = accountIndex 1 (USDG Spot bucket).");
2598
+ var mcpArcusBuildDepositMultisignInputSchema = withMultisignKeySourceRefine(
2599
+ evmMultisignCommonInputSchema.extend({
2600
+ usdHuman: zod.z.string().min(1).describe("USD amount of USDG to deposit on chain 4663."),
2601
+ product: arcusFundProductSchema
2602
+ })
2603
+ );
2604
+ var mcpArcusBuildWithdrawMultisignInputSchema = withMultisignKeySourceRefine(
2605
+ evmMultisignCommonInputSchema.extend({
2606
+ usdHuman: zod.z.string().min(1).describe("USD amount to withdraw (min $1)."),
2607
+ product: arcusFundProductSchema
2608
+ })
2609
+ );
2242
2610
  var mcpCctpFeeFieldsSchema = zod.z.object({
2243
2611
  feeTierUsed: zod.z.enum(["low", "med", "high"]),
2244
2612
  maxFee: zod.z.string().describe("Selected tier max fee in USDC base units (6 decimals)"),
@@ -2409,6 +2777,98 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2409
2777
  handler: { importPath: "protocols/evm/ethena", exportName: "buildEvmMultisignBodyEthenaUnstakeClaim" },
2410
2778
  inputZod: mcpEthenaClaimInputSchema
2411
2779
  }),
2780
+ defineProtocolMcpTool({
2781
+ name: "ctm_venice_build_stake_vvv_multisign",
2782
+ actionId: "venice.stake-vvv",
2783
+ protocolId: "venice",
2784
+ chainCategory: "evm",
2785
+ description: "Build batch: VVV approve + stake \u2192 sVVV on Base.",
2786
+ prerequisites: ["keyGen", "executorAddress", "Base RPC (chainId 8453)"],
2787
+ handler: { importPath: "protocols/evm/venice", exportName: "buildEvmMultisignBodyVeniceStakeVvv" },
2788
+ inputZod: mcpVeniceStakeVvvInputSchema
2789
+ }),
2790
+ defineProtocolMcpTool({
2791
+ name: "ctm_venice_build_initiate_unstake_svvv_multisign",
2792
+ actionId: "venice.initiate-unstake-svvv",
2793
+ protocolId: "venice",
2794
+ chainCategory: "evm",
2795
+ description: "Start sVVV unstake (7-day cooldown) on Base.",
2796
+ prerequisites: ["keyGen", "executorAddress", "Base RPC"],
2797
+ handler: {
2798
+ importPath: "protocols/evm/venice",
2799
+ exportName: "buildEvmMultisignBodyVeniceInitiateUnstakeSvvv"
2800
+ },
2801
+ inputZod: mcpVeniceInitiateUnstakeSvvvInputSchema
2802
+ }),
2803
+ defineProtocolMcpTool({
2804
+ name: "ctm_venice_build_complete_unstake_svvv_multisign",
2805
+ actionId: "venice.complete-unstake-svvv",
2806
+ protocolId: "venice",
2807
+ chainCategory: "evm",
2808
+ description: "Claim VVV after sVVV unstake cooldown on Base.",
2809
+ prerequisites: ["keyGen", "executorAddress", "Base RPC", "pending sVVV unstake"],
2810
+ handler: {
2811
+ importPath: "protocols/evm/venice",
2812
+ exportName: "buildEvmMultisignBodyVeniceCompleteUnstakeSvvv"
2813
+ },
2814
+ inputZod: mcpVeniceCompleteUnstakeSvvvInputSchema
2815
+ }),
2816
+ defineProtocolMcpTool({
2817
+ name: "ctm_venice_build_mint_diem_multisign",
2818
+ actionId: "venice.mint-diem",
2819
+ protocolId: "venice",
2820
+ chainCategory: "evm",
2821
+ description: "Lock sVVV and mint DIEM on Base (preview with ctm_venice_read_mint_diem_preview).",
2822
+ prerequisites: ["keyGen", "executorAddress", "Base RPC", "sVVV balance"],
2823
+ handler: { importPath: "protocols/evm/venice", exportName: "buildEvmMultisignBodyVeniceMintDiem" },
2824
+ inputZod: mcpVeniceMintDiemInputSchema
2825
+ }),
2826
+ defineProtocolMcpTool({
2827
+ name: "ctm_venice_build_burn_diem_multisign",
2828
+ actionId: "venice.burn-diem",
2829
+ protocolId: "venice",
2830
+ chainCategory: "evm",
2831
+ description: "Burn DIEM to unlock locked sVVV on Base.",
2832
+ prerequisites: ["keyGen", "executorAddress", "Base RPC", "DIEM balance"],
2833
+ handler: { importPath: "protocols/evm/venice", exportName: "buildEvmMultisignBodyVeniceBurnDiem" },
2834
+ inputZod: mcpVeniceBurnDiemInputSchema
2835
+ }),
2836
+ defineProtocolMcpTool({
2837
+ name: "ctm_venice_build_stake_diem_multisign",
2838
+ actionId: "venice.stake-diem",
2839
+ protocolId: "venice",
2840
+ chainCategory: "evm",
2841
+ description: "Stake DIEM for Venice API credits ($1/day per DIEM) on Base.",
2842
+ prerequisites: ["keyGen", "executorAddress", "Base RPC", "DIEM balance"],
2843
+ handler: { importPath: "protocols/evm/venice", exportName: "buildEvmMultisignBodyVeniceStakeDiem" },
2844
+ inputZod: mcpVeniceStakeDiemInputSchema
2845
+ }),
2846
+ defineProtocolMcpTool({
2847
+ name: "ctm_venice_build_initiate_unstake_diem_multisign",
2848
+ actionId: "venice.initiate-unstake-diem",
2849
+ protocolId: "venice",
2850
+ chainCategory: "evm",
2851
+ description: "Start DIEM unstake (1-day cooldown) on Base.",
2852
+ prerequisites: ["keyGen", "executorAddress", "Base RPC", "staked DIEM"],
2853
+ handler: {
2854
+ importPath: "protocols/evm/venice",
2855
+ exportName: "buildEvmMultisignBodyVeniceInitiateUnstakeDiem"
2856
+ },
2857
+ inputZod: mcpVeniceInitiateUnstakeDiemInputSchema
2858
+ }),
2859
+ defineProtocolMcpTool({
2860
+ name: "ctm_venice_build_complete_unstake_diem_multisign",
2861
+ actionId: "venice.complete-unstake-diem",
2862
+ protocolId: "venice",
2863
+ chainCategory: "evm",
2864
+ description: "Claim DIEM after staked-DIEM unstake cooldown on Base.",
2865
+ prerequisites: ["keyGen", "executorAddress", "Base RPC", "pending DIEM unstake"],
2866
+ handler: {
2867
+ importPath: "protocols/evm/venice",
2868
+ exportName: "buildEvmMultisignBodyVeniceCompleteUnstakeDiem"
2869
+ },
2870
+ inputZod: mcpVeniceCompleteUnstakeDiemInputSchema
2871
+ }),
2412
2872
  defineProtocolMcpTool({
2413
2873
  name: "ctm_maple_build_deposit_multisign",
2414
2874
  actionId: "maple-syrup.deposit",
@@ -2610,11 +3070,11 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2610
3070
  actionId: "morpho.vault-deposit",
2611
3071
  protocolId: "morpho",
2612
3072
  chainCategory: "evm",
2613
- description: "Build Morpho vault deposit batch (wrap/approve + deposit). Works with listed V1 and V2 vaults.",
3073
+ description: "Build Morpho vault deposit batch (wrap/approve + deposit). Works with listed V1 and V2 vaults. On chain 4663, robinhoodEarn: true pre-fills Robinhood Earn (Steakhouse USDG).",
2614
3074
  prerequisites: [
2615
3075
  "keyGenId",
2616
3076
  "chainId",
2617
- "vaultAddress + underlyingAddress from ctm_morpho_fetch_earn_vaults",
3077
+ "vaultAddress + underlyingAddress from ctm_morpho_fetch_earn_vaults (or robinhoodEarn: true on 4663)",
2618
3078
  "amountHuman"
2619
3079
  ],
2620
3080
  handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoVaultDepositBatch" },
@@ -2625,11 +3085,11 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2625
3085
  actionId: "morpho.vault-withdraw",
2626
3086
  protocolId: "morpho",
2627
3087
  chainCategory: "evm",
2628
- description: "Build Morpho vault withdraw batch. Works with listed V1 and V2 vaults.",
3088
+ description: "Build Morpho vault withdraw batch. Works with listed V1 and V2 vaults. On chain 4663, robinhoodEarn: true pre-fills Robinhood Earn (Steakhouse USDG).",
2629
3089
  prerequisites: [
2630
3090
  "keyGenId",
2631
3091
  "chainId",
2632
- "vaultAddress from ctm_morpho_fetch_earn_vaults or user positions",
3092
+ "vaultAddress from ctm_morpho_fetch_earn_vaults or user positions (or robinhoodEarn: true on 4663)",
2633
3093
  "amountHuman"
2634
3094
  ],
2635
3095
  handler: { importPath: "protocols/evm/morpho", exportName: "buildEvmMultisignBodyMorphoVaultWithdraw" },
@@ -2690,8 +3150,8 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2690
3150
  actionId: "gmx.increase",
2691
3151
  protocolId: "gmx",
2692
3152
  chainCategory: "evm",
2693
- description: "Create and submit mpc-auth multiSignRequest for GMX classic increase order (open/add perp). Optional takeProfitPriceUsdHuman / stopLossPriceUsdHuman attach native TP/SL decrease orders (full size). Keeper executes asynchronously after on-chain broadcast.",
2694
- prerequisites: ["keyGen", "executorAddress", "GMX market symbol", "classic mode only \u2014 no subaccounts"],
3153
+ description: "Create and submit mpc-auth multiSignRequest for GMX classic increase order (open/add perp). Optional takeProfitPriceUsdHuman / stopLossPriceUsdHuman attach native on-chain TP/SL decrease orders (full size). On-chain EVM \u2014 useCustomGas applies (not EIP-712). Keeper executes asynchronously after broadcast.",
3154
+ prerequisites: ["keyGenId", "chainId", "purposeText", "GMX market symbol", "classic mode only \u2014 no subaccounts"],
2695
3155
  handler: { importPath: "protocols/evm/gmx", exportName: "buildEvmMultisignBodyGmxIncreaseBatch" },
2696
3156
  inputZod: mcpGmxIncreaseInputSchema
2697
3157
  }),
@@ -2760,8 +3220,8 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2760
3220
  actionId: "hyperliquid.limitOrder",
2761
3221
  protocolId: "hyperliquid",
2762
3222
  chainCategory: "evm",
2763
- description: "Create and submit mpc-auth multiSignRequest for a Hyperliquid limit/IoC order. Plain limit uses CoreWriter; when takeProfitTriggerPxHuman and/or stopLossTriggerPxHuman are set, submits one L1 EIP-712 normalTpsl bracket (entry + TP/SL) to /exchange.",
2764
- prerequisites: ["keyGen", "executorAddress", "chainId 999 or 998", "coin", "limitPxHuman", "szHuman"],
3223
+ description: "Create and submit mpc-auth multiSignRequest for a Hyperliquid limit/IoC order. Plain limit: CoreWriter (useCustomGas). When takeProfitTriggerPxHuman and/or stopLossTriggerPxHuman are set: one L1 EIP-712 normalTpsl bracket (entry + TP/SL) to /exchange \u2014 no useCustomGas.",
3224
+ prerequisites: ["keyGenId", "chainId 999 or 998", "coin", "limitPxHuman", "szHuman"],
2765
3225
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "buildEvmMultisignBodyHyperliquidLimitOrderBatch" },
2766
3226
  inputZod: mcpHyperliquidLimitOrderInputSchema
2767
3227
  }),
@@ -2816,8 +3276,8 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2816
3276
  actionId: "hyperliquid.bridgeWithdraw",
2817
3277
  protocolId: "hyperliquid",
2818
3278
  chainCategory: "evm",
2819
- description: "Create and submit mpc-auth multiSignRequest to withdraw USDC from Hyperliquid to Arbitrum via withdraw3 (EIP-712, delivered to /exchange). chainId 999 or 998. ~1 USDC bridge fee on Hyperliquid.",
2820
- prerequisites: ["keyGen", "executorAddress", "Hyperliquid withdrawable balance", "usdHuman"],
3279
+ description: "Create and submit mpc-auth multiSignRequest to withdraw USDC from Hyperliquid to Arbitrum via withdraw3 (EIP-712, delivered to /exchange). chainId 999 or 998. No useCustomGas. ~1 USDC bridge fee on Hyperliquid.",
3280
+ prerequisites: ["keyGenId", "chainId 999 or 998", "usdHuman", "Hyperliquid withdrawable balance"],
2821
3281
  handler: {
2822
3282
  importPath: "protocols/evm/hyperliquid",
2823
3283
  exportName: "buildHyperliquidBridgeWithdrawMultisign"
@@ -2889,7 +3349,7 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2889
3349
  actionId: "hyperliquid.updateLeverage",
2890
3350
  protocolId: "hyperliquid",
2891
3351
  chainCategory: "evm",
2892
- description: "Set per-market leverage (cross or isolated) on Hyperliquid via L1 /exchange EIP-712 signing \u2014 not CoreWriter, no EVM gas at propose/trigger.",
3352
+ description: "Set per-market leverage (cross or isolated) on Hyperliquid via L1 /exchange EIP-712 signing \u2014 not CoreWriter. No useCustomGas. trigger_sign_result without txParams; broadcast_sign_result POSTs to /exchange.",
2893
3353
  prerequisites: [
2894
3354
  "keyGenId",
2895
3355
  "chainId 999 or 998",
@@ -2905,6 +3365,101 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
2905
3365
  handler: { importPath: "protocols/evm/hyperliquid", exportName: "buildHyperliquidUpdateLeverageMultisign" },
2906
3366
  inputZod: mcpHyperliquidUpdateLeverageInputSchema
2907
3367
  }),
3368
+ defineProtocolMcpTool({
3369
+ name: "ctm_arcus_build_create_api_key_multisign",
3370
+ actionId: "arcus.createApiKey",
3371
+ protocolId: "arcus",
3372
+ chainCategory: "evm",
3373
+ description: "Register Arcus Ed25519 API key. Requires paired KeyGens (same GroupId): secp256k1KeyGenId for personal_sign + ed25519KeyGenId pubkey. No useCustomGas.",
3374
+ prerequisites: ["secp256k1KeyGenId", "ed25519KeyGenId (same GroupId)", "ed25519PubKeyHex from ed25519 KeyGen"],
3375
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result"],
3376
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildEvmMultisignBodyArcusCreateApiKeyBatch" },
3377
+ inputZod: mcpArcusBuildCreateApiKeyMultisignInputSchema
3378
+ }),
3379
+ defineProtocolMcpTool({
3380
+ name: "ctm_arcus_build_place_order_multisign",
3381
+ actionId: "arcus.placeOrder",
3382
+ protocolId: "arcus",
3383
+ chainCategory: "evm",
3384
+ description: "Arcus perp limit order with optional TP/SL bracket (Ed25519 payload sign). Uses account leverage already set on Arcus (see fetch_open_context.activeAsset). ed25519KeyGenId signs; secp256k1KeyGenId bills globalNonce.",
3385
+ prerequisites: ["secp256k1KeyGenId", "ed25519KeyGenId", "registered API key", "market from fetch_markets", "leverage from fetch_open_context"],
3386
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result"],
3387
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildEvmMultisignBodyArcusPlaceOrderBatch" },
3388
+ inputZod: mcpArcusBuildPlaceOrderMultisignInputSchema
3389
+ }),
3390
+ defineProtocolMcpTool({
3391
+ name: "ctm_arcus_build_close_multisign",
3392
+ actionId: "arcus.close",
3393
+ protocolId: "arcus",
3394
+ chainCategory: "evm",
3395
+ description: "Close Arcus perp position with IoC reduce-only limit (Ed25519 payload sign). Inverts side from isLong. Fetch positions via fetch_open_context.",
3396
+ prerequisites: ["secp256k1KeyGenId", "ed25519KeyGenId", "market", "isLong from fetch_positions", "limitPxHuman", "szHuman"],
3397
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result"],
3398
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildEvmMultisignBodyArcusCloseBatch" },
3399
+ inputZod: mcpArcusBuildCloseMultisignInputSchema
3400
+ }),
3401
+ defineProtocolMcpTool({
3402
+ name: "ctm_arcus_build_cancel_order_multisign",
3403
+ actionId: "arcus.cancelOrder",
3404
+ protocolId: "arcus",
3405
+ chainCategory: "evm",
3406
+ description: "Cancel Arcus perp order (Ed25519 payload sign).",
3407
+ prerequisites: ["secp256k1KeyGenId", "ed25519KeyGenId", "orderId from fetch_open_orders"],
3408
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result"],
3409
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildEvmMultisignBodyArcusCancelOrderBatch" },
3410
+ inputZod: mcpArcusBuildCancelOrderMultisignInputSchema
3411
+ }),
3412
+ defineProtocolMcpTool({
3413
+ name: "ctm_arcus_build_set_leverage_multisign",
3414
+ actionId: "arcus.setLeverage",
3415
+ protocolId: "arcus",
3416
+ chainCategory: "evm",
3417
+ description: "Set Arcus perp leverage for a market (Scheme 2 Ed25519 \u2192 POST /v1/setLeverage). Call before place_order when leverage must change. Max leverage = floor(1 / initialMarginFraction) from fetch_markets.",
3418
+ prerequisites: ["secp256k1KeyGenId", "ed25519KeyGenId", "market", "leverage", "ctm_arcus_fetch_open_context for current leverage"],
3419
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result"],
3420
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildEvmMultisignBodyArcusSetLeverageBatch" },
3421
+ inputZod: mcpArcusBuildSetLeverageMultisignInputSchema
3422
+ }),
3423
+ defineProtocolMcpTool({
3424
+ name: "ctm_arcus_spot_build_rfq_multisign",
3425
+ actionId: "arcus.spotRfq",
3426
+ protocolId: "arcus",
3427
+ chainCategory: "evm",
3428
+ description: "Arcus spot Stock Token RFQ buy/sell. Post-fill: offer Add ERC20 with tokenContractAddress from delivery.",
3429
+ prerequisites: ["secp256k1KeyGenId", "ed25519KeyGenId", "ticker from spot_fetch_markets"],
3430
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result"],
3431
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildEvmMultisignBodyArcusSpotRfqBatch" },
3432
+ inputZod: mcpArcusSpotBuildRfqMultisignInputSchema
3433
+ }),
3434
+ defineProtocolMcpTool({
3435
+ name: "ctm_arcus_build_deposit_multisign",
3436
+ actionId: "arcus.deposit",
3437
+ protocolId: "arcus",
3438
+ chainCategory: "evm",
3439
+ description: "Deposit USDG on Robinhood Chain (4663) into Arcus collateral via approve + initiateDeposit. product=perp (accountIndex 0) or spot (accountIndex 1). Requires registered API key (createApiKey first). After broadcast, call ctm_arcus_fetch_account to confirm \u2014 no polling loop.",
3440
+ prerequisites: [
3441
+ "keyGenId",
3442
+ "chainId 4663",
3443
+ "executorAddress",
3444
+ "hasRegisteredApiKey from fetch_open_context",
3445
+ "USDG wallet balance on 4663",
3446
+ "usdHuman"
3447
+ ],
3448
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result", "ctm_arcus_fetch_account"],
3449
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildEvmMultisignBodyArcusDepositBatch" },
3450
+ inputZod: mcpArcusBuildDepositMultisignInputSchema
3451
+ }),
3452
+ defineProtocolMcpTool({
3453
+ name: "ctm_arcus_build_withdraw_multisign",
3454
+ actionId: "arcus.withdraw",
3455
+ protocolId: "arcus",
3456
+ chainCategory: "evm",
3457
+ description: "Withdraw USDG collateral from Arcus to the signing wallet (EIP-712 + POST /v1/withdraw). product=perp or spot. Min $1. Async \u2014 refresh with ctm_arcus_fetch_account after broadcast.",
3458
+ prerequisites: ["keyGenId", "chainId 4663", "freeCollateral or spot balance", "usdHuman"],
3459
+ followUp: ["sign_request_agree", "trigger_sign_result", "broadcast_sign_result", "ctm_arcus_fetch_account"],
3460
+ handler: { importPath: "protocols/evm/arcus", exportName: "buildArcusWithdrawMultisignBody" },
3461
+ inputZod: mcpArcusBuildWithdrawMultisignInputSchema
3462
+ }),
2908
3463
  defineProtocolMcpTool({
2909
3464
  name: "ctm_cctp_build_burn_multisign",
2910
3465
  actionId: "circle-cctp.burn-forward",
@@ -3000,11 +3555,11 @@ var CORE_MCP_TOOL_DEFINITIONS = [
3000
3555
  actionId: "uniswap-v4.limit-order-quote",
3001
3556
  protocolId: "uniswap-v4",
3002
3557
  chainCategory: "evm",
3003
- description: "Fetch a UniswapX limit order quote (POST /v1/limit_order_quote). Ethereum mainnet (chainId 1) only. Returns quote + permitData for EIP-712 signing. Does NOT create a sign request \u2014 call ctm_uniswap_v4_build_limit_order_multisign next.",
3558
+ description: "Fetch a UniswapX limit order quote (POST /v1/limit_order_quote). Ethereum mainnet (chainId 1) only. Returns quote + permitData for EIP-712 signing. Does NOT create a sign request \u2014 call ctm_uniswap_v4_build_limit_order_multisign next with this exact JSON as fullLimitQuote (re-quote if limitPrice or orderDeadline changes).",
3004
3559
  prerequisites: [
3005
3560
  "UNISWAP_API_KEY in node Variables",
3006
3561
  "chainId must be 1",
3007
- "keyGenId or swapper",
3562
+ "keyGenId or swapper (server resolves swapper from keyGenId)",
3008
3563
  "limitPrice, orderDeadline, amount, tokenIn, tokenOut"
3009
3564
  ],
3010
3565
  followUp: ["ctm_uniswap_v4_build_limit_order_multisign", "ctm_uniswap_v4_fetch_limit_orders"],
@@ -3017,9 +3572,9 @@ var CORE_MCP_TOOL_DEFINITIONS = [
3017
3572
  actionId: "uniswap-v4.limit-order",
3018
3573
  protocolId: "uniswap-v4",
3019
3574
  chainCategory: "evm",
3020
- description: "Create and submit mpc-auth multiSignRequest for a UniswapX limit order (EIP-712 Permit2 witness). After sign + execute, delivery POSTs to Trade API /v1/order. Mainnet only.",
3575
+ description: "Create and submit mpc-auth multiSignRequest for a UniswapX limit order (EIP-712 Permit2 witness). After sign + execute, delivery POSTs to Trade API /v1/order. Mainnet only. EIP-712 only \u2014 useCustomGas is ignored.",
3021
3576
  prerequisites: [
3022
- "ctm_uniswap_v4_limit_order_quote output (fullLimitQuote)",
3577
+ "Fresh ctm_uniswap_v4_limit_order_quote output (fullLimitQuote) \u2014 re-quote when limitPrice or orderDeadline changes",
3023
3578
  "keyGenId + chainId 1 + purposeText"
3024
3579
  ],
3025
3580
  followUp: ["ctm_uniswap_v4_fetch_limit_orders"],
@@ -3492,6 +4047,158 @@ var CORE_MCP_TOOL_DEFINITIONS = [
3492
4047
  inputZod: mcpHyperliquidFetchDelegationsInputSchema,
3493
4048
  outputZod: mcpHyperliquidFetchDelegationsOutputSchema
3494
4049
  }),
4050
+ defineMcpTool({
4051
+ name: "ctm_arcus_fetch_markets",
4052
+ actionId: "arcus.fetch-markets",
4053
+ protocolId: "arcus",
4054
+ chainCategory: "evm",
4055
+ description: "List Arcus perp markets on Robinhood Chain (4663). Crypto, equities, commodities.",
4056
+ prerequisites: ["chainId 4663"],
4057
+ followUp: ["ctm_arcus_fetch_open_context", "ctm_arcus_fetch_ohlcv", "ctm_arcus_build_place_order_multisign"],
4058
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusFetchMarketsSummary" },
4059
+ inputZod: mcpArcusFetchMarketsInputSchema,
4060
+ outputZod: mcpArcusFetchMarketsOutputSchema
4061
+ }),
4062
+ defineMcpTool({
4063
+ name: "ctm_arcus_search_markets",
4064
+ actionId: "arcus.search-markets",
4065
+ protocolId: "arcus",
4066
+ chainCategory: "evm",
4067
+ description: "Search Arcus perp markets by ticker or name.",
4068
+ prerequisites: ["chainId 4663", "query"],
4069
+ followUp: ["ctm_arcus_fetch_ohlcv", "ctm_arcus_build_place_order_multisign"],
4070
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusSearchMarketsSummary" },
4071
+ inputZod: mcpArcusSearchMarketsInputSchema,
4072
+ outputZod: mcpArcusSearchMarketsOutputSchema
4073
+ }),
4074
+ defineMcpTool({
4075
+ name: "ctm_arcus_fetch_ohlcv",
4076
+ actionId: "arcus.fetch-ohlcv",
4077
+ protocolId: "arcus",
4078
+ chainCategory: "evm",
4079
+ description: "OHLCV for Arcus perps (api.arcus.xyz). Returns HL-shaped { ohlcv: { market, interval, candles } } for chart/analysis binding. Use for perp charts only \u2014 spot uses ctm_arcus_spot_fetch_ohlcv.",
4080
+ prerequisites: ["chainId 4663", "market or coin"],
4081
+ followUp: ["ctm_arcus_fetch_market_snapshot", "continuum__prepare_chart_from_rows", "ctm_arcus_build_place_order_multisign"],
4082
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusFetchOhlcvSummary" },
4083
+ inputZod: mcpArcusFetchOhlcvInputSchema,
4084
+ outputZod: mcpArcusFetchOhlcvOutputSchema
4085
+ }),
4086
+ defineMcpTool({
4087
+ name: "ctm_arcus_spot_fetch_markets",
4088
+ actionId: "arcus.spot-fetch-markets",
4089
+ protocolId: "arcus",
4090
+ chainCategory: "evm",
4091
+ description: "Arcus spot Stock Token catalog (ticker, contract address, logo).",
4092
+ prerequisites: ["chainId 4663"],
4093
+ followUp: ["ctm_arcus_spot_fetch_ohlcv", "ctm_arcus_spot_fetch_balances", "ctm_arcus_spot_build_rfq_multisign"],
4094
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusSpotFetchMarketsSummary" },
4095
+ inputZod: mcpArcusSpotFetchMarketsInputSchema,
4096
+ outputZod: mcpArcusSpotFetchMarketsOutputSchema
4097
+ }),
4098
+ defineMcpTool({
4099
+ name: "ctm_arcus_spot_search_markets",
4100
+ actionId: "arcus.spot-search-markets",
4101
+ protocolId: "arcus",
4102
+ chainCategory: "evm",
4103
+ description: "Search Arcus spot Stock Tokens.",
4104
+ prerequisites: ["chainId 4663", "query"],
4105
+ followUp: ["ctm_arcus_spot_fetch_ohlcv", "ctm_arcus_spot_build_rfq_multisign"],
4106
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusSpotSearchMarketsSummary" },
4107
+ inputZod: mcpArcusSearchMarketsInputSchema,
4108
+ outputZod: mcpArcusSpotFetchMarketsOutputSchema
4109
+ }),
4110
+ defineMcpTool({
4111
+ name: "ctm_arcus_spot_fetch_ohlcv",
4112
+ actionId: "arcus.spot-fetch-ohlcv",
4113
+ protocolId: "arcus",
4114
+ chainCategory: "evm",
4115
+ description: "OHLCV for Arcus spot Stock Tokens (indexer.spot.arcus.xyz). Use for spot charts \u2014 not perp ctm_arcus_fetch_ohlcv.",
4116
+ prerequisites: ["chainId 4663", "ticker or tokenAddress"],
4117
+ followUp: ["continuum__prepare_chart_from_rows", "ctm_arcus_spot_build_rfq_multisign"],
4118
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusSpotFetchOhlcvSummary" },
4119
+ inputZod: mcpArcusSpotFetchOhlcvInputSchema,
4120
+ outputZod: mcpArcusSpotFetchOhlcvOutputSchema
4121
+ }),
4122
+ defineMcpTool({
4123
+ name: "ctm_arcus_fetch_market_snapshot",
4124
+ actionId: "arcus.fetch-market-snapshot",
4125
+ protocolId: "arcus",
4126
+ chainCategory: "evm",
4127
+ description: "Live mid price plus recent perp OHLCV candles.",
4128
+ prerequisites: ["chainId 4663", "market or coin"],
4129
+ followUp: ["ctm_arcus_fetch_open_context", "ctm_arcus_build_place_order_multisign"],
4130
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusFetchMarketSnapshotSummary" },
4131
+ inputZod: mcpArcusFetchMarketSnapshotInputSchema,
4132
+ outputZod: mcpArcusFetchMarketSnapshotOutputSchema
4133
+ }),
4134
+ defineMcpTool({
4135
+ name: "ctm_arcus_fetch_account",
4136
+ actionId: "arcus.fetch-account",
4137
+ protocolId: "arcus",
4138
+ chainCategory: "evm",
4139
+ description: "Arcus perp account summary (equity, collateral).",
4140
+ prerequisites: ["chainId 4663", "executorAddress"],
4141
+ followUp: ["ctm_arcus_build_create_api_key_multisign", "ctm_arcus_build_deposit_multisign", "ctm_arcus_build_withdraw_multisign"],
4142
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusFetchAccountSummary" },
4143
+ inputZod: mcpArcusFetchAccountInputSchema,
4144
+ outputZod: mcpArcusFetchAccountOutputSchema
4145
+ }),
4146
+ defineMcpTool({
4147
+ name: "ctm_arcus_fetch_positions",
4148
+ actionId: "arcus.fetch-positions",
4149
+ protocolId: "arcus",
4150
+ chainCategory: "evm",
4151
+ description: "Open Arcus perp positions.",
4152
+ prerequisites: ["chainId 4663", "executorAddress"],
4153
+ followUp: ["ctm_arcus_build_place_order_multisign", "ctm_arcus_build_close_multisign"],
4154
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusFetchPositionsSummary" },
4155
+ inputZod: mcpArcusFetchPositionsInputSchema,
4156
+ outputZod: mcpArcusFetchPositionsOutputSchema
4157
+ }),
4158
+ defineMcpTool({
4159
+ name: "ctm_arcus_fetch_open_orders",
4160
+ actionId: "arcus.fetch-open-orders",
4161
+ protocolId: "arcus",
4162
+ chainCategory: "evm",
4163
+ description: "Pending Arcus perp orders.",
4164
+ prerequisites: ["chainId 4663", "executorAddress"],
4165
+ followUp: ["ctm_arcus_build_cancel_order_multisign"],
4166
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusFetchOpenOrdersSummary" },
4167
+ inputZod: mcpArcusFetchOpenOrdersInputSchema,
4168
+ outputZod: mcpArcusFetchOpenOrdersOutputSchema
4169
+ }),
4170
+ defineMcpTool({
4171
+ name: "ctm_arcus_fetch_open_context",
4172
+ actionId: "arcus.fetch-open-context",
4173
+ protocolId: "arcus",
4174
+ chainCategory: "evm",
4175
+ description: "Account, positions, orders, API keys, per-market leverages, and optional activeAsset leverage for a market.",
4176
+ prerequisites: ["chainId 4663", "executorAddress"],
4177
+ followUp: [
4178
+ "ctm_arcus_build_create_api_key_multisign",
4179
+ "ctm_arcus_build_set_leverage_multisign",
4180
+ "ctm_arcus_build_place_order_multisign",
4181
+ "ctm_arcus_build_close_multisign",
4182
+ "ctm_arcus_build_cancel_order_multisign",
4183
+ "ctm_arcus_build_deposit_multisign",
4184
+ "ctm_arcus_build_withdraw_multisign"
4185
+ ],
4186
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusFetchOpenContextSummary" },
4187
+ inputZod: mcpArcusFetchOpenContextInputSchema,
4188
+ outputZod: mcpArcusFetchOpenContextOutputSchema
4189
+ }),
4190
+ defineMcpTool({
4191
+ name: "ctm_arcus_spot_fetch_balances",
4192
+ actionId: "arcus.spot-fetch-balances",
4193
+ protocolId: "arcus",
4194
+ chainCategory: "evm",
4195
+ description: "On-chain Stock Token ERC20 balances for executor on 4663.",
4196
+ prerequisites: ["chainId 4663", "executorAddress"],
4197
+ followUp: ["ctm_arcus_spot_build_rfq_multisign", "ctm_arcus_build_deposit_multisign", "ctm_arcus_build_withdraw_multisign"],
4198
+ handler: { importPath: "protocols/evm/arcus", exportName: "arcusSpotFetchBalancesSummary" },
4199
+ inputZod: mcpArcusSpotFetchBalancesInputSchema,
4200
+ outputZod: mcpArcusSpotFetchBalancesOutputSchema
4201
+ }),
3495
4202
  defineMcpTool({
3496
4203
  name: "ctm_morpho_fetch_blue_markets",
3497
4204
  actionId: "morpho.fetch-blue-markets",
@@ -3568,12 +4275,52 @@ var CORE_MCP_TOOL_DEFINITIONS = [
3568
4275
  inputZod: mcpCctpFetchTransferStatusInputSchema,
3569
4276
  outputZod: mcpCctpFetchTransferStatusOutputSchema
3570
4277
  }),
4278
+ defineMcpTool({
4279
+ name: "ctm_venice_list_models",
4280
+ actionId: "venice.list-models",
4281
+ protocolId: "venice",
4282
+ chainCategory: "evm",
4283
+ description: "Venice AI model catalog (GET /models). Optional type filter (text, image, video, all). Requires VENICE_API_KEY in node Variables (server injects \u2014 do not pass apiKey).",
4284
+ prerequisites: ["VENICE_API_KEY in node Variables"],
4285
+ followUp: [],
4286
+ handler: { importPath: "protocols/evm/venice", exportName: "veniceListModelsSummary" },
4287
+ inputZod: mcpVeniceListModelsInputSchema,
4288
+ outputZod: mcpVeniceListModelsOutputSchema
4289
+ }),
4290
+ defineMcpTool({
4291
+ name: "ctm_venice_read_staking_state",
4292
+ actionId: "venice.read-staking-state",
4293
+ protocolId: "venice",
4294
+ chainCategory: "evm",
4295
+ description: "Read VVV/sVVV/DIEM wallet balances, staked DIEM, cooldown fields, mint rate, and estimated API credit on Base.",
4296
+ prerequisites: ["rpcUrl", "executorAddress", "chainId 8453"],
4297
+ followUp: [
4298
+ "ctm_venice_read_mint_diem_preview",
4299
+ "ctm_venice_build_stake_vvv_multisign",
4300
+ "ctm_venice_build_stake_diem_multisign"
4301
+ ],
4302
+ handler: { importPath: "protocols/evm/venice", exportName: "veniceReadStakingStateSummary" },
4303
+ inputZod: mcpVeniceReadStakingStateInputSchema,
4304
+ outputZod: mcpVeniceReadStakingStateOutputSchema
4305
+ }),
4306
+ defineMcpTool({
4307
+ name: "ctm_venice_read_mint_diem_preview",
4308
+ actionId: "venice.read-mint-diem-preview",
4309
+ protocolId: "venice",
4310
+ chainCategory: "evm",
4311
+ description: "Preview DIEM mint rate and expected DIEM output for locking sVVV on Base.",
4312
+ prerequisites: ["rpcUrl", "svvvLockAmountHuman"],
4313
+ followUp: ["ctm_venice_build_mint_diem_multisign"],
4314
+ handler: { importPath: "protocols/evm/venice", exportName: "veniceReadMintDiemPreviewSummary" },
4315
+ inputZod: mcpVeniceReadMintDiemPreviewInputSchema,
4316
+ outputZod: mcpVeniceReadMintDiemPreviewOutputSchema
4317
+ }),
3571
4318
  defineMcpTool({
3572
4319
  name: "ctm_morpho_fetch_earn_vaults",
3573
4320
  actionId: "morpho.fetch-earn-vaults",
3574
4321
  protocolId: "morpho",
3575
4322
  chainCategory: "evm",
3576
- description: "Morpho-listed earn vaults (V1 + V2 unified). Filter by deposit asset symbol/address and/or case-insensitive vault name search. Returns vaultAddress for deposit/withdraw multisign tools.",
4323
+ description: 'Morpho-listed earn vaults (V1 + V2 unified). Filter by deposit asset symbol/address and/or case-insensitive vault name search. On chain 4663, query "robinhood earn" resolves to Steakhouse USDG (Robinhood Earn). Returns vaultAddress for deposit/withdraw multisign tools.',
3577
4324
  prerequisites: ["chainId"],
3578
4325
  followUp: [
3579
4326
  "ctm_morpho_build_vault_deposit_multisign",
@@ -4373,6 +5120,136 @@ var hyperliquidProtocolModule = {
4373
5120
  ]
4374
5121
  };
4375
5122
  registerProtocolModule(hyperliquidProtocolModule);
5123
+
5124
+ // src/protocols/evm/arcus/index.ts
5125
+ init_support();
5126
+ init_support();
5127
+ init_constants();
5128
+ init_api();
5129
+ init_constants();
5130
+ var arcusProtocolModule = {
5131
+ id: ARCUS_PROTOCOL_ID,
5132
+ chainCategory: "evm",
5133
+ isChainSupported(ctx) {
5134
+ if (ctx.chainCategory !== "evm") return false;
5135
+ const chainId = typeof ctx.chainId === "number" ? ctx.chainId : Number(ctx.chainId);
5136
+ return Number.isFinite(chainId) && isArcusChainSupported(chainId);
5137
+ },
5138
+ isTokenSupported(token) {
5139
+ if (token.category !== "evm") return false;
5140
+ return token.kind === "erc20" || token.kind === "native";
5141
+ },
5142
+ actions: [
5143
+ {
5144
+ id: "arcus.createApiKey",
5145
+ protocolId: ARCUS_PROTOCOL_ID,
5146
+ chainCategory: "evm",
5147
+ description: "Register Arcus Ed25519 API key (secp256k1 personal_sign + paired ed25519 KeyGen)",
5148
+ commonParams: ["keyGen", "purposeText"],
5149
+ params: {
5150
+ secp256k1KeyGenId: { type: "string", required: true, description: "Custody secp256k1 KeyGen id" },
5151
+ ed25519KeyGenId: { type: "string", required: true, description: "Paired ed25519 KeyGen id (same GroupId)" },
5152
+ apiWalletName: { type: "string", required: false, description: "Label for the API key" }
5153
+ }
5154
+ },
5155
+ {
5156
+ id: "arcus.placeOrder",
5157
+ protocolId: ARCUS_PROTOCOL_ID,
5158
+ chainCategory: "evm",
5159
+ description: "Place Arcus perp order with optional TP/SL (Ed25519 payload sign)",
5160
+ commonParams: ["keyGen", "purposeText"],
5161
+ params: {
5162
+ secp256k1KeyGenId: { type: "string", required: true, description: "Custody secp256k1 KeyGen id" },
5163
+ ed25519KeyGenId: { type: "string", required: true, description: "Paired ed25519 KeyGen id" },
5164
+ market: { type: "string", required: true, description: "e.g. BTC-USD" },
5165
+ isBuy: { type: "boolean", required: true, description: "true for buy/long" },
5166
+ limitPxHuman: { type: "string", required: true, description: "Entry limit price" },
5167
+ szHuman: { type: "string", required: true, description: "Order size" },
5168
+ takeProfitTriggerPxHuman: { type: "string", required: false, description: "Optional TP trigger" },
5169
+ stopLossTriggerPxHuman: { type: "string", required: false, description: "Optional SL trigger" }
5170
+ }
5171
+ },
5172
+ {
5173
+ id: "arcus.spotRfq",
5174
+ protocolId: ARCUS_PROTOCOL_ID,
5175
+ chainCategory: "evm",
5176
+ description: "Arcus spot Stock Token RFQ buy/sell",
5177
+ commonParams: ["keyGen", "purposeText"],
5178
+ params: {
5179
+ secp256k1KeyGenId: { type: "string", required: true, description: "Custody secp256k1 KeyGen id" },
5180
+ ed25519KeyGenId: { type: "string", required: true, description: "Paired ed25519 KeyGen id" },
5181
+ ticker: { type: "string", required: true, description: "Spot ticker e.g. AAPL" },
5182
+ isBuy: { type: "boolean", required: true, description: "true for buy" },
5183
+ sizeHuman: { type: "string", required: true, description: "Token size" },
5184
+ limitPxHuman: { type: "string", required: false, description: "Optional limit price" }
5185
+ }
5186
+ },
5187
+ {
5188
+ id: "arcus.close",
5189
+ protocolId: ARCUS_PROTOCOL_ID,
5190
+ chainCategory: "evm",
5191
+ description: "Close Arcus perp position with IoC reduce-only limit order",
5192
+ commonParams: ["keyGen", "purposeText"],
5193
+ params: {
5194
+ secp256k1KeyGenId: { type: "string", required: true, description: "Custody secp256k1 KeyGen id" },
5195
+ ed25519KeyGenId: { type: "string", required: true, description: "Paired ed25519 KeyGen id" },
5196
+ market: { type: "string", required: true, description: "Perp market" },
5197
+ isLong: { type: "boolean", required: true, description: "true when closing a long position" },
5198
+ limitPxHuman: { type: "string", required: true, description: "Limit price for IoC close" },
5199
+ szHuman: { type: "string", required: true, description: "Size to close" }
5200
+ }
5201
+ },
5202
+ {
5203
+ id: "arcus.cancelOrder",
5204
+ protocolId: ARCUS_PROTOCOL_ID,
5205
+ chainCategory: "evm",
5206
+ description: "Cancel Arcus perp order",
5207
+ commonParams: ["keyGen", "purposeText"],
5208
+ params: {
5209
+ secp256k1KeyGenId: { type: "string", required: true, description: "Custody secp256k1 KeyGen id" },
5210
+ ed25519KeyGenId: { type: "string", required: true, description: "Paired ed25519 KeyGen id" },
5211
+ market: { type: "string", required: true, description: "Perp market" },
5212
+ orderId: { type: "string", required: true, description: "Server order id" }
5213
+ }
5214
+ },
5215
+ {
5216
+ id: "arcus.setLeverage",
5217
+ protocolId: ARCUS_PROTOCOL_ID,
5218
+ chainCategory: "evm",
5219
+ description: "Set Arcus perp leverage for a market",
5220
+ commonParams: ["keyGen", "purposeText"],
5221
+ params: {
5222
+ secp256k1KeyGenId: { type: "string", required: true, description: "Custody secp256k1 KeyGen id" },
5223
+ ed25519KeyGenId: { type: "string", required: true, description: "Paired ed25519 KeyGen id" },
5224
+ market: { type: "string", required: true, description: "Perp market" },
5225
+ leverage: { type: "number", required: true, description: "Target leverage" }
5226
+ }
5227
+ },
5228
+ {
5229
+ id: "arcus.deposit",
5230
+ protocolId: ARCUS_PROTOCOL_ID,
5231
+ chainCategory: "evm",
5232
+ description: "Deposit USDG on Robinhood Chain into Arcus perp or spot collateral (approve + initiateDeposit). Requires registered API key.",
5233
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5234
+ params: {
5235
+ usdHuman: { type: "string", required: true, description: "USD amount to deposit" },
5236
+ product: { type: "string", required: false, description: "perp (default) or spot" }
5237
+ }
5238
+ },
5239
+ {
5240
+ id: "arcus.withdraw",
5241
+ protocolId: ARCUS_PROTOCOL_ID,
5242
+ chainCategory: "evm",
5243
+ description: "Withdraw USDG collateral from Arcus to wallet (EIP-712 + POST /v1/withdraw)",
5244
+ commonParams: ["keyGen", "purposeText"],
5245
+ params: {
5246
+ usdHuman: { type: "string", required: true, description: "USD amount to withdraw" },
5247
+ product: { type: "string", required: false, description: "perp (default) or spot" }
5248
+ }
5249
+ }
5250
+ ]
5251
+ };
5252
+ registerProtocolModule(arcusProtocolModule);
4376
5253
  var MORPHO_GRAPHQL_URL = "https://api.morpho.org/graphql";
4377
5254
  async function morphoGql(query, variables) {
4378
5255
  const body = { query, variables: variables ?? {} };
@@ -4721,6 +5598,97 @@ var circleCctpProtocolModule = {
4721
5598
  ]
4722
5599
  };
4723
5600
  registerProtocolModule(circleCctpProtocolModule);
5601
+ var VENICE_PROTOCOL_ID = "venice";
5602
+ var VENICE_BASE_CHAIN_ID = 8453;
5603
+ var VVV_BASE = "0xacfE6019Ed1A7Dc6f7B508C02d1b04ec88cC21bf";
5604
+ var DIEM_BASE = "0xF4d97F2da56e8c3098f3a8D538DB630A2606a024";
5605
+ function isVeniceBaseChain(chainId) {
5606
+ return chainId === VENICE_BASE_CHAIN_ID;
5607
+ }
5608
+
5609
+ // src/protocols/evm/venice/index.ts
5610
+ var veniceProtocolModule = {
5611
+ id: VENICE_PROTOCOL_ID,
5612
+ chainCategory: "evm",
5613
+ isChainSupported(ctx) {
5614
+ if (ctx.chainCategory !== "evm") return false;
5615
+ const n = typeof ctx.chainId === "number" ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10);
5616
+ return isVeniceBaseChain(n);
5617
+ },
5618
+ isTokenSupported(token) {
5619
+ return token.category === "evm" && token.kind === "erc20";
5620
+ },
5621
+ actions: [
5622
+ {
5623
+ id: "venice.stake-vvv",
5624
+ protocolId: VENICE_PROTOCOL_ID,
5625
+ chainCategory: "evm",
5626
+ description: "Stake VVV \u2192 sVVV on Base",
5627
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5628
+ params: { amountHuman: { type: "string", required: true, description: "VVV amount" } }
5629
+ },
5630
+ {
5631
+ id: "venice.initiate-unstake-svvv",
5632
+ protocolId: VENICE_PROTOCOL_ID,
5633
+ chainCategory: "evm",
5634
+ description: "Start sVVV unstake (7-day cooldown)",
5635
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5636
+ params: { amountHuman: { type: "string", required: true, description: "sVVV amount" } }
5637
+ },
5638
+ {
5639
+ id: "venice.complete-unstake-svvv",
5640
+ protocolId: VENICE_PROTOCOL_ID,
5641
+ chainCategory: "evm",
5642
+ description: "Claim VVV after sVVV unstake cooldown",
5643
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5644
+ params: {}
5645
+ },
5646
+ {
5647
+ id: "venice.mint-diem",
5648
+ protocolId: VENICE_PROTOCOL_ID,
5649
+ chainCategory: "evm",
5650
+ description: "Lock sVVV and mint DIEM",
5651
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5652
+ params: {
5653
+ svvvLockAmountHuman: { type: "string", required: true, description: "sVVV to lock" },
5654
+ slippageBps: { type: "number", required: false, description: "Min DIEM slippage bps (default 50)" }
5655
+ }
5656
+ },
5657
+ {
5658
+ id: "venice.burn-diem",
5659
+ protocolId: VENICE_PROTOCOL_ID,
5660
+ chainCategory: "evm",
5661
+ description: "Burn DIEM to unlock locked sVVV",
5662
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5663
+ params: { amountHuman: { type: "string", required: true, description: "DIEM to burn" } }
5664
+ },
5665
+ {
5666
+ id: "venice.stake-diem",
5667
+ protocolId: VENICE_PROTOCOL_ID,
5668
+ chainCategory: "evm",
5669
+ description: "Stake DIEM for Venice API credits ($1/day per DIEM)",
5670
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5671
+ params: { amountHuman: { type: "string", required: true, description: "DIEM amount" } }
5672
+ },
5673
+ {
5674
+ id: "venice.initiate-unstake-diem",
5675
+ protocolId: VENICE_PROTOCOL_ID,
5676
+ chainCategory: "evm",
5677
+ description: "Start DIEM unstake (1-day cooldown)",
5678
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5679
+ params: { amountHuman: { type: "string", required: true, description: "Staked DIEM amount" } }
5680
+ },
5681
+ {
5682
+ id: "venice.complete-unstake-diem",
5683
+ protocolId: VENICE_PROTOCOL_ID,
5684
+ chainCategory: "evm",
5685
+ description: "Claim DIEM after unstake cooldown",
5686
+ commonParams: ["keyGen", "purposeText", "useCustomGas"],
5687
+ params: {}
5688
+ }
5689
+ ]
5690
+ };
5691
+ registerProtocolModule(veniceProtocolModule);
4724
5692
  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");
4725
5693
  var SKILL_PROTOCOL_IDS = [
4726
5694
  "aave-v4",
@@ -4733,6 +5701,7 @@ var SKILL_PROTOCOL_IDS = [
4733
5701
  "sky",
4734
5702
  "gmx",
4735
5703
  "hyperliquid",
5704
+ "arcus",
4736
5705
  "morpho",
4737
5706
  "circle-cctp"
4738
5707
  ];
@@ -4782,6 +5751,7 @@ function getProtocolDiscoverySummary(protocolId) {
4782
5751
  }))
4783
5752
  };
4784
5753
  }
5754
+ init_support();
4785
5755
  var EULER_V2_SUBGRAPH_CHAIN_IDS = [
4786
5756
  1,
4787
5757
  8453,
@@ -4966,7 +5936,7 @@ var PROTOCOL_SUPPORT_ADVISORS = {
4966
5936
  }));
4967
5937
  return {
4968
5938
  tokens,
4969
- notes: "Morpho vault assets and Blue market loan/collateral tokens from api.morpho.org."
5939
+ notes: chainId === ROBINHOOD_CHAIN_ID ? 'Morpho vault assets on Robinhood Chain. Robinhood Earn USDG yield uses Steakhouse USDG (steakUSDG) \u2014 query "robinhood earn" or robinhoodEarn: true on deposit multisign; not Arcus collateral.' : "Morpho vault assets and Blue market loan/collateral tokens from api.morpho.org."
4970
5940
  };
4971
5941
  },
4972
5942
  async isTokenSupported(chainId, address) {
@@ -5052,6 +6022,39 @@ var PROTOCOL_SUPPORT_ADVISORS = {
5052
6022
  notes: "Hyperliquid perp coins from fetch_markets; chainId 999 mainnet or 998 testnet for HyperEVM multisign."
5053
6023
  };
5054
6024
  }
6025
+ }),
6026
+ [VENICE_PROTOCOL_ID]: advisor(VENICE_PROTOCOL_ID, "fixed_addresses", {
6027
+ async supportedChainIds() {
6028
+ return [VENICE_BASE_CHAIN_ID];
6029
+ },
6030
+ async supportedTokens() {
6031
+ return {
6032
+ tokens: [
6033
+ { address: VVV_BASE, symbol: "VVV", roles: ["staking_input"] },
6034
+ { address: DIEM_BASE, symbol: "DIEM", roles: ["api_credit"] }
6035
+ ],
6036
+ notes: "Venice VVV/sVVV/DIEM staking on Base (8453). Stake DIEM for $1/day Venice API credit per token. Never send tokens directly to contract addresses."
6037
+ };
6038
+ },
6039
+ async isTokenSupported(_chainId, address) {
6040
+ try {
6041
+ const normalized = viem.getAddress(address).toLowerCase();
6042
+ return normalized === viem.getAddress(VVV_BASE).toLowerCase() || normalized === viem.getAddress(DIEM_BASE).toLowerCase();
6043
+ } catch {
6044
+ return false;
6045
+ }
6046
+ }
6047
+ }),
6048
+ arcus: advisor("arcus", "api_underlyings", {
6049
+ async supportedChainIds() {
6050
+ return [...ARCUS_SUPPORTED_CHAIN_IDS];
6051
+ },
6052
+ async supportedTokens() {
6053
+ return {
6054
+ tokens: [],
6055
+ notes: "Arcus on Robinhood Chain (4663): perps via fetch_markets; spot Stock Tokens via spot_fetch_markets. Custody is secp256k1 on 4663; API signing uses paired ed25519 KeyGen (same GroupId)."
6056
+ };
6057
+ }
5055
6058
  })
5056
6059
  };
5057
6060
  function getProtocolSupportAdvisor(protocolId) {
@@ -5072,8 +6075,10 @@ registerProtocolModule(aaveV4ProtocolModule);
5072
6075
  registerProtocolModule(eulerV2ProtocolModule);
5073
6076
  registerProtocolModule(gmxProtocolModule);
5074
6077
  registerProtocolModule(hyperliquidProtocolModule);
6078
+ registerProtocolModule(arcusProtocolModule);
5075
6079
  registerProtocolModule(morphoProtocolModule);
5076
6080
  registerProtocolModule(circleCctpProtocolModule);
6081
+ registerProtocolModule(veniceProtocolModule);
5077
6082
  function getAgentCatalog() {
5078
6083
  return {
5079
6084
  protocols: getProtocolModules(),
@@ -5092,8 +6097,10 @@ function getAgentCatalog() {
5092
6097
  eulerV2: eulerV2ProtocolModule,
5093
6098
  gmx: gmxProtocolModule,
5094
6099
  hyperliquid: hyperliquidProtocolModule,
6100
+ arcus: arcusProtocolModule,
5095
6101
  morpho: morphoProtocolModule,
5096
6102
  circleCctp: circleCctpProtocolModule,
6103
+ venice: veniceProtocolModule,
5097
6104
  /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */
5098
6105
  mcp: getAgentCatalogForMcp()
5099
6106
  };
@@ -5131,6 +6138,36 @@ exports.mcpAaveV4BorrowInputSchema = mcpAaveV4BorrowInputSchema;
5131
6138
  exports.mcpAaveV4DepositInputSchema = mcpAaveV4DepositInputSchema;
5132
6139
  exports.mcpAaveV4RepayInputSchema = mcpAaveV4RepayInputSchema;
5133
6140
  exports.mcpAaveV4WithdrawInputSchema = mcpAaveV4WithdrawInputSchema;
6141
+ exports.mcpArcusBuildCancelOrderMultisignInputSchema = mcpArcusBuildCancelOrderMultisignInputSchema;
6142
+ exports.mcpArcusBuildCloseMultisignInputSchema = mcpArcusBuildCloseMultisignInputSchema;
6143
+ exports.mcpArcusBuildCreateApiKeyMultisignInputSchema = mcpArcusBuildCreateApiKeyMultisignInputSchema;
6144
+ exports.mcpArcusBuildDepositMultisignInputSchema = mcpArcusBuildDepositMultisignInputSchema;
6145
+ exports.mcpArcusBuildPlaceOrderMultisignInputSchema = mcpArcusBuildPlaceOrderMultisignInputSchema;
6146
+ exports.mcpArcusBuildSetLeverageMultisignInputSchema = mcpArcusBuildSetLeverageMultisignInputSchema;
6147
+ exports.mcpArcusBuildWithdrawMultisignInputSchema = mcpArcusBuildWithdrawMultisignInputSchema;
6148
+ exports.mcpArcusFetchAccountInputSchema = mcpArcusFetchAccountInputSchema;
6149
+ exports.mcpArcusFetchAccountOutputSchema = mcpArcusFetchAccountOutputSchema;
6150
+ exports.mcpArcusFetchMarketSnapshotInputSchema = mcpArcusFetchMarketSnapshotInputSchema;
6151
+ exports.mcpArcusFetchMarketSnapshotOutputSchema = mcpArcusFetchMarketSnapshotOutputSchema;
6152
+ exports.mcpArcusFetchMarketsInputSchema = mcpArcusFetchMarketsInputSchema;
6153
+ exports.mcpArcusFetchMarketsOutputSchema = mcpArcusFetchMarketsOutputSchema;
6154
+ exports.mcpArcusFetchOhlcvInputSchema = mcpArcusFetchOhlcvInputSchema;
6155
+ exports.mcpArcusFetchOhlcvOutputSchema = mcpArcusFetchOhlcvOutputSchema;
6156
+ exports.mcpArcusFetchOpenContextInputSchema = mcpArcusFetchOpenContextInputSchema;
6157
+ exports.mcpArcusFetchOpenContextOutputSchema = mcpArcusFetchOpenContextOutputSchema;
6158
+ exports.mcpArcusFetchOpenOrdersInputSchema = mcpArcusFetchOpenOrdersInputSchema;
6159
+ exports.mcpArcusFetchOpenOrdersOutputSchema = mcpArcusFetchOpenOrdersOutputSchema;
6160
+ exports.mcpArcusFetchPositionsInputSchema = mcpArcusFetchPositionsInputSchema;
6161
+ exports.mcpArcusFetchPositionsOutputSchema = mcpArcusFetchPositionsOutputSchema;
6162
+ exports.mcpArcusSearchMarketsInputSchema = mcpArcusSearchMarketsInputSchema;
6163
+ exports.mcpArcusSearchMarketsOutputSchema = mcpArcusSearchMarketsOutputSchema;
6164
+ exports.mcpArcusSpotBuildRfqMultisignInputSchema = mcpArcusSpotBuildRfqMultisignInputSchema;
6165
+ exports.mcpArcusSpotFetchBalancesInputSchema = mcpArcusSpotFetchBalancesInputSchema;
6166
+ exports.mcpArcusSpotFetchBalancesOutputSchema = mcpArcusSpotFetchBalancesOutputSchema;
6167
+ exports.mcpArcusSpotFetchMarketsInputSchema = mcpArcusSpotFetchMarketsInputSchema;
6168
+ exports.mcpArcusSpotFetchMarketsOutputSchema = mcpArcusSpotFetchMarketsOutputSchema;
6169
+ exports.mcpArcusSpotFetchOhlcvInputSchema = mcpArcusSpotFetchOhlcvInputSchema;
6170
+ exports.mcpArcusSpotFetchOhlcvOutputSchema = mcpArcusSpotFetchOhlcvOutputSchema;
5134
6171
  exports.mcpCurveDaoBuildSwapMultisignInputSchema = mcpCurveDaoBuildSwapMultisignInputSchema;
5135
6172
  exports.mcpCurveDaoQuoteInputSchema = mcpCurveDaoQuoteInputSchema;
5136
6173
  exports.mcpCurveDaoQuoteOutputSchema = mcpCurveDaoQuoteOutputSchema;
@@ -5270,6 +6307,20 @@ exports.mcpUniswapV4RegisterPositionFromMintTxInputSchema = mcpUniswapV4Register
5270
6307
  exports.mcpUniswapV4RegisterPositionFromMintTxOutputSchema = mcpUniswapV4RegisterPositionFromMintTxOutputSchema;
5271
6308
  exports.mcpUniswapV4RegisterPositionNftInputSchema = mcpUniswapV4RegisterPositionNftInputSchema;
5272
6309
  exports.mcpUniswapV4RegisterPositionNftOutputSchema = mcpUniswapV4RegisterPositionNftOutputSchema;
6310
+ exports.mcpVeniceBurnDiemInputSchema = mcpVeniceBurnDiemInputSchema;
6311
+ exports.mcpVeniceCompleteUnstakeDiemInputSchema = mcpVeniceCompleteUnstakeDiemInputSchema;
6312
+ exports.mcpVeniceCompleteUnstakeSvvvInputSchema = mcpVeniceCompleteUnstakeSvvvInputSchema;
6313
+ exports.mcpVeniceInitiateUnstakeDiemInputSchema = mcpVeniceInitiateUnstakeDiemInputSchema;
6314
+ exports.mcpVeniceInitiateUnstakeSvvvInputSchema = mcpVeniceInitiateUnstakeSvvvInputSchema;
6315
+ exports.mcpVeniceListModelsInputSchema = mcpVeniceListModelsInputSchema;
6316
+ exports.mcpVeniceListModelsOutputSchema = mcpVeniceListModelsOutputSchema;
6317
+ exports.mcpVeniceMintDiemInputSchema = mcpVeniceMintDiemInputSchema;
6318
+ exports.mcpVeniceReadMintDiemPreviewInputSchema = mcpVeniceReadMintDiemPreviewInputSchema;
6319
+ exports.mcpVeniceReadMintDiemPreviewOutputSchema = mcpVeniceReadMintDiemPreviewOutputSchema;
6320
+ exports.mcpVeniceReadStakingStateInputSchema = mcpVeniceReadStakingStateInputSchema;
6321
+ exports.mcpVeniceReadStakingStateOutputSchema = mcpVeniceReadStakingStateOutputSchema;
6322
+ exports.mcpVeniceStakeDiemInputSchema = mcpVeniceStakeDiemInputSchema;
6323
+ exports.mcpVeniceStakeVvvInputSchema = mcpVeniceStakeVvvInputSchema;
5273
6324
  exports.multisignOutputSchema = multisignOutputSchema;
5274
6325
  exports.parseAgentBoolean = parseAgentBoolean;
5275
6326
  exports.parseAgentEvmChainId = parseAgentEvmChainId;