dexe-mcp 0.1.5 → 0.3.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.
- package/.mcp.example.json +12 -2
- package/CHANGELOG.md +84 -0
- package/FUTURE.md +26 -5
- package/README.md +105 -197
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/addresses.d.ts +57 -0
- package/dist/lib/addresses.d.ts.map +1 -0
- package/dist/lib/addresses.js +83 -0
- package/dist/lib/addresses.js.map +1 -0
- package/dist/lib/calldata.d.ts +32 -0
- package/dist/lib/calldata.d.ts.map +1 -0
- package/dist/lib/calldata.js +28 -0
- package/dist/lib/calldata.js.map +1 -0
- package/dist/lib/govEnums.d.ts +12 -0
- package/dist/lib/govEnums.d.ts.map +1 -0
- package/dist/lib/govEnums.js +35 -0
- package/dist/lib/govEnums.js.map +1 -0
- package/dist/lib/ipfs.d.ts +60 -0
- package/dist/lib/ipfs.d.ts.map +1 -0
- package/dist/lib/ipfs.js +168 -0
- package/dist/lib/ipfs.js.map +1 -0
- package/dist/lib/markdownToSlate.d.ts +39 -0
- package/dist/lib/markdownToSlate.d.ts.map +1 -0
- package/dist/lib/markdownToSlate.js +203 -0
- package/dist/lib/markdownToSlate.js.map +1 -0
- package/dist/lib/multicall.d.ts +33 -0
- package/dist/lib/multicall.d.ts.map +1 -0
- package/dist/lib/multicall.js +46 -0
- package/dist/lib/multicall.js.map +1 -0
- package/dist/lib/proposalCatalog.d.ts +45 -0
- package/dist/lib/proposalCatalog.d.ts.map +1 -0
- package/dist/lib/proposalCatalog.js +416 -0
- package/dist/lib/proposalCatalog.js.map +1 -0
- package/dist/lib/signer.d.ts +12 -0
- package/dist/lib/signer.d.ts.map +1 -0
- package/dist/lib/signer.js +31 -0
- package/dist/lib/signer.js.map +1 -0
- package/dist/lib/subgraph.d.ts +15 -0
- package/dist/lib/subgraph.d.ts.map +1 -0
- package/dist/lib/subgraph.js +42 -0
- package/dist/lib/subgraph.js.map +1 -0
- package/dist/tools/dao.d.ts +4 -0
- package/dist/tools/dao.d.ts.map +1 -0
- package/dist/tools/dao.js +242 -0
- package/dist/tools/dao.js.map +1 -0
- package/dist/tools/daoDeploy.d.ts +4 -0
- package/dist/tools/daoDeploy.d.ts.map +1 -0
- package/dist/tools/daoDeploy.js +573 -0
- package/dist/tools/daoDeploy.js.map +1 -0
- package/dist/tools/flow.d.ts +5 -0
- package/dist/tools/flow.d.ts.map +1 -0
- package/dist/tools/flow.js +451 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/ipfs.d.ts +6 -0
- package/dist/tools/ipfs.d.ts.map +1 -0
- package/dist/tools/ipfs.js +376 -0
- package/dist/tools/ipfs.js.map +1 -0
- package/dist/tools/proposal.d.ts +4 -0
- package/dist/tools/proposal.d.ts.map +1 -0
- package/dist/tools/proposal.js +217 -0
- package/dist/tools/proposal.js.map +1 -0
- package/dist/tools/proposalBuild.d.ts +4 -0
- package/dist/tools/proposalBuild.d.ts.map +1 -0
- package/dist/tools/proposalBuild.js +372 -0
- package/dist/tools/proposalBuild.js.map +1 -0
- package/dist/tools/proposalBuildComplex.d.ts +4 -0
- package/dist/tools/proposalBuildComplex.d.ts.map +1 -0
- package/dist/tools/proposalBuildComplex.js +766 -0
- package/dist/tools/proposalBuildComplex.js.map +1 -0
- package/dist/tools/proposalBuildInternal.d.ts +4 -0
- package/dist/tools/proposalBuildInternal.d.ts.map +1 -0
- package/dist/tools/proposalBuildInternal.js +224 -0
- package/dist/tools/proposalBuildInternal.js.map +1 -0
- package/dist/tools/proposalBuildMore.d.ts +4 -0
- package/dist/tools/proposalBuildMore.d.ts.map +1 -0
- package/dist/tools/proposalBuildMore.js +457 -0
- package/dist/tools/proposalBuildMore.js.map +1 -0
- package/dist/tools/proposalBuildOffchain.d.ts +4 -0
- package/dist/tools/proposalBuildOffchain.d.ts.map +1 -0
- package/dist/tools/proposalBuildOffchain.js +389 -0
- package/dist/tools/proposalBuildOffchain.js.map +1 -0
- package/dist/tools/read.d.ts +4 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +580 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/subgraph.d.ts +4 -0
- package/dist/tools/subgraph.d.ts.map +1 -0
- package/dist/tools/subgraph.js +404 -0
- package/dist/tools/subgraph.js.map +1 -0
- package/dist/tools/txSend.d.ts +5 -0
- package/dist/tools/txSend.d.ts.map +1 -0
- package/dist/tools/txSend.js +87 -0
- package/dist/tools/txSend.js.map +1 -0
- package/dist/tools/vote.d.ts +4 -0
- package/dist/tools/vote.d.ts.map +1 -0
- package/dist/tools/vote.js +196 -0
- package/dist/tools/vote.js.map +1 -0
- package/dist/tools/voteBuild.d.ts +4 -0
- package/dist/tools/voteBuild.d.ts.map +1 -0
- package/dist/tools/voteBuild.js +983 -0
- package/dist/tools/voteBuild.js.map +1 -0
- package/package.json +18 -5
- package/PLAN.md +0 -132
|
@@ -0,0 +1,451 @@
|
|
|
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
|
+
async function sendOrCollect(signer, payloads) {
|
|
107
|
+
const steps = [];
|
|
108
|
+
if (!signer.hasSigner()) {
|
|
109
|
+
for (const p of payloads) {
|
|
110
|
+
steps.push({ label: p.description, skipped: false, payload: p });
|
|
111
|
+
}
|
|
112
|
+
return { mode: "payloads", steps };
|
|
113
|
+
}
|
|
114
|
+
const wallet = signer.requireSigner();
|
|
115
|
+
for (const p of payloads) {
|
|
116
|
+
const tx = await wallet.sendTransaction({
|
|
117
|
+
to: p.to,
|
|
118
|
+
data: p.data,
|
|
119
|
+
value: BigInt(p.value),
|
|
120
|
+
chainId: BigInt(p.chainId),
|
|
121
|
+
});
|
|
122
|
+
const receipt = await tx.wait(1);
|
|
123
|
+
steps.push({
|
|
124
|
+
label: p.description,
|
|
125
|
+
skipped: false,
|
|
126
|
+
txHash: receipt?.hash ?? tx.hash,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return { mode: "executed", steps };
|
|
130
|
+
}
|
|
131
|
+
// ---------- register ----------
|
|
132
|
+
export function registerFlowTools(server, ctx, signer) {
|
|
133
|
+
const rpc = new RpcProvider(ctx.config);
|
|
134
|
+
// =============================================
|
|
135
|
+
// dexe_proposal_create
|
|
136
|
+
// =============================================
|
|
137
|
+
server.tool("dexe_proposal_create", "Create a governance proposal with full prerequisite handling. " +
|
|
138
|
+
"Automatically checks token balance, approves if needed, deposits if needed, " +
|
|
139
|
+
"uploads metadata to IPFS (with correct category/changes fields), and builds " +
|
|
140
|
+
"createProposalAndVote calldata. When DEXE_PRIVATE_KEY is set, signs and broadcasts " +
|
|
141
|
+
"all transactions. Otherwise returns ordered TxPayload list.\n\n" +
|
|
142
|
+
"Supported proposalType values: 'modify_dao_profile', 'custom'.\n\n" +
|
|
143
|
+
"For modify_dao_profile: provide newDaoDescription and/or newAvatarCID to change the DAO profile. " +
|
|
144
|
+
"Tool encodes editDescriptionURL action and uploads both DAO metadata and proposal metadata to IPFS.\n\n" +
|
|
145
|
+
"For custom: provide actionsOnFor array with {executor, value, data} objects.", {
|
|
146
|
+
govPool: z.string().describe("GovPool contract address"),
|
|
147
|
+
proposalType: z.enum(["modify_dao_profile", "custom"]).default("custom"),
|
|
148
|
+
title: z.string().describe("Proposal title"),
|
|
149
|
+
description: z.string().default("").describe("Proposal description (markdown supported)"),
|
|
150
|
+
// modify_dao_profile fields
|
|
151
|
+
newDaoName: z.string().optional().describe("New DAO name (for modify_dao_profile)"),
|
|
152
|
+
newDaoDescription: z.string().optional().describe("New DAO description markdown"),
|
|
153
|
+
newWebsiteUrl: z.string().optional().describe("New website URL"),
|
|
154
|
+
newAvatarCID: z.string().optional().describe("CID of avatar image (from dexe_ipfs_upload_file)"),
|
|
155
|
+
newAvatarFileName: z.string().optional().describe("Avatar filename e.g. 'avatar.jpeg'"),
|
|
156
|
+
newSocialLinks: z.array(z.tuple([z.string(), z.string()])).optional(),
|
|
157
|
+
// custom fields
|
|
158
|
+
actionsOnFor: z.array(z.object({
|
|
159
|
+
executor: z.string(),
|
|
160
|
+
value: z.string().default("0"),
|
|
161
|
+
data: z.string(),
|
|
162
|
+
})).default([]).describe("Actions for custom proposals"),
|
|
163
|
+
category: z.string().optional().describe("Proposal category (e.g. 'Token Transfer', 'Change Voting Settings'). Included in IPFS metadata."),
|
|
164
|
+
proposalMetadataExtra: z.record(z.unknown()).optional().describe("Extra fields merged into IPFS metadata (e.g. changes, isMeta). From dexe_proposal_build_* output."),
|
|
165
|
+
// voting
|
|
166
|
+
voteAmount: z.string().optional().describe("Auto-vote amount (18-dec wei). Defaults to all deposited power."),
|
|
167
|
+
voteNftIds: z.array(z.string()).default([]),
|
|
168
|
+
// override
|
|
169
|
+
user: z.string().optional().describe("User address. Required when DEXE_PRIVATE_KEY not set."),
|
|
170
|
+
}, async (input) => {
|
|
171
|
+
if (!ctx.config.pinataJwt)
|
|
172
|
+
return err("DEXE_PINATA_JWT required for proposal creation (IPFS metadata upload).");
|
|
173
|
+
const user = input.user ?? (signer.hasSigner() ? signer.getAddress() : undefined);
|
|
174
|
+
if (!user)
|
|
175
|
+
return err("Provide 'user' address or set DEXE_PRIVATE_KEY.");
|
|
176
|
+
const pinata = new PinataClient(ctx.config.pinataJwt);
|
|
177
|
+
const chainId = ctx.config.chainId;
|
|
178
|
+
const govPool = input.govPool;
|
|
179
|
+
// Step 1: resolve prerequisites
|
|
180
|
+
let prereqs;
|
|
181
|
+
try {
|
|
182
|
+
prereqs = await resolvePrereqs(rpc, govPool, user);
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
return err(`Failed to resolve prerequisites: ${e instanceof Error ? e.message : String(e)}`);
|
|
186
|
+
}
|
|
187
|
+
// Step 2: check creation threshold
|
|
188
|
+
const totalAvailable = prereqs.walletBalance + prereqs.depositedPower;
|
|
189
|
+
if (prereqs.minVotesForCreating > 0n && totalAvailable < prereqs.minVotesForCreating) {
|
|
190
|
+
return err(`Insufficient tokens for proposal creation. Need ${prereqs.minVotesForCreating} but have ${totalAvailable} (wallet: ${prereqs.walletBalance}, deposited: ${prereqs.depositedPower}).`);
|
|
191
|
+
}
|
|
192
|
+
// Step 3: build actions + metadata based on type
|
|
193
|
+
let actionsOnFor;
|
|
194
|
+
let proposalExtra;
|
|
195
|
+
if (input.proposalType === "modify_dao_profile") {
|
|
196
|
+
// Upload new DAO metadata
|
|
197
|
+
const descSlate = markdownToSlate(input.newDaoDescription ?? input.description ?? "");
|
|
198
|
+
const descRes = await pinata.pinJson(descSlate, { name: `dao-desc:${govPool.slice(0, 10)}` });
|
|
199
|
+
const daoMeta = {
|
|
200
|
+
daoName: input.newDaoName ?? "",
|
|
201
|
+
websiteUrl: input.newWebsiteUrl ?? "",
|
|
202
|
+
description: `ipfs://${descRes.cid}`,
|
|
203
|
+
socialLinks: input.newSocialLinks ?? [],
|
|
204
|
+
documents: [],
|
|
205
|
+
};
|
|
206
|
+
if (input.newAvatarCID) {
|
|
207
|
+
daoMeta.avatarCID = input.newAvatarCID;
|
|
208
|
+
daoMeta.avatarFileName = input.newAvatarFileName ?? "avatar";
|
|
209
|
+
daoMeta.avatarUrl = `https://${input.newAvatarCID}.ipfs.4everland.io/${daoMeta.avatarFileName}`;
|
|
210
|
+
}
|
|
211
|
+
const daoMetaRes = await pinata.pinJson(daoMeta, { name: `dao-meta:${govPool.slice(0, 10)}` });
|
|
212
|
+
const newDescriptionURL = `ipfs://${daoMetaRes.cid}`;
|
|
213
|
+
// Read current descriptionURL for "currentChanges"
|
|
214
|
+
let currentDescriptionURL = "";
|
|
215
|
+
try {
|
|
216
|
+
const provider = rpc.requireProvider();
|
|
217
|
+
const descIface = new Interface(["function descriptionURL() view returns (string)"]);
|
|
218
|
+
const batch = [{ target: govPool, iface: descIface, method: "descriptionURL", args: [] }];
|
|
219
|
+
const res = await multicall(provider, batch);
|
|
220
|
+
if (res[0].success)
|
|
221
|
+
currentDescriptionURL = res[0].value;
|
|
222
|
+
}
|
|
223
|
+
catch { /* best effort */ }
|
|
224
|
+
actionsOnFor = [{
|
|
225
|
+
executor: govPool,
|
|
226
|
+
value: 0n,
|
|
227
|
+
data: GOV_POOL_ABI.encodeFunctionData("editDescriptionURL", [newDescriptionURL]),
|
|
228
|
+
}];
|
|
229
|
+
proposalExtra = {
|
|
230
|
+
category: "daoProfileModification",
|
|
231
|
+
isMeta: false,
|
|
232
|
+
changes: {
|
|
233
|
+
proposedChanges: { descriptionUrl: newDescriptionURL },
|
|
234
|
+
currentChanges: { descriptionUrl: currentDescriptionURL },
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// custom
|
|
240
|
+
actionsOnFor = input.actionsOnFor.map(a => ({
|
|
241
|
+
executor: a.executor,
|
|
242
|
+
value: BigInt(a.value),
|
|
243
|
+
data: a.data,
|
|
244
|
+
}));
|
|
245
|
+
proposalExtra = {
|
|
246
|
+
...(input.category ? { category: input.category } : {}),
|
|
247
|
+
isMeta: false,
|
|
248
|
+
...(input.proposalMetadataExtra ?? {}),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// Step 4: upload proposal metadata (field names must match frontend exactly)
|
|
252
|
+
const proposalMeta = {
|
|
253
|
+
proposalName: input.title,
|
|
254
|
+
proposalDescription: JSON.stringify(markdownToSlate(input.description)),
|
|
255
|
+
...proposalExtra,
|
|
256
|
+
};
|
|
257
|
+
const proposalMetaRes = await pinata.pinJson(proposalMeta, { name: `proposal:${input.title.slice(0, 30)}` });
|
|
258
|
+
const descriptionURL = `ipfs://${proposalMetaRes.cid}`;
|
|
259
|
+
// Step 5: build tx payloads
|
|
260
|
+
const payloads = [];
|
|
261
|
+
const skippedSteps = [];
|
|
262
|
+
// Determine how much to deposit
|
|
263
|
+
const voteAmount = input.voteAmount ? BigInt(input.voteAmount) : prereqs.depositedPower + prereqs.walletBalance;
|
|
264
|
+
if (voteAmount === 0n) {
|
|
265
|
+
return err("No voting power available (wallet + deposited = 0). Deposit tokens first.");
|
|
266
|
+
}
|
|
267
|
+
const needDeposit = voteAmount > prereqs.depositedPower ? voteAmount - prereqs.depositedPower : 0n;
|
|
268
|
+
if (needDeposit > prereqs.walletBalance) {
|
|
269
|
+
return err(`Need to deposit ${needDeposit} but wallet only has ${prereqs.walletBalance}. Missing ${needDeposit - prereqs.walletBalance}.`);
|
|
270
|
+
}
|
|
271
|
+
// Approve (if needed)
|
|
272
|
+
if (needDeposit > 0n && prereqs.currentAllowance < needDeposit) {
|
|
273
|
+
payloads.push(makeTxPayload(prereqs.tokenAddress, ERC20_ABI, "approve", [prereqs.userKeeper, MaxUint256], chainId, `ERC20.approve(${prereqs.userKeeper}, MAX_UINT256)`));
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
skippedSteps.push({ label: "ERC20.approve", skipped: true, reason: "Allowance sufficient" });
|
|
277
|
+
}
|
|
278
|
+
// Build GovPool calls to batch via multicall
|
|
279
|
+
const govPoolCalls = [];
|
|
280
|
+
// Deposit (if needed)
|
|
281
|
+
if (needDeposit > 0n) {
|
|
282
|
+
govPoolCalls.push(GOV_POOL_ABI.encodeFunctionData("deposit", [needDeposit, []]));
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
skippedSteps.push({ label: "GovPool.deposit", skipped: true, reason: "Sufficient deposited power" });
|
|
286
|
+
}
|
|
287
|
+
// createProposalAndVote
|
|
288
|
+
const actionsForTuple = actionsOnFor.map(a => [a.executor, a.value, a.data]);
|
|
289
|
+
govPoolCalls.push(GOV_POOL_ABI.encodeFunctionData("createProposalAndVote", [
|
|
290
|
+
descriptionURL,
|
|
291
|
+
actionsForTuple,
|
|
292
|
+
[], // actionsOnAgainst
|
|
293
|
+
voteAmount,
|
|
294
|
+
input.voteNftIds.map(id => BigInt(id)),
|
|
295
|
+
]));
|
|
296
|
+
// Wrap in multicall if >1 call, otherwise single tx
|
|
297
|
+
if (govPoolCalls.length > 1) {
|
|
298
|
+
payloads.push({
|
|
299
|
+
to: govPool,
|
|
300
|
+
data: GOV_POOL_ABI.encodeFunctionData("multicall", [govPoolCalls]),
|
|
301
|
+
value: "0",
|
|
302
|
+
chainId,
|
|
303
|
+
description: `GovPool.multicall([deposit, createProposalAndVote])`,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
payloads.push({
|
|
308
|
+
to: govPool,
|
|
309
|
+
data: govPoolCalls[0],
|
|
310
|
+
value: "0",
|
|
311
|
+
chainId,
|
|
312
|
+
description: `GovPool.createProposalAndVote("${input.title}")`,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
// Step 6: send or return
|
|
316
|
+
const result = await sendOrCollect(signer, payloads);
|
|
317
|
+
return ok({
|
|
318
|
+
mode: result.mode,
|
|
319
|
+
descriptionURL,
|
|
320
|
+
proposalMetadataCID: proposalMetaRes.cid,
|
|
321
|
+
prereqs: {
|
|
322
|
+
walletBalance: prereqs.walletBalance.toString(),
|
|
323
|
+
depositedPower: prereqs.depositedPower.toString(),
|
|
324
|
+
allowance: prereqs.currentAllowance.toString(),
|
|
325
|
+
minVotesForCreating: prereqs.minVotesForCreating.toString(),
|
|
326
|
+
tokenAddress: prereqs.tokenAddress,
|
|
327
|
+
},
|
|
328
|
+
steps: [...skippedSteps, ...result.steps],
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
// =============================================
|
|
332
|
+
// dexe_proposal_vote_and_execute
|
|
333
|
+
// =============================================
|
|
334
|
+
server.tool("dexe_proposal_vote_and_execute", "Vote on a proposal and optionally execute it. " +
|
|
335
|
+
"Checks proposal state, deposits tokens if needed, votes, and when autoExecute is true " +
|
|
336
|
+
"attempts to execute after voting. When DEXE_PRIVATE_KEY is set, signs and broadcasts. " +
|
|
337
|
+
"Otherwise returns ordered TxPayload list.", {
|
|
338
|
+
govPool: z.string().describe("GovPool contract address"),
|
|
339
|
+
proposalId: z.number().int().min(1).describe("Proposal ID (1-indexed)"),
|
|
340
|
+
isVoteFor: z.boolean().default(true).describe("Vote for (true) or against (false)"),
|
|
341
|
+
voteAmount: z.string().optional().describe("Vote amount (18-dec wei). Defaults to all deposited power."),
|
|
342
|
+
voteNftIds: z.array(z.string()).default([]),
|
|
343
|
+
depositFirst: z.boolean().default(false).describe("Deposit wallet tokens before voting"),
|
|
344
|
+
autoExecute: z.boolean().default(true).describe("Attempt execute if proposal passes after vote"),
|
|
345
|
+
user: z.string().optional().describe("User address. Required when DEXE_PRIVATE_KEY not set."),
|
|
346
|
+
}, async (input) => {
|
|
347
|
+
const user = input.user ?? (signer.hasSigner() ? signer.getAddress() : undefined);
|
|
348
|
+
if (!user)
|
|
349
|
+
return err("Provide 'user' address or set DEXE_PRIVATE_KEY.");
|
|
350
|
+
const provider = rpc.requireProvider();
|
|
351
|
+
const chainId = ctx.config.chainId;
|
|
352
|
+
const govPool = input.govPool;
|
|
353
|
+
const proposalId = input.proposalId;
|
|
354
|
+
// Step 1: read proposal state
|
|
355
|
+
const stateCalls = [
|
|
356
|
+
{ target: govPool, iface: GOV_POOL_ABI, method: "getProposalState", args: [proposalId] },
|
|
357
|
+
];
|
|
358
|
+
const stateRes = await multicall(provider, stateCalls);
|
|
359
|
+
if (!stateRes[0].success)
|
|
360
|
+
return err(`Failed to read proposal state: ${stateRes[0].error}`);
|
|
361
|
+
const STATE_NAMES = ["Voting", "WaitingForVotingTransfer", "ValidatorVoting", "Defeated", "SucceededFor", "SucceededAgainst", "Locked", "ExecutedFor", "ExecutedAgainst", "Undefined"];
|
|
362
|
+
const stateNum = Number(stateRes[0].value);
|
|
363
|
+
const stateName = STATE_NAMES[stateNum] ?? `Unknown(${stateNum})`;
|
|
364
|
+
// Already succeeded — skip voting, go straight to execute
|
|
365
|
+
if ((stateNum === 4 || stateNum === 5) && input.autoExecute) {
|
|
366
|
+
const execResult = await sendOrCollect(signer, [
|
|
367
|
+
makeTxPayload(govPool, GOV_POOL_ABI, "execute", [proposalId], chainId, `GovPool.execute(${proposalId})`),
|
|
368
|
+
]);
|
|
369
|
+
return ok({
|
|
370
|
+
mode: execResult.mode,
|
|
371
|
+
proposalId,
|
|
372
|
+
proposalStateBefore: stateName,
|
|
373
|
+
steps: [
|
|
374
|
+
{ label: "GovPool.vote", skipped: true, reason: `Proposal already in "${stateName}" — no vote needed` },
|
|
375
|
+
...execResult.steps,
|
|
376
|
+
],
|
|
377
|
+
executed: true,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
if (stateNum !== 0) {
|
|
381
|
+
return err(`Proposal #${proposalId} is in state "${stateName}" — voting requires "Voting" state.`);
|
|
382
|
+
}
|
|
383
|
+
// Step 2: resolve prereqs for deposit check
|
|
384
|
+
let prereqs;
|
|
385
|
+
if (input.depositFirst) {
|
|
386
|
+
prereqs = await resolvePrereqs(rpc, govPool, user);
|
|
387
|
+
}
|
|
388
|
+
const payloads = [];
|
|
389
|
+
const skippedSteps = [];
|
|
390
|
+
// Step 3: optional deposit
|
|
391
|
+
if (input.depositFirst && prereqs && prereqs.walletBalance > 0n) {
|
|
392
|
+
// Approve if needed
|
|
393
|
+
if (prereqs.currentAllowance < prereqs.walletBalance) {
|
|
394
|
+
payloads.push(makeTxPayload(prereqs.tokenAddress, ERC20_ABI, "approve", [prereqs.userKeeper, MaxUint256], chainId, `ERC20.approve(${prereqs.userKeeper}, MAX_UINT256)`));
|
|
395
|
+
}
|
|
396
|
+
// Deposit
|
|
397
|
+
payloads.push(makeTxPayload(govPool, GOV_POOL_ABI, "deposit", [prereqs.walletBalance, []], chainId, `GovPool.deposit(${prereqs.walletBalance})`));
|
|
398
|
+
}
|
|
399
|
+
// Step 4: vote
|
|
400
|
+
const voteAmt = input.voteAmount
|
|
401
|
+
? BigInt(input.voteAmount)
|
|
402
|
+
: (prereqs ? prereqs.depositedPower + prereqs.walletBalance : 0n);
|
|
403
|
+
if (voteAmt === 0n) {
|
|
404
|
+
return err("No voting power available. Deposit tokens before voting.");
|
|
405
|
+
}
|
|
406
|
+
// Check minVotesForVoting threshold
|
|
407
|
+
if (!prereqs && !input.voteAmount) {
|
|
408
|
+
// Need prereqs to validate threshold — fetch them
|
|
409
|
+
prereqs = await resolvePrereqs(rpc, govPool, user);
|
|
410
|
+
}
|
|
411
|
+
if (prereqs && prereqs.minVotesForVoting > 0n && voteAmt < prereqs.minVotesForVoting) {
|
|
412
|
+
return err(`Insufficient voting power. Need ${prereqs.minVotesForVoting} but voting with ${voteAmt}.`);
|
|
413
|
+
}
|
|
414
|
+
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})`));
|
|
415
|
+
// Step 5: send or collect
|
|
416
|
+
const result = await sendOrCollect(signer, payloads);
|
|
417
|
+
// Step 6: auto-execute (only in executed mode)
|
|
418
|
+
let executed = false;
|
|
419
|
+
if (input.autoExecute && result.mode === "executed") {
|
|
420
|
+
// Re-read state after vote
|
|
421
|
+
const postRes = await multicall(provider, [
|
|
422
|
+
{ target: govPool, iface: GOV_POOL_ABI, method: "getProposalState", args: [proposalId] },
|
|
423
|
+
]);
|
|
424
|
+
const postState = Number(postRes[0].value);
|
|
425
|
+
const postStateName = STATE_NAMES[postState] ?? `Unknown(${postState})`;
|
|
426
|
+
if (postState === 4 || postState === 5) {
|
|
427
|
+
// SucceededFor or SucceededAgainst — execute
|
|
428
|
+
const execResult = await sendOrCollect(signer, [
|
|
429
|
+
makeTxPayload(govPool, GOV_POOL_ABI, "execute", [proposalId], chainId, `GovPool.execute(${proposalId})`),
|
|
430
|
+
]);
|
|
431
|
+
result.steps.push(...execResult.steps);
|
|
432
|
+
executed = true;
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
skippedSteps.push({
|
|
436
|
+
label: "GovPool.execute",
|
|
437
|
+
skipped: true,
|
|
438
|
+
reason: `Proposal in state "${postStateName}" after vote — not ready for execution`,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return ok({
|
|
443
|
+
mode: result.mode,
|
|
444
|
+
proposalId,
|
|
445
|
+
proposalStateBefore: stateName,
|
|
446
|
+
steps: [...skippedSteps, ...result.steps],
|
|
447
|
+
executed,
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/tools/flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAI/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAa,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,sCAAsC;AAEtC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;IAC9B,oDAAoD;IACpD,2EAA2E;IAC3E,kEAAkE;CACnE,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC;IACjC,gJAAgJ;IAChJ,4OAA4O;IAC5O,2LAA2L;IAC3L,6FAA6F;IAC7F,sCAAsC;IACtC,oDAAoD;IACpD,4DAA4D;IAC5D,uDAAuD;IACvD,oEAAoE;CACrE,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC;IACpC,gDAAgD;IAChD,2GAA2G;CAC5G,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC;IACjC,sbAAsb;CACvb,CAAC,CAAC;AAuBH,gCAAgC;AAEhC,SAAS,GAAG,CAAC,OAAe;IAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,EAAE,CAAC,IAA6B;IACvC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC;KACpF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EAAU,EAAE,CAAU;IAC5C,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,EAAU,EAAE,KAAgB,EAAE,MAAc,EAAE,IAAe,EAAE,OAAe,EAAE,WAAmB,EAAE,KAAc;IACxI,OAAO;QACL,EAAE;QACF,IAAI,EAAE,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5C,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC/B,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAgB,EAChB,OAAe,EACf,IAAY;IAEZ,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IAEvC,gCAAgC;IAChC,MAAM,MAAM,GAAW;QACrB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,EAAE;KACjF,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,KAAiD,CAAC;IAC3E,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC;IAEvC,oCAAoC;IACpC,MAAM,MAAM,GAAW;QACrB,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE;QAChF,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,EAAE;QACjF;YACE,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,cAAc;YACtB,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACf,YAAY,EAAE,IAAI;SACnB;KACF,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAE5E,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,KAAe,CAAC;IAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,KAGhC,CAAC;IAEF,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,KAAyB,CAAC;QACnE,cAAc,GAAG,OAAO,GAAG,YAAY,CAAC;IAC1C,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAW;QACrB,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE;QAC7E,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;KAC1F,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE/C,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAE,CAAC,KAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAE,CAAC,KAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5E,OAAO;QACL,UAAU;QACV,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,gBAAgB;QAChB,cAAc;QACd,mBAAmB,EAAE,eAAe,CAAC,mBAAmB;QACxD,iBAAiB,EAAE,eAAe,CAAC,iBAAiB;KACrD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAqB,EACrB,QAAqB;IAErB,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;YACtC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;SAC3B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,CAAC,CAAC,WAAW;YACpB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,IAAI;SACjC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,iCAAiC;AAEjC,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,GAAgB,EAChB,MAAqB;IAErB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAExC,gDAAgD;IAChD,uBAAuB;IACvB,gDAAgD;IAChD,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,gEAAgE;QAC9D,8EAA8E;QAC9E,8EAA8E;QAC9E,qFAAqF;QACrF,iEAAiE;QACjE,oEAAoE;QACpE,mGAAmG;QACnG,yGAAyG;QACzG,8EAA8E,EAChF;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACxD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QAEzF,4BAA4B;QAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACnF,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACjF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAChE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QAChG,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACvF,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAErE,gBAAgB;QAChB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;YACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;YAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACjB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iGAAiG,CAAC;QAC3I,qBAAqB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mGAAmG,CAAC;QAErK,SAAS;QACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;QAC7G,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAE3C,WAAW;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;KAC9F,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,GAAG,CAAC,wEAAwE,CAAC,CAAC;QAEhH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE9B,gCAAgC;QAChC,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,oCAAoC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,mCAAmC;QACnC,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;QACtE,IAAI,OAAO,CAAC,mBAAmB,GAAG,EAAE,IAAI,cAAc,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACrF,OAAO,GAAG,CACR,mDAAmD,OAAO,CAAC,mBAAmB,aAAa,cAAc,aAAa,OAAO,CAAC,aAAa,gBAAgB,OAAO,CAAC,cAAc,IAAI,CACtL,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,IAAI,YAAsE,CAAC;QAC3E,IAAI,aAAsC,CAAC;QAE3C,IAAI,KAAK,CAAC,YAAY,KAAK,oBAAoB,EAAE,CAAC;YAChD,0BAA0B;YAC1B,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACtF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAE9F,MAAM,OAAO,GAA4B;gBACvC,OAAO,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;gBAC/B,UAAU,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE;gBACrC,WAAW,EAAE,UAAU,OAAO,CAAC,GAAG,EAAE;gBACpC,WAAW,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE;gBACvC,SAAS,EAAE,EAAE;aACd,CAAC;YACF,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvB,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC;gBACvC,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,iBAAiB,IAAI,QAAQ,CAAC;gBAC7D,OAAO,CAAC,SAAS,GAAG,WAAW,KAAK,CAAC,YAAY,sBAAsB,OAAO,CAAC,cAAc,EAAE,CAAC;YAClG,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/F,MAAM,iBAAiB,GAAG,UAAU,UAAU,CAAC,GAAG,EAAE,CAAC;YAErD,mDAAmD;YACnD,IAAI,qBAAqB,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;gBACvC,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBACrF,MAAM,KAAK,GAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAClG,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC,OAAO;oBAAE,qBAAqB,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,KAAe,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAE7B,YAAY,GAAG,CAAC;oBACd,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,EAAE;oBACT,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,CAAC,iBAAiB,CAAC,CAAC;iBACjF,CAAC,CAAC;YAEH,aAAa,GAAG;gBACd,QAAQ,EAAE,wBAAwB;gBAClC,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,eAAe,EAAE,EAAE,cAAc,EAAE,iBAAiB,EAAE;oBACtD,cAAc,EAAE,EAAE,cAAc,EAAE,qBAAqB,EAAE;iBAC1D;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,SAAS;YACT,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1C,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC,CAAC;YACJ,aAAa,GAAG;gBACd,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,MAAM,EAAE,KAAK;gBACb,GAAG,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC;aACvC,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,MAAM,YAAY,GAAG;YACnB,YAAY,EAAE,KAAK,CAAC,KAAK;YACzB,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACvE,GAAG,aAAa;SACjB,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,YAAY,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7G,MAAM,cAAc,GAAG,UAAU,eAAe,CAAC,GAAG,EAAE,CAAC;QAEvD,4BAA4B;QAC5B,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,MAAM,YAAY,GAAe,EAAE,CAAC;QAEpC,gCAAgC;QAChC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;QAChH,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,2EAA2E,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnG,IAAI,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,OAAO,GAAG,CACR,mBAAmB,WAAW,wBAAwB,OAAO,CAAC,aAAa,aAAa,WAAW,GAAG,OAAO,CAAC,aAAa,GAAG,CAC/H,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,WAAW,GAAG,EAAE,IAAI,OAAO,CAAC,gBAAgB,GAAG,WAAW,EAAE,CAAC;YAC/D,QAAQ,CAAC,IAAI,CAAC,aAAa,CACzB,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAC1C,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,OAAO,EACzC,iBAAiB,OAAO,CAAC,UAAU,gBAAgB,CACpD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,6CAA6C;QAC7C,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,sBAAsB;QACtB,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CACf,YAAY,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAC9D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACvG,CAAC;QAED,wBAAwB;QACxB,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7E,YAAY,CAAC,IAAI,CACf,YAAY,CAAC,kBAAkB,CAAC,uBAAuB,EAAE;YACvD,cAAc;YACd,eAAe;YACf,EAAE,EAAE,mBAAmB;YACvB,UAAU;YACV,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACvC,CAAC,CACH,CAAC;QAEF,oDAAoD;QACpD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC;gBAClE,KAAK,EAAE,GAAG;gBACV,OAAO;gBACP,WAAW,EAAE,qDAAqD;aACnE,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,YAAY,CAAC,CAAC,CAAE;gBACtB,KAAK,EAAE,GAAG;gBACV,OAAO;gBACP,WAAW,EAAE,kCAAkC,KAAK,CAAC,KAAK,IAAI;aAC/D,CAAC,CAAC;QACL,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAErD,OAAO,EAAE,CAAC;YACR,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,cAAc;YACd,mBAAmB,EAAE,eAAe,CAAC,GAAG;YACxC,OAAO,EAAE;gBACP,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC/C,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE;gBACjD,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE;gBAC9C,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE;gBAC3D,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC;YACD,KAAK,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,gDAAgD;IAChD,iCAAiC;IACjC,gDAAgD;IAChD,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,gDAAgD;QAC9C,wFAAwF;QACxF,wFAAwF;QACxF,2CAA2C,EAC7C;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACvE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACnF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACxG,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QACxF,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAChG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;KAC9F,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QAEpC,8BAA8B;QAC9B,MAAM,UAAU,GAAW;YACzB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE;SACzF,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO;YAAE,OAAO,GAAG,CAAC,kCAAkC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9F,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;QACvL,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,CAAC;QAElE,0DAA0D;QAC1D,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;gBAC7C,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,mBAAmB,UAAU,GAAG,CAAC;aACzG,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,UAAU;gBACV,mBAAmB,EAAE,SAAS;gBAC9B,KAAK,EAAE;oBACL,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,SAAS,oBAAoB,EAAE;oBACvG,GAAG,UAAU,CAAC,KAAK;iBACpB;gBACD,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,aAAa,UAAU,iBAAiB,SAAS,qCAAqC,CAAC,CAAC;QACrG,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAA4B,CAAC;QACjC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,MAAM,YAAY,GAAe,EAAE,CAAC;QAEpC,2BAA2B;QAC3B,IAAI,KAAK,CAAC,YAAY,IAAI,OAAO,IAAI,OAAO,CAAC,aAAa,GAAG,EAAE,EAAE,CAAC;YAChE,oBAAoB;YACpB,IAAI,OAAO,CAAC,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,aAAa,CACzB,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAC1C,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,OAAO,EACzC,iBAAiB,OAAO,CAAC,UAAU,gBAAgB,CACpD,CAAC,CAAC;YACL,CAAC;YACD,UAAU;YACV,QAAQ,CAAC,IAAI,CAAC,aAAa,CACzB,OAAO,EAAE,YAAY,EAAE,SAAS,EAChC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,OAAO,EACpC,mBAAmB,OAAO,CAAC,aAAa,GAAG,CAC5C,CAAC,CAAC;QACL,CAAC;QAED,eAAe;QACf,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU;YAC9B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;YAC1B,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEpE,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACzE,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAClC,kDAAkD;YAClD,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,GAAG,EAAE,IAAI,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACrF,OAAO,GAAG,CACR,mCAAmC,OAAO,CAAC,iBAAiB,oBAAoB,OAAO,GAAG,CAC3F,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,aAAa,CACzB,OAAO,EAAE,YAAY,EAAE,MAAM,EAC7B,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAC9E,OAAO,EACP,gBAAgB,UAAU,KAAK,KAAK,CAAC,SAAS,KAAK,OAAO,GAAG,CAC9D,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAErD,+CAA+C;QAC/C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACpD,2BAA2B;YAC3B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;gBACxC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE;aACzF,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,WAAW,SAAS,GAAG,CAAC;YAExE,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACvC,6CAA6C;gBAC7C,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;oBAC7C,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,mBAAmB,UAAU,GAAG,CAAC;iBACzG,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;gBACvC,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,sBAAsB,aAAa,wCAAwC;iBACpF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC;YACR,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU;YACV,mBAAmB,EAAE,SAAS;YAC9B,KAAK,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;YACzC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -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;
|
|
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;AAyB/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA0BvE"}
|
package/dist/tools/index.js
CHANGED
|
@@ -4,6 +4,22 @@ import { SelectorIndex } from "../lib/selectors.js";
|
|
|
4
4
|
import { registerBuildTools } from "./build.js";
|
|
5
5
|
import { registerIntrospectTools } from "./introspect.js";
|
|
6
6
|
import { registerGovTools } from "./gov.js";
|
|
7
|
+
import { registerDaoTools } from "./dao.js";
|
|
8
|
+
import { registerProposalTools } from "./proposal.js";
|
|
9
|
+
import { registerVoteTools } from "./vote.js";
|
|
10
|
+
import { registerReadTools } from "./read.js";
|
|
11
|
+
import { registerIpfsTools } from "./ipfs.js";
|
|
12
|
+
import { registerProposalBuildTools } from "./proposalBuild.js";
|
|
13
|
+
import { registerProposalBuildMoreTools } from "./proposalBuildMore.js";
|
|
14
|
+
import { registerProposalBuildComplexTools } from "./proposalBuildComplex.js";
|
|
15
|
+
import { registerProposalBuildOffchainTools } from "./proposalBuildOffchain.js";
|
|
16
|
+
import { registerProposalBuildInternalTools } from "./proposalBuildInternal.js";
|
|
17
|
+
import { registerVoteBuildTools } from "./voteBuild.js";
|
|
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 { SignerManager } from "../lib/signer.js";
|
|
7
23
|
/**
|
|
8
24
|
* Wire every dexe-mcp tool onto the given server instance. Builds the shared
|
|
9
25
|
* ToolContext (artifacts cache, hardhat runner, selector index) once so all
|
|
@@ -17,5 +33,21 @@ export function registerAll(server, config) {
|
|
|
17
33
|
registerBuildTools(server, ctx);
|
|
18
34
|
registerIntrospectTools(server, ctx);
|
|
19
35
|
registerGovTools(server, ctx);
|
|
36
|
+
registerDaoTools(server, ctx);
|
|
37
|
+
registerProposalTools(server, ctx);
|
|
38
|
+
registerVoteTools(server, ctx);
|
|
39
|
+
registerReadTools(server, ctx);
|
|
40
|
+
registerIpfsTools(server, ctx);
|
|
41
|
+
registerProposalBuildTools(server, ctx);
|
|
42
|
+
registerProposalBuildMoreTools(server, ctx);
|
|
43
|
+
registerProposalBuildComplexTools(server, ctx);
|
|
44
|
+
registerProposalBuildOffchainTools(server, ctx);
|
|
45
|
+
registerProposalBuildInternalTools(server, ctx);
|
|
46
|
+
registerVoteBuildTools(server, ctx);
|
|
47
|
+
registerDaoDeployTools(server, ctx);
|
|
48
|
+
registerSubgraphTools(server, ctx);
|
|
49
|
+
const signer = new SignerManager(config);
|
|
50
|
+
registerTxTools(server, config, signer);
|
|
51
|
+
registerFlowTools(server, ctx, signer);
|
|
20
52
|
}
|
|
21
53
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ToolContext } from "./context.js";
|
|
3
|
+
import { cidForBytes } from "../lib/ipfs.js";
|
|
4
|
+
export declare function registerIpfsTools(server: McpServer, ctx: ToolContext): void;
|
|
5
|
+
export { cidForBytes };
|
|
6
|
+
//# sourceMappingURL=ipfs.d.ts.map
|
|
@@ -0,0 +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;AAGxB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAS3E;AAuaD,OAAO,EAAE,WAAW,EAAE,CAAC"}
|