dexe-mcp 0.5.8 → 0.7.0

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 (91) hide show
  1. package/CHANGELOG.md +707 -536
  2. package/README.md +291 -270
  3. package/SECURITY.md +100 -46
  4. package/dist/config.d.ts +19 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +79 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/governor/adapter.d.ts +90 -0
  9. package/dist/governor/adapter.d.ts.map +1 -0
  10. package/dist/governor/adapter.js +169 -0
  11. package/dist/governor/adapter.js.map +1 -0
  12. package/dist/governor/configs/compound.json +32 -0
  13. package/dist/governor/configs/optimism.json +28 -0
  14. package/dist/governor/configs/uniswap.json +32 -0
  15. package/dist/governor/encoder.d.ts +59 -0
  16. package/dist/governor/encoder.d.ts.map +1 -0
  17. package/dist/governor/encoder.js +290 -0
  18. package/dist/governor/encoder.js.map +1 -0
  19. package/dist/governor/index.d.ts +11 -0
  20. package/dist/governor/index.d.ts.map +1 -0
  21. package/dist/governor/index.js +20 -0
  22. package/dist/governor/index.js.map +1 -0
  23. package/dist/governor/loader.d.ts +42 -0
  24. package/dist/governor/loader.d.ts.map +1 -0
  25. package/dist/governor/loader.js +103 -0
  26. package/dist/governor/loader.js.map +1 -0
  27. package/dist/governor/tally.d.ts +48 -0
  28. package/dist/governor/tally.d.ts.map +1 -0
  29. package/dist/governor/tally.js +103 -0
  30. package/dist/governor/tally.js.map +1 -0
  31. package/dist/governor/tools/build.d.ts +3 -0
  32. package/dist/governor/tools/build.d.ts.map +1 -0
  33. package/dist/governor/tools/build.js +137 -0
  34. package/dist/governor/tools/build.js.map +1 -0
  35. package/dist/governor/tools/extras.d.ts +4 -0
  36. package/dist/governor/tools/extras.d.ts.map +1 -0
  37. package/dist/governor/tools/extras.js +197 -0
  38. package/dist/governor/tools/extras.js.map +1 -0
  39. package/dist/governor/tools/read.d.ts +4 -0
  40. package/dist/governor/tools/read.d.ts.map +1 -0
  41. package/dist/governor/tools/read.js +174 -0
  42. package/dist/governor/tools/read.js.map +1 -0
  43. package/dist/governor/tools/simulate.d.ts +6 -0
  44. package/dist/governor/tools/simulate.d.ts.map +1 -0
  45. package/dist/governor/tools/simulate.js +191 -0
  46. package/dist/governor/tools/simulate.js.map +1 -0
  47. package/dist/lib/broadcastGuards.d.ts +41 -0
  48. package/dist/lib/broadcastGuards.d.ts.map +1 -0
  49. package/dist/lib/broadcastGuards.js +85 -0
  50. package/dist/lib/broadcastGuards.js.map +1 -0
  51. package/dist/lib/ethersProvider.d.ts +96 -0
  52. package/dist/lib/ethersProvider.d.ts.map +1 -0
  53. package/dist/lib/ethersProvider.js +170 -0
  54. package/dist/lib/ethersProvider.js.map +1 -0
  55. package/dist/lib/signer.d.ts +2 -0
  56. package/dist/lib/signer.d.ts.map +1 -1
  57. package/dist/lib/signer.js +4 -0
  58. package/dist/lib/signer.js.map +1 -1
  59. package/dist/lib/walletconnect.d.ts +62 -0
  60. package/dist/lib/walletconnect.d.ts.map +1 -0
  61. package/dist/lib/walletconnect.js +184 -0
  62. package/dist/lib/walletconnect.js.map +1 -0
  63. package/dist/tools/flow.d.ts.map +1 -1
  64. package/dist/tools/flow.js +13 -0
  65. package/dist/tools/flow.js.map +1 -1
  66. package/dist/tools/getConfig.d.ts.map +1 -1
  67. package/dist/tools/getConfig.js +27 -0
  68. package/dist/tools/getConfig.js.map +1 -1
  69. package/dist/tools/inbox.js +8 -8
  70. package/dist/tools/index.d.ts.map +1 -1
  71. package/dist/tools/index.js +11 -1
  72. package/dist/tools/index.js.map +1 -1
  73. package/dist/tools/predict.js +17 -17
  74. package/dist/tools/safe.d.ts +5 -0
  75. package/dist/tools/safe.d.ts.map +1 -0
  76. package/dist/tools/safe.js +264 -0
  77. package/dist/tools/safe.js.map +1 -0
  78. package/dist/tools/simulate.d.ts +7 -0
  79. package/dist/tools/simulate.d.ts.map +1 -1
  80. package/dist/tools/simulate.js +8 -0
  81. package/dist/tools/simulate.js.map +1 -1
  82. package/dist/tools/subgraph.js +162 -162
  83. package/dist/tools/txSend.d.ts +2 -1
  84. package/dist/tools/txSend.d.ts.map +1 -1
  85. package/dist/tools/txSend.js +111 -3
  86. package/dist/tools/txSend.js.map +1 -1
  87. package/dist/tools/walletconnectStatus.d.ts +18 -0
  88. package/dist/tools/walletconnectStatus.d.ts.map +1 -0
  89. package/dist/tools/walletconnectStatus.js +132 -0
  90. package/dist/tools/walletconnectStatus.js.map +1 -0
  91. package/package.json +96 -92
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Tally GraphQL parity harness — W4 of research/06-execution-plan.md.
3
+ *
4
+ * Tally exposes proposal state as a string enum
5
+ * (PENDING / ACTIVE / CANCELED / DEFEATED / SUCCEEDED / QUEUED / EXPIRED /
6
+ * EXECUTED / EXTENDED / ...). We project Tally's string back onto OZ's
7
+ * numeric enum and compare to our `state()` result. Mismatch on any of the 30
8
+ * sampled proposals fails the harness — see plan §2 state-parity metric.
9
+ *
10
+ * Live runs require TALLY_API_KEY (free at https://www.tally.xyz/user/api-keys).
11
+ * When unset the test file marks parity tests as skipped — we keep the
12
+ * comparison logic itself under unit test against synthetic fixtures.
13
+ */
14
+ export interface TallyProposalSnapshot {
15
+ /** Tally-side stringly-typed state. */
16
+ status: string;
17
+ /** Numeric proposal id on the governor (uint256 decimal string). */
18
+ onchainId: string;
19
+ }
20
+ export interface ParityCheckRow {
21
+ proposalId: string;
22
+ expected: {
23
+ source: "tally";
24
+ status: string;
25
+ mappedIndex: number | null;
26
+ };
27
+ actual: {
28
+ source: "rpc";
29
+ index: number;
30
+ name: string;
31
+ };
32
+ match: boolean;
33
+ }
34
+ export declare function mapTallyStatusToIndex(status: string): number | null;
35
+ export declare function compareStateEnum(proposalId: string, tally: TallyProposalSnapshot, actualStateIndex: number): ParityCheckRow;
36
+ /**
37
+ * Tally GraphQL query for governor proposals. Caller passes governor ID in
38
+ * Tally's `eip155:<chainId>:<address>` form. Returns `limit` most-recent
39
+ * proposals.
40
+ */
41
+ export declare const TALLY_PROPOSALS_QUERY = "\n query Proposals($input: ProposalsInput!) {\n proposals(input: $input) {\n nodes {\n ... on Proposal {\n onchainId\n status\n }\n }\n }\n }\n";
42
+ export interface TallyClient {
43
+ apiKey: string;
44
+ endpoint?: string;
45
+ }
46
+ export declare function fetchTallyProposals(client: TallyClient, governorChainAddress: string, limit: number): Promise<TallyProposalSnapshot[]>;
47
+ export declare function tallyGovernorId(chainId: number, address: string): string;
48
+ //# sourceMappingURL=tally.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tally.d.ts","sourceRoot":"","sources":["../../src/governor/tally.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1E,MAAM,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,KAAK,EAAE,OAAO,CAAC;CAChB;AAuBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,qBAAqB,EAC5B,gBAAgB,EAAE,MAAM,GACvB,cAAc,CAahB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,sMAWjC,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,oBAAoB,EAAE,MAAM,EAC5B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA4BlC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExE"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Tally GraphQL parity harness — W4 of research/06-execution-plan.md.
3
+ *
4
+ * Tally exposes proposal state as a string enum
5
+ * (PENDING / ACTIVE / CANCELED / DEFEATED / SUCCEEDED / QUEUED / EXPIRED /
6
+ * EXECUTED / EXTENDED / ...). We project Tally's string back onto OZ's
7
+ * numeric enum and compare to our `state()` result. Mismatch on any of the 30
8
+ * sampled proposals fails the harness — see plan §2 state-parity metric.
9
+ *
10
+ * Live runs require TALLY_API_KEY (free at https://www.tally.xyz/user/api-keys).
11
+ * When unset the test file marks parity tests as skipped — we keep the
12
+ * comparison logic itself under unit test against synthetic fixtures.
13
+ */
14
+ import { PROPOSAL_STATE } from "./adapter.js";
15
+ const STATUS_TO_INDEX = {
16
+ // OZ Governor canonical
17
+ PENDING: 0,
18
+ ACTIVE: 1,
19
+ CANCELED: 2,
20
+ CANCELLED: 2,
21
+ DEFEATED: 3,
22
+ SUCCEEDED: 4,
23
+ QUEUED: 5,
24
+ EXPIRED: 6,
25
+ EXECUTED: 7,
26
+ // Tally synonyms / extended states we treat as equivalent
27
+ CALLEXECUTED: 7,
28
+ CROSSCHAINEXECUTED: 7,
29
+ // SUBMITTED / DRAFT are pre-Pending Tally states — we map to Pending for
30
+ // the on-chain comparator because the on-chain `state()` will return Pending
31
+ // until the snapshot block elapses.
32
+ SUBMITTED: 0,
33
+ DRAFT: 0,
34
+ };
35
+ export function mapTallyStatusToIndex(status) {
36
+ const idx = STATUS_TO_INDEX[status.toUpperCase()];
37
+ return idx === undefined ? null : idx;
38
+ }
39
+ export function compareStateEnum(proposalId, tally, actualStateIndex) {
40
+ const mappedIndex = mapTallyStatusToIndex(tally.status);
41
+ const match = mappedIndex !== null && mappedIndex === actualStateIndex;
42
+ return {
43
+ proposalId,
44
+ expected: { source: "tally", status: tally.status, mappedIndex },
45
+ actual: {
46
+ source: "rpc",
47
+ index: actualStateIndex,
48
+ name: PROPOSAL_STATE[actualStateIndex] ?? `Unknown(${actualStateIndex})`,
49
+ },
50
+ match,
51
+ };
52
+ }
53
+ /**
54
+ * Tally GraphQL query for governor proposals. Caller passes governor ID in
55
+ * Tally's `eip155:<chainId>:<address>` form. Returns `limit` most-recent
56
+ * proposals.
57
+ */
58
+ export const TALLY_PROPOSALS_QUERY = `
59
+ query Proposals($input: ProposalsInput!) {
60
+ proposals(input: $input) {
61
+ nodes {
62
+ ... on Proposal {
63
+ onchainId
64
+ status
65
+ }
66
+ }
67
+ }
68
+ }
69
+ `;
70
+ export async function fetchTallyProposals(client, governorChainAddress, limit) {
71
+ const endpoint = client.endpoint ?? "https://api.tally.xyz/query";
72
+ const res = await fetch(endpoint, {
73
+ method: "POST",
74
+ headers: {
75
+ "content-type": "application/json",
76
+ "api-key": client.apiKey,
77
+ },
78
+ body: JSON.stringify({
79
+ query: TALLY_PROPOSALS_QUERY,
80
+ variables: {
81
+ input: {
82
+ filters: { governorId: governorChainAddress },
83
+ page: { limit },
84
+ sort: { sortBy: "id", isDescending: true },
85
+ },
86
+ },
87
+ }),
88
+ });
89
+ if (!res.ok) {
90
+ throw new Error(`Tally HTTP ${res.status}: ${await res.text()}`);
91
+ }
92
+ const body = (await res.json());
93
+ if (body.errors)
94
+ throw new Error(`Tally GraphQL: ${JSON.stringify(body.errors)}`);
95
+ const nodes = body.data?.proposals?.nodes ?? [];
96
+ return nodes
97
+ .filter((n) => n?.onchainId && n?.status)
98
+ .map((n) => ({ onchainId: String(n.onchainId), status: String(n.status) }));
99
+ }
100
+ export function tallyGovernorId(chainId, address) {
101
+ return `eip155:${chainId}:${address.toLowerCase()}`;
102
+ }
103
+ //# sourceMappingURL=tally.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tally.js","sourceRoot":"","sources":["../../src/governor/tally.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGovernorBuildTools(server: McpServer): void;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/governor/tools/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyBzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAMlE"}
@@ -0,0 +1,137 @@
1
+ import { z } from "zod";
2
+ import { resolveGovernor } from "../loader.js";
3
+ import { buildDelegate, buildExecute, buildPropose, buildQueue, buildVoteCast, } from "../encoder.js";
4
+ function ok(data) {
5
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
6
+ }
7
+ function err(message) {
8
+ return { content: [{ type: "text", text: message }], isError: true };
9
+ }
10
+ const governorIdSchema = z
11
+ .string()
12
+ .min(1)
13
+ .describe("Governor id (e.g. 'uniswap') or 0x-prefixed governor contract address.");
14
+ const uintLikeSchema = z.union([z.string(), z.number()]);
15
+ export function registerGovernorBuildTools(server) {
16
+ registerPropose(server);
17
+ registerVoteCast(server);
18
+ registerQueue(server);
19
+ registerExecute(server);
20
+ registerDelegate(server);
21
+ }
22
+ function registerPropose(server) {
23
+ server.registerTool("dexe_gov_build_propose", {
24
+ title: "Encode Governor.propose calldata",
25
+ description: "Returns {to, value, data, selector} for the configured Governor's propose method. OZ v4+ uses (targets, values, calldatas, description); Bravo uses (targets, values, signatures, calldatas, description). On Bravo, signatures defaults to [''...] when omitted.",
26
+ inputSchema: {
27
+ governor: governorIdSchema,
28
+ targets: z.array(z.string()).min(1),
29
+ values: z.array(uintLikeSchema).min(1).describe("ETH value per target as decimal string or number."),
30
+ calldatas: z.array(z.string()).min(1).describe("0x-prefixed bytes per target."),
31
+ description: z.string().describe("Human-readable proposal description; hashed for queue/execute on OZ."),
32
+ signatures: z
33
+ .array(z.string())
34
+ .optional()
35
+ .describe("Bravo only. Per-target function signature strings. Defaults to empty strings when omitted."),
36
+ },
37
+ }, async ({ governor, targets, values, calldatas, description, signatures }) => {
38
+ try {
39
+ const cfg = resolveGovernor(governor);
40
+ const built = buildPropose(cfg, { targets, values, calldatas, description, signatures });
41
+ return ok({ governor: cfg.id, governorVersion: cfg.governorVersion, ...built });
42
+ }
43
+ catch (e) {
44
+ return err(`dexe_gov_build_propose failed: ${e.message}`);
45
+ }
46
+ });
47
+ }
48
+ function registerVoteCast(server) {
49
+ server.registerTool("dexe_gov_build_vote_cast", {
50
+ title: "Encode Governor.castVote / castVoteWithReason calldata",
51
+ description: "Returns {to, value, data, selector}. support: 0=Against, 1=For, 2=Abstain. When reason is provided, uses castVoteWithReason; otherwise castVote. Identical signature on OZ and Bravo.",
52
+ inputSchema: {
53
+ governor: governorIdSchema,
54
+ proposalId: z.string().describe("Proposal id as decimal string (uint256)."),
55
+ support: z.number().int().min(0).max(2),
56
+ reason: z.string().optional(),
57
+ },
58
+ }, async ({ governor, proposalId, support, reason }) => {
59
+ try {
60
+ const cfg = resolveGovernor(governor);
61
+ const built = buildVoteCast(cfg, proposalId, support, reason);
62
+ return ok({ governor: cfg.id, governorVersion: cfg.governorVersion, ...built });
63
+ }
64
+ catch (e) {
65
+ return err(`dexe_gov_build_vote_cast failed: ${e.message}`);
66
+ }
67
+ });
68
+ }
69
+ function registerQueue(server) {
70
+ server.registerTool("dexe_gov_build_queue", {
71
+ title: "Encode Governor.queue calldata",
72
+ description: "OZ v4+: pass targets/values/calldatas plus either description (we hash it) or descriptionHash. Bravo: pass proposalId only.",
73
+ inputSchema: {
74
+ governor: governorIdSchema,
75
+ proposalId: z.string().optional(),
76
+ targets: z.array(z.string()).optional(),
77
+ values: z.array(uintLikeSchema).optional(),
78
+ calldatas: z.array(z.string()).optional(),
79
+ description: z.string().optional(),
80
+ descriptionHash: z.string().optional(),
81
+ },
82
+ }, async (args) => {
83
+ try {
84
+ const cfg = resolveGovernor(args.governor);
85
+ const built = buildQueue(cfg, args);
86
+ return ok({ governor: cfg.id, governorVersion: cfg.governorVersion, ...built });
87
+ }
88
+ catch (e) {
89
+ return err(`dexe_gov_build_queue failed: ${e.message}`);
90
+ }
91
+ });
92
+ }
93
+ function registerExecute(server) {
94
+ server.registerTool("dexe_gov_build_execute", {
95
+ title: "Encode Governor.execute calldata",
96
+ description: "OZ v4+: pass targets/values/calldatas plus description or descriptionHash. Bravo: pass proposalId only. Optional msgValue passes through as the tx value (sum of proposal target values when calling OZ execute).",
97
+ inputSchema: {
98
+ governor: governorIdSchema,
99
+ proposalId: z.string().optional(),
100
+ targets: z.array(z.string()).optional(),
101
+ values: z.array(uintLikeSchema).optional(),
102
+ calldatas: z.array(z.string()).optional(),
103
+ description: z.string().optional(),
104
+ descriptionHash: z.string().optional(),
105
+ msgValue: uintLikeSchema.optional().describe("Tx value in wei. Defaults to 0."),
106
+ },
107
+ }, async (args) => {
108
+ try {
109
+ const cfg = resolveGovernor(args.governor);
110
+ const built = buildExecute(cfg, args, args.msgValue);
111
+ return ok({ governor: cfg.id, governorVersion: cfg.governorVersion, ...built });
112
+ }
113
+ catch (e) {
114
+ return err(`dexe_gov_build_execute failed: ${e.message}`);
115
+ }
116
+ });
117
+ }
118
+ function registerDelegate(server) {
119
+ server.registerTool("dexe_gov_build_delegate", {
120
+ title: "Encode IVotes.delegate calldata on the configured voting token",
121
+ description: "Returns {to, value, data, selector}. `to` is the voting token (NOT the Governor). delegatee=zero address self-revokes delegation.",
122
+ inputSchema: {
123
+ governor: governorIdSchema,
124
+ delegatee: z.string(),
125
+ },
126
+ }, async ({ governor, delegatee }) => {
127
+ try {
128
+ const cfg = resolveGovernor(governor);
129
+ const built = buildDelegate(cfg, delegatee);
130
+ return ok({ governor: cfg.id, votingToken: cfg.votingToken, ...built });
131
+ }
132
+ catch (e) {
133
+ return err(`dexe_gov_build_delegate failed: ${e.message}`);
134
+ }
135
+ });
136
+ }
137
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/governor/tools/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { RpcProvider } from "../../rpc.js";
3
+ export declare function registerGovernorExtraTools(server: McpServer, rpc: RpcProvider): void;
4
+ //# sourceMappingURL=extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.d.ts","sourceRoot":"","sources":["../../../src/governor/tools/extras.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAwC3C,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAOpF"}
@@ -0,0 +1,197 @@
1
+ import { z } from "zod";
2
+ import { isAddress, keccak256, toUtf8Bytes } from "ethers";
3
+ import { resolveGovernor } from "../loader.js";
4
+ import { governorContract, isBravo, stateName } from "../adapter.js";
5
+ import { buildCancel, decodeGovernorWrite, } from "../encoder.js";
6
+ function ok(data) {
7
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
8
+ }
9
+ function err(message) {
10
+ return { content: [{ type: "text", text: message }], isError: true };
11
+ }
12
+ const governorIdSchema = z
13
+ .string()
14
+ .min(1)
15
+ .describe("Governor id (e.g. 'uniswap') or 0x-prefixed governor contract address.");
16
+ const uintLikeSchema = z.union([z.string(), z.number()]);
17
+ const addressArg = (desc) => z.string().refine((s) => isAddress(s), { message: "must be a 0x-prefixed 20-byte address" }).describe(desc);
18
+ const proposalIdArg = z.string().refine((s) => {
19
+ try {
20
+ BigInt(s);
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }, { message: "must be a uint256 (decimal or 0x-hex) string" });
27
+ export function registerGovernorExtraTools(server, rpc) {
28
+ registerGetState(server, rpc);
29
+ registerHasVoted(server, rpc);
30
+ registerBuildCancel(server);
31
+ registerDecodeCalldata(server);
32
+ registerHashDescription(server);
33
+ registerHashProposal(server, rpc);
34
+ }
35
+ function registerGetState(server, rpc) {
36
+ server.registerTool("dexe_gov_get_state", {
37
+ title: "Read Governor.state() — minimal proposal-state lookup",
38
+ description: "Returns {index, name} for the proposal's current state. Shorthand for the state field of dexe_gov_get_proposal — useful when you only need the state and want a single eth_call.",
39
+ inputSchema: {
40
+ governor: governorIdSchema,
41
+ proposalId: proposalIdArg,
42
+ },
43
+ }, async ({ governor, proposalId }) => {
44
+ try {
45
+ const cfg = resolveGovernor(governor);
46
+ const provider = rpc.requireProvider(cfg.chainId);
47
+ const c = governorContract(provider, cfg);
48
+ const idx = Number(await c.getFunction("state").staticCall(BigInt(proposalId)));
49
+ return ok({
50
+ governor: cfg.id,
51
+ governorVersion: cfg.governorVersion,
52
+ proposalId,
53
+ state: { index: idx, name: stateName(idx) },
54
+ });
55
+ }
56
+ catch (e) {
57
+ return err(`dexe_gov_get_state failed: ${e.message}`);
58
+ }
59
+ });
60
+ }
61
+ function registerHasVoted(server, rpc) {
62
+ server.registerTool("dexe_gov_has_voted", {
63
+ title: "Read Governor.hasVoted(proposalId, account)",
64
+ description: "Returns true when the account has already cast a vote on this proposal. Identical signature on OZ and Bravo.",
65
+ inputSchema: {
66
+ governor: governorIdSchema,
67
+ proposalId: proposalIdArg,
68
+ account: addressArg("0x-prefixed account address."),
69
+ },
70
+ }, async ({ governor, proposalId, account }) => {
71
+ try {
72
+ const cfg = resolveGovernor(governor);
73
+ const provider = rpc.requireProvider(cfg.chainId);
74
+ const c = governorContract(provider, cfg);
75
+ const voted = await c.getFunction("hasVoted").staticCall(BigInt(proposalId), account);
76
+ return ok({
77
+ governor: cfg.id,
78
+ proposalId,
79
+ account,
80
+ hasVoted: voted,
81
+ });
82
+ }
83
+ catch (e) {
84
+ return err(`dexe_gov_has_voted failed: ${e.message}`);
85
+ }
86
+ });
87
+ }
88
+ function registerBuildCancel(server) {
89
+ server.registerTool("dexe_gov_build_cancel", {
90
+ title: "Encode Governor.cancel calldata",
91
+ description: "OZ v4+: pass targets/values/calldatas + description or descriptionHash. Bravo: pass proposalId only. Returns {to, value, data, selector}.",
92
+ inputSchema: {
93
+ governor: governorIdSchema,
94
+ proposalId: z.string().optional(),
95
+ targets: z.array(z.string()).optional(),
96
+ values: z.array(uintLikeSchema).optional(),
97
+ calldatas: z.array(z.string()).optional(),
98
+ description: z.string().optional(),
99
+ descriptionHash: z.string().optional(),
100
+ },
101
+ }, async (args) => {
102
+ try {
103
+ const cfg = resolveGovernor(args.governor);
104
+ const built = buildCancel(cfg, args);
105
+ return ok({ governor: cfg.id, governorVersion: cfg.governorVersion, ...built });
106
+ }
107
+ catch (e) {
108
+ return err(`dexe_gov_build_cancel failed: ${e.message}`);
109
+ }
110
+ });
111
+ }
112
+ function registerDecodeCalldata(server) {
113
+ server.registerTool("dexe_gov_decode_calldata", {
114
+ title: "Decode any Governor write calldata back to its named args",
115
+ description: "Parses raw 0x-prefixed calldata against the configured Governor's write ABI (family-aware). Returns {method, args}. Useful for auditing a transaction in a wallet before signing, or round-tripping output of dexe_gov_build_* tools.",
116
+ inputSchema: {
117
+ governor: governorIdSchema,
118
+ data: z.string().describe("0x-prefixed calldata."),
119
+ },
120
+ }, async ({ governor, data }) => {
121
+ try {
122
+ const cfg = resolveGovernor(governor);
123
+ const decoded = decodeGovernorWrite(cfg, data);
124
+ // bigints → strings for JSON safety
125
+ const argsOut = decoded.args.map((v) => typeof v === "bigint"
126
+ ? v.toString()
127
+ : Array.isArray(v)
128
+ ? v.map((x) => (typeof x === "bigint" ? x.toString() : x))
129
+ : v);
130
+ return ok({
131
+ governor: cfg.id,
132
+ governorVersion: cfg.governorVersion,
133
+ family: isBravo(cfg) ? "bravo" : "oz",
134
+ method: decoded.method,
135
+ args: argsOut,
136
+ });
137
+ }
138
+ catch (e) {
139
+ return err(`dexe_gov_decode_calldata failed: ${e.message}`);
140
+ }
141
+ });
142
+ }
143
+ function registerHashDescription(server) {
144
+ server.registerTool("dexe_gov_hash_description", {
145
+ title: "Compute keccak256(toUtf8Bytes(description))",
146
+ description: "Returns the 32-byte descriptionHash that OZ Governor queue/execute/cancel use. Lets clients pre-compute the hash, store it, and skip rehashing on every call.",
147
+ inputSchema: {
148
+ description: z.string(),
149
+ },
150
+ }, async ({ description }) => {
151
+ try {
152
+ return ok({ description, descriptionHash: keccak256(toUtf8Bytes(description)) });
153
+ }
154
+ catch (e) {
155
+ return err(`dexe_gov_hash_description failed: ${e.message}`);
156
+ }
157
+ });
158
+ }
159
+ function registerHashProposal(server, rpc) {
160
+ server.registerTool("dexe_gov_hash_proposal", {
161
+ title: "Call OZ Governor.hashProposal — preview the deterministic proposalId",
162
+ description: "OZ v4+ only. Computes the on-chain proposalId for a (targets, values, calldatas, descriptionHash) tuple before submission. Lets clients verify the propose calldata matches an expected id. Errors clearly on Bravo (hashProposal is not part of Bravo's ABI).",
163
+ inputSchema: {
164
+ governor: governorIdSchema,
165
+ targets: z.array(z.string()),
166
+ values: z.array(uintLikeSchema),
167
+ calldatas: z.array(z.string()),
168
+ description: z.string().optional(),
169
+ descriptionHash: z.string().optional(),
170
+ },
171
+ }, async ({ governor, targets, values, calldatas, description, descriptionHash }) => {
172
+ try {
173
+ const cfg = resolveGovernor(governor);
174
+ if (isBravo(cfg)) {
175
+ return err(`dexe_gov_hash_proposal: ${cfg.id} is Bravo (${cfg.governorVersion}); Bravo does not expose hashProposal. Use Bravo's on-chain proposalCount + propose-returned id instead.`);
176
+ }
177
+ const provider = rpc.requireProvider(cfg.chainId);
178
+ const c = governorContract(provider, cfg);
179
+ const dh = descriptionHash
180
+ ?? (description !== undefined ? keccak256(toUtf8Bytes(description)) : undefined);
181
+ if (!dh)
182
+ throw new Error("either description or descriptionHash is required");
183
+ const vals = values.map((v) => BigInt(v));
184
+ const id = await c.getFunction("hashProposal").staticCall(targets, vals, calldatas, dh);
185
+ return ok({
186
+ governor: cfg.id,
187
+ proposalIdHex: "0x" + id.toString(16),
188
+ proposalIdDecimal: id.toString(),
189
+ descriptionHash: dh,
190
+ });
191
+ }
192
+ catch (e) {
193
+ return err(`dexe_gov_hash_proposal failed: ${e.message}`);
194
+ }
195
+ });
196
+ }
197
+ //# sourceMappingURL=extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.js","sourceRoot":"","sources":["../../../src/governor/tools/extras.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { RpcProvider } from "../../rpc.js";
3
+ export declare function registerGovernorReadTools(server: McpServer, rpc: RpcProvider): void;
4
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/governor/tools/read.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA0C3C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAMnF"}