dexe-mcp 0.2.0 → 0.4.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 (80) hide show
  1. package/CHANGELOG.md +192 -85
  2. package/README.md +103 -80
  3. package/dist/config.d.ts +2 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +10 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/index.js +16 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/addresses.js +1 -1
  10. package/dist/lib/ipfs.d.ts.map +1 -1
  11. package/dist/lib/ipfs.js +2 -1
  12. package/dist/lib/ipfs.js.map +1 -1
  13. package/dist/lib/markdownToSlate.d.ts +39 -0
  14. package/dist/lib/markdownToSlate.d.ts.map +1 -0
  15. package/dist/lib/markdownToSlate.js +203 -0
  16. package/dist/lib/markdownToSlate.js.map +1 -0
  17. package/dist/lib/merkleTree.d.ts +38 -0
  18. package/dist/lib/merkleTree.d.ts.map +1 -0
  19. package/dist/lib/merkleTree.js +83 -0
  20. package/dist/lib/merkleTree.js.map +1 -0
  21. package/dist/lib/signer.d.ts +12 -0
  22. package/dist/lib/signer.d.ts.map +1 -0
  23. package/dist/lib/signer.js +31 -0
  24. package/dist/lib/signer.js.map +1 -0
  25. package/dist/lib/subgraph.d.ts +2 -2
  26. package/dist/lib/subgraph.d.ts.map +1 -1
  27. package/dist/lib/subgraph.js +14 -9
  28. package/dist/lib/subgraph.js.map +1 -1
  29. package/dist/tools/daoDeploy.d.ts.map +1 -1
  30. package/dist/tools/daoDeploy.js +313 -63
  31. package/dist/tools/daoDeploy.js.map +1 -1
  32. package/dist/tools/flow.d.ts +62 -0
  33. package/dist/tools/flow.d.ts.map +1 -0
  34. package/dist/tools/flow.js +479 -0
  35. package/dist/tools/flow.js.map +1 -0
  36. package/dist/tools/index.d.ts.map +1 -1
  37. package/dist/tools/index.js +12 -0
  38. package/dist/tools/index.js.map +1 -1
  39. package/dist/tools/ipfs.d.ts.map +1 -1
  40. package/dist/tools/ipfs.js +94 -28
  41. package/dist/tools/ipfs.js.map +1 -1
  42. package/dist/tools/merkle.d.ts +4 -0
  43. package/dist/tools/merkle.d.ts.map +1 -0
  44. package/dist/tools/merkle.js +174 -0
  45. package/dist/tools/merkle.js.map +1 -0
  46. package/dist/tools/otc.d.ts +5 -0
  47. package/dist/tools/otc.d.ts.map +1 -0
  48. package/dist/tools/otc.js +481 -0
  49. package/dist/tools/otc.js.map +1 -0
  50. package/dist/tools/proposal.js +28 -10
  51. package/dist/tools/proposal.js.map +1 -1
  52. package/dist/tools/proposalBuild.d.ts.map +1 -1
  53. package/dist/tools/proposalBuild.js +28 -13
  54. package/dist/tools/proposalBuild.js.map +1 -1
  55. package/dist/tools/proposalBuildComplex.d.ts +222 -0
  56. package/dist/tools/proposalBuildComplex.d.ts.map +1 -1
  57. package/dist/tools/proposalBuildComplex.js +511 -138
  58. package/dist/tools/proposalBuildComplex.js.map +1 -1
  59. package/dist/tools/proposalBuildInternal.js +24 -11
  60. package/dist/tools/proposalBuildInternal.js.map +1 -1
  61. package/dist/tools/proposalBuildMore.js +42 -21
  62. package/dist/tools/proposalBuildMore.js.map +1 -1
  63. package/dist/tools/proposalBuildOffchain.d.ts.map +1 -1
  64. package/dist/tools/proposalBuildOffchain.js +8 -5
  65. package/dist/tools/proposalBuildOffchain.js.map +1 -1
  66. package/dist/tools/read.d.ts.map +1 -1
  67. package/dist/tools/read.js +227 -0
  68. package/dist/tools/read.js.map +1 -1
  69. package/dist/tools/subgraph.d.ts +4 -0
  70. package/dist/tools/subgraph.d.ts.map +1 -0
  71. package/dist/tools/subgraph.js +404 -0
  72. package/dist/tools/subgraph.js.map +1 -0
  73. package/dist/tools/txSend.d.ts +5 -0
  74. package/dist/tools/txSend.d.ts.map +1 -0
  75. package/dist/tools/txSend.js +87 -0
  76. package/dist/tools/txSend.js.map +1 -0
  77. package/dist/tools/voteBuild.d.ts.map +1 -1
  78. package/dist/tools/voteBuild.js +420 -0
  79. package/dist/tools/voteBuild.js.map +1 -1
  80. package/package.json +83 -75
@@ -0,0 +1,479 @@
1
+ import { z } from "zod";
2
+ import { Interface, MaxUint256 } from "ethers";
3
+ import { RpcProvider } from "../rpc.js";
4
+ import { multicall } from "../lib/multicall.js";
5
+ import { PinataClient } from "../lib/ipfs.js";
6
+ import { markdownToSlate } from "../lib/markdownToSlate.js";
7
+ // ---------- ABI fragments ----------
8
+ const ERC20_ABI = new Interface([
9
+ "function balanceOf(address) view returns (uint256)",
10
+ "function allowance(address owner, address spender) view returns (uint256)",
11
+ "function approve(address spender, uint256 amount) returns (bool)",
12
+ ]);
13
+ const GOV_POOL_ABI = new Interface([
14
+ "function getHelperContracts() view returns (address settings, address userKeeper, address validators, address poolRegistry, address votePower)",
15
+ "function createProposalAndVote(string _descriptionURL, tuple(address executor, uint256 value, bytes data)[] actionsOnFor, tuple(address executor, uint256 value, bytes data)[] actionsOnAgainst, uint256 voteAmount, uint256[] voteNftIds)",
16
+ "function createProposal(string _descriptionURL, tuple(address executor, uint256 value, bytes data)[] actionsOnFor, tuple(address executor, uint256 value, bytes data)[] actionsOnAgainst)",
17
+ "function vote(uint256 proposalId, bool isVoteFor, uint256 voteAmount, uint256[] voteNftIds)",
18
+ "function execute(uint256 proposalId)",
19
+ "function multicall(bytes[] data) returns (bytes[])",
20
+ "function deposit(uint256 amount, uint256[] nftIds) payable",
21
+ "function editDescriptionURL(string newDescriptionURL)",
22
+ "function getProposalState(uint256 proposalId) view returns (uint8)",
23
+ ]);
24
+ const USER_KEEPER_ABI = new Interface([
25
+ "function tokenAddress() view returns (address)",
26
+ "function tokenBalance(address voter, uint8 voteType) view returns (uint256 balance, uint256 ownedBalance)",
27
+ ]);
28
+ const SETTINGS_ABI = new Interface([
29
+ "function getDefaultSettings() view returns (tuple(bool earlyCompletion, bool delegatedVotingAllowed, bool validatorsVote, uint64 duration, uint64 durationValidators, uint64 executionDelay, uint128 quorum, uint128 quorumValidators, uint256 minVotesForVoting, uint256 minVotesForCreating, tuple(address rewardToken, uint256 creationReward, uint256 executionReward, uint256 voteRewardsCoefficient) rewardsInfo, string executorDescription))",
30
+ ]);
31
+ // ---------- helpers ----------
32
+ function err(message) {
33
+ return { content: [{ type: "text", text: message }], isError: true };
34
+ }
35
+ function ok(data) {
36
+ return {
37
+ content: [{ type: "text", text: JSON.stringify(data, bigintReplacer, 2) }],
38
+ };
39
+ }
40
+ function bigintReplacer(_k, v) {
41
+ return typeof v === "bigint" ? v.toString() : v;
42
+ }
43
+ function makeTxPayload(to, iface, method, args, chainId, description, value) {
44
+ return {
45
+ to,
46
+ data: iface.encodeFunctionData(method, args),
47
+ value: (value ?? 0n).toString(),
48
+ chainId,
49
+ description,
50
+ };
51
+ }
52
+ async function resolvePrereqs(rpc, govPool, user) {
53
+ const provider = rpc.requireProvider();
54
+ // Batch 1: get helper addresses
55
+ const batch1 = [
56
+ { target: govPool, iface: GOV_POOL_ABI, method: "getHelperContracts", args: [] },
57
+ ];
58
+ const res1 = await multicall(provider, batch1);
59
+ if (!res1[0].success)
60
+ throw new Error("Failed to read getHelperContracts");
61
+ const helpers = res1[0].value;
62
+ const [settings, userKeeper] = helpers;
63
+ // Batch 2: token address + settings
64
+ const batch2 = [
65
+ { target: userKeeper, iface: USER_KEEPER_ABI, method: "tokenAddress", args: [] },
66
+ { target: settings, iface: SETTINGS_ABI, method: "getDefaultSettings", args: [] },
67
+ {
68
+ target: userKeeper,
69
+ iface: USER_KEEPER_ABI,
70
+ method: "tokenBalance",
71
+ args: [user, 0],
72
+ allowFailure: true,
73
+ },
74
+ ];
75
+ const res2 = await multicall(provider, batch2);
76
+ if (!res2[0].success)
77
+ throw new Error("Failed to read tokenAddress");
78
+ if (!res2[1].success)
79
+ throw new Error("Failed to read getDefaultSettings");
80
+ const tokenAddress = res2[0].value;
81
+ const defaultSettings = res2[1].value;
82
+ let depositedPower = 0n;
83
+ if (res2[2].success) {
84
+ const [balance, ownedBalance] = res2[2].value;
85
+ depositedPower = balance - ownedBalance;
86
+ }
87
+ // Batch 3: ERC20 balance + allowance
88
+ const batch3 = [
89
+ { target: tokenAddress, iface: ERC20_ABI, method: "balanceOf", args: [user] },
90
+ { target: tokenAddress, iface: ERC20_ABI, method: "allowance", args: [user, userKeeper] },
91
+ ];
92
+ const res3 = await multicall(provider, batch3);
93
+ const walletBalance = res3[0].success ? res3[0].value : 0n;
94
+ const currentAllowance = res3[1].success ? res3[1].value : 0n;
95
+ return {
96
+ userKeeper,
97
+ settings,
98
+ tokenAddress,
99
+ walletBalance,
100
+ currentAllowance,
101
+ depositedPower,
102
+ minVotesForCreating: defaultSettings.minVotesForCreating,
103
+ minVotesForVoting: defaultSettings.minVotesForVoting,
104
+ };
105
+ }
106
+ export async function sendOrCollect(signer, payloads, opts) {
107
+ const steps = [];
108
+ // `dryRun` and "no signer" both return calldata without broadcasting, but
109
+ // they're tagged distinctly so the swarm orchestrator's mcpFallbackDispatcher
110
+ // (which auto-broadcasts on `mode === "payloads"`) leaves dryRun responses
111
+ // alone. No-signer remains "payloads" so external callers get the same
112
+ // ordered TxPayload contract the public docs promise.
113
+ if (opts?.dryRun) {
114
+ for (const p of payloads) {
115
+ steps.push({ label: p.description, skipped: false, payload: p });
116
+ }
117
+ return { mode: "dryRun", steps };
118
+ }
119
+ if (!signer.hasSigner()) {
120
+ for (const p of payloads) {
121
+ steps.push({ label: p.description, skipped: false, payload: p });
122
+ }
123
+ return { mode: "payloads", steps };
124
+ }
125
+ const wallet = signer.requireSigner();
126
+ for (const p of payloads) {
127
+ const tx = await wallet.sendTransaction({
128
+ to: p.to,
129
+ data: p.data,
130
+ value: BigInt(p.value),
131
+ chainId: BigInt(p.chainId),
132
+ });
133
+ const receipt = await tx.wait(1);
134
+ steps.push({
135
+ label: p.description,
136
+ skipped: false,
137
+ txHash: receipt?.hash ?? tx.hash,
138
+ });
139
+ }
140
+ return { mode: "executed", steps };
141
+ }
142
+ /**
143
+ * Pure runner behind `dexe_proposal_create`. Exposed for composite tools
144
+ * (e.g. `dexe_otc_dao_open_sale`) that build their own `actionsOnFor` and
145
+ * want the same prereq + IPFS + multicall flow without going through the
146
+ * MCP tool layer.
147
+ */
148
+ export async function runProposalCreate(inputRaw, deps) {
149
+ const input = {
150
+ proposalType: "custom",
151
+ description: "",
152
+ actionsOnFor: [],
153
+ voteNftIds: [],
154
+ ...inputRaw,
155
+ };
156
+ const { ctx, signer, rpc } = deps;
157
+ if (!ctx.config.pinataJwt)
158
+ return err("DEXE_PINATA_JWT required for proposal creation (IPFS metadata upload).");
159
+ const user = input.user ?? (signer.hasSigner() ? signer.getAddress() : undefined);
160
+ if (!user)
161
+ return err("Provide 'user' address or set DEXE_PRIVATE_KEY.");
162
+ const pinata = new PinataClient(ctx.config.pinataJwt);
163
+ const chainId = ctx.config.chainId;
164
+ const govPool = input.govPool;
165
+ // Step 1: resolve prerequisites
166
+ let prereqs;
167
+ try {
168
+ prereqs = await resolvePrereqs(rpc, govPool, user);
169
+ }
170
+ catch (e) {
171
+ return err(`Failed to resolve prerequisites: ${e instanceof Error ? e.message : String(e)}`);
172
+ }
173
+ // Step 2: check creation threshold
174
+ const totalAvailable = prereqs.walletBalance + prereqs.depositedPower;
175
+ if (prereqs.minVotesForCreating > 0n && totalAvailable < prereqs.minVotesForCreating) {
176
+ return err(`Insufficient tokens for proposal creation. Need ${prereqs.minVotesForCreating} but have ${totalAvailable} (wallet: ${prereqs.walletBalance}, deposited: ${prereqs.depositedPower}).`);
177
+ }
178
+ // Step 3: build actions + metadata based on type
179
+ let actionsOnFor;
180
+ let proposalExtra;
181
+ if (input.proposalType === "modify_dao_profile") {
182
+ // Upload new DAO metadata
183
+ const descSlate = markdownToSlate(input.newDaoDescription ?? input.description ?? "");
184
+ const descRes = await pinata.pinJson(descSlate, { name: `dao-desc:${govPool.slice(0, 10)}` });
185
+ const daoMeta = {
186
+ daoName: input.newDaoName ?? "",
187
+ websiteUrl: input.newWebsiteUrl ?? "",
188
+ description: `ipfs://${descRes.cid}`,
189
+ socialLinks: input.newSocialLinks ?? [],
190
+ documents: [],
191
+ };
192
+ if (input.newAvatarCID) {
193
+ daoMeta.avatarCID = input.newAvatarCID;
194
+ daoMeta.avatarFileName = input.newAvatarFileName ?? "avatar";
195
+ daoMeta.avatarUrl = `https://${input.newAvatarCID}.ipfs.4everland.io/${daoMeta.avatarFileName}`;
196
+ }
197
+ const daoMetaRes = await pinata.pinJson(daoMeta, { name: `dao-meta:${govPool.slice(0, 10)}` });
198
+ const newDescriptionURL = `ipfs://${daoMetaRes.cid}`;
199
+ // Read current descriptionURL for "currentChanges"
200
+ let currentDescriptionURL = "";
201
+ try {
202
+ const provider = rpc.requireProvider();
203
+ const descIface = new Interface(["function descriptionURL() view returns (string)"]);
204
+ const batch = [{ target: govPool, iface: descIface, method: "descriptionURL", args: [] }];
205
+ const res = await multicall(provider, batch);
206
+ if (res[0].success)
207
+ currentDescriptionURL = res[0].value;
208
+ }
209
+ catch { /* best effort */ }
210
+ actionsOnFor = [{
211
+ executor: govPool,
212
+ value: 0n,
213
+ data: GOV_POOL_ABI.encodeFunctionData("editDescriptionURL", [newDescriptionURL]),
214
+ }];
215
+ proposalExtra = {
216
+ category: "daoProfileModification",
217
+ isMeta: false,
218
+ changes: {
219
+ proposedChanges: { descriptionUrl: newDescriptionURL },
220
+ currentChanges: { descriptionUrl: currentDescriptionURL },
221
+ },
222
+ };
223
+ }
224
+ else {
225
+ // custom
226
+ actionsOnFor = input.actionsOnFor.map(a => ({
227
+ executor: a.executor,
228
+ value: BigInt(a.value ?? "0"),
229
+ data: a.data,
230
+ }));
231
+ proposalExtra = {
232
+ ...(input.category ? { category: input.category } : {}),
233
+ isMeta: false,
234
+ ...(input.proposalMetadataExtra ?? {}),
235
+ };
236
+ }
237
+ // Step 4: upload proposal metadata (field names must match frontend exactly)
238
+ const proposalMeta = {
239
+ proposalName: input.title,
240
+ proposalDescription: JSON.stringify(markdownToSlate(input.description)),
241
+ ...proposalExtra,
242
+ };
243
+ const proposalMetaRes = await pinata.pinJson(proposalMeta, { name: `proposal:${input.title.slice(0, 30)}` });
244
+ const descriptionURL = `ipfs://${proposalMetaRes.cid}`;
245
+ // Step 5: build tx payloads
246
+ const payloads = [];
247
+ const skippedSteps = [];
248
+ // Determine how much to deposit
249
+ const voteAmount = input.voteAmount ? BigInt(input.voteAmount) : prereqs.depositedPower + prereqs.walletBalance;
250
+ if (voteAmount === 0n) {
251
+ return err("No voting power available (wallet + deposited = 0). Deposit tokens first.");
252
+ }
253
+ const needDeposit = voteAmount > prereqs.depositedPower ? voteAmount - prereqs.depositedPower : 0n;
254
+ if (needDeposit > prereqs.walletBalance) {
255
+ return err(`Need to deposit ${needDeposit} but wallet only has ${prereqs.walletBalance}. Missing ${needDeposit - prereqs.walletBalance}.`);
256
+ }
257
+ // Approve (if needed)
258
+ if (needDeposit > 0n && prereqs.currentAllowance < needDeposit) {
259
+ payloads.push(makeTxPayload(prereqs.tokenAddress, ERC20_ABI, "approve", [prereqs.userKeeper, MaxUint256], chainId, `ERC20.approve(${prereqs.userKeeper}, MAX_UINT256)`));
260
+ }
261
+ else {
262
+ skippedSteps.push({ label: "ERC20.approve", skipped: true, reason: "Allowance sufficient" });
263
+ }
264
+ // Build GovPool calls to batch via multicall
265
+ const govPoolCalls = [];
266
+ // Deposit (if needed)
267
+ if (needDeposit > 0n) {
268
+ govPoolCalls.push(GOV_POOL_ABI.encodeFunctionData("deposit", [needDeposit, []]));
269
+ }
270
+ else {
271
+ skippedSteps.push({ label: "GovPool.deposit", skipped: true, reason: "Sufficient deposited power" });
272
+ }
273
+ // createProposalAndVote
274
+ const actionsForTuple = actionsOnFor.map(a => [a.executor, a.value, a.data]);
275
+ govPoolCalls.push(GOV_POOL_ABI.encodeFunctionData("createProposalAndVote", [
276
+ descriptionURL,
277
+ actionsForTuple,
278
+ [], // actionsOnAgainst
279
+ voteAmount,
280
+ input.voteNftIds.map(id => BigInt(id)),
281
+ ]));
282
+ // Wrap in multicall if >1 call, otherwise single tx
283
+ if (govPoolCalls.length > 1) {
284
+ payloads.push({
285
+ to: govPool,
286
+ data: GOV_POOL_ABI.encodeFunctionData("multicall", [govPoolCalls]),
287
+ value: "0",
288
+ chainId,
289
+ description: `GovPool.multicall([deposit, createProposalAndVote])`,
290
+ });
291
+ }
292
+ else {
293
+ payloads.push({
294
+ to: govPool,
295
+ data: govPoolCalls[0],
296
+ value: "0",
297
+ chainId,
298
+ description: `GovPool.createProposalAndVote("${input.title}")`,
299
+ });
300
+ }
301
+ // Step 6: send or return
302
+ const result = await sendOrCollect(signer, payloads, { dryRun: input.dryRun });
303
+ return ok({
304
+ mode: result.mode,
305
+ descriptionURL,
306
+ proposalMetadataCID: proposalMetaRes.cid,
307
+ prereqs: {
308
+ walletBalance: prereqs.walletBalance.toString(),
309
+ depositedPower: prereqs.depositedPower.toString(),
310
+ allowance: prereqs.currentAllowance.toString(),
311
+ minVotesForCreating: prereqs.minVotesForCreating.toString(),
312
+ tokenAddress: prereqs.tokenAddress,
313
+ },
314
+ steps: [...skippedSteps, ...result.steps],
315
+ });
316
+ }
317
+ // ---------- register ----------
318
+ export function registerFlowTools(server, ctx, signer) {
319
+ const rpc = new RpcProvider(ctx.config);
320
+ // =============================================
321
+ // dexe_proposal_create — thin shim around runProposalCreate
322
+ // =============================================
323
+ server.tool("dexe_proposal_create", "Create a governance proposal with full prerequisite handling. " +
324
+ "Automatically checks token balance, approves if needed, deposits if needed, " +
325
+ "uploads metadata to IPFS (with correct category/changes fields), and builds " +
326
+ "createProposalAndVote calldata. When DEXE_PRIVATE_KEY is set, signs and broadcasts " +
327
+ "all transactions. Otherwise returns ordered TxPayload list.\n\n" +
328
+ "Supported proposalType values: 'modify_dao_profile', 'custom'.\n\n" +
329
+ "For modify_dao_profile: provide newDaoDescription and/or newAvatarCID to change the DAO profile. " +
330
+ "Tool encodes editDescriptionURL action and uploads both DAO metadata and proposal metadata to IPFS.\n\n" +
331
+ "For custom: provide actionsOnFor array with {executor, value, data} objects.", {
332
+ govPool: z.string().describe("GovPool contract address"),
333
+ proposalType: z.enum(["modify_dao_profile", "custom"]).default("custom"),
334
+ title: z.string().describe("Proposal title"),
335
+ description: z.string().default("").describe("Proposal description (markdown supported)"),
336
+ newDaoName: z.string().optional(),
337
+ newDaoDescription: z.string().optional(),
338
+ newWebsiteUrl: z.string().optional(),
339
+ newAvatarCID: z.string().optional(),
340
+ newAvatarFileName: z.string().optional(),
341
+ newSocialLinks: z.array(z.tuple([z.string(), z.string()])).optional(),
342
+ actionsOnFor: z.array(z.object({
343
+ executor: z.string(),
344
+ value: z.string().default("0"),
345
+ data: z.string(),
346
+ })).default([]).describe("Actions for custom proposals"),
347
+ category: z.string().optional().describe("Proposal category (included in IPFS metadata)."),
348
+ proposalMetadataExtra: z.record(z.unknown()).optional().describe("Extra fields merged into IPFS metadata."),
349
+ voteAmount: z.string().optional().describe("Auto-vote amount (18-dec wei). Defaults to all deposited power."),
350
+ voteNftIds: z.array(z.string()).default([]),
351
+ user: z.string().optional().describe("User address. Required when DEXE_PRIVATE_KEY not set."),
352
+ dryRun: z.boolean().default(false).describe("If true, return ordered TxPayloads even when DEXE_PRIVATE_KEY is set."),
353
+ }, (input) => runProposalCreate(input, { ctx, signer, rpc }));
354
+ // =============================================
355
+ // dexe_proposal_vote_and_execute
356
+ // =============================================
357
+ server.tool("dexe_proposal_vote_and_execute", "Vote on a proposal and optionally execute it. " +
358
+ "Checks proposal state, deposits tokens if needed, votes, and when autoExecute is true " +
359
+ "attempts to execute after voting. When DEXE_PRIVATE_KEY is set, signs and broadcasts. " +
360
+ "Otherwise returns ordered TxPayload list.", {
361
+ govPool: z.string().describe("GovPool contract address"),
362
+ proposalId: z.number().int().min(1).describe("Proposal ID (1-indexed)"),
363
+ isVoteFor: z.boolean().default(true).describe("Vote for (true) or against (false)"),
364
+ voteAmount: z.string().optional().describe("Vote amount (18-dec wei). Defaults to all deposited power."),
365
+ voteNftIds: z.array(z.string()).default([]),
366
+ depositFirst: z.boolean().default(false).describe("Deposit wallet tokens before voting"),
367
+ autoExecute: z.boolean().default(true).describe("Attempt execute if proposal passes after vote"),
368
+ user: z.string().optional().describe("User address. Required when DEXE_PRIVATE_KEY not set."),
369
+ }, async (input) => {
370
+ const user = input.user ?? (signer.hasSigner() ? signer.getAddress() : undefined);
371
+ if (!user)
372
+ return err("Provide 'user' address or set DEXE_PRIVATE_KEY.");
373
+ const provider = rpc.requireProvider();
374
+ const chainId = ctx.config.chainId;
375
+ const govPool = input.govPool;
376
+ const proposalId = input.proposalId;
377
+ // Step 1: read proposal state
378
+ const stateCalls = [
379
+ { target: govPool, iface: GOV_POOL_ABI, method: "getProposalState", args: [proposalId] },
380
+ ];
381
+ const stateRes = await multicall(provider, stateCalls);
382
+ if (!stateRes[0].success)
383
+ return err(`Failed to read proposal state: ${stateRes[0].error}`);
384
+ const STATE_NAMES = ["Voting", "WaitingForVotingTransfer", "ValidatorVoting", "Defeated", "SucceededFor", "SucceededAgainst", "Locked", "ExecutedFor", "ExecutedAgainst", "Undefined"];
385
+ const stateNum = Number(stateRes[0].value);
386
+ const stateName = STATE_NAMES[stateNum] ?? `Unknown(${stateNum})`;
387
+ // Already past voting — skip vote, go straight to execute. State 4 =
388
+ // SucceededFor, 5 = SucceededAgainst, 6 = Locked (post-quorum, post-
389
+ // validator window if any, executable once delay elapsed). When the
390
+ // open_sale composite votes with enough power to clear quorum +
391
+ // earlyCompletion, the proposal lands directly in Locked, so we must
392
+ // recognize it here as executable.
393
+ if ((stateNum === 4 || stateNum === 5 || stateNum === 6) && input.autoExecute) {
394
+ const execResult = await sendOrCollect(signer, [
395
+ makeTxPayload(govPool, GOV_POOL_ABI, "execute", [proposalId], chainId, `GovPool.execute(${proposalId})`),
396
+ ]);
397
+ return ok({
398
+ mode: execResult.mode,
399
+ proposalId,
400
+ proposalStateBefore: stateName,
401
+ steps: [
402
+ { label: "GovPool.vote", skipped: true, reason: `Proposal already in "${stateName}" — no vote needed` },
403
+ ...execResult.steps,
404
+ ],
405
+ executed: true,
406
+ });
407
+ }
408
+ if (stateNum !== 0) {
409
+ return err(`Proposal #${proposalId} is in state "${stateName}" — voting requires "Voting" state.`);
410
+ }
411
+ // Step 2: resolve prereqs for deposit check
412
+ let prereqs;
413
+ if (input.depositFirst) {
414
+ prereqs = await resolvePrereqs(rpc, govPool, user);
415
+ }
416
+ const payloads = [];
417
+ const skippedSteps = [];
418
+ // Step 3: optional deposit
419
+ if (input.depositFirst && prereqs && prereqs.walletBalance > 0n) {
420
+ // Approve if needed
421
+ if (prereqs.currentAllowance < prereqs.walletBalance) {
422
+ payloads.push(makeTxPayload(prereqs.tokenAddress, ERC20_ABI, "approve", [prereqs.userKeeper, MaxUint256], chainId, `ERC20.approve(${prereqs.userKeeper}, MAX_UINT256)`));
423
+ }
424
+ // Deposit
425
+ payloads.push(makeTxPayload(govPool, GOV_POOL_ABI, "deposit", [prereqs.walletBalance, []], chainId, `GovPool.deposit(${prereqs.walletBalance})`));
426
+ }
427
+ // Step 4: vote
428
+ const voteAmt = input.voteAmount
429
+ ? BigInt(input.voteAmount)
430
+ : (prereqs ? prereqs.depositedPower + prereqs.walletBalance : 0n);
431
+ if (voteAmt === 0n) {
432
+ return err("No voting power available. Deposit tokens before voting.");
433
+ }
434
+ // Check minVotesForVoting threshold
435
+ if (!prereqs && !input.voteAmount) {
436
+ // Need prereqs to validate threshold — fetch them
437
+ prereqs = await resolvePrereqs(rpc, govPool, user);
438
+ }
439
+ if (prereqs && prereqs.minVotesForVoting > 0n && voteAmt < prereqs.minVotesForVoting) {
440
+ return err(`Insufficient voting power. Need ${prereqs.minVotesForVoting} but voting with ${voteAmt}.`);
441
+ }
442
+ payloads.push(makeTxPayload(govPool, GOV_POOL_ABI, "vote", [proposalId, input.isVoteFor, voteAmt, input.voteNftIds.map(id => BigInt(id))], chainId, `GovPool.vote(${proposalId}, ${input.isVoteFor}, ${voteAmt})`));
443
+ // Step 5: send or collect
444
+ const result = await sendOrCollect(signer, payloads);
445
+ // Step 6: auto-execute (only in executed mode)
446
+ let executed = false;
447
+ if (input.autoExecute && result.mode === "executed") {
448
+ // Re-read state after vote
449
+ const postRes = await multicall(provider, [
450
+ { target: govPool, iface: GOV_POOL_ABI, method: "getProposalState", args: [proposalId] },
451
+ ]);
452
+ const postState = Number(postRes[0].value);
453
+ const postStateName = STATE_NAMES[postState] ?? `Unknown(${postState})`;
454
+ if (postState === 4 || postState === 5) {
455
+ // SucceededFor or SucceededAgainst — execute
456
+ const execResult = await sendOrCollect(signer, [
457
+ makeTxPayload(govPool, GOV_POOL_ABI, "execute", [proposalId], chainId, `GovPool.execute(${proposalId})`),
458
+ ]);
459
+ result.steps.push(...execResult.steps);
460
+ executed = true;
461
+ }
462
+ else {
463
+ skippedSteps.push({
464
+ label: "GovPool.execute",
465
+ skipped: true,
466
+ reason: `Proposal in state "${postStateName}" after vote — not ready for execution`,
467
+ });
468
+ }
469
+ }
470
+ return ok({
471
+ mode: result.mode,
472
+ proposalId,
473
+ proposalStateBefore: stateName,
474
+ steps: [...skippedSteps, ...result.steps],
475
+ executed,
476
+ });
477
+ });
478
+ }
479
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/tools/flow.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAqB/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAqBvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA2B/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA4BvE"}
@@ -16,6 +16,12 @@ import { registerProposalBuildOffchainTools } from "./proposalBuildOffchain.js";
16
16
  import { registerProposalBuildInternalTools } from "./proposalBuildInternal.js";
17
17
  import { registerVoteBuildTools } from "./voteBuild.js";
18
18
  import { registerDaoDeployTools } from "./daoDeploy.js";
19
+ import { registerSubgraphTools } from "./subgraph.js";
20
+ import { registerTxTools } from "./txSend.js";
21
+ import { registerFlowTools } from "./flow.js";
22
+ import { registerMerkleTools } from "./merkle.js";
23
+ import { registerOtcTools } from "./otc.js";
24
+ import { SignerManager } from "../lib/signer.js";
19
25
  /**
20
26
  * Wire every dexe-mcp tool onto the given server instance. Builds the shared
21
27
  * ToolContext (artifacts cache, hardhat runner, selector index) once so all
@@ -41,5 +47,11 @@ export function registerAll(server, config) {
41
47
  registerProposalBuildInternalTools(server, ctx);
42
48
  registerVoteBuildTools(server, ctx);
43
49
  registerDaoDeployTools(server, ctx);
50
+ registerSubgraphTools(server, ctx);
51
+ registerMerkleTools(server, ctx);
52
+ const signer = new SignerManager(config);
53
+ registerTxTools(server, config, signer);
54
+ registerFlowTools(server, ctx, signer);
55
+ registerOtcTools(server, ctx, signer);
44
56
  }
45
57
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAiB,EAAE,MAAkB;IAC/D,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAElE,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,8BAA8B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,iCAAiC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,kCAAkC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../src/tools/ipfs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,WAAW,EAKZ,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAS3E;AA6UD,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../src/tools/ipfs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,WAAW,EAKZ,MAAM,gBAAgB,CAAC;AAGxB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAS3E;AAuaD,OAAO,EAAE,WAAW,EAAE,CAAC"}