dexe-mcp 0.1.3 → 0.2.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 +48 -0
- package/FUTURE.md +26 -5
- package/README.md +80 -195
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +10 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -1
- package/dist/config.js.map +1 -1
- package/dist/hardhat.d.ts.map +1 -1
- package/dist/hardhat.js +10 -5
- package/dist/hardhat.js.map +1 -1
- package/dist/index.js +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 +167 -0
- package/dist/lib/ipfs.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/subgraph.d.ts +15 -0
- package/dist/lib/subgraph.d.ts.map +1 -0
- package/dist/lib/subgraph.js +37 -0
- package/dist/lib/subgraph.js.map +1 -0
- package/dist/runtime.d.ts +51 -13
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +149 -26
- package/dist/runtime.js.map +1 -1
- 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 +323 -0
- package/dist/tools/daoDeploy.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +24 -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 +310 -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 +199 -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 +357 -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 +700 -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 +211 -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 +436 -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 +386 -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 +353 -0
- package/dist/tools/read.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 +563 -0
- package/dist/tools/voteBuild.js.map +1 -0
- package/package.json +9 -4
- package/PLAN.md +0 -132
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Contract } from "ethers";
|
|
2
|
+
/**
|
|
3
|
+
* Multicall3 — deployed at the same address on ~every EVM chain.
|
|
4
|
+
* https://www.multicall3.com
|
|
5
|
+
*/
|
|
6
|
+
export const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
7
|
+
const MULTICALL3_ABI = [
|
|
8
|
+
"function aggregate3((address target, bool allowFailure, bytes callData)[] calls) payable returns ((bool success, bytes returnData)[] returnData)",
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* Batch `calls` into a single Multicall3 aggregate3 RPC round-trip. Each call
|
|
12
|
+
* is decoded via its own `iface`. Failed calls with `allowFailure: true`
|
|
13
|
+
* yield `{ success: false, value: null }` instead of throwing.
|
|
14
|
+
*/
|
|
15
|
+
export async function multicall(provider, calls) {
|
|
16
|
+
if (calls.length === 0)
|
|
17
|
+
return [];
|
|
18
|
+
const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
|
|
19
|
+
const payload = calls.map((c) => ({
|
|
20
|
+
target: c.target,
|
|
21
|
+
allowFailure: c.allowFailure ?? false,
|
|
22
|
+
callData: c.iface.encodeFunctionData(c.method, c.args),
|
|
23
|
+
}));
|
|
24
|
+
const results = await mc.getFunction("aggregate3").staticCall(payload);
|
|
25
|
+
return results.map((r, i) => {
|
|
26
|
+
const c = calls[i];
|
|
27
|
+
if (!r.success) {
|
|
28
|
+
return { success: false, value: null, raw: r.returnData, error: "call reverted" };
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const decoded = c.iface.decodeFunctionResult(c.method, r.returnData);
|
|
32
|
+
// Unwrap single-return-value tuples for ergonomic use.
|
|
33
|
+
const value = decoded.length === 1 ? decoded[0] : decoded;
|
|
34
|
+
return { success: true, value, raw: r.returnData };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
value: null,
|
|
40
|
+
raw: r.returnData,
|
|
41
|
+
error: err instanceof Error ? err.message : String(err),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=multicall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../src/lib/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA8B,MAAM,QAAQ,CAAC;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAE/E,MAAM,cAAc,GAAG;IACrB,kJAAkJ;CAC1I,CAAC;AAwBX;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAyB,EACzB,KAAa;IAEb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,kBAAkB,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,KAAK;QACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;KACvD,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GACX,MAAM,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACpF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YACrE,uDAAuD;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,CAAC,CAAC,UAAU;gBACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static catalog of every proposal type the DeXe frontend exposes. Derived
|
|
3
|
+
* from a full audit of `C:/dev/investing-dashboard` forms + hooks
|
|
4
|
+
* (2026-04-15). Consumed by `dexe_proposal_catalog` so agents can discover
|
|
5
|
+
* which builder tool to call for a given user intent.
|
|
6
|
+
*
|
|
7
|
+
* `mcpTool` is the name of the dedicated MCP builder tool (when one exists)
|
|
8
|
+
* or `null` if agents must compose via primitives (`build_external` +
|
|
9
|
+
* `build_custom_abi`) — flip `implemented` to `true` as each ships.
|
|
10
|
+
*/
|
|
11
|
+
export type ProposalCategory = "external" | "internal" | "offchain";
|
|
12
|
+
export interface ProposalTypeEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
category: ProposalCategory;
|
|
15
|
+
name: string;
|
|
16
|
+
formPath: string;
|
|
17
|
+
/** High-level description of the on-chain effect or off-chain action. */
|
|
18
|
+
effect: string;
|
|
19
|
+
/** Target contract (on-chain) or backend endpoint (off-chain). */
|
|
20
|
+
target: string;
|
|
21
|
+
/** Does this type require an IPFS metadata upload? */
|
|
22
|
+
needsIpfs: boolean;
|
|
23
|
+
/** Gating tags: "expert", "validator", "babt", "dao-admin". */
|
|
24
|
+
gating: string[];
|
|
25
|
+
/** Dedicated MCP builder tool name, or null. */
|
|
26
|
+
mcpTool: string | null;
|
|
27
|
+
/** Shipped? */
|
|
28
|
+
implemented: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare const PROPOSAL_CATALOG: ProposalTypeEntry[];
|
|
31
|
+
/** Metadata JSON shape used by the frontend for every external proposal. */
|
|
32
|
+
export declare const EXTERNAL_METADATA_SHAPE: {
|
|
33
|
+
readonly proposalName: "string (required)";
|
|
34
|
+
readonly proposalDescription: "string (required, markdown/slate)";
|
|
35
|
+
readonly category: "string (e.g. 'Token Transfer', 'Manage Validators')";
|
|
36
|
+
readonly isMeta: "boolean (default false)";
|
|
37
|
+
readonly changes: "object (type-specific structured payload for indexing, optional)";
|
|
38
|
+
};
|
|
39
|
+
export declare const INTERNAL_METADATA_SHAPE: {
|
|
40
|
+
readonly proposalName: "string (required)";
|
|
41
|
+
readonly proposalDescription: "string";
|
|
42
|
+
readonly category: "string (ValidatorBalances | ValidatorSettings | MonthlyWithdraw | Offchain)";
|
|
43
|
+
readonly changes: "object (type-specific)";
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=proposalCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposalCatalog.d.ts","sourceRoot":"","sources":["../../src/lib/proposalCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAkZ/C,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;;;;CAM1B,CAAC;AAEX,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
export const PROPOSAL_CATALOG = [
|
|
2
|
+
// ---------- External (on-chain, call GovPool.createProposal, needs IPFS) ----------
|
|
3
|
+
{
|
|
4
|
+
id: "external.modify_dao_profile",
|
|
5
|
+
category: "external",
|
|
6
|
+
name: "Modify DAO Profile",
|
|
7
|
+
formPath: "src/forms/createProposal/external/ModifyDaoProfileForm",
|
|
8
|
+
effect: "Update DAO descriptionURL pointer",
|
|
9
|
+
target: "GovPool.editDescriptionURL(string)",
|
|
10
|
+
needsIpfs: true,
|
|
11
|
+
gating: [],
|
|
12
|
+
mcpTool: "dexe_proposal_build_modify_dao_profile",
|
|
13
|
+
implemented: true,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "external.change_voting_settings",
|
|
17
|
+
category: "external",
|
|
18
|
+
name: "Change Voting Settings",
|
|
19
|
+
formPath: "src/forms/createProposal/external/ChangeVotingSettingsForm",
|
|
20
|
+
effect: "Add or edit ProposalSettings on GovSettings (quorum, duration, etc.)",
|
|
21
|
+
target: "GovSettings.addSettings / editSettings (encoded as actionsOnFor)",
|
|
22
|
+
needsIpfs: true,
|
|
23
|
+
gating: [],
|
|
24
|
+
mcpTool: "dexe_proposal_build_change_voting_settings",
|
|
25
|
+
implemented: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "external.token_distribution",
|
|
29
|
+
category: "external",
|
|
30
|
+
name: "Token Distribution",
|
|
31
|
+
formPath: "src/forms/createProposal/external/TokenDistributionForm",
|
|
32
|
+
effect: "Distribute tokens via DistributionProposal.execute(proposalId, token, amount)",
|
|
33
|
+
target: "DistributionProposal.execute(uint256,address,uint256)",
|
|
34
|
+
needsIpfs: true,
|
|
35
|
+
gating: [],
|
|
36
|
+
mcpTool: "dexe_proposal_build_token_distribution",
|
|
37
|
+
implemented: true,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: "external.token_sale",
|
|
41
|
+
category: "external",
|
|
42
|
+
name: "Token Sale (create tier)",
|
|
43
|
+
formPath: "src/forms/createProposal/external/TokenSaleForm",
|
|
44
|
+
effect: "Launch a new token sale tier",
|
|
45
|
+
target: "TokenSaleProposal.createTiers(ITier[])",
|
|
46
|
+
needsIpfs: true,
|
|
47
|
+
gating: [],
|
|
48
|
+
mcpTool: "dexe_proposal_build_token_sale",
|
|
49
|
+
implemented: true,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "external.token_transfer",
|
|
53
|
+
category: "external",
|
|
54
|
+
name: "Token Transfer (treasury → address)",
|
|
55
|
+
formPath: "src/forms/createProposal/external/TokenTransferForm",
|
|
56
|
+
effect: "Transfer ERC20 from DAO treasury to a single recipient",
|
|
57
|
+
target: "ERC20.transfer (as actionsOnFor on the token contract)",
|
|
58
|
+
needsIpfs: true,
|
|
59
|
+
gating: [],
|
|
60
|
+
mcpTool: "dexe_proposal_build_token_transfer",
|
|
61
|
+
implemented: true,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "external.token_sale_recover",
|
|
65
|
+
category: "external",
|
|
66
|
+
name: "Recover Token Sale",
|
|
67
|
+
formPath: "src/forms/createProposal/external/TokenSaleRecoverForm",
|
|
68
|
+
effect: "Recover unsold tokens from tiers",
|
|
69
|
+
target: "TokenSaleProposal.recover(uint256[] tierIds)",
|
|
70
|
+
needsIpfs: true,
|
|
71
|
+
gating: [],
|
|
72
|
+
mcpTool: "dexe_proposal_build_token_sale_recover",
|
|
73
|
+
implemented: true,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: "external.withdraw_treasury",
|
|
77
|
+
category: "external",
|
|
78
|
+
name: "Withdraw from Treasury",
|
|
79
|
+
formPath: "src/forms/createProposal/external/WithdrawForm",
|
|
80
|
+
effect: "Withdraw native or ERC20 from DAO treasury",
|
|
81
|
+
target: "GovPool.withdraw(receiver, amount, nftIds) — treasury lives on GovPool itself",
|
|
82
|
+
needsIpfs: true,
|
|
83
|
+
gating: [],
|
|
84
|
+
mcpTool: "dexe_proposal_build_withdraw_treasury",
|
|
85
|
+
implemented: true,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "external.manage_validators",
|
|
89
|
+
category: "external",
|
|
90
|
+
name: "Manage Validators (add/remove/balance)",
|
|
91
|
+
formPath: "src/forms/createProposal/external/ManageValidatorsForm",
|
|
92
|
+
effect: "Direct call to GovValidators.changeBalances(balances, users). Set balance=0 to remove.",
|
|
93
|
+
target: "GovValidators.changeBalances(uint256[], address[])",
|
|
94
|
+
needsIpfs: true,
|
|
95
|
+
gating: [],
|
|
96
|
+
mcpTool: "dexe_proposal_build_manage_validators",
|
|
97
|
+
implemented: true,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: "external.delegate_tokens_to_expert",
|
|
101
|
+
category: "external",
|
|
102
|
+
name: "Delegate Tokens to Expert",
|
|
103
|
+
formPath: "src/forms/createProposal/external/DelegateOrRevokeTokensForm",
|
|
104
|
+
effect: "Delegate DAO treasury tokens/NFTs to an expert address",
|
|
105
|
+
target: "GovPool.delegateTreasury(delegatee, amount, nftIds)",
|
|
106
|
+
needsIpfs: true,
|
|
107
|
+
gating: ["expert"],
|
|
108
|
+
mcpTool: "dexe_proposal_build_delegate_to_expert",
|
|
109
|
+
implemented: true,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "external.revoke_tokens_from_expert",
|
|
113
|
+
category: "external",
|
|
114
|
+
name: "Revoke Tokens from Expert",
|
|
115
|
+
formPath: "src/forms/createProposal/external/DelegateOrRevokeTokensForm",
|
|
116
|
+
effect: "Undelegate treasury tokens/NFTs from an expert",
|
|
117
|
+
target: "GovPool.undelegateTreasury(delegatee, amount, nftIds)",
|
|
118
|
+
needsIpfs: true,
|
|
119
|
+
gating: ["expert"],
|
|
120
|
+
mcpTool: "dexe_proposal_build_revoke_from_expert",
|
|
121
|
+
implemented: true,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "external.validators_allocation",
|
|
125
|
+
category: "external",
|
|
126
|
+
name: "Validators Allocation",
|
|
127
|
+
formPath: "src/forms/createProposal/external/ValidatorsAllocationForm",
|
|
128
|
+
effect: "Reallocate validator stake weights (use manage_validators wrapper)",
|
|
129
|
+
target: "GovValidators.changeBalances",
|
|
130
|
+
needsIpfs: true,
|
|
131
|
+
gating: ["validator"],
|
|
132
|
+
mcpTool: "dexe_proposal_build_manage_validators",
|
|
133
|
+
implemented: true,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: "external.add_local_expert",
|
|
137
|
+
category: "external",
|
|
138
|
+
name: "Add Local Expert",
|
|
139
|
+
formPath: "src/forms/createProposal/external/ExpertApplicationForm",
|
|
140
|
+
effect: "Grant local-expert role to an address (mint ExpertNft)",
|
|
141
|
+
target: "ExpertNft.mint(address, uri) — scope='local'",
|
|
142
|
+
needsIpfs: true,
|
|
143
|
+
gating: ["expert"],
|
|
144
|
+
mcpTool: "dexe_proposal_build_add_expert",
|
|
145
|
+
implemented: true,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "external.add_global_expert",
|
|
149
|
+
category: "external",
|
|
150
|
+
name: "Add Global Expert",
|
|
151
|
+
formPath: "src/forms/createProposal/external/ExpertApplicationForm",
|
|
152
|
+
effect: "Grant global-expert role (DeXe-wide)",
|
|
153
|
+
target: "DeXeExpertNft.mint(address, uri) — scope='global'",
|
|
154
|
+
needsIpfs: true,
|
|
155
|
+
gating: ["expert"],
|
|
156
|
+
mcpTool: "dexe_proposal_build_add_expert",
|
|
157
|
+
implemented: true,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: "external.remove_local_expert",
|
|
161
|
+
category: "external",
|
|
162
|
+
name: "Remove Local Expert",
|
|
163
|
+
formPath: "src/forms/createProposal/external/ExpertRemovalForm",
|
|
164
|
+
effect: "Revoke local-expert role (burn ExpertNft)",
|
|
165
|
+
target: "ExpertNft.burn(address) — scope='local'",
|
|
166
|
+
needsIpfs: true,
|
|
167
|
+
gating: ["expert"],
|
|
168
|
+
mcpTool: "dexe_proposal_build_remove_expert",
|
|
169
|
+
implemented: true,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: "external.remove_global_expert",
|
|
173
|
+
category: "external",
|
|
174
|
+
name: "Remove Global Expert",
|
|
175
|
+
formPath: "src/forms/createProposal/external/ExpertRemovalForm",
|
|
176
|
+
effect: "Revoke global-expert role (burn DeXeExpertNft)",
|
|
177
|
+
target: "DeXeExpertNft.burn(address) — scope='global'",
|
|
178
|
+
needsIpfs: true,
|
|
179
|
+
gating: ["expert"],
|
|
180
|
+
mcpTool: "dexe_proposal_build_remove_expert",
|
|
181
|
+
implemented: true,
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
id: "external.reward_multiplier",
|
|
185
|
+
category: "external",
|
|
186
|
+
name: "Reward Multiplier (set address / set URI / mint)",
|
|
187
|
+
formPath: "src/forms/createProposal/external/RewardMultiplierForm",
|
|
188
|
+
effect: "Manage reward-multiplier NFT (3 modes)",
|
|
189
|
+
target: "GovPool.setNftMultiplierAddress / ERC721Multiplier.setURI / .mint",
|
|
190
|
+
needsIpfs: true,
|
|
191
|
+
gating: ["expert"],
|
|
192
|
+
mcpTool: "dexe_proposal_build_reward_multiplier",
|
|
193
|
+
implemented: true,
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: "external.apply_to_dao",
|
|
197
|
+
category: "external",
|
|
198
|
+
name: "Apply to DAO",
|
|
199
|
+
formPath: "src/forms/createProposal/external/ApplyToDaoForm",
|
|
200
|
+
effect: "Grant tokens from DAO treasury (transfer + optional mint for shortfall)",
|
|
201
|
+
target: "ERC20.transfer [+ ERC20Gov.mint if needed]",
|
|
202
|
+
needsIpfs: true,
|
|
203
|
+
gating: [],
|
|
204
|
+
mcpTool: "dexe_proposal_build_apply_to_dao",
|
|
205
|
+
implemented: true,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: "external.blacklist",
|
|
209
|
+
category: "external",
|
|
210
|
+
name: "Blacklist Management",
|
|
211
|
+
formPath: "src/forms/createProposal/external/BlacklistManagementForm",
|
|
212
|
+
effect: "Add/remove addresses from ERC20Gov blacklist (1-2 actions)",
|
|
213
|
+
target: "ERC20Gov.blacklist(address[], bool)",
|
|
214
|
+
needsIpfs: true,
|
|
215
|
+
gating: [],
|
|
216
|
+
mcpTool: "dexe_proposal_build_blacklist",
|
|
217
|
+
implemented: true,
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
id: "external.custom_abi",
|
|
221
|
+
category: "external",
|
|
222
|
+
name: "Arbitrary Contract Call (ABI)",
|
|
223
|
+
formPath: "src/forms/createProposal/external/AbiForm",
|
|
224
|
+
effect: "User supplies target + method + args; we ABI-encode",
|
|
225
|
+
target: "Any contract (user-specified)",
|
|
226
|
+
needsIpfs: true,
|
|
227
|
+
gating: [],
|
|
228
|
+
mcpTool: "dexe_proposal_build_custom_abi",
|
|
229
|
+
implemented: true,
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: "external.manual_calldata",
|
|
233
|
+
category: "external",
|
|
234
|
+
name: "Manual Calldata Entry",
|
|
235
|
+
formPath: "src/forms/createProposal/external/ManualForm",
|
|
236
|
+
effect: "Raw {target, callData, value}[] — no encoding",
|
|
237
|
+
target: "Any",
|
|
238
|
+
needsIpfs: true,
|
|
239
|
+
gating: [],
|
|
240
|
+
mcpTool: "dexe_proposal_build_external",
|
|
241
|
+
implemented: true,
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: "external.new_proposal_type",
|
|
245
|
+
category: "external",
|
|
246
|
+
name: "Create Custom Proposal Type (settings template)",
|
|
247
|
+
formPath: "src/forms/createProposal/external/NewProposalTypeForm",
|
|
248
|
+
effect: "Register new ProposalSettings + executor binding (2 actions)",
|
|
249
|
+
target: "GovSettings.addSettings + GovSettings.changeExecutors",
|
|
250
|
+
needsIpfs: true,
|
|
251
|
+
gating: [],
|
|
252
|
+
mcpTool: "dexe_proposal_build_new_proposal_type",
|
|
253
|
+
implemented: true,
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
id: "external.change_math_model",
|
|
257
|
+
category: "external",
|
|
258
|
+
name: "Change Proposal Math Model",
|
|
259
|
+
formPath: "src/forms/createProposal/external/ChangeMathModelForm",
|
|
260
|
+
effect: "Swap voting-power math contract (linear / polynomial / custom)",
|
|
261
|
+
target: "GovPool.changeVotePower(address)",
|
|
262
|
+
needsIpfs: true,
|
|
263
|
+
gating: [],
|
|
264
|
+
mcpTool: "dexe_proposal_build_change_math_model",
|
|
265
|
+
implemented: true,
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
id: "external.enable_staking",
|
|
269
|
+
category: "external",
|
|
270
|
+
name: "Enable Staking",
|
|
271
|
+
formPath: "src/forms/createProposal/external/EnableStakingForm",
|
|
272
|
+
effect: "Frontend routes this via `new_proposal_type` — register settings + bind StakingProposal executor",
|
|
273
|
+
target: "GovSettings.addSettings + changeExecutors (via new_proposal_type)",
|
|
274
|
+
needsIpfs: true,
|
|
275
|
+
gating: [],
|
|
276
|
+
mcpTool: "dexe_proposal_build_new_proposal_type",
|
|
277
|
+
implemented: true,
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
id: "external.create_staking_tier",
|
|
281
|
+
category: "external",
|
|
282
|
+
name: "Create Staking",
|
|
283
|
+
formPath: "src/forms/createProposal/external/CreateStakingTierForm",
|
|
284
|
+
effect: "Create a staking pool (reward token + duration)",
|
|
285
|
+
target: "StakingProposal.createStaking(address,uint256,uint256,uint256,string)",
|
|
286
|
+
needsIpfs: true,
|
|
287
|
+
gating: [],
|
|
288
|
+
mcpTool: "dexe_proposal_build_create_staking_tier",
|
|
289
|
+
implemented: true,
|
|
290
|
+
},
|
|
291
|
+
// ---------- Internal (GovValidators.createInternalProposal) ----------
|
|
292
|
+
{
|
|
293
|
+
id: "internal.change_validator_balances",
|
|
294
|
+
category: "internal",
|
|
295
|
+
name: "Change Validator Balances",
|
|
296
|
+
formPath: "src/forms/createProposal/internal/ManageValidatorsForm",
|
|
297
|
+
effect: "Directly change validator stake amounts (type 0). Set balance=0 to remove.",
|
|
298
|
+
target: "GovValidators.createInternalProposal(type=0, url, data) — data=changeBalances(balances,users)",
|
|
299
|
+
needsIpfs: true,
|
|
300
|
+
gating: ["validator"],
|
|
301
|
+
mcpTool: "dexe_proposal_build_change_validator_balances",
|
|
302
|
+
implemented: true,
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
id: "internal.change_validator_settings",
|
|
306
|
+
category: "internal",
|
|
307
|
+
name: "Change Validator Settings",
|
|
308
|
+
formPath: "src/forms/createProposal/internal/ChangeVotingSettingsForm",
|
|
309
|
+
effect: "Change validator voting duration / executionDelay / quorum (type 1)",
|
|
310
|
+
target: "GovValidators.createInternalProposal(type=1, url, data) — data=changeSettings(duration,executionDelay,quorum)",
|
|
311
|
+
needsIpfs: true,
|
|
312
|
+
gating: ["validator"],
|
|
313
|
+
mcpTool: "dexe_proposal_build_change_validator_settings",
|
|
314
|
+
implemented: true,
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
id: "internal.monthly_withdraw",
|
|
318
|
+
category: "internal",
|
|
319
|
+
name: "Monthly Validator Withdraw",
|
|
320
|
+
formPath: "src/forms/createProposal/internal/MonthlyWithdrawForm",
|
|
321
|
+
effect: "Pay validators from treasury (multi-token supported) (type 2)",
|
|
322
|
+
target: "GovValidators.createInternalProposal(type=2, url, data) — data=monthlyWithdraw(tokens[],amounts[],destination)",
|
|
323
|
+
needsIpfs: true,
|
|
324
|
+
gating: ["validator"],
|
|
325
|
+
mcpTool: "dexe_proposal_build_monthly_withdraw",
|
|
326
|
+
implemented: true,
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
id: "internal.offchain_proposal",
|
|
330
|
+
category: "internal",
|
|
331
|
+
name: "Off-chain Internal Proposal (validators vote on off-chain result)",
|
|
332
|
+
formPath: "src/forms/createProposal/internal/EmptyTxForm",
|
|
333
|
+
effect: "Validators vote to attest an off-chain result (type 3, empty data bytes)",
|
|
334
|
+
target: "GovValidators.createInternalProposal(type=3, url, 0x)",
|
|
335
|
+
needsIpfs: true,
|
|
336
|
+
gating: ["validator"],
|
|
337
|
+
mcpTool: "dexe_proposal_build_offchain_internal_proposal",
|
|
338
|
+
implemented: true,
|
|
339
|
+
},
|
|
340
|
+
// ---------- Off-chain (DeXe backend API, no on-chain tx) ----------
|
|
341
|
+
{
|
|
342
|
+
id: "offchain.single_option",
|
|
343
|
+
category: "offchain",
|
|
344
|
+
name: "Single-option Off-chain Voting",
|
|
345
|
+
formPath: "src/forms/createProposal/offchain/TypedProposaForm",
|
|
346
|
+
effect: "Pick one of N options, tallied off-chain",
|
|
347
|
+
target: "POST /integrations/voting/proposals (voting_type=one_of)",
|
|
348
|
+
needsIpfs: false,
|
|
349
|
+
gating: [],
|
|
350
|
+
mcpTool: "dexe_proposal_build_offchain_single_option",
|
|
351
|
+
implemented: true,
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
id: "offchain.multi_option",
|
|
355
|
+
category: "offchain",
|
|
356
|
+
name: "Multi-option Off-chain Voting",
|
|
357
|
+
formPath: "src/forms/createProposal/offchain/TypedProposaForm",
|
|
358
|
+
effect: "Pick any subset of N options",
|
|
359
|
+
target: "POST /integrations/voting/proposals (voting_type=multiple_of)",
|
|
360
|
+
needsIpfs: false,
|
|
361
|
+
gating: [],
|
|
362
|
+
mcpTool: "dexe_proposal_build_offchain_multi_option",
|
|
363
|
+
implemented: true,
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
id: "offchain.for_against",
|
|
367
|
+
category: "offchain",
|
|
368
|
+
name: "For/Against Off-chain Voting",
|
|
369
|
+
formPath: "src/forms/createProposal/offchain/TypedProposaForm",
|
|
370
|
+
effect: "Binary vote (default labels: For / Against)",
|
|
371
|
+
target: "POST /integrations/voting/proposals (voting_type=for_against)",
|
|
372
|
+
needsIpfs: false,
|
|
373
|
+
gating: [],
|
|
374
|
+
mcpTool: "dexe_proposal_build_offchain_for_against",
|
|
375
|
+
implemented: true,
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
id: "offchain.change_voting_settings",
|
|
379
|
+
category: "offchain",
|
|
380
|
+
name: "Change Off-chain Voting Settings",
|
|
381
|
+
formPath: "src/forms/createProposal/offchain/ChangeVotingSettingsForm",
|
|
382
|
+
effect: "Update DAO-wide off-chain voting parameters",
|
|
383
|
+
target: "POST /integrations/voting/proposals (attributes.type=edit_proposal_type)",
|
|
384
|
+
needsIpfs: false,
|
|
385
|
+
gating: [],
|
|
386
|
+
mcpTool: "dexe_proposal_build_offchain_settings",
|
|
387
|
+
implemented: true,
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
id: "offchain.new_template",
|
|
391
|
+
category: "offchain",
|
|
392
|
+
name: "Save Voting Template",
|
|
393
|
+
formPath: "src/forms/createProposal/offchain/NewTemplateForm",
|
|
394
|
+
effect: "Persist a reusable voting-template record",
|
|
395
|
+
target: "POST /integrations/voting/proposals (attributes.type=create_proposal_type)",
|
|
396
|
+
needsIpfs: false,
|
|
397
|
+
gating: [],
|
|
398
|
+
mcpTool: "dexe_proposal_build_offchain_settings",
|
|
399
|
+
implemented: true,
|
|
400
|
+
},
|
|
401
|
+
];
|
|
402
|
+
/** Metadata JSON shape used by the frontend for every external proposal. */
|
|
403
|
+
export const EXTERNAL_METADATA_SHAPE = {
|
|
404
|
+
proposalName: "string (required)",
|
|
405
|
+
proposalDescription: "string (required, markdown/slate)",
|
|
406
|
+
category: "string (e.g. 'Token Transfer', 'Manage Validators')",
|
|
407
|
+
isMeta: "boolean (default false)",
|
|
408
|
+
changes: "object (type-specific structured payload for indexing, optional)",
|
|
409
|
+
};
|
|
410
|
+
export const INTERNAL_METADATA_SHAPE = {
|
|
411
|
+
proposalName: "string (required)",
|
|
412
|
+
proposalDescription: "string",
|
|
413
|
+
category: "string (ValidatorBalances | ValidatorSettings | MonthlyWithdraw | Offchain)",
|
|
414
|
+
changes: "object (type-specific)",
|
|
415
|
+
};
|
|
416
|
+
//# sourceMappingURL=proposalCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposalCatalog.js","sourceRoot":"","sources":["../../src/lib/proposalCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal GraphQL fetcher for The Graph subgraphs. Uses global `fetch` (Node
|
|
3
|
+
* 18+). We avoid `graphql-request` as a dep for now — the calls we make are
|
|
4
|
+
* simple enough.
|
|
5
|
+
*/
|
|
6
|
+
export interface GqlResponse<T> {
|
|
7
|
+
data?: T;
|
|
8
|
+
errors?: Array<{
|
|
9
|
+
message: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export declare function gqlRequest<T>(endpoint: string, query: string, variables?: Record<string, unknown>): Promise<T>;
|
|
13
|
+
/** Ported from frontend `/src/gql/interactions.ts`. */
|
|
14
|
+
export declare const VOTES_BY_PROPOSAL_QUERY = "\n query VotesByProposal($pool: Bytes!, $proposalId: BigInt!, $first: Int!, $skip: Int!) {\n votes(\n where: { pool: $pool, proposalId: $proposalId }\n first: $first\n skip: $skip\n orderBy: timestamp\n orderDirection: desc\n ) {\n id\n voter\n isVoteFor\n totalRawVoted\n timestamp\n transactionHash\n }\n }\n";
|
|
15
|
+
//# sourceMappingURL=subgraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph.d.ts","sourceRoot":"","sources":["../../src/lib/subgraph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrC;AAED,wBAAsB,UAAU,CAAC,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED,uDAAuD;AACvD,eAAO,MAAM,uBAAuB,6XAiBnC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export async function gqlRequest(endpoint, query, variables) {
|
|
2
|
+
const res = await fetch(endpoint, {
|
|
3
|
+
method: "POST",
|
|
4
|
+
headers: { "Content-Type": "application/json" },
|
|
5
|
+
body: JSON.stringify({ query, variables }),
|
|
6
|
+
});
|
|
7
|
+
if (!res.ok) {
|
|
8
|
+
throw new Error(`Subgraph HTTP ${res.status} ${res.statusText}`);
|
|
9
|
+
}
|
|
10
|
+
const body = (await res.json());
|
|
11
|
+
if (body.errors?.length) {
|
|
12
|
+
throw new Error(`Subgraph errors: ${body.errors.map((e) => e.message).join("; ")}`);
|
|
13
|
+
}
|
|
14
|
+
if (!body.data)
|
|
15
|
+
throw new Error("Subgraph returned empty data");
|
|
16
|
+
return body.data;
|
|
17
|
+
}
|
|
18
|
+
/** Ported from frontend `/src/gql/interactions.ts`. */
|
|
19
|
+
export const VOTES_BY_PROPOSAL_QUERY = /* GraphQL */ `
|
|
20
|
+
query VotesByProposal($pool: Bytes!, $proposalId: BigInt!, $first: Int!, $skip: Int!) {
|
|
21
|
+
votes(
|
|
22
|
+
where: { pool: $pool, proposalId: $proposalId }
|
|
23
|
+
first: $first
|
|
24
|
+
skip: $skip
|
|
25
|
+
orderBy: timestamp
|
|
26
|
+
orderDirection: desc
|
|
27
|
+
) {
|
|
28
|
+
id
|
|
29
|
+
voter
|
|
30
|
+
isVoteFor
|
|
31
|
+
totalRawVoted
|
|
32
|
+
timestamp
|
|
33
|
+
transactionHash
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
//# sourceMappingURL=subgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../src/lib/subgraph.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,KAAa,EACb,SAAmC;IAEnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KAC3C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;;;;;;;;;;;;;;;;;CAiBpD,CAAC"}
|