@continuumdao/ctm-mpc-defi 0.2.50 → 0.2.52

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 (38) hide show
  1. package/dist/agent/catalog.cjs +829 -55
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +93 -22
  4. package/dist/agent/catalog.js +829 -55
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/continuum-dao/SKILL.md +9 -6
  7. package/dist/agent/skills/continuum-dao-marketplace/SKILL.md +58 -0
  8. package/dist/agent/skills/hyperliquidOutcome/SKILL.md +47 -0
  9. package/dist/core/index.cjs +2 -1
  10. package/dist/core/index.cjs.map +1 -1
  11. package/dist/core/index.js +2 -1
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/index.cjs +2 -1
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.js +2 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  18. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  19. package/dist/protocols/evm/continuum-dao/index.cjs +2311 -62
  20. package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
  21. package/dist/protocols/evm/continuum-dao/index.d.ts +697 -2
  22. package/dist/protocols/evm/continuum-dao/index.js +2255 -64
  23. package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
  24. package/dist/protocols/evm/hyperliquidOutcome/index.cjs +1294 -0
  25. package/dist/protocols/evm/hyperliquidOutcome/index.cjs.map +1 -0
  26. package/dist/protocols/evm/hyperliquidOutcome/index.d.ts +465 -0
  27. package/dist/protocols/evm/hyperliquidOutcome/index.js +1247 -0
  28. package/dist/protocols/evm/hyperliquidOutcome/index.js.map +1 -0
  29. package/dist/protocols/evm/pendle/index.cjs +2 -1
  30. package/dist/protocols/evm/pendle/index.cjs.map +1 -1
  31. package/dist/protocols/evm/pendle/index.js +2 -1
  32. package/dist/protocols/evm/pendle/index.js.map +1 -1
  33. package/dist/protocols/evm/trueo/index.cjs +569 -9
  34. package/dist/protocols/evm/trueo/index.cjs.map +1 -1
  35. package/dist/protocols/evm/trueo/index.d.ts +42 -1
  36. package/dist/protocols/evm/trueo/index.js +569 -9
  37. package/dist/protocols/evm/trueo/index.js.map +1 -1
  38. package/package.json +6 -1
@@ -535,6 +535,10 @@ function votingEscrowAddressOnEvmChain(chainId) {
535
535
  const ve = continuumDaoDeployment(chainId)?.votingEscrow;
536
536
  return ve && isConfiguredAddress(ve) ? getAddress(ve) : null;
537
537
  }
538
+ function votingEscrowMarketplaceAddressOnEvmChain(chainId) {
539
+ if (chainId !== CONTINUUM_DAO_LINEA_CHAIN_ID) return null;
540
+ return VOTING_ESCROW_MARKETPLACE_LINEA_ADDRESS;
541
+ }
538
542
  function listContinuumDaoDefaultAssets() {
539
543
  const out = [];
540
544
  for (const chainId of [
@@ -566,7 +570,7 @@ function listContinuumDaoDefaultAssets() {
566
570
  }
567
571
  return out;
568
572
  }
569
- var CONTINUUM_DAO_PROTOCOL_ID, CONTINUUM_DAO_ETHEREUM_CHAIN_ID, CONTINUUM_DAO_LINEA_CHAIN_ID, CONTINUUM_DAO_LINEA_SEPOLIA_CHAIN_ID, CTM_TOKEN_NAME, CTM_TOKEN_SYMBOL, VECTM_TOKEN_NAME, VECTM_TOKEN_SYMBOL, CTM_TOKEN_DECIMALS, UNSET, CTM_TOKEN_ADDRESS, VOTING_ESCROW_LINEA_ADDRESS, CONTINUUM_DAO_DEPLOYMENTS;
573
+ var CONTINUUM_DAO_PROTOCOL_ID, CONTINUUM_DAO_ETHEREUM_CHAIN_ID, CONTINUUM_DAO_LINEA_CHAIN_ID, CONTINUUM_DAO_LINEA_SEPOLIA_CHAIN_ID, CTM_TOKEN_NAME, CTM_TOKEN_SYMBOL, VECTM_TOKEN_NAME, VECTM_TOKEN_SYMBOL, CTM_TOKEN_DECIMALS, UNSET, CTM_TOKEN_ADDRESS, VOTING_ESCROW_LINEA_ADDRESS, VOTING_ESCROW_MARKETPLACE_LINEA_ADDRESS, CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, CONTINUUM_DAO_DEPLOYMENTS;
570
574
  var init_constants2 = __esm({
571
575
  "src/protocols/evm/continuum-dao/constants.ts"() {
572
576
  CONTINUUM_DAO_PROTOCOL_ID = "continuum-dao";
@@ -587,6 +591,11 @@ var init_constants2 = __esm({
587
591
  };
588
592
  CTM_TOKEN_ADDRESS = getAddress("0x2026027054F5beBCEB650aBD62dC623e327658e7");
589
593
  VOTING_ESCROW_LINEA_ADDRESS = getAddress("0x221EC90B3B083A8501A37bdeb7035CeaedF3C31f");
594
+ getAddress("0x4ebd7cCBe32a51d1638cFE90E8eD1c4BdF42f729");
595
+ VOTING_ESCROW_MARKETPLACE_LINEA_ADDRESS = getAddress("0x92557d38beAe4658d3c03A02F349FFB60c3bfFA5");
596
+ getAddress("0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f");
597
+ getAddress("0x176211869cA2b568f2A7D4EE941E073a821EE1ff");
598
+ CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID = "continuum-dao-marketplace";
590
599
  getAddress("0x76FF2CB03175900F1D83328C82D27EA9aeaF2355");
591
600
  getAddress("0x4800F9f1dC1b6daCA841B71E0531F547D374168E");
592
601
  [
@@ -2752,7 +2761,12 @@ var MCP_NON_SUBMIT_TOOL_NAMES = /* @__PURE__ */ new Set([
2752
2761
  "ctm_trueo_search_markets",
2753
2762
  "ctm_trueo_fetch_market",
2754
2763
  "ctm_trueo_fetch_chance_series",
2755
- "ctm_trueo_fetch_orderbook"
2764
+ "ctm_trueo_fetch_orderbook",
2765
+ "ctm_hyperliquid_outcome_fetch_markets",
2766
+ "ctm_hyperliquid_outcome_fetch_market",
2767
+ "ctm_hyperliquid_outcome_fetch_orderbook",
2768
+ "ctm_hyperliquid_outcome_fetch_positions",
2769
+ "ctm_hyperliquid_outcome_fetch_open_orders"
2756
2770
  ]);
2757
2771
 
2758
2772
  // src/agent/schemas/protocols.ts
@@ -3682,7 +3696,16 @@ var mcpContinuumDaoRegisterProposalOutputSchema = z.object({
3682
3696
  ok: z.literal(true),
3683
3697
  result: z.unknown()
3684
3698
  });
3685
- var forumUrlField = { forumUrl: z.string().optional(), ticket: z.string().optional() };
3699
+ var forumNodeAddressField = z.string().optional().describe(
3700
+ "KeyGen ethereum address. The server reads the forum ticket stored on this node and continues only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is already logged in."
3701
+ );
3702
+ var forumUrlField = {
3703
+ forumUrl: z.string().optional(),
3704
+ ticket: z.string().optional().describe(
3705
+ "Forum ticket from get_forum_session. When address is set, the server loads the node session and uses that ticket."
3706
+ ),
3707
+ address: forumNodeAddressField
3708
+ };
3686
3709
  var mcpContinuumDaoForumResolveInputSchema = z.object({
3687
3710
  url: z.string().optional(),
3688
3711
  tid: z.union([z.string(), z.number()]).optional(),
@@ -3768,7 +3791,10 @@ var mcpContinuumDaoForumDeleteInputSchema = z.object({
3768
3791
  "Only delete posts/threads in the last X hours. Omit with since for all."
3769
3792
  ),
3770
3793
  since: z.string().min(1).optional().describe("Only delete posts/threads at or after this ISO date or unix timestamp. Omit with hours for all."),
3771
- ticket: z.string().min(1).describe("Forum write ticket from EIP-712 sign-in. Caller must be an admin or moderator."),
3794
+ ticket: z.string().min(1).optional().describe(
3795
+ "Forum ticket from get_forum_session. Omit when address is set; the server loads the node session. Caller must be an admin or moderator."
3796
+ ),
3797
+ address: forumNodeAddressField,
3772
3798
  forumUrl: z.string().optional()
3773
3799
  }).refine(
3774
3800
  (v) => {
@@ -3846,7 +3872,10 @@ var mcpContinuumDaoForumMeInputSchema = z.object({
3846
3872
  });
3847
3873
  var mcpContinuumDaoForumMeOutputSchema = z.unknown();
3848
3874
  var mcpContinuumDaoForumUnreadInputSchema = z.object({
3849
- ticket: z.string().min(1).describe("Forum write ticket from EIP-712 sign-in"),
3875
+ ticket: z.string().min(1).optional().describe(
3876
+ "Forum ticket from get_forum_session. Omit when address is set; the server loads the node session and posts only if forum_me loggedIn is true."
3877
+ ),
3878
+ address: forumNodeAddressField,
3850
3879
  filter: z.enum(["all", "new", "watched", "unreplied"]).optional().describe("NodeBB Unread filter. Default all (watched/tracked categories + followed topics)."),
3851
3880
  start: agentCoercedOptionalIntSchema(z.number().int().nonnegative()),
3852
3881
  limit: agentCoercedOptionalIntSchema(z.number().int().positive().max(100)),
@@ -3880,7 +3909,10 @@ var mcpContinuumDaoForumUnreadOutputSchema = z.object({
3880
3909
  nextStart: z.number().nullable().optional()
3881
3910
  });
3882
3911
  var mcpContinuumDaoForumMarkReadInputSchema = z.object({
3883
- ticket: z.string().min(1).describe("Forum write ticket from EIP-712 sign-in"),
3912
+ ticket: z.string().min(1).optional().describe(
3913
+ "Forum ticket from get_forum_session. Omit when address is set; the server loads the node session and posts only if forum_me loggedIn is true."
3914
+ ),
3915
+ address: forumNodeAddressField,
3884
3916
  tid: z.union([z.string(), z.number()]).optional().describe("Mark this thread read."),
3885
3917
  url: z.string().optional().describe("Mark this thread read by topic URL."),
3886
3918
  tids: z.array(z.union([z.string(), z.number()])).optional().describe("Mark these threads read."),
@@ -3896,7 +3928,10 @@ var mcpContinuumDaoForumMarkReadInputSchema = z.object({
3896
3928
  );
3897
3929
  var mcpContinuumDaoForumMarkReadOutputSchema = z.unknown();
3898
3930
  var mcpContinuumDaoForumMarkUnreadInputSchema = z.object({
3899
- ticket: z.string().min(1).describe("Forum write ticket from EIP-712 sign-in"),
3931
+ ticket: z.string().min(1).optional().describe(
3932
+ "Forum ticket from get_forum_session. Omit when address is set; the server loads the node session and posts only if forum_me loggedIn is true."
3933
+ ),
3934
+ address: forumNodeAddressField,
3900
3935
  tid: z.union([z.string(), z.number()]).optional(),
3901
3936
  url: z.string().optional(),
3902
3937
  forumUrl: z.string().optional()
@@ -3905,7 +3940,10 @@ var mcpContinuumDaoForumMarkUnreadInputSchema = z.object({
3905
3940
  });
3906
3941
  var mcpContinuumDaoForumMarkUnreadOutputSchema = z.unknown();
3907
3942
  var mcpContinuumDaoForumSignOutInputSchema = z.object({
3908
- ticket: z.string().min(1).describe("Forum write ticket from EIP-712 sign-in"),
3943
+ ticket: z.string().min(1).optional().describe(
3944
+ "Forum ticket from get_forum_session. Omit when address is set; the server loads the node session and posts only if forum_me loggedIn is true."
3945
+ ),
3946
+ address: forumNodeAddressField,
3909
3947
  forumUrl: z.string().optional()
3910
3948
  });
3911
3949
  var mcpContinuumDaoForumSignOutOutputSchema = z.object({
@@ -3974,11 +4012,19 @@ var mcpContinuumDaoForumSignInEligibleOutputSchema = z.object({
3974
4012
  ok: z.boolean(),
3975
4013
  eligible: z.boolean(),
3976
4014
  address: z.string().optional(),
3977
- reason: z.string().optional()
4015
+ reason: z.string().optional(),
4016
+ votingPower: z.string().optional().describe("Current balanceOfNFT wei for the owned or attached veCTM that was checked"),
4017
+ threshold: z.string().optional().describe("MultiSignAgentWallet.veCtmThresholdPower wei"),
4018
+ tokenId: z.string().optional()
3978
4019
  });
3979
4020
  var mcpContinuumDaoForumSignInInputSchema = mcpMultisignInput({
3980
- nodeKey: z.string().optional().describe("Attached node key. When set, username is the first 16 characters. Optional for a personal/KeyGen address with no node."),
3981
- username: z.string().min(2).max(16).optional().describe("Required on first login when there is no node key (2\u201316 letters, numbers, . _ -)."),
4021
+ nodeKey: z.string().optional().describe("Node key bound to this KeyGen. Required when useNodeKeyUsername is true. A node key does not choose the username by itself."),
4022
+ username: z.string().min(2).max(16).regex(/^[A-Za-z0-9._-]+$/).optional().describe(
4023
+ "Custom forum username for a wallet or a KeyGen. Ask the operator before calling. 2\u201316 letters, numbers, . _ -."
4024
+ ),
4025
+ useNodeKeyUsername: z.boolean().optional().describe(
4026
+ "Set true only after the operator declines a custom username. The forum assigns the first 16 characters of nodeKey."
4027
+ ),
3982
4028
  forumUrl: z.string().optional()
3983
4029
  });
3984
4030
  var mcpMapleSyrupMarketSummarySchema = z.object({
@@ -5402,7 +5448,7 @@ var mcpSearchPredictionMarketsInputSchema = z.object({
5402
5448
  "Pass the operator topic verbatim (case-insensitive title substring). Do not substitute a category name. Empty lists trending."
5403
5449
  ),
5404
5450
  category: z.string().optional().describe("Venue category, e.g. Politics"),
5405
- venues: z.array(z.string()).optional().describe("Optional venue filter. v1: trueo"),
5451
+ venues: z.array(z.string()).optional().describe('Optional venue filter. Omit to search trueo and hyperliquid. Restrict with ["trueo"] or ["hyperliquid"].'),
5406
5452
  trending: agentOptionalBooleanSchema().describe(
5407
5453
  "Trending board only when query and category are empty. Ignored when query is set."
5408
5454
  ),
@@ -5464,8 +5510,8 @@ var mcpListMyPredictionMarketsInputSchema = z.object({
5464
5510
  });
5465
5511
  var mcpListMyPredictionMarketsOutputSchema = mcpSearchPredictionMarketsOutputSchema;
5466
5512
  var mcpGetPredictionMarketInputSchema = z.object({
5467
- venue: z.string().optional().describe("Default trueo"),
5468
- venueMarketId: z.string().min(1).describe("Venue id (Trueo: market address)")
5513
+ venue: z.string().optional().describe("trueo (default) or hyperliquid"),
5514
+ venueMarketId: z.string().min(1).describe("Trueo market address, or Hyperliquid outcome id")
5469
5515
  });
5470
5516
  var mcpGetPredictionMarketOutputSchema = mcpPredictionMarketRowSchema.passthrough();
5471
5517
  var mcpTrueoWrapTydInputSchema = mcpMultisignInput({
@@ -5863,6 +5909,131 @@ var mcpCctpBuildBurnMultisignInputSchema = mcpMultisignInput({
5863
5909
  minFinalityThreshold: agentCoercedOptionalIntSchema(z.number().int().positive()),
5864
5910
  feeSnapshot: jsonObjectSchema.optional().describe("Optional output from ctm_cctp_fetch_burn_fees")
5865
5911
  });
5912
+ var outcomeIdSchema = z.number().int().nonnegative();
5913
+ var sideSchema = z.enum(["yes", "no"]);
5914
+ var mcpHyperliquidOutcomeFetchMarketsInputSchema = z.object({
5915
+ chainId: z.number().int().positive().optional().describe("999 mainnet or 998 testnet. Default 999."),
5916
+ query: z.string().optional().describe("Case-insensitive substring of the question, description, or outcome id."),
5917
+ limit: z.number().int().positive().optional(),
5918
+ offset: z.number().int().nonnegative().optional()
5919
+ });
5920
+ var mcpHyperliquidOutcomeMarketSchema = z.object({
5921
+ outcome: z.number(),
5922
+ question: z.string(),
5923
+ description: z.string(),
5924
+ questionId: z.number().nullable(),
5925
+ sideNames: z.tuple([z.string(), z.string()]),
5926
+ quoteToken: z.string(),
5927
+ yesCoin: z.string(),
5928
+ noCoin: z.string(),
5929
+ yesAssetId: z.number(),
5930
+ noAssetId: z.number(),
5931
+ yesPrice: z.number().nullable(),
5932
+ noPrice: z.number().nullable(),
5933
+ yesPriceLabel: z.string().nullable(),
5934
+ noPriceLabel: z.string().nullable(),
5935
+ expiresAt: z.string().nullable(),
5936
+ endOfTrading: z.number(),
5937
+ status: z.enum(["live", "closed"]),
5938
+ tradable: z.boolean(),
5939
+ categories: z.array(z.string())
5940
+ });
5941
+ var mcpHyperliquidOutcomeFetchMarketsOutputSchema = z.object({
5942
+ markets: z.array(mcpHyperliquidOutcomeMarketSchema),
5943
+ notes: z.string(),
5944
+ hasMore: z.boolean(),
5945
+ nextOffset: z.number()
5946
+ });
5947
+ var mcpHyperliquidOutcomeFetchMarketInputSchema = z.object({
5948
+ chainId: z.number().int().positive().optional(),
5949
+ outcome: outcomeIdSchema.describe("outcome id from outcomeMeta / search venueMarketId")
5950
+ });
5951
+ var mcpHyperliquidOutcomeBookSchema = z.object({
5952
+ coin: z.string(),
5953
+ bids: z.array(z.object({ px: z.string(), sz: z.string(), n: z.number() })),
5954
+ asks: z.array(z.object({ px: z.string(), sz: z.string(), n: z.number() }))
5955
+ });
5956
+ var mcpHyperliquidOutcomeFetchMarketOutputSchema = mcpHyperliquidOutcomeMarketSchema.extend({
5957
+ yesBook: mcpHyperliquidOutcomeBookSchema,
5958
+ noBook: mcpHyperliquidOutcomeBookSchema,
5959
+ notes: z.string()
5960
+ });
5961
+ var mcpHyperliquidOutcomeFetchOrderbookInputSchema = z.object({
5962
+ chainId: z.number().int().positive().optional(),
5963
+ outcome: outcomeIdSchema,
5964
+ side: sideSchema.optional().describe("Default yes")
5965
+ });
5966
+ var mcpHyperliquidOutcomeFetchOrderbookOutputSchema = z.object({
5967
+ outcome: z.number(),
5968
+ side: sideSchema,
5969
+ book: mcpHyperliquidOutcomeBookSchema,
5970
+ notes: z.string()
5971
+ });
5972
+ var mcpHyperliquidOutcomeFetchAccountInputSchema = z.object({
5973
+ chainId: z.number().int().positive().optional(),
5974
+ user: z.string().min(1).describe("HyperCore account address (the MPA ethereum address).")
5975
+ });
5976
+ var mcpHyperliquidOutcomeFetchPositionsOutputSchema = z.object({
5977
+ quoteBalances: z.array(z.object({ coin: z.string(), total: z.string(), hold: z.string() })),
5978
+ outcomeBalances: z.array(
5979
+ z.object({
5980
+ coin: z.string(),
5981
+ total: z.string(),
5982
+ hold: z.string(),
5983
+ outcome: z.number().nullable(),
5984
+ side: z.enum(["yes", "no"]).nullable()
5985
+ })
5986
+ ),
5987
+ notes: z.string()
5988
+ });
5989
+ var mcpHyperliquidOutcomeFetchOpenOrdersOutputSchema = z.object({
5990
+ openOrders: z.array(
5991
+ z.object({
5992
+ coin: z.string(),
5993
+ side: z.string(),
5994
+ limitPx: z.string(),
5995
+ sz: z.string(),
5996
+ oid: z.number(),
5997
+ timestamp: z.number(),
5998
+ outcome: z.number().nullable(),
5999
+ outcomeSide: z.enum(["yes", "no"]).nullable()
6000
+ })
6001
+ ),
6002
+ notes: z.string()
6003
+ });
6004
+ var mcpHyperliquidOutcomeOrderInputSchema = mcpMultisignInput({
6005
+ outcome: outcomeIdSchema,
6006
+ side: sideSchema,
6007
+ isBuy: z.boolean().describe("true buys the side, false sells it"),
6008
+ limitPxHuman: z.string().min(1).describe("Limit price in quote per share, typically 0 to 1"),
6009
+ szHuman: z.string().min(1).describe("Share size"),
6010
+ tif: z.enum(["gtc", "ioc", "alo"]).optional().describe("Default gtc. ioc crosses the book."),
6011
+ reduceOnly: agentOptionalBooleanSchema()
6012
+ });
6013
+ var mcpHyperliquidOutcomeCancelInputSchema = mcpMultisignInput({
6014
+ outcome: outcomeIdSchema,
6015
+ side: sideSchema,
6016
+ oid: z.number().int().positive()
6017
+ });
6018
+ var mcpHyperliquidOutcomeSplitInputSchema = mcpMultisignInput({
6019
+ outcome: outcomeIdSchema,
6020
+ amountHuman: z.string().min(1).describe("Quote amount to split into equal Yes and No shares")
6021
+ });
6022
+ var mcpHyperliquidOutcomeMergeInputSchema = mcpMultisignInput({
6023
+ outcome: outcomeIdSchema,
6024
+ amountHuman: z.string().optional().describe("Yes+No amount to merge. Omit or amountMax for the maximum."),
6025
+ amountMax: agentOptionalBooleanSchema()
6026
+ });
6027
+ var mcpHyperliquidOutcomeMergeQuestionInputSchema = mcpMultisignInput({
6028
+ question: outcomeIdSchema.describe("question id from outcomeMeta.questions"),
6029
+ amountHuman: z.string().optional(),
6030
+ amountMax: agentOptionalBooleanSchema()
6031
+ });
6032
+ var mcpHyperliquidOutcomeNegateInputSchema = mcpMultisignInput({
6033
+ question: outcomeIdSchema,
6034
+ outcome: outcomeIdSchema,
6035
+ amountHuman: z.string().min(1)
6036
+ });
5866
6037
 
5867
6038
  // src/agent/mcpProtocolTools.ts
5868
6039
  function defineProtocolMcpTool(def) {
@@ -7006,11 +7177,11 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
7006
7177
  actionId: "continuum-dao.forum-sign-in",
7007
7178
  protocolId: "continuum-dao",
7008
7179
  chainCategory: "evm",
7009
- description: "Build an EIP-712 forum login multi-sign (no EVM tx). Checks the KeyGen address against the forum veCTM threshold first and refuses if ineligible so other nodes never enter the sign loop. Pass nodeKey (username = first 16 chars) or a username on first login. After Get Sig, node-app exchanges the signature for a forum ticket.",
7180
+ description: "Build an EIP-712 forum login multi-sign (no EVM tx). Refuses when this node already has a live forum session for the KeyGen (getForumSession plus forum_me loggedIn) and returns that ticket instead of creating a sign request. Checks current balanceOfNFT on an owned or attached veCTM against MultiSignAgentWallet.veCtmThresholdPower and refuses if that power is short, so other nodes never enter the sign loop. Ask the operator for a custom username (2\u201316 letters, numbers, . _ -) and pass it as username. If they decline, set useNodeKeyUsername true with nodeKey; the forum assigns the first 16 characters of the node key. After Get Sig, node-app stores the ticket on the node.",
7010
7181
  prerequisites: [
7011
7182
  "keyGen",
7012
- "veCTM at or above MultiSignAgentWallet.veCtmThresholdPower (holder or attach-key)",
7013
- "nodeKey or username"
7183
+ "current balanceOfNFT on an owned or attached veCTM at or above MultiSignAgentWallet.veCtmThresholdPower",
7184
+ "username from the operator, or useNodeKeyUsername with nodeKey"
7014
7185
  ],
7015
7186
  followUp: [...MCP_MULTISIGN_SUBMIT_FOLLOW_UP, "ctm_continuum_dao_forum_me"],
7016
7187
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "buildEvmMultisignBodyContinuumDaoForumSignIn" },
@@ -7247,6 +7418,430 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
7247
7418
  prerequisites: ["keyGenId", "chainId 8453", "marketAddress", "side", "orderId"],
7248
7419
  handler: { importPath: "protocols/evm/trueo", exportName: "buildEvmMultisignBodyTrueoCancelOrder" },
7249
7420
  inputZod: mcpTrueoCancelOrderInputSchema
7421
+ }),
7422
+ defineProtocolMcpTool({
7423
+ name: "ctm_hyperliquid_outcome_build_order_multisign",
7424
+ actionId: "hyperliquidOutcome.order",
7425
+ protocolId: "hyperliquidOutcome",
7426
+ chainCategory: "evm",
7427
+ description: "Limit buy or sell a Hyperliquid HIP-4 outcome side. Asset id is 100000000 + 10*outcome + side (yes=0, no=1). EIP-712 Agent signature, no gas. IOC crosses the book. 30-minute expiry.",
7428
+ prerequisites: ["keyGenId", "chainId 999", "outcome id", "side yes|no", "isBuy", "limitPxHuman", "szHuman", "purposeText"],
7429
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "buildEvmMultisignBodyHyperliquidOutcomeOrder" },
7430
+ inputZod: mcpHyperliquidOutcomeOrderInputSchema
7431
+ }),
7432
+ defineProtocolMcpTool({
7433
+ name: "ctm_hyperliquid_outcome_build_cancel_multisign",
7434
+ actionId: "hyperliquidOutcome.cancel",
7435
+ protocolId: "hyperliquidOutcome",
7436
+ chainCategory: "evm",
7437
+ description: "Cancel a resting Hyperliquid outcome order by oid. EIP-712, no gas.",
7438
+ prerequisites: ["keyGenId", "chainId 999", "outcome", "side", "oid", "purposeText"],
7439
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "buildEvmMultisignBodyHyperliquidOutcomeCancel" },
7440
+ inputZod: mcpHyperliquidOutcomeCancelInputSchema
7441
+ }),
7442
+ defineProtocolMcpTool({
7443
+ name: "ctm_hyperliquid_outcome_build_split_multisign",
7444
+ actionId: "hyperliquidOutcome.split",
7445
+ protocolId: "hyperliquidOutcome",
7446
+ chainCategory: "evm",
7447
+ description: "Split quote tokens into equal Yes and No shares (userOutcome splitOutcome). EIP-712, no gas.",
7448
+ prerequisites: ["keyGenId", "chainId 999", "outcome", "amountHuman", "purposeText"],
7449
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "buildEvmMultisignBodyHyperliquidOutcomeSplit" },
7450
+ inputZod: mcpHyperliquidOutcomeSplitInputSchema
7451
+ }),
7452
+ defineProtocolMcpTool({
7453
+ name: "ctm_hyperliquid_outcome_build_merge_multisign",
7454
+ actionId: "hyperliquidOutcome.merge",
7455
+ protocolId: "hyperliquidOutcome",
7456
+ chainCategory: "evm",
7457
+ description: "Merge Yes and No shares back into quote (userOutcome mergeOutcome). Omit amount or set amountMax to merge the maximum. EIP-712, no gas.",
7458
+ prerequisites: ["keyGenId", "chainId 999", "outcome", "purposeText"],
7459
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "buildEvmMultisignBodyHyperliquidOutcomeMerge" },
7460
+ inputZod: mcpHyperliquidOutcomeMergeInputSchema
7461
+ }),
7462
+ defineProtocolMcpTool({
7463
+ name: "ctm_hyperliquid_outcome_build_merge_question_multisign",
7464
+ actionId: "hyperliquidOutcome.merge-question",
7465
+ protocolId: "hyperliquidOutcome",
7466
+ chainCategory: "evm",
7467
+ description: "Merge Yes shares across one question into quote tokens. EIP-712, no gas.",
7468
+ prerequisites: ["keyGenId", "chainId 999", "question id", "purposeText"],
7469
+ handler: {
7470
+ importPath: "protocols/evm/hyperliquidOutcome",
7471
+ exportName: "buildEvmMultisignBodyHyperliquidOutcomeMergeQuestion"
7472
+ },
7473
+ inputZod: mcpHyperliquidOutcomeMergeQuestionInputSchema
7474
+ }),
7475
+ defineProtocolMcpTool({
7476
+ name: "ctm_hyperliquid_outcome_build_negate_multisign",
7477
+ actionId: "hyperliquidOutcome.negate",
7478
+ protocolId: "hyperliquidOutcome",
7479
+ chainCategory: "evm",
7480
+ description: "Convert No shares of one outcome into Yes shares of the other outcomes in the question. EIP-712, no gas.",
7481
+ prerequisites: ["keyGenId", "chainId 999", "question", "outcome", "amountHuman", "purposeText"],
7482
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "buildEvmMultisignBodyHyperliquidOutcomeNegate" },
7483
+ inputZod: mcpHyperliquidOutcomeNegateInputSchema
7484
+ })
7485
+ ];
7486
+ var catalogQuery = {
7487
+ apiBase: z.string().optional().describe("Override https://app-api.continuumdao.org"),
7488
+ rpcUrl: z.string().optional().describe("Linea RPC used when the marketplace API is offline"),
7489
+ chainId: z.number().int().optional().describe("59144"),
7490
+ includeInactive: z.boolean().optional().describe("Include closed sales, offers, and settled auctions"),
7491
+ paymentToken: evmAddressSchema.optional(),
7492
+ tokenId: z.string().optional(),
7493
+ creator: evmAddressSchema.optional(),
7494
+ seller: evmAddressSchema.optional(),
7495
+ viewer: evmAddressSchema.optional(),
7496
+ limit: z.number().int().optional(),
7497
+ cursor: z.string().optional().describe("nextCursor from the previous page")
7498
+ };
7499
+ var mcpContinuumDaoMarketplaceSearchInputSchema = z.object({
7500
+ apiBase: catalogQuery.apiBase,
7501
+ rpcUrl: catalogQuery.rpcUrl,
7502
+ chainId: catalogQuery.chainId,
7503
+ kind: z.enum(["listing", "auction", "both"]).optional().describe("Default listing. Use auction or both only when the user wants to bid."),
7504
+ paymentToken: evmAddressSchema.optional().describe("Required when ranking by price and more than one payment token is listed"),
7505
+ minLockedCtm: z.string().optional().describe('Minimum locked CTM, human amount such as "1000"'),
7506
+ maxLockedCtm: z.string().optional().describe("Maximum locked CTM, human amount"),
7507
+ unlockBefore: z.string().optional().describe("ISO date or unix seconds"),
7508
+ unlockAfter: z.string().optional().describe("ISO date or unix seconds"),
7509
+ maxUnlockMonths: z.number().optional().describe("Still locked, and unlocks within this many 30-day months"),
7510
+ sort: z.enum(["pricePerLockedCtm", "price", "locked", "unlock", "deadline"]).optional().describe("Default pricePerLockedCtm, cheapest first. locked defaults to most CTM. unlock and deadline default to soonest."),
7511
+ sortDirection: z.enum(["asc", "desc"]).optional(),
7512
+ limit: z.number().int().min(1).max(25).optional().describe("Ranked rows to return, default 10"),
7513
+ executor: evmAddressSchema.optional().describe("KeyGen address. veCTMs this address sells are omitted."),
7514
+ excludeOwned: z.boolean().optional()
7515
+ });
7516
+ var mcpContinuumDaoMarketplaceFeeAlternativeInputSchema = z.object({
7517
+ apiBase: catalogQuery.apiBase,
7518
+ rpcUrl: z.string().min(1).describe("Linea RPC. Required to read the monthly fee, threshold, and voting power."),
7519
+ chainId: catalogQuery.chainId,
7520
+ payment: z.enum(["fee", "ctm"]).optional().describe("fee matches a USDC month. ctm matches a CTM month. Default fee."),
7521
+ executor: evmAddressSchema.optional().describe("KeyGen address. veCTMs this address sells are omitted.")
7522
+ });
7523
+ var mcpContinuumDaoMarketplaceFetchListingsInputSchema = z.object(catalogQuery);
7524
+ var mcpContinuumDaoMarketplaceFetchOfferingsInputSchema = z.object(catalogQuery);
7525
+ var mcpContinuumDaoMarketplaceFetchAuctionsInputSchema = z.object(catalogQuery);
7526
+ var mcpContinuumDaoMarketplaceFetchConfigInputSchema = z.object({
7527
+ apiBase: catalogQuery.apiBase,
7528
+ rpcUrl: catalogQuery.rpcUrl,
7529
+ chainId: catalogQuery.chainId
7530
+ });
7531
+ var mcpContinuumDaoMarketplaceFetchTokenInputSchema = z.object({
7532
+ apiBase: catalogQuery.apiBase,
7533
+ rpcUrl: catalogQuery.rpcUrl,
7534
+ chainId: catalogQuery.chainId,
7535
+ tokenId: z.string().min(1),
7536
+ viewer: catalogQuery.viewer
7537
+ });
7538
+ var mcpContinuumDaoMarketplaceFetchActivityInputSchema = z.object({
7539
+ apiBase: catalogQuery.apiBase,
7540
+ rpcUrl: catalogQuery.rpcUrl,
7541
+ chainId: catalogQuery.chainId,
7542
+ address: evmAddressSchema,
7543
+ limit: catalogQuery.limit
7544
+ });
7545
+ var mcpContinuumDaoMarketplaceFetchFeePreviewInputSchema = z.object({
7546
+ apiBase: catalogQuery.apiBase,
7547
+ rpcUrl: catalogQuery.rpcUrl,
7548
+ chainId: catalogQuery.chainId,
7549
+ tokenId: z.string().min(1),
7550
+ price: z.string().min(1).describe("Price in payment-token wei")
7551
+ });
7552
+ var source = z.enum(["api", "logs"]);
7553
+ var loose = z.record(z.unknown());
7554
+ var mcpContinuumDaoMarketplaceFeeAlternativeOutputSchema = z.object({
7555
+ payment: z.enum(["fee", "ctm"]),
7556
+ thresholdHuman: z.string(),
7557
+ monthlyFeeHuman: z.string(),
7558
+ monthlyFeeSymbol: z.string(),
7559
+ annualFeeHuman: z.string(),
7560
+ annualFeeCtmHuman: z.string(),
7561
+ example: loose.nullable(),
7562
+ summary: z.string(),
7563
+ source
7564
+ }).passthrough();
7565
+ var mcpContinuumDaoMarketplaceSearchOutputSchema = z.object({
7566
+ sort: z.string(),
7567
+ sortDirection: z.enum(["asc", "desc"]),
7568
+ paymentToken: z.string().nullable(),
7569
+ scanned: z.number(),
7570
+ truncated: z.boolean(),
7571
+ items: z.array(loose),
7572
+ source
7573
+ }).passthrough();
7574
+ var mcpContinuumDaoMarketplaceListOutputSchema = z.object({
7575
+ items: z.array(loose),
7576
+ nextCursor: z.string().nullable().optional(),
7577
+ source
7578
+ }).passthrough();
7579
+ var mcpContinuumDaoMarketplaceConfigOutputSchema = z.object({ source }).passthrough();
7580
+ var mcpContinuumDaoMarketplaceTokenOutputSchema = z.object({ source }).passthrough();
7581
+ var mcpContinuumDaoMarketplaceActivityOutputSchema = z.object({
7582
+ address: z.string(),
7583
+ orders: z.array(loose),
7584
+ auctions: z.array(loose),
7585
+ source
7586
+ }).passthrough();
7587
+ var mcpContinuumDaoMarketplaceFeeOutputSchema = z.object({ source }).passthrough();
7588
+ var wei = z.union([z.string(), z.number()]);
7589
+ var deadline = z.union([z.string(), z.number()]).describe("Unix seconds");
7590
+ var mcpContinuumDaoMarketplaceCreateListingInputSchema = mcpMultisignInput({
7591
+ tokenId: wei,
7592
+ paymentToken: evmAddressSchema,
7593
+ askWei: wei,
7594
+ deadline
7595
+ });
7596
+ var mcpContinuumDaoMarketplaceDelistInputSchema = mcpMultisignInput({ tokenId: wei });
7597
+ var mcpContinuumDaoMarketplaceFulfillListingInputSchema = mcpMultisignInput({
7598
+ tokenId: wei,
7599
+ seller: evmAddressSchema,
7600
+ paymentToken: evmAddressSchema,
7601
+ priceWei: wei
7602
+ });
7603
+ var mcpContinuumDaoMarketplaceCreateOfferingInputSchema = mcpMultisignInput({
7604
+ tokenId: wei,
7605
+ paymentToken: evmAddressSchema,
7606
+ bidWei: wei,
7607
+ deadline
7608
+ });
7609
+ var mcpContinuumDaoMarketplaceRescindInputSchema = mcpMultisignInput({ tokenId: wei });
7610
+ var mcpContinuumDaoMarketplaceFulfillOfferingInputSchema = mcpMultisignInput({
7611
+ tokenId: wei,
7612
+ buyer: evmAddressSchema,
7613
+ paymentToken: evmAddressSchema,
7614
+ priceWei: wei
7615
+ });
7616
+ var mcpContinuumDaoMarketplaceCreateAuctionInputSchema = mcpMultisignInput({
7617
+ tokenId: wei,
7618
+ paymentToken: evmAddressSchema,
7619
+ deadline,
7620
+ reserveWei: wei,
7621
+ minIncrementWei: wei
7622
+ });
7623
+ var mcpContinuumDaoMarketplaceCancelAuctionInputSchema = mcpMultisignInput({ tokenId: wei });
7624
+ var mcpContinuumDaoMarketplaceAuctionBidInputSchema = mcpMultisignInput({
7625
+ tokenId: wei,
7626
+ seller: evmAddressSchema,
7627
+ priceWei: wei
7628
+ });
7629
+ var mcpContinuumDaoMarketplaceSettleAuctionInputSchema = mcpMultisignInput({
7630
+ tokenId: wei,
7631
+ seller: evmAddressSchema
7632
+ });
7633
+
7634
+ // src/agent/mcpMarketplaceTools.ts
7635
+ var PROTOCOL = "continuum-dao-marketplace";
7636
+ var IMPORT_PATH = "protocols/evm/continuum-dao";
7637
+ function defineRead(def) {
7638
+ return {
7639
+ name: def.name,
7640
+ actionId: def.actionId,
7641
+ protocolId: PROTOCOL,
7642
+ chainCategory: "evm",
7643
+ description: def.description,
7644
+ prerequisites: def.prerequisites,
7645
+ followUp: def.followUp,
7646
+ handler: { importPath: IMPORT_PATH, exportName: def.exportName },
7647
+ inputZod: def.inputZod,
7648
+ outputZod: def.outputZod,
7649
+ inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),
7650
+ outputSchema: zodSchemaToMcpJsonSchema(def.outputZod),
7651
+ parseInput: (data) => def.inputZod.parse(data),
7652
+ parseOutput: (data) => def.outputZod.parse(data)
7653
+ };
7654
+ }
7655
+ function defineWrite(def) {
7656
+ const meta = withMultisignSubmitMcpMeta(def.description, MCP_MULTISIGN_SUBMIT_FOLLOW_UP);
7657
+ const handler = { importPath: IMPORT_PATH, exportName: def.exportName };
7658
+ return {
7659
+ name: def.name,
7660
+ actionId: def.actionId,
7661
+ protocolId: PROTOCOL,
7662
+ chainCategory: "evm",
7663
+ description: meta.description,
7664
+ prerequisites: def.prerequisites,
7665
+ followUp: meta.followUp,
7666
+ handler,
7667
+ inputZod: def.inputZod,
7668
+ outputZod: mcpServerSubmitOutputSchema,
7669
+ inputSchema: agentFacingMultisignJsonSchema(def.inputZod),
7670
+ outputSchema: zodSchemaToMcpJsonSchema(mcpServerSubmitOutputSchema),
7671
+ parseInput: (data) => def.inputZod.parse(data),
7672
+ parseOutput: (data) => mcpServerSubmitOutputSchema.parse(data)
7673
+ };
7674
+ }
7675
+ var MCP_MARKETPLACE_TOOL_DEFINITIONS = [
7676
+ defineRead({
7677
+ name: "ctm_continuum_dao_marketplace_fetch_config",
7678
+ actionId: "continuum-dao-marketplace.fetch-config",
7679
+ description: "Marketplace config: payment tokens, WETH, duration bounds, fee tiers. Falls back to the Linea contract when the API is down.",
7680
+ prerequisites: ["chainId 59144", "rpcUrl when the API may be offline"],
7681
+ followUp: ["ctm_continuum_dao_marketplace_search", "ctm_continuum_dao_marketplace_fetch_listings", "ctm_continuum_dao_marketplace_fetch_auctions"],
7682
+ inputZod: mcpContinuumDaoMarketplaceFetchConfigInputSchema,
7683
+ outputZod: mcpContinuumDaoMarketplaceConfigOutputSchema,
7684
+ exportName: "fetchContinuumDaoMarketplaceConfig"
7685
+ }),
7686
+ defineRead({
7687
+ name: "ctm_continuum_dao_marketplace_fee_alternative",
7688
+ actionId: "continuum-dao-marketplace.fee-alternative",
7689
+ description: "Alternative to paying a KeyGen month in the fee token or CTM. Returns the live monthly fee, 12 times that fee, the veCTM threshold, and one direct listing whose locked CTM and voting power are both above the threshold. Auctions are excluded. Relay the summary, then continue the paid month. Buy the listing only if the user chooses it. Skip this when the month is already waived.",
7690
+ prerequisites: ["rpcUrl", "payment fee or ctm"],
7691
+ followUp: ["ctm_continuum_dao_marketplace_build_fulfill_listing_multisign"],
7692
+ inputZod: mcpContinuumDaoMarketplaceFeeAlternativeInputSchema,
7693
+ outputZod: mcpContinuumDaoMarketplaceFeeAlternativeOutputSchema,
7694
+ exportName: "quoteContinuumDaoMarketplaceFeeAlternative"
7695
+ }),
7696
+ defineRead({
7697
+ name: "ctm_continuum_dao_marketplace_search",
7698
+ actionId: "continuum-dao-marketplace.search",
7699
+ description: "Rank veCTMs for sale. Returns a short list already sorted by price per locked CTM, price, locked CTM, unlock, or deadline. Filters: min/max locked CTM, unlock window, maxUnlockMonths. Pass paymentToken to compare prices. Pass executor to drop veCTMs this KeyGen sells. Use this to choose a buy. Do not fetch the raw listing page and then offer to sort it.",
7700
+ prerequisites: ["chainId 59144", "rpcUrl when lock snapshots are missing"],
7701
+ followUp: ["ctm_continuum_dao_marketplace_build_fulfill_listing_multisign", "ctm_continuum_dao_marketplace_build_auction_bid_multisign"],
7702
+ inputZod: mcpContinuumDaoMarketplaceSearchInputSchema,
7703
+ outputZod: mcpContinuumDaoMarketplaceSearchOutputSchema,
7704
+ exportName: "searchContinuumDaoMarketplace"
7705
+ }),
7706
+ defineRead({
7707
+ name: "ctm_continuum_dao_marketplace_fetch_listings",
7708
+ actionId: "continuum-dao-marketplace.fetch-listings",
7709
+ description: "Unfiltered page of open veCTM listings, created order, up to 100, with nextCursor. includeInactive adds past sales. To choose a buy by price, locked CTM, or unlock time, use search instead.",
7710
+ prerequisites: ["chainId 59144"],
7711
+ followUp: ["ctm_continuum_dao_marketplace_build_fulfill_listing_multisign"],
7712
+ inputZod: mcpContinuumDaoMarketplaceFetchListingsInputSchema,
7713
+ outputZod: mcpContinuumDaoMarketplaceListOutputSchema,
7714
+ exportName: "fetchContinuumDaoMarketplaceListings"
7715
+ }),
7716
+ defineRead({
7717
+ name: "ctm_continuum_dao_marketplace_fetch_offerings",
7718
+ actionId: "continuum-dao-marketplace.fetch-offerings",
7719
+ description: "Open veCTM offerings. includeInactive adds fulfilled and rescinded rows. API first, then marketplace logs.",
7720
+ prerequisites: ["chainId 59144"],
7721
+ followUp: ["ctm_continuum_dao_marketplace_build_fulfill_offering_multisign"],
7722
+ inputZod: mcpContinuumDaoMarketplaceFetchOfferingsInputSchema,
7723
+ outputZod: mcpContinuumDaoMarketplaceListOutputSchema,
7724
+ exportName: "fetchContinuumDaoMarketplaceOfferings"
7725
+ }),
7726
+ defineRead({
7727
+ name: "ctm_continuum_dao_marketplace_fetch_auctions",
7728
+ actionId: "continuum-dao-marketplace.fetch-auctions",
7729
+ description: "Live veCTM auctions (Pending, Active, Complete). includeInactive adds sold, canceled, and expired. Each auction includes bids.",
7730
+ prerequisites: ["chainId 59144"],
7731
+ followUp: ["ctm_continuum_dao_marketplace_build_auction_bid_multisign", "ctm_continuum_dao_marketplace_build_settle_auction_multisign"],
7732
+ inputZod: mcpContinuumDaoMarketplaceFetchAuctionsInputSchema,
7733
+ outputZod: mcpContinuumDaoMarketplaceListOutputSchema,
7734
+ exportName: "fetchContinuumDaoMarketplaceAuctions"
7735
+ }),
7736
+ defineRead({
7737
+ name: "ctm_continuum_dao_marketplace_fetch_token",
7738
+ actionId: "continuum-dao-marketplace.fetch-token",
7739
+ description: "One veCTM: live listing, offerings, and auction, plus history of closed sales and auctions with bids.",
7740
+ prerequisites: ["tokenId"],
7741
+ followUp: ["ctm_continuum_dao_marketplace_fetch_auctions"],
7742
+ inputZod: mcpContinuumDaoMarketplaceFetchTokenInputSchema,
7743
+ outputZod: mcpContinuumDaoMarketplaceTokenOutputSchema,
7744
+ exportName: "fetchContinuumDaoMarketplaceToken"
7745
+ }),
7746
+ defineRead({
7747
+ name: "ctm_continuum_dao_marketplace_fetch_activity",
7748
+ actionId: "continuum-dao-marketplace.fetch-activity",
7749
+ description: "One address\u2019s marketplace orders and auctions, including past sales and bids.",
7750
+ prerequisites: ["address"],
7751
+ followUp: ["ctm_continuum_dao_marketplace_fetch_token"],
7752
+ inputZod: mcpContinuumDaoMarketplaceFetchActivityInputSchema,
7753
+ outputZod: mcpContinuumDaoMarketplaceActivityOutputSchema,
7754
+ exportName: "fetchContinuumDaoMarketplaceActivity"
7755
+ }),
7756
+ defineRead({
7757
+ name: "ctm_continuum_dao_marketplace_fetch_fee_preview",
7758
+ actionId: "continuum-dao-marketplace.fetch-fee-preview",
7759
+ description: "Protocol fee for a veCTM price. Uses the API, then on-chain fee tiers.",
7760
+ prerequisites: ["tokenId", "price wei"],
7761
+ followUp: ["ctm_continuum_dao_marketplace_build_create_listing_multisign"],
7762
+ inputZod: mcpContinuumDaoMarketplaceFetchFeePreviewInputSchema,
7763
+ outputZod: mcpContinuumDaoMarketplaceFeeOutputSchema,
7764
+ exportName: "fetchContinuumDaoMarketplaceFeePreview"
7765
+ }),
7766
+ defineWrite({
7767
+ name: "ctm_continuum_dao_marketplace_build_create_listing_multisign",
7768
+ actionId: "continuum-dao-marketplace.create-listing",
7769
+ description: "List a veCTM. Approves the marketplace for the token id when needed. Linea only.",
7770
+ prerequisites: ["keyGen", "tokenId owned by the KeyGen", "askWei", "deadline"],
7771
+ inputZod: mcpContinuumDaoMarketplaceCreateListingInputSchema,
7772
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceCreateListing"
7773
+ }),
7774
+ defineWrite({
7775
+ name: "ctm_continuum_dao_marketplace_build_delist_multisign",
7776
+ actionId: "continuum-dao-marketplace.delist",
7777
+ description: "Delist this KeyGen\u2019s open veCTM listing.",
7778
+ prerequisites: ["keyGen", "tokenId"],
7779
+ inputZod: mcpContinuumDaoMarketplaceDelistInputSchema,
7780
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceDelist"
7781
+ }),
7782
+ defineWrite({
7783
+ name: "ctm_continuum_dao_marketplace_build_fulfill_listing_multisign",
7784
+ actionId: "continuum-dao-marketplace.fulfill-listing",
7785
+ description: "Buy a listed veCTM. Refuses when this KeyGen already owns it or is the seller. WETH sends msg.value.",
7786
+ prerequisites: ["keyGen", "tokenId", "seller", "priceWei"],
7787
+ inputZod: mcpContinuumDaoMarketplaceFulfillListingInputSchema,
7788
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceFulfillListing"
7789
+ }),
7790
+ defineWrite({
7791
+ name: "ctm_continuum_dao_marketplace_build_create_offering_multisign",
7792
+ actionId: "continuum-dao-marketplace.create-offering",
7793
+ description: "Offer on a veCTM this KeyGen does not own. WETH sends msg.value and still approves WETH for later fulfillment.",
7794
+ prerequisites: ["keyGen", "tokenId", "bidWei", "deadline"],
7795
+ inputZod: mcpContinuumDaoMarketplaceCreateOfferingInputSchema,
7796
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceCreateOffering"
7797
+ }),
7798
+ defineWrite({
7799
+ name: "ctm_continuum_dao_marketplace_build_rescind_multisign",
7800
+ actionId: "continuum-dao-marketplace.rescind",
7801
+ description: "Rescind this KeyGen\u2019s open offering.",
7802
+ prerequisites: ["keyGen", "tokenId"],
7803
+ inputZod: mcpContinuumDaoMarketplaceRescindInputSchema,
7804
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceRescind"
7805
+ }),
7806
+ defineWrite({
7807
+ name: "ctm_continuum_dao_marketplace_build_fulfill_offering_multisign",
7808
+ actionId: "continuum-dao-marketplace.fulfill-offering",
7809
+ description: "Accept an offering on a veCTM this KeyGen owns. Refuses an attached KeyGen.",
7810
+ prerequisites: ["keyGen", "tokenId", "buyer", "priceWei"],
7811
+ inputZod: mcpContinuumDaoMarketplaceFulfillOfferingInputSchema,
7812
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceFulfillOffering"
7813
+ }),
7814
+ defineWrite({
7815
+ name: "ctm_continuum_dao_marketplace_build_create_auction_multisign",
7816
+ actionId: "continuum-dao-marketplace.create-auction",
7817
+ description: "Start an auction and escrow the veCTM. Refuses an attached KeyGen.",
7818
+ prerequisites: ["keyGen", "tokenId", "reserveWei", "minIncrementWei", "deadline"],
7819
+ inputZod: mcpContinuumDaoMarketplaceCreateAuctionInputSchema,
7820
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceCreateAuction"
7821
+ }),
7822
+ defineWrite({
7823
+ name: "ctm_continuum_dao_marketplace_build_cancel_auction_multisign",
7824
+ actionId: "continuum-dao-marketplace.cancel-auction",
7825
+ description: "Cancel a pending auction that has no bids. The veCTM returns to the seller.",
7826
+ prerequisites: ["keyGen", "tokenId"],
7827
+ inputZod: mcpContinuumDaoMarketplaceCancelAuctionInputSchema,
7828
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceCancelAuction"
7829
+ }),
7830
+ defineWrite({
7831
+ name: "ctm_continuum_dao_marketplace_build_auction_bid_multisign",
7832
+ actionId: "continuum-dao-marketplace.auction-bid",
7833
+ description: "Bid on a live auction. Refuses when this KeyGen is the seller or already owns the veCTM.",
7834
+ prerequisites: ["keyGen", "tokenId", "seller", "priceWei"],
7835
+ inputZod: mcpContinuumDaoMarketplaceAuctionBidInputSchema,
7836
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceAuctionBid"
7837
+ }),
7838
+ defineWrite({
7839
+ name: "ctm_continuum_dao_marketplace_build_settle_auction_multisign",
7840
+ actionId: "continuum-dao-marketplace.settle-auction",
7841
+ description: "Settle a completed or expired auction. A completed auction transfers the veCTM to the highest bidder.",
7842
+ prerequisites: ["keyGen", "tokenId", "seller"],
7843
+ inputZod: mcpContinuumDaoMarketplaceSettleAuctionInputSchema,
7844
+ exportName: "buildEvmMultisignBodyContinuumDaoMarketplaceSettleAuction"
7250
7845
  })
7251
7846
  ];
7252
7847
 
@@ -8817,7 +9412,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8817
9412
  actionId: "continuum-dao.forum-sign-in-eligible",
8818
9413
  protocolId: "continuum-dao",
8819
9414
  chainCategory: "evm",
8820
- description: "Check whether an address may EIP-712 sign in to the forum (holder or attach-key veCTM at MultiSignAgentWallet.veCtmThresholdPower). Call this before ctm_continuum_dao_build_forum_sign_in_multisign. If eligible is false, do not start a multi-sign request.",
9415
+ description: "Check whether an address may EIP-712 sign in to the forum. Call get_forum_session and forum_me first. Call this only when there is no live node session (loggedIn is false). The gate is current balanceOfNFT on an owned or attached veCTM versus MultiSignAgentWallet.veCtmThresholdPower. Governor getVotes and month-start balanceOfNFTAt do not count. If eligible is false, do not start a multi-sign request.",
8821
9416
  prerequisites: ["address (KeyGen ethereumaddress)"],
8822
9417
  followUp: ["ctm_continuum_dao_build_forum_sign_in_multisign"],
8823
9418
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumSignInEligible" },
@@ -8889,7 +9484,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8889
9484
  actionId: "continuum-dao.forum-delete",
8890
9485
  protocolId: "continuum-dao",
8891
9486
  chainCategory: "evm",
8892
- description: "Admin or moderator soft-delete on forum.continuumdao.org. Requires a forum ticket. Caller must be an administrator or category moderator \u2014 post owners are refused. Exactly one of: pid (one post), tid/url (one thread), or username (that user\u2019s posts). Optional hours or since; omit both to delete all matches. Confirm with the operator before calling, especially username. Then forum_fetch_post / forum_search to verify.",
9487
+ description: "Admin or moderator soft-delete on forum.continuumdao.org. Pass address so the server loads the node forum session and continues only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is logged in. Caller must be an administrator or category moderator \u2014 post owners are refused. Exactly one of: pid (one post), tid/url (one thread), or username (that user\u2019s posts). Optional hours or since; omit both to delete all matches. Confirm with the operator before calling, especially username. Then forum_fetch_post / forum_search to verify.",
8893
9488
  prerequisites: ["ticket", "exactly one of pid, tid/url, or username"],
8894
9489
  followUp: ["ctm_continuum_dao_forum_fetch_post", "ctm_continuum_dao_forum_recent", "ctm_continuum_dao_forum_sign_out"],
8895
9490
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumDelete" },
@@ -8925,7 +9520,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8925
9520
  actionId: "continuum-dao.forum-reply",
8926
9521
  protocolId: "continuum-dao",
8927
9522
  chainCategory: "evm",
8928
- description: "Post an English reply (max 8000 characters) to a forum thread (Ideas, Governance, or MPA listing). Requires forumTicket. Do not use for Agent Mail \u2014 use mpa_mailbox_send. Locked MPA listings refuse replies.",
9523
+ description: "Post an English reply (max 8000 characters) to a forum thread (Ideas, Governance, or MPA listing). Pass address so the server loads the node forum session and posts only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is logged in. Do not use for Agent Mail \u2014 use mpa_mailbox_send. Locked MPA listings refuse replies.",
8929
9524
  prerequisites: ["ticket", "content", "url or tid"],
8930
9525
  followUp: ["ctm_continuum_dao_forum_fetch_thread"],
8931
9526
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumReply" },
@@ -8937,7 +9532,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8937
9532
  actionId: "continuum-dao.forum-react",
8938
9533
  protocolId: "continuum-dao",
8939
9534
  chainCategory: "evm",
8940
- description: "Toggle an allowlisted reaction on a post: +1, -1, heart, tada, eyes. Requires forumTicket.",
9535
+ description: "Toggle an allowlisted reaction on a post: +1, -1, heart, tada, eyes. Pass address so the server loads the node forum session and posts only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is logged in.",
8941
9536
  prerequisites: ["ticket", "pid", "emoji"],
8942
9537
  followUp: ["ctm_continuum_dao_forum_fetch_post"],
8943
9538
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumReact" },
@@ -8949,7 +9544,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8949
9544
  actionId: "continuum-dao.forum-create-topic",
8950
9545
  protocolId: "continuum-dao",
8951
9546
  chainCategory: "evm",
8952
- description: "Create a formal proposal thread in a Governance section: decision, election, treasury, constitution, or admin. Requires getVotes >= live proposalThreshold() and a forumTicket. Never use Ideas & Suggestions here. Pass the returned url as forumKey on build_propose_* and register_proposal. Map type Decision\u2192decision, Election\u2192election, Treasury\u2192treasury, Constitution\u2192constitution, Admin\u2192admin.",
9547
+ description: "Create a formal proposal thread in a Governance section: decision, election, treasury, constitution, or admin. Requires getVotes >= live proposalThreshold(). Pass address so the server loads the node forum session and posts only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is logged in. Never use Ideas & Suggestions here. Pass the returned url as forumKey on build_propose_* and register_proposal. Map type Decision\u2192decision, Election\u2192election, Treasury\u2192treasury, Constitution\u2192constitution, Admin\u2192admin.",
8953
9548
  prerequisites: ["ticket", "title", "content", "section or cid", "governor configured on the forum"],
8954
9549
  followUp: ["ctm_continuum_dao_build_propose_bravo_multisign", "ctm_continuum_dao_build_propose_delta_multisign"],
8955
9550
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumCreateTopic" },
@@ -8961,7 +9556,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8961
9556
  actionId: "continuum-dao.forum-create-idea",
8962
9557
  protocolId: "continuum-dao",
8963
9558
  chainCategory: "evm",
8964
- description: "Post an Idea or Suggestion (discussion only) to Ideas & Suggestions for ContinuumDAO protocol / DAO management. Not a proposal and not a valid forumKey. Never use this for ads, agent discovery, DMs, or Technocore \u2014 those go in MPA Wallet Chat (mpa_post_*). Constitution CoC applies; spam or off-section posts are a ban.",
9559
+ description: "Post an Idea or Suggestion (discussion only) to Ideas & Suggestions for ContinuumDAO protocol / DAO management. Pass address so the server loads the node forum session and posts only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is logged in. Not a proposal and not a valid forumKey. Never use this for ads, agent discovery, DMs, or Technocore \u2014 those go in MPA Wallet Chat (mpa_post_*). Constitution CoC applies; spam or off-section posts are a ban.",
8965
9560
  prerequisites: ["ticket", "title", "content"],
8966
9561
  followUp: ["ctm_continuum_dao_forum_reply", "ctm_continuum_dao_forum_sign_out"],
8967
9562
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumCreateIdea" },
@@ -8973,7 +9568,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8973
9568
  actionId: "continuum-dao.mpa-post-listing",
8974
9569
  protocolId: "continuum-dao",
8975
9570
  chainCategory: "evm",
8976
- description: "Post one MPA Wallet Chat listing (offer, request, directory, or opportunity). Wallet login required; proposal threshold is not. One active listing per kind. Forum injects the HITL sentence. Never post ads to Ideas or Governance. Agents use this, not NodeBB chat.",
9571
+ description: "Post one MPA Wallet Chat listing (offer, request, directory, or opportunity). Pass address so the server loads the node forum session and posts only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is logged in. Wallet login required; proposal threshold is not. One active listing per kind. Forum injects the HITL sentence. Never post ads to Ideas or Governance. Agents use this, not NodeBB chat.",
8977
9572
  prerequisites: ["ticket", "kind", "summary", "details", "capabilities"],
8978
9573
  followUp: ["ctm_continuum_dao_forum_reply", "ctm_continuum_dao_mpa_retract"],
8979
9574
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoMpaListing" },
@@ -8985,7 +9580,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8985
9580
  actionId: "continuum-dao.mpa-reply",
8986
9581
  protocolId: "continuum-dao",
8987
9582
  chainCategory: "evm",
8988
- description: "Reply on an MPA listing thread (30s cooldown). Locked listings refuse replies. Not for Agent Mail \u2014 use mpa_mailbox_send.",
9583
+ description: "Reply on an MPA listing thread (30s cooldown). Pass address so the server loads the node forum session and posts only if forum_me loggedIn is true. Locked listings refuse replies. Not for Agent Mail \u2014 use mpa_mailbox_send.",
8989
9584
  prerequisites: ["ticket", "content", "url or tid"],
8990
9585
  followUp: ["ctm_continuum_dao_forum_fetch_thread"],
8991
9586
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumReply" },
@@ -8997,7 +9592,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
8997
9592
  actionId: "continuum-dao.mpa-retract",
8998
9593
  protocolId: "continuum-dao",
8999
9594
  chainCategory: "evm",
9000
- description: "Retract your MPA listing (locks immediately; soft-delete 90 days later). Requires ticket and url or tid.",
9595
+ description: "Retract your MPA listing (locks immediately; soft-delete 90 days later). Pass address so the server loads the node forum session and continues only if forum_me loggedIn is true. Requires url or tid.",
9001
9596
  prerequisites: ["ticket", "url or tid"],
9002
9597
  followUp: ["ctm_continuum_dao_mpa_post_listing"],
9003
9598
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoMpaRetract" },
@@ -9009,7 +9604,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9009
9604
  actionId: "continuum-dao.mpa-flag",
9010
9605
  protocolId: "continuum-dao",
9011
9606
  chainCategory: "evm",
9012
- description: "Flag an MPA listing for moderators. Requires ticket, reason, and url or tid.",
9607
+ description: "Flag an MPA listing for moderators. Pass address so the server loads the node forum session and continues only if forum_me loggedIn is true. Requires reason and url or tid.",
9013
9608
  prerequisites: ["ticket", "reason", "url or tid"],
9014
9609
  followUp: ["ctm_continuum_dao_forum_fetch_thread"],
9015
9610
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoMpaFlag" },
@@ -9045,7 +9640,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9045
9640
  actionId: "continuum-dao.mpa-mailbox-send",
9046
9641
  protocolId: "continuum-dao",
9047
9642
  chainCategory: "evm",
9048
- description: "Send an Agent Mail message to another KeyGen (username or existing tid/url). Agents must use this, never NodeBB chat or forum_reply on mail threads.",
9643
+ description: "Send an Agent Mail message to another KeyGen (username or existing tid/url). Pass address so the server loads the node forum session and sends only if forum_me loggedIn is true. Do not call build_forum_sign_in_multisign when that session is logged in. Agents must use this, never NodeBB chat or forum_reply on mail threads.",
9049
9644
  prerequisites: ["ticket", "content", "username or url or tid"],
9050
9645
  followUp: ["ctm_continuum_dao_mpa_mailbox_list"],
9051
9646
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoMpaMailboxSend" },
@@ -9085,7 +9680,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9085
9680
  actionId: "continuum-dao.forum-unread",
9086
9681
  protocolId: "continuum-dao",
9087
9682
  chainCategory: "evm",
9088
- description: "List unread Forum topics for the logged-in user (NodeBB Unread). Requires a forum ticket. Optional filter all/new/watched/unreplied. Returns tid, title, url, replyCount, lastPostAt \u2014 then forum_fetch_thread and forum_mark_read. Interactive only; never from cron.",
9683
+ description: "List unread Forum topics for the logged-in user (NodeBB Unread). Pass address so the server loads the node forum session and continues only if forum_me loggedIn is true. Optional filter all/new/watched/unreplied. Returns tid, title, url, replyCount, lastPostAt \u2014 then forum_fetch_thread and forum_mark_read. Interactive only; never from cron.",
9089
9684
  prerequisites: ["ticket"],
9090
9685
  followUp: ["ctm_continuum_dao_forum_fetch_thread", "ctm_continuum_dao_forum_mark_read"],
9091
9686
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumUnread" },
@@ -9097,7 +9692,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9097
9692
  actionId: "continuum-dao.forum-mark-read",
9098
9693
  protocolId: "continuum-dao",
9099
9694
  chainCategory: "evm",
9100
- description: "Mark Forum topic(s) read for the logged-in user (clears NodeBB Unread and topic notifications). Requires a ticket. Exactly one of tid/url, tids, or all. Confirm before all. Interactive only; never from cron.",
9695
+ description: "Mark Forum topic(s) read for the logged-in user (clears NodeBB Unread and topic notifications). Pass address so the server loads the node forum session and continues only if forum_me loggedIn is true. Exactly one of tid/url, tids, or all. Confirm before all. Interactive only; never from cron.",
9101
9696
  prerequisites: ["ticket", "exactly one of tid/url, tids, or all"],
9102
9697
  followUp: ["ctm_continuum_dao_forum_unread", "ctm_continuum_dao_forum_fetch_thread"],
9103
9698
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumMarkRead" },
@@ -9109,7 +9704,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9109
9704
  actionId: "continuum-dao.forum-mark-unread",
9110
9705
  protocolId: "continuum-dao",
9111
9706
  chainCategory: "evm",
9112
- description: "Mark one Forum topic unread for the logged-in user. Requires a ticket and tid or url. Interactive only; never from cron.",
9707
+ description: "Mark one Forum topic unread for the logged-in user. Pass address so the server loads the node forum session and continues only if forum_me loggedIn is true. Requires tid or url. Interactive only; never from cron.",
9113
9708
  prerequisites: ["ticket", "tid or url"],
9114
9709
  followUp: ["ctm_continuum_dao_forum_unread"],
9115
9710
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumMarkUnread" },
@@ -9121,7 +9716,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9121
9716
  actionId: "continuum-dao.forum-sign-out",
9122
9717
  protocolId: "continuum-dao",
9123
9718
  chainCategory: "evm",
9124
- description: "Revoke the forum ticket and destroy NodeBB sessions for that user. Requires the ticket from EIP-712 sign-in. Does not create a multi-sign request.",
9719
+ description: "Revoke the forum ticket and destroy NodeBB sessions for that user. Pass address or ticket. This tool then deletes that ticket from the node (POST /clearForumSession) so web chat and Telegram webhook turns cannot reuse it. Does not create a multi-sign request.",
9125
9720
  prerequisites: ["ticket from forum sign-in"],
9126
9721
  followUp: ["ctm_continuum_dao_forum_me"],
9127
9722
  handler: { importPath: "protocols/evm/continuum-dao", exportName: "continuumDaoForumSignOut" },
@@ -9701,12 +10296,72 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9701
10296
  inputZod: mcpDeriveFetchOpenOrdersInputSchema,
9702
10297
  outputZod: mcpDeriveFetchOpenOrdersOutputSchema
9703
10298
  }),
10299
+ defineMcpTool({
10300
+ name: "ctm_hyperliquid_outcome_fetch_markets",
10301
+ actionId: "hyperliquidOutcome.fetch-markets",
10302
+ protocolId: "hyperliquidOutcome",
10303
+ chainCategory: "evm",
10304
+ description: "Live Hyperliquid HIP-4 outcome markets from outcomeMeta, with Yes/No mids. Optional query substring. Chain 999.",
10305
+ prerequisites: ["load_defi_protocol hyperliquidOutcome"],
10306
+ followUp: ["ctm_hyperliquid_outcome_fetch_market", "ctm_hyperliquid_outcome_build_order_multisign"],
10307
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "hyperliquidOutcomeFetchMarketsSummary" },
10308
+ inputZod: mcpHyperliquidOutcomeFetchMarketsInputSchema,
10309
+ outputZod: mcpHyperliquidOutcomeFetchMarketsOutputSchema
10310
+ }),
10311
+ defineMcpTool({
10312
+ name: "ctm_hyperliquid_outcome_fetch_market",
10313
+ actionId: "hyperliquidOutcome.fetch-market",
10314
+ protocolId: "hyperliquidOutcome",
10315
+ chainCategory: "evm",
10316
+ description: "One Hyperliquid outcome market plus both Yes and No order books.",
10317
+ prerequisites: ["load_defi_protocol hyperliquidOutcome", "outcome id"],
10318
+ followUp: ["ctm_hyperliquid_outcome_build_order_multisign"],
10319
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "hyperliquidOutcomeFetchMarketSummary" },
10320
+ inputZod: mcpHyperliquidOutcomeFetchMarketInputSchema,
10321
+ outputZod: mcpHyperliquidOutcomeFetchMarketOutputSchema
10322
+ }),
10323
+ defineMcpTool({
10324
+ name: "ctm_hyperliquid_outcome_fetch_orderbook",
10325
+ actionId: "hyperliquidOutcome.fetch-orderbook",
10326
+ protocolId: "hyperliquidOutcome",
10327
+ chainCategory: "evm",
10328
+ description: "l2Book for one Hyperliquid outcome side (default yes).",
10329
+ prerequisites: ["load_defi_protocol hyperliquidOutcome", "outcome id"],
10330
+ followUp: ["ctm_hyperliquid_outcome_build_order_multisign"],
10331
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "hyperliquidOutcomeFetchOrderbookSummary" },
10332
+ inputZod: mcpHyperliquidOutcomeFetchOrderbookInputSchema,
10333
+ outputZod: mcpHyperliquidOutcomeFetchOrderbookOutputSchema
10334
+ }),
10335
+ defineMcpTool({
10336
+ name: "ctm_hyperliquid_outcome_fetch_positions",
10337
+ actionId: "hyperliquidOutcome.fetch-positions",
10338
+ protocolId: "hyperliquidOutcome",
10339
+ chainCategory: "evm",
10340
+ description: "Quote balances and HIP-4 share balances (+encoding) for a HyperCore address. Not ERC20s \u2014 do not add_to_token_registry.",
10341
+ prerequisites: ["load_defi_protocol hyperliquidOutcome", "user address"],
10342
+ followUp: ["ctm_hyperliquid_outcome_build_merge_multisign"],
10343
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "hyperliquidOutcomeFetchPositionsSummary" },
10344
+ inputZod: mcpHyperliquidOutcomeFetchAccountInputSchema,
10345
+ outputZod: mcpHyperliquidOutcomeFetchPositionsOutputSchema
10346
+ }),
10347
+ defineMcpTool({
10348
+ name: "ctm_hyperliquid_outcome_fetch_open_orders",
10349
+ actionId: "hyperliquidOutcome.fetch-open-orders",
10350
+ protocolId: "hyperliquidOutcome",
10351
+ chainCategory: "evm",
10352
+ description: "Open Hyperliquid outcome orders (#encoding coins) for a user.",
10353
+ prerequisites: ["load_defi_protocol hyperliquidOutcome", "user address"],
10354
+ followUp: ["ctm_hyperliquid_outcome_build_cancel_multisign"],
10355
+ handler: { importPath: "protocols/evm/hyperliquidOutcome", exportName: "hyperliquidOutcomeFetchOpenOrdersSummary" },
10356
+ inputZod: mcpHyperliquidOutcomeFetchAccountInputSchema,
10357
+ outputZod: mcpHyperliquidOutcomeFetchOpenOrdersOutputSchema
10358
+ }),
9704
10359
  defineMcpTool({
9705
10360
  name: "search_prediction_markets",
9706
10361
  actionId: "prediction-markets.search",
9707
10362
  protocolId: "prediction-markets",
9708
10363
  chainCategory: "evm",
9709
- description: 'Venue-agnostic prediction market search for MPA chat. v1 adapter is Trueo on Base. Pass the operator topic verbatim as query (case-insensitive title substring). Do not substitute a category or synonym. Do not set trending when query is set. Empty query lists trending (max 10; cannot page). If hasMore, call again with offset/nextOffset, trending=false, indexBase=nextIndexBase, excludeAddresses of listed venueMarketIds. Default: live and recently finished (14 days) \u2014 do not pass includeAll unless the operator asked for closed or historical markets. If the live board is empty, say so. After a pick, get_prediction_market. Writes (mint / limit / burn / redeem / Yes-No swap) are not in the opening catalog \u2014 load_defi_protocol({ protocolId: "trueo" }) then get_defi_protocol_skill or search_continuum_tools for ctm_trueo_build_*.',
10364
+ description: 'Venue-agnostic prediction market search (Trueo on Base and Hyperliquid outcome markets). Pass the operator topic verbatim as query. Omit venues to search both. Restrict with venues ["trueo"] or ["hyperliquid"]. Do not set trending when query is set. If hasMore, page Trueo with offset/nextOffset. Hyperliquid matches are included on the first page. After a pick, get_prediction_market (venue from the row). Trueo writes: load_defi_protocol trueo. Hyperliquid bets: load_defi_protocol hyperliquidOutcome.',
9710
10365
  prerequisites: [],
9711
10366
  followUp: ["get_prediction_market", "load_defi_protocol", "get_defi_protocol_skill"],
9712
10367
  handler: { importPath: "protocols/evm/trueo", exportName: "searchPredictionMarketsSummary" },
@@ -9718,7 +10373,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9718
10373
  actionId: "prediction-markets.get",
9719
10374
  protocolId: "prediction-markets",
9720
10375
  chainCategory: "evm",
9721
- description: 'Full selected prediction market (rules, Yes/No, volume, TVL, expiry). Use after search_prediction_markets pick #N. Does not require load_defi_protocol. Writes stay behind load_defi_protocol({ protocolId: "trueo" }): ctm_trueo_build_wrap_tyd_multisign, ctm_trueo_build_unwrap_tyd_multisign, ctm_trueo_build_mint_multisign, ctm_trueo_build_create_order_multisign, ctm_trueo_build_burn_multisign, ctm_trueo_build_redeem_multisign, ctm_trueo_build_swap_multisign. Discover via get_defi_protocol_skill or search_continuum_tools \u2014 they are not on the opening chat catalog.',
10376
+ description: "Full selected prediction market. venue defaults to trueo (market address). For Hyperliquid pass venue hyperliquid and venueMarketId = outcome id. Does not require load_defi_protocol. Trueo writes stay behind load_defi_protocol trueo. Hyperliquid bets stay behind load_defi_protocol hyperliquidOutcome (ctm_hyperliquid_outcome_build_order_multisign). Yes/No Hyperliquid shares are not ERC20s \u2014 do not add_to_token_registry.",
9722
10377
  prerequisites: ["venueMarketId from search_prediction_markets"],
9723
10378
  followUp: [
9724
10379
  "load_defi_protocol",
@@ -9835,7 +10490,8 @@ var CORE_MCP_TOOL_DEFINITIONS = [
9835
10490
  ];
9836
10491
  var MCP_TOOL_DEFINITIONS = [
9837
10492
  ...CORE_MCP_TOOL_DEFINITIONS,
9838
- ...MCP_PROTOCOL_TOOL_DEFINITIONS
10493
+ ...MCP_PROTOCOL_TOOL_DEFINITIONS,
10494
+ ...MCP_MARKETPLACE_TOOL_DEFINITIONS
9839
10495
  ];
9840
10496
  function buildToolSchemaMap(kind) {
9841
10497
  const out = {};
@@ -11656,12 +12312,52 @@ registerProtocolModule(aerodromeProtocolModule);
11656
12312
 
11657
12313
  // src/protocols/evm/continuum-dao/index.ts
11658
12314
  init_constants2();
12315
+
12316
+ // src/protocols/evm/continuum-dao/marketplaceModule.ts
12317
+ init_constants2();
12318
+ var common = ["keyGen", "purposeText", "useCustomGas"];
12319
+ var continuumDaoMarketplaceProtocolModule = {
12320
+ id: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID,
12321
+ chainCategory: "evm",
12322
+ isChainSupported(ctx) {
12323
+ if (ctx.chainCategory !== "evm") return false;
12324
+ const n = typeof ctx.chainId === "number" ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10);
12325
+ return n === CONTINUUM_DAO_LINEA_CHAIN_ID;
12326
+ },
12327
+ isTokenSupported(token) {
12328
+ return token.category === "evm" && (token.kind === "erc20" || token.kind === "erc721");
12329
+ },
12330
+ actions: [
12331
+ { id: "continuum-dao-marketplace.fetch-config", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Marketplace payment tokens, durations, and fees", commonParams: [], params: {} },
12332
+ { id: "continuum-dao-marketplace.search", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Rank veCTMs for sale by price, locked CTM, or unlock time", commonParams: [], params: {} },
12333
+ { id: "continuum-dao-marketplace.fee-alternative", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "One qualifying direct listing beside 12 times the KeyGen monthly fee", commonParams: [], params: {} },
12334
+ { id: "continuum-dao-marketplace.fetch-listings", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Open listings, or past sales when includeInactive is set", commonParams: [], params: {} },
12335
+ { id: "continuum-dao-marketplace.fetch-offerings", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Open offerings, or closed offers when includeInactive is set", commonParams: [], params: {} },
12336
+ { id: "continuum-dao-marketplace.fetch-auctions", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Live auctions, or settled auctions when includeInactive is set. Each row includes bids.", commonParams: [], params: {} },
12337
+ { id: "continuum-dao-marketplace.fetch-token", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "One veCTM: live orders plus history of sales and auctions", commonParams: [], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12338
+ { id: "continuum-dao-marketplace.fetch-activity", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "An address\u2019s sales, buys, and auctions including bids", commonParams: [], params: { address: { type: "string", required: true, description: "KeyGen or wallet" } } },
12339
+ { id: "continuum-dao-marketplace.fetch-fee-preview", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Protocol fee for a price and veCTM", commonParams: [], params: {} },
12340
+ { id: "continuum-dao-marketplace.create-listing", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Approve veCTM if needed and create a listing", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" }, askWei: { type: "string", required: true, description: "Ask in payment-token wei" } } },
12341
+ { id: "continuum-dao-marketplace.delist", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Delist an open listing", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12342
+ { id: "continuum-dao-marketplace.fulfill-listing", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Buy a listed veCTM", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12343
+ { id: "continuum-dao-marketplace.create-offering", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Make an offering on a veCTM", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12344
+ { id: "continuum-dao-marketplace.rescind", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Rescind an open offering", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12345
+ { id: "continuum-dao-marketplace.fulfill-offering", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Accept an offering on a veCTM you own", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12346
+ { id: "continuum-dao-marketplace.create-auction", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Escrow a veCTM into an auction", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12347
+ { id: "continuum-dao-marketplace.cancel-auction", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Cancel a pending auction with no bids", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12348
+ { id: "continuum-dao-marketplace.auction-bid", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Bid on a live auction", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } },
12349
+ { id: "continuum-dao-marketplace.settle-auction", protocolId: CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, chainCategory: "evm", description: "Settle a completed or expired auction", commonParams: [...common], params: { tokenId: { type: "string", required: true, description: "veCTM token id" } } }
12350
+ ]
12351
+ };
12352
+
12353
+ // src/protocols/evm/continuum-dao/index.ts
11659
12354
  init_constants2();
11660
12355
  init_governance();
11661
12356
  init_simulateProposal();
11662
12357
  init_foundryProposalScript();
11663
12358
  init_explainProposal();
11664
12359
  init_forum();
12360
+ registerProtocolModule(continuumDaoMarketplaceProtocolModule);
11665
12361
  var continuumDaoProtocolModule = {
11666
12362
  id: CONTINUUM_DAO_PROTOCOL_ID,
11667
12363
  chainCategory: "evm",
@@ -13055,6 +13751,9 @@ function isTrueoChainSupported(chainId) {
13055
13751
  return TRUEO_CHAIN_IDS.includes(chainId);
13056
13752
  }
13057
13753
 
13754
+ // src/protocols/evm/hyperliquidOutcome/api.ts
13755
+ var HYPERLIQUID_OUTCOME_PROTOCOL_ID = "hyperliquidOutcome";
13756
+
13058
13757
  // src/protocols/evm/trueo/index.ts
13059
13758
  var trueoProtocolModule = {
13060
13759
  id: TRUEO_PROTOCOL_ID,
@@ -13134,6 +13833,71 @@ var trueoProtocolModule = {
13134
13833
  ]
13135
13834
  };
13136
13835
  registerProtocolModule(trueoProtocolModule);
13836
+
13837
+ // src/protocols/evm/hyperliquidOutcome/index.ts
13838
+ var hyperliquidOutcomeProtocolModule = {
13839
+ id: HYPERLIQUID_OUTCOME_PROTOCOL_ID,
13840
+ chainCategory: "evm",
13841
+ isChainSupported(ctx) {
13842
+ if (ctx.chainCategory !== "evm") return false;
13843
+ const chainId = typeof ctx.chainId === "number" ? ctx.chainId : Number(ctx.chainId);
13844
+ return Number.isFinite(chainId) && isHyperliquidChainSupported(chainId);
13845
+ },
13846
+ isTokenSupported(token) {
13847
+ return token.category === "evm" && token.kind === "native";
13848
+ },
13849
+ actions: [
13850
+ {
13851
+ id: "hyperliquidOutcome.order",
13852
+ protocolId: HYPERLIQUID_OUTCOME_PROTOCOL_ID,
13853
+ chainCategory: "evm",
13854
+ description: "Limit buy or sell a HIP-4 outcome side via Hyperliquid /exchange",
13855
+ commonParams: ["keyGen", "purposeText"],
13856
+ params: {}
13857
+ },
13858
+ {
13859
+ id: "hyperliquidOutcome.cancel",
13860
+ protocolId: HYPERLIQUID_OUTCOME_PROTOCOL_ID,
13861
+ chainCategory: "evm",
13862
+ description: "Cancel a resting HIP-4 outcome order",
13863
+ commonParams: ["keyGen", "purposeText"],
13864
+ params: {}
13865
+ },
13866
+ {
13867
+ id: "hyperliquidOutcome.split",
13868
+ protocolId: HYPERLIQUID_OUTCOME_PROTOCOL_ID,
13869
+ chainCategory: "evm",
13870
+ description: "Split quote tokens into Yes and No shares",
13871
+ commonParams: ["keyGen", "purposeText"],
13872
+ params: {}
13873
+ },
13874
+ {
13875
+ id: "hyperliquidOutcome.merge",
13876
+ protocolId: HYPERLIQUID_OUTCOME_PROTOCOL_ID,
13877
+ chainCategory: "evm",
13878
+ description: "Merge Yes and No shares back into quote tokens",
13879
+ commonParams: ["keyGen", "purposeText"],
13880
+ params: {}
13881
+ },
13882
+ {
13883
+ id: "hyperliquidOutcome.merge-question",
13884
+ protocolId: HYPERLIQUID_OUTCOME_PROTOCOL_ID,
13885
+ chainCategory: "evm",
13886
+ description: "Merge Yes shares across a question into quote tokens",
13887
+ commonParams: ["keyGen", "purposeText"],
13888
+ params: {}
13889
+ },
13890
+ {
13891
+ id: "hyperliquidOutcome.negate",
13892
+ protocolId: HYPERLIQUID_OUTCOME_PROTOCOL_ID,
13893
+ chainCategory: "evm",
13894
+ description: "Convert No shares of one outcome into Yes shares of the other outcomes",
13895
+ commonParams: ["keyGen", "purposeText"],
13896
+ params: {}
13897
+ }
13898
+ ]
13899
+ };
13900
+ registerProtocolModule(hyperliquidOutcomeProtocolModule);
13137
13901
  var skillsDir = join(dirname(fileURLToPath(import.meta.url)), "skills");
13138
13902
  var SKILL_PROTOCOL_IDS = [
13139
13903
  "aave-v4",
@@ -13152,9 +13916,11 @@ var SKILL_PROTOCOL_IDS = [
13152
13916
  "aerodrome",
13153
13917
  "pendle",
13154
13918
  "continuum-dao",
13919
+ "continuum-dao-marketplace",
13155
13920
  "compound-v3",
13156
13921
  "derive",
13157
13922
  "trueo",
13923
+ "hyperliquidOutcome",
13158
13924
  "yield-compare"
13159
13925
  ];
13160
13926
  function getToolsForProtocol(protocolId) {
@@ -13523,6 +14289,17 @@ var PROTOCOL_SUPPORT_ADVISORS = {
13523
14289
  }
13524
14290
  }
13525
14291
  }),
14292
+ hyperliquidOutcome: advisor("hyperliquidOutcome", "api_underlyings", {
14293
+ async supportedChainIds() {
14294
+ return [...HYPERLIQUID_SUPPORTED_CHAIN_IDS];
14295
+ },
14296
+ async supportedTokens() {
14297
+ return {
14298
+ tokens: [],
14299
+ notes: 'HIP-4 outcome markets on HyperCore (chainId 999). Yes/No shares are exchange balances, not ERC20s. Search with search_prediction_markets venues ["hyperliquid"].'
14300
+ };
14301
+ }
14302
+ }),
13526
14303
  hyperliquid: advisor("hyperliquid", "api_underlyings", {
13527
14304
  async supportedChainIds() {
13528
14305
  return [...HYPERLIQUID_SUPPORTED_CHAIN_IDS];
@@ -13587,6 +14364,22 @@ var PROTOCOL_SUPPORT_ADVISORS = {
13587
14364
  };
13588
14365
  }
13589
14366
  }),
14367
+ [CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID]: advisor(CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID, "fixed_addresses", {
14368
+ async supportedChainIds() {
14369
+ return [59144];
14370
+ },
14371
+ async supportedTokens(chainId) {
14372
+ const ve = votingEscrowAddressOnEvmChain(chainId);
14373
+ const market = votingEscrowMarketplaceAddressOnEvmChain(chainId);
14374
+ const tokens = [];
14375
+ if (ve) tokens.push({ address: ve, symbol: "veCTM", roles: ["position_nft"] });
14376
+ if (market) tokens.push({ address: market, symbol: "veCTM-market", roles: ["protocol"] });
14377
+ return {
14378
+ tokens,
14379
+ notes: "Linea veCTM marketplace. Load continuum-dao-marketplace, not continuum-dao. Search ranks buys by locked CTM, unlock time, or price per CTM and returns a short list. fetch_listings is the unfiltered page. fetch_auctions is the live book; includeInactive adds settled auctions and each row includes bids. Do not buy or bid a veCTM this KeyGen already owns."
14380
+ };
14381
+ }
14382
+ }),
13590
14383
  [COMPOUND_V3_PROTOCOL_ID]: advisor(COMPOUND_V3_PROTOCOL_ID, "api_underlyings", {
13591
14384
  async supportedChainIds() {
13592
14385
  return listCompoundV3SupportedChainIds();
@@ -13770,26 +14563,6 @@ function listProtocolSupportAdvisorIds() {
13770
14563
  }
13771
14564
 
13772
14565
  // src/agent/catalog.ts
13773
- registerProtocolModule(uniswapV4ProtocolModule);
13774
- registerProtocolModule(curveDaoProtocolModule);
13775
- registerProtocolModule(lidoProtocolModule);
13776
- registerProtocolModule(ethenaProtocolModule);
13777
- registerProtocolModule(mapleProtocolModule);
13778
- registerProtocolModule(skyProtocolModule);
13779
- registerProtocolModule(aaveV4ProtocolModule);
13780
- registerProtocolModule(eulerV2ProtocolModule);
13781
- registerProtocolModule(gmxProtocolModule);
13782
- registerProtocolModule(hyperliquidProtocolModule);
13783
- registerProtocolModule(arcusProtocolModule);
13784
- registerProtocolModule(morphoProtocolModule);
13785
- registerProtocolModule(circleCctpProtocolModule);
13786
- registerProtocolModule(veniceProtocolModule);
13787
- registerProtocolModule(aerodromeProtocolModule);
13788
- registerProtocolModule(continuumDaoProtocolModule);
13789
- registerProtocolModule(compoundV3ProtocolModule);
13790
- registerProtocolModule(pendleProtocolModule);
13791
- registerProtocolModule(deriveProtocolModule);
13792
- registerProtocolModule(trueoProtocolModule);
13793
14566
  function getAgentCatalog() {
13794
14567
  return {
13795
14568
  protocols: getProtocolModules(),
@@ -13818,6 +14591,7 @@ function getAgentCatalog() {
13818
14591
  pendle: pendleProtocolModule,
13819
14592
  derive: deriveProtocolModule,
13820
14593
  trueo: trueoProtocolModule,
14594
+ hyperliquidOutcome: hyperliquidOutcomeProtocolModule,
13821
14595
  /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */
13822
14596
  mcp: getAgentCatalogForMcp()
13823
14597
  };