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.
- package/CHANGELOG.md +192 -85
- package/README.md +103 -80
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/addresses.js +1 -1
- package/dist/lib/ipfs.d.ts.map +1 -1
- package/dist/lib/ipfs.js +2 -1
- package/dist/lib/ipfs.js.map +1 -1
- 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/merkleTree.d.ts +38 -0
- package/dist/lib/merkleTree.d.ts.map +1 -0
- package/dist/lib/merkleTree.js +83 -0
- package/dist/lib/merkleTree.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 +2 -2
- package/dist/lib/subgraph.d.ts.map +1 -1
- package/dist/lib/subgraph.js +14 -9
- package/dist/lib/subgraph.js.map +1 -1
- package/dist/tools/daoDeploy.d.ts.map +1 -1
- package/dist/tools/daoDeploy.js +313 -63
- package/dist/tools/daoDeploy.js.map +1 -1
- package/dist/tools/flow.d.ts +62 -0
- package/dist/tools/flow.d.ts.map +1 -0
- package/dist/tools/flow.js +479 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +12 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/ipfs.d.ts.map +1 -1
- package/dist/tools/ipfs.js +94 -28
- package/dist/tools/ipfs.js.map +1 -1
- package/dist/tools/merkle.d.ts +4 -0
- package/dist/tools/merkle.d.ts.map +1 -0
- package/dist/tools/merkle.js +174 -0
- package/dist/tools/merkle.js.map +1 -0
- package/dist/tools/otc.d.ts +5 -0
- package/dist/tools/otc.d.ts.map +1 -0
- package/dist/tools/otc.js +481 -0
- package/dist/tools/otc.js.map +1 -0
- package/dist/tools/proposal.js +28 -10
- package/dist/tools/proposal.js.map +1 -1
- package/dist/tools/proposalBuild.d.ts.map +1 -1
- package/dist/tools/proposalBuild.js +28 -13
- package/dist/tools/proposalBuild.js.map +1 -1
- package/dist/tools/proposalBuildComplex.d.ts +222 -0
- package/dist/tools/proposalBuildComplex.d.ts.map +1 -1
- package/dist/tools/proposalBuildComplex.js +511 -138
- package/dist/tools/proposalBuildComplex.js.map +1 -1
- package/dist/tools/proposalBuildInternal.js +24 -11
- package/dist/tools/proposalBuildInternal.js.map +1 -1
- package/dist/tools/proposalBuildMore.js +42 -21
- package/dist/tools/proposalBuildMore.js.map +1 -1
- package/dist/tools/proposalBuildOffchain.d.ts.map +1 -1
- package/dist/tools/proposalBuildOffchain.js +8 -5
- package/dist/tools/proposalBuildOffchain.js.map +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +227 -0
- package/dist/tools/read.js.map +1 -1
- 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/voteBuild.d.ts.map +1 -1
- package/dist/tools/voteBuild.js +420 -0
- package/dist/tools/voteBuild.js.map +1 -1
- package/package.json +83 -75
package/dist/index.js
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
6
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
7
|
import { loadConfig } from "./config.js";
|
|
5
8
|
import { registerAll } from "./tools/index.js";
|
|
9
|
+
// Load .env from project root if present — ensures env vars reach the process
|
|
10
|
+
// regardless of how the MCP host launches us (Claude Code drops most env vars
|
|
11
|
+
// from its settings.json "env" block on Windows).
|
|
12
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const dotenvPath = resolve(__dirname, "..", ".env");
|
|
14
|
+
if (existsSync(dotenvPath)) {
|
|
15
|
+
try {
|
|
16
|
+
process.loadEnvFile(dotenvPath);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Node < 21.7 or other issue — fall through to process.env as-is
|
|
20
|
+
}
|
|
21
|
+
}
|
|
6
22
|
async function main() {
|
|
7
23
|
const config = await loadConfig();
|
|
8
24
|
const server = new McpServer({ name: "dexe-mcp", version: "0.1.5" }, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EACtC;QACE,YAAY,EACV,mRAAmR;KACtR,CACF,CAAC;IAEF,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qDAAqD,MAAM,CAAC,YAAY,GACtE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACrC,IAAI,CACL,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,8EAA8E;AAC9E,8EAA8E;AAC9E,kDAAkD;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EACtC;QACE,YAAY,EACV,mRAAmR;KACtR,CACF,CAAC;IAEF,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qDAAqD,MAAM,CAAC,YAAY,GACtE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACrC,IAAI,CACL,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/lib/addresses.js
CHANGED
|
@@ -9,7 +9,7 @@ import { Contract, ZeroAddress } from "ethers";
|
|
|
9
9
|
* frontend env. Add more chains as they come online.
|
|
10
10
|
*/
|
|
11
11
|
export const CONTRACTS_REGISTRY_BY_CHAIN = {
|
|
12
|
-
56: "
|
|
12
|
+
56: "0x46B46629B674b4C0b48B111DEeB0eAfd9F84A1c0",
|
|
13
13
|
};
|
|
14
14
|
/**
|
|
15
15
|
* Canonical contract names used as keys inside `ContractsRegistry`. Mirrors
|
package/dist/lib/ipfs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../src/lib/ipfs.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAO,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,gEAAgE;IAChE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../src/lib/ipfs.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAO,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,gEAAgE;IAChE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAID,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAoB/C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,iEAAiE;AACjE,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhE;AAED,iEAAiE;AACjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpE;AAyBD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAIxC,4DAA4D;IACtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,OAAO,CACX,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC3D,OAAO,CAAC,eAAe,CAAC;IA0BrB,OAAO,CACX,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAChE,OAAO,CAAC,eAAe,CAAC;CAwB5B"}
|
package/dist/lib/ipfs.js
CHANGED
|
@@ -21,7 +21,8 @@ export async function fetchIpfs(cid, cfg) {
|
|
|
21
21
|
let attempts = 0;
|
|
22
22
|
for (const gw of cfg.gateways) {
|
|
23
23
|
attempts++;
|
|
24
|
-
const
|
|
24
|
+
const base = gw.replace(/\/+$/, "").replace(/\/ipfs$/, "");
|
|
25
|
+
const url = `${base}/ipfs/${cidStr}`;
|
|
25
26
|
const controller = new AbortController();
|
|
26
27
|
const t = setTimeout(() => controller.abort(), timeout);
|
|
27
28
|
try {
|
package/dist/lib/ipfs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../src/lib/ipfs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,0BAA0B,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsB,EAAE,CAAC;AAmBzD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,GAAoB;IAEpB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,QAAQ,EAAE,CAAC;QACX,MAAM,
|
|
1
|
+
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../src/lib/ipfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a Markdown string to the Slate node format used by the DeXe
|
|
3
|
+
* investing-dashboard frontend.
|
|
4
|
+
*
|
|
5
|
+
* Uses `unified` + `remark-parse` + `remark-slate-transformer` with overrides
|
|
6
|
+
* that map remark's default node types to the frontend's ELEMENT_TYPES enum:
|
|
7
|
+
*
|
|
8
|
+
* Remark default → Frontend Slate type
|
|
9
|
+
* ─────────────────────────────────────────────
|
|
10
|
+
* heading depth=1 → "heading-one"
|
|
11
|
+
* heading depth=2 → "heading-two"
|
|
12
|
+
* heading depth=3 → "heading-three"
|
|
13
|
+
* paragraph → "paragraph" (same)
|
|
14
|
+
* list ordered=false → "bulleted-list"
|
|
15
|
+
* list ordered=true → "numbered-list"
|
|
16
|
+
* listItem → "list-item"
|
|
17
|
+
* code → "code-block"
|
|
18
|
+
* link → "link"
|
|
19
|
+
* image → "image"
|
|
20
|
+
* delete → "strikethrough" (~~text~~)
|
|
21
|
+
*
|
|
22
|
+
* Text marks:
|
|
23
|
+
* strong → { bold: true }
|
|
24
|
+
* emphasis → { italic: true }
|
|
25
|
+
* inlineCode → wrapped in code-inline element
|
|
26
|
+
* delete → { strikethrough: true }
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Convert a Markdown string to a Slate `SlateDescendant[]` array compatible
|
|
30
|
+
* with the DeXe investing-dashboard frontend.
|
|
31
|
+
*
|
|
32
|
+
* - Empty / whitespace-only input → default empty paragraph node
|
|
33
|
+
* - Plain text (no markdown syntax) → paragraph nodes split by newline
|
|
34
|
+
* - Rich markdown → full Slate tree with headings, lists, bold, etc.
|
|
35
|
+
*
|
|
36
|
+
* This function is synchronous (`processSync`).
|
|
37
|
+
*/
|
|
38
|
+
export declare function markdownToSlate(markdown: string): unknown[];
|
|
39
|
+
//# sourceMappingURL=markdownToSlate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownToSlate.d.ts","sourceRoot":"","sources":["../../src/lib/markdownToSlate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AA6IH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAuB3D"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a Markdown string to the Slate node format used by the DeXe
|
|
3
|
+
* investing-dashboard frontend.
|
|
4
|
+
*
|
|
5
|
+
* Uses `unified` + `remark-parse` + `remark-slate-transformer` with overrides
|
|
6
|
+
* that map remark's default node types to the frontend's ELEMENT_TYPES enum:
|
|
7
|
+
*
|
|
8
|
+
* Remark default → Frontend Slate type
|
|
9
|
+
* ─────────────────────────────────────────────
|
|
10
|
+
* heading depth=1 → "heading-one"
|
|
11
|
+
* heading depth=2 → "heading-two"
|
|
12
|
+
* heading depth=3 → "heading-three"
|
|
13
|
+
* paragraph → "paragraph" (same)
|
|
14
|
+
* list ordered=false → "bulleted-list"
|
|
15
|
+
* list ordered=true → "numbered-list"
|
|
16
|
+
* listItem → "list-item"
|
|
17
|
+
* code → "code-block"
|
|
18
|
+
* link → "link"
|
|
19
|
+
* image → "image"
|
|
20
|
+
* delete → "strikethrough" (~~text~~)
|
|
21
|
+
*
|
|
22
|
+
* Text marks:
|
|
23
|
+
* strong → { bold: true }
|
|
24
|
+
* emphasis → { italic: true }
|
|
25
|
+
* inlineCode → wrapped in code-inline element
|
|
26
|
+
* delete → { strikethrough: true }
|
|
27
|
+
*/
|
|
28
|
+
import { unified } from "unified";
|
|
29
|
+
import remarkParse from "remark-parse";
|
|
30
|
+
import remarkGfm from "remark-gfm";
|
|
31
|
+
import { remarkToSlate } from "remark-slate-transformer";
|
|
32
|
+
/**
|
|
33
|
+
* Override builders that remap remark-slate-transformer's default output
|
|
34
|
+
* into the exact element/mark types the frontend expects.
|
|
35
|
+
*/
|
|
36
|
+
const overrides = {
|
|
37
|
+
// ── Block elements ──────────────────────────────────────────────
|
|
38
|
+
heading(node, next) {
|
|
39
|
+
const depthMap = {
|
|
40
|
+
1: "heading-one",
|
|
41
|
+
2: "heading-two",
|
|
42
|
+
3: "heading-three",
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
type: depthMap[node.depth] ?? "heading-three",
|
|
46
|
+
children: next(node.children),
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
// paragraph — default type name matches, but we define it explicitly
|
|
50
|
+
// to ensure children get processed through `next` consistently
|
|
51
|
+
paragraph(node, next) {
|
|
52
|
+
return {
|
|
53
|
+
type: "paragraph",
|
|
54
|
+
children: next(node.children),
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
list(node, next) {
|
|
58
|
+
const type = node.ordered ? "numbered-list" : "bulleted-list";
|
|
59
|
+
return {
|
|
60
|
+
type,
|
|
61
|
+
children: next(node.children),
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
listItem(node, next) {
|
|
65
|
+
// remark wraps list item content in a paragraph — we need to flatten
|
|
66
|
+
// so the frontend gets { type: "list-item", children: [{ text }] }
|
|
67
|
+
const processed = next(node.children);
|
|
68
|
+
// If the only child is a paragraph, unwrap its children
|
|
69
|
+
const children = processed.length === 1 &&
|
|
70
|
+
processed[0] &&
|
|
71
|
+
processed[0].type === "paragraph"
|
|
72
|
+
? processed[0].children
|
|
73
|
+
: processed;
|
|
74
|
+
return {
|
|
75
|
+
type: "list-item",
|
|
76
|
+
children,
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
code(node) {
|
|
80
|
+
// Fenced code blocks → code-block element
|
|
81
|
+
return {
|
|
82
|
+
type: "code-block",
|
|
83
|
+
language: node.lang ?? "",
|
|
84
|
+
children: [{ text: node.value }],
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
blockquote(node, next) {
|
|
88
|
+
// Frontend doesn't have a blockquote type — flatten to paragraphs
|
|
89
|
+
// Each child (usually paragraphs) gets returned as-is
|
|
90
|
+
const children = next(node.children);
|
|
91
|
+
return children.length > 0 ? children : undefined;
|
|
92
|
+
},
|
|
93
|
+
thematicBreak() {
|
|
94
|
+
// --- / *** → no frontend equivalent, skip
|
|
95
|
+
return { type: "paragraph", children: [{ text: "---" }] };
|
|
96
|
+
},
|
|
97
|
+
// ── Inline elements ─────────────────────────────────────────────
|
|
98
|
+
link(node, next) {
|
|
99
|
+
return {
|
|
100
|
+
type: "link",
|
|
101
|
+
url: node.url,
|
|
102
|
+
children: next(node.children),
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
image(node) {
|
|
106
|
+
return {
|
|
107
|
+
type: "image",
|
|
108
|
+
url: node.url,
|
|
109
|
+
children: [{ text: node.alt ?? "" }],
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
// ── Text marks ──────────────────────────────────────────────────
|
|
113
|
+
// remark-slate-transformer applies these as flags on text nodes.
|
|
114
|
+
// We need to remap the flag names to match the frontend's CustomText.
|
|
115
|
+
strong(node, next) {
|
|
116
|
+
// Apply bold: true to all text children
|
|
117
|
+
const children = next(node.children);
|
|
118
|
+
return children.map((child) => ({ ...child, bold: true }));
|
|
119
|
+
},
|
|
120
|
+
emphasis(node, next) {
|
|
121
|
+
const children = next(node.children);
|
|
122
|
+
return children.map((child) => ({ ...child, italic: true }));
|
|
123
|
+
},
|
|
124
|
+
delete(node, next) {
|
|
125
|
+
const children = next(node.children);
|
|
126
|
+
return children.map((child) => ({ ...child, strikethrough: "true" }));
|
|
127
|
+
},
|
|
128
|
+
inlineCode(node) {
|
|
129
|
+
// Frontend has code-inline as an element type wrapping text
|
|
130
|
+
return {
|
|
131
|
+
type: "code-inline",
|
|
132
|
+
children: [{ text: node.value }],
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
/** The default empty Slate document the frontend uses. */
|
|
137
|
+
const SLATE_DEFAULT = [{ type: "paragraph", children: [{ text: "" }] }];
|
|
138
|
+
/**
|
|
139
|
+
* Unified processor configured with our overrides.
|
|
140
|
+
*/
|
|
141
|
+
const processor = unified()
|
|
142
|
+
.use(remarkParse)
|
|
143
|
+
.use(remarkGfm) // GFM: ~~strikethrough~~, tables, autolinks, task lists
|
|
144
|
+
.use(remarkToSlate, { overrides });
|
|
145
|
+
/**
|
|
146
|
+
* Convert a Markdown string to a Slate `SlateDescendant[]` array compatible
|
|
147
|
+
* with the DeXe investing-dashboard frontend.
|
|
148
|
+
*
|
|
149
|
+
* - Empty / whitespace-only input → default empty paragraph node
|
|
150
|
+
* - Plain text (no markdown syntax) → paragraph nodes split by newline
|
|
151
|
+
* - Rich markdown → full Slate tree with headings, lists, bold, etc.
|
|
152
|
+
*
|
|
153
|
+
* This function is synchronous (`processSync`).
|
|
154
|
+
*/
|
|
155
|
+
export function markdownToSlate(markdown) {
|
|
156
|
+
if (!markdown || markdown.trim().length === 0) {
|
|
157
|
+
return SLATE_DEFAULT;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const result = processor.processSync(markdown);
|
|
161
|
+
const nodes = result.result;
|
|
162
|
+
if (!Array.isArray(nodes) || nodes.length === 0) {
|
|
163
|
+
return SLATE_DEFAULT;
|
|
164
|
+
}
|
|
165
|
+
// Flatten any arrays returned by mark overrides (strong/emphasis/delete
|
|
166
|
+
// return arrays of text nodes instead of a single element)
|
|
167
|
+
return flattenSlateNodes(nodes);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Fallback: split by newlines into paragraphs (same as old behavior)
|
|
171
|
+
const lines = markdown.split("\n").filter((l) => l.length > 0);
|
|
172
|
+
return lines.length > 0
|
|
173
|
+
? lines.map((line) => ({ type: "paragraph", children: [{ text: line }] }))
|
|
174
|
+
: SLATE_DEFAULT;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Recursively flatten any nested arrays that our mark overrides produce.
|
|
179
|
+
* Mark handlers (strong, emphasis, delete) return arrays of text nodes
|
|
180
|
+
* instead of elements, which can end up as nested arrays in children.
|
|
181
|
+
*/
|
|
182
|
+
function flattenSlateNodes(nodes) {
|
|
183
|
+
const result = [];
|
|
184
|
+
for (const node of nodes) {
|
|
185
|
+
if (Array.isArray(node)) {
|
|
186
|
+
result.push(...flattenSlateNodes(node));
|
|
187
|
+
}
|
|
188
|
+
else if (node && typeof node === "object") {
|
|
189
|
+
const n = node;
|
|
190
|
+
if (Array.isArray(n.children)) {
|
|
191
|
+
result.push({ ...n, children: flattenSlateNodes(n.children) });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
result.push(n);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
result.push(node);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=markdownToSlate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownToSlate.js","sourceRoot":"","sources":["../../src/lib/markdownToSlate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAMzD;;;GAGG;AACH,MAAM,SAAS,GAAmF;IAChG,mEAAmE;IACnE,OAAO,CAAC,IAAI,EAAE,IAAI;QAChB,MAAM,QAAQ,GAA2B;YACvC,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,eAAe;SACnB,CAAC;QACF,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAe,CAAC,IAAI,eAAe;YACvD,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC9B,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,+DAA+D;IAC/D,SAAS,CAAC,IAAI,EAAE,IAAI;QAClB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC9B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,IAAI;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9D,OAAO;YACL,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC9B,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,IAAI,EAAE,IAAI;QACjB,qEAAqE;QACrE,mEAAmE;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgB,CAAC;QACrD,wDAAwD;QACxD,MAAM,QAAQ,GACZ,SAAS,CAAC,MAAM,KAAK,CAAC;YACtB,SAAS,CAAC,CAAC,CAAC;YACX,SAAS,CAAC,CAAC,CAAS,CAAC,IAAI,KAAK,WAAW;YACxC,CAAC,CAAG,SAAS,CAAC,CAAC,CAAS,CAAC,QAAwB;YACjD,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI;QACP,0CAA0C;QAC1C,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAG,IAAI,CAAC,IAAe,IAAI,EAAE;YACrC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAe,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,IAAI,EAAE,IAAI;QACnB,kEAAkE;QAClE,sDAAsD;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgB,CAAC;QACpD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IAED,aAAa;QACX,2CAA2C;QAC3C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IAED,mEAAmE;IACnE,IAAI,CAAC,IAAI,EAAE,IAAI;QACb,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,IAAI,CAAC,GAAa;YACvB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC9B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO;YACL,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,IAAI,CAAC,GAAa;YACvB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAG,IAAI,CAAC,GAAc,IAAI,EAAE,EAAE,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,iEAAiE;IACjE,sEAAsE;IAEtE,MAAM,CAAC,IAAI,EAAE,IAAI;QACf,wCAAwC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgB,CAAC;QACpD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,QAAQ,CAAC,IAAI,EAAE,IAAI;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgB,CAAC;QACpD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,IAAI,EAAE,IAAI;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgB,CAAC;QACpD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,UAAU,CAAC,IAAI;QACb,4DAA4D;QAC5D,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAe,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,0DAA0D;AAC1D,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,SAAS,GAAG,OAAO,EAAE;KACxB,GAAG,CAAC,WAAW,CAAC;KAChB,GAAG,CAAC,SAAS,CAAC,CAAE,wDAAwD;KACxE,GAAG,CAAC,aAAa,EAAE,EAAE,SAAS,EAAS,CAAC,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAmB,CAAC;QAEzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,wEAAwE;QACxE,2DAA2D;QAC3D,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC,CAAC,aAAa,CAAC;IACpB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,KAAgB;IACzC,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,IAA+B,CAAC;YAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAqB,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal OpenZeppelin-StandardMerkleTree-compatible builder.
|
|
3
|
+
*
|
|
4
|
+
* Matches the frontend's `@openzeppelin/merkle-tree` (used in
|
|
5
|
+
* `C:/dev/investing-dashboard/src/utils/MerkleTreeEntity.ts`) and the
|
|
6
|
+
* on-chain verifier in `TokenSaleProposalBuy.sol::_checkMerkleProofs`:
|
|
7
|
+
*
|
|
8
|
+
* leaf = keccak256(bytes.concat(keccak256(abi.encode(...values))))
|
|
9
|
+
* node = keccak256(sorted(left, right)) // commutative
|
|
10
|
+
*
|
|
11
|
+
* Leaves are sorted by leafHash (ascending) to give a deterministic root.
|
|
12
|
+
*/
|
|
13
|
+
export type LeafValues = readonly unknown[];
|
|
14
|
+
export interface MerkleTreeResult {
|
|
15
|
+
root: string;
|
|
16
|
+
/** Proof per original-input index (i.e. proofs[i] is for entries[i]). */
|
|
17
|
+
proofs: string[][];
|
|
18
|
+
/** Sorted leaf hashes (debug/inspection). */
|
|
19
|
+
leafHashes: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build a merkle tree over `entries`, where each entry is a tuple of values
|
|
23
|
+
* matching `leafEncoding` (e.g. `["address"]` or `["address", "uint256"]`).
|
|
24
|
+
*
|
|
25
|
+
* Returns root + per-entry proof + leaf hashes. Compatible with
|
|
26
|
+
* `MerkleProof.verifyCalldata` in OpenZeppelin Solidity.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildMerkleTree(entries: readonly LeafValues[], leafEncoding: readonly string[]): MerkleTreeResult;
|
|
29
|
+
/** Convenience: build a single-address-leaf tree (the OTC default). */
|
|
30
|
+
export declare function buildAddressMerkleTree(addresses: readonly string[]): MerkleTreeResult;
|
|
31
|
+
/** Verify a proof against the root. Mirrors `MerkleProof.verifyCalldata`. */
|
|
32
|
+
export declare function verifyProof(proof: readonly string[], root: string, leaf: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Compute leaf hash for a given entry — exposed for callers that want to
|
|
35
|
+
* pass the leaf to `verifyProof` without re-running the whole tree.
|
|
36
|
+
*/
|
|
37
|
+
export declare function computeLeafHash(values: LeafValues, leafEncoding: readonly string[]): string;
|
|
38
|
+
//# sourceMappingURL=merkleTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkleTree.d.ts","sourceRoot":"","sources":["../../src/lib/merkleTree.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,UAAU,GAAG,SAAS,OAAO,EAAE,CAAC;AAoB5C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,gBAAgB,CA4ClB;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAGrF;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE3F"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { AbiCoder, getBytes, keccak256, concat, hexlify } from "ethers";
|
|
2
|
+
const coder = AbiCoder.defaultAbiCoder();
|
|
3
|
+
function leafHash(types, values) {
|
|
4
|
+
const inner = keccak256(coder.encode(types, values));
|
|
5
|
+
return keccak256(concat([inner]));
|
|
6
|
+
}
|
|
7
|
+
function commutative(a, b) {
|
|
8
|
+
const ab = getBytes(a);
|
|
9
|
+
const bb = getBytes(b);
|
|
10
|
+
// lexicographic compare of bytes
|
|
11
|
+
let cmp = 0;
|
|
12
|
+
for (let i = 0; i < ab.length && cmp === 0; i++) {
|
|
13
|
+
cmp = (ab[i] ?? 0) - (bb[i] ?? 0);
|
|
14
|
+
}
|
|
15
|
+
return cmp <= 0 ? keccak256(concat([a, b])) : keccak256(concat([b, a]));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Build a merkle tree over `entries`, where each entry is a tuple of values
|
|
19
|
+
* matching `leafEncoding` (e.g. `["address"]` or `["address", "uint256"]`).
|
|
20
|
+
*
|
|
21
|
+
* Returns root + per-entry proof + leaf hashes. Compatible with
|
|
22
|
+
* `MerkleProof.verifyCalldata` in OpenZeppelin Solidity.
|
|
23
|
+
*/
|
|
24
|
+
export function buildMerkleTree(entries, leafEncoding) {
|
|
25
|
+
if (entries.length === 0) {
|
|
26
|
+
throw new Error("buildMerkleTree: entries must not be empty");
|
|
27
|
+
}
|
|
28
|
+
const original = entries.map((vals) => leafHash(leafEncoding, vals));
|
|
29
|
+
const indexed = original
|
|
30
|
+
.map((h, i) => ({ h, i }))
|
|
31
|
+
.sort((a, b) => (a.h < b.h ? -1 : a.h > b.h ? 1 : 0));
|
|
32
|
+
const n = indexed.length;
|
|
33
|
+
const treeSize = n === 1 ? 1 : 2 * n - 1;
|
|
34
|
+
const tree = new Array(treeSize).fill("0x");
|
|
35
|
+
for (let i = 0; i < n; i++)
|
|
36
|
+
tree[n - 1 + i] = indexed[i].h;
|
|
37
|
+
for (let i = n - 2; i >= 0; i--) {
|
|
38
|
+
tree[i] = commutative(tree[2 * i + 1], tree[2 * i + 2]);
|
|
39
|
+
}
|
|
40
|
+
const sortedToOriginal = indexed.map(({ i }) => i);
|
|
41
|
+
const originalToSorted = new Array(n).fill(0);
|
|
42
|
+
for (let s = 0; s < n; s++)
|
|
43
|
+
originalToSorted[sortedToOriginal[s]] = s;
|
|
44
|
+
function siblingPath(leafSortedIdx) {
|
|
45
|
+
const proof = [];
|
|
46
|
+
let node = n - 1 + leafSortedIdx;
|
|
47
|
+
while (node > 0) {
|
|
48
|
+
const sibling = node % 2 === 0 ? node - 1 : node + 1;
|
|
49
|
+
proof.push(tree[sibling]);
|
|
50
|
+
node = Math.floor((node - 1) / 2);
|
|
51
|
+
}
|
|
52
|
+
return proof;
|
|
53
|
+
}
|
|
54
|
+
const proofs = new Array(n);
|
|
55
|
+
for (let original_i = 0; original_i < n; original_i++) {
|
|
56
|
+
proofs[original_i] = siblingPath(originalToSorted[original_i]);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
root: hexlify(tree[0]),
|
|
60
|
+
proofs,
|
|
61
|
+
leafHashes: indexed.map(({ h }) => h),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Convenience: build a single-address-leaf tree (the OTC default). */
|
|
65
|
+
export function buildAddressMerkleTree(addresses) {
|
|
66
|
+
const entries = addresses.map((a) => [a]);
|
|
67
|
+
return buildMerkleTree(entries, ["address"]);
|
|
68
|
+
}
|
|
69
|
+
/** Verify a proof against the root. Mirrors `MerkleProof.verifyCalldata`. */
|
|
70
|
+
export function verifyProof(proof, root, leaf) {
|
|
71
|
+
let computed = leaf;
|
|
72
|
+
for (const sibling of proof)
|
|
73
|
+
computed = commutative(computed, sibling);
|
|
74
|
+
return computed.toLowerCase() === root.toLowerCase();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Compute leaf hash for a given entry — exposed for callers that want to
|
|
78
|
+
* pass the leaf to `verifyProof` without re-running the whole tree.
|
|
79
|
+
*/
|
|
80
|
+
export function computeLeafHash(values, leafEncoding) {
|
|
81
|
+
return leafHash(leafEncoding, values);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=merkleTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkleTree.js","sourceRoot":"","sources":["../../src/lib/merkleTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Wallet } from "ethers";
|
|
2
|
+
import type { DexeConfig } from "../config.js";
|
|
3
|
+
export declare class SignerManager {
|
|
4
|
+
private wallet;
|
|
5
|
+
private readonly key;
|
|
6
|
+
private readonly rpcUrl;
|
|
7
|
+
constructor(config: DexeConfig);
|
|
8
|
+
hasSigner(): boolean;
|
|
9
|
+
getAddress(): string;
|
|
10
|
+
requireSigner(): Wallet;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/lib/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEhC,MAAM,EAAE,UAAU;IAK9B,SAAS,IAAI,OAAO;IAIpB,UAAU,IAAI,MAAM;IAIpB,aAAa,IAAI,MAAM;CAgBxB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { JsonRpcProvider, Wallet } from "ethers";
|
|
2
|
+
export class SignerManager {
|
|
3
|
+
wallet = null;
|
|
4
|
+
key;
|
|
5
|
+
rpcUrl;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.key = config.privateKey;
|
|
8
|
+
this.rpcUrl = config.rpcUrl;
|
|
9
|
+
}
|
|
10
|
+
hasSigner() {
|
|
11
|
+
return !!this.key;
|
|
12
|
+
}
|
|
13
|
+
getAddress() {
|
|
14
|
+
return this.requireSigner().address;
|
|
15
|
+
}
|
|
16
|
+
requireSigner() {
|
|
17
|
+
if (!this.key) {
|
|
18
|
+
const dexeEnvKeys = Object.keys(process.env).filter(k => k.startsWith("DEXE_")).join(", ");
|
|
19
|
+
throw new Error(`DEXE_PRIVATE_KEY not set. Available DEXE_* env vars: [${dexeEnvKeys}]. Configure it in MCP server env to enable transaction signing.`);
|
|
20
|
+
}
|
|
21
|
+
if (!this.wallet) {
|
|
22
|
+
if (!this.rpcUrl) {
|
|
23
|
+
throw new Error("DEXE_RPC_URL required when DEXE_PRIVATE_KEY is set.");
|
|
24
|
+
}
|
|
25
|
+
const provider = new JsonRpcProvider(this.rpcUrl);
|
|
26
|
+
this.wallet = new Wallet(this.key, provider);
|
|
27
|
+
}
|
|
28
|
+
return this.wallet;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/lib/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGjD,MAAM,OAAO,aAAa;IAChB,MAAM,GAAkB,IAAI,CAAC;IACpB,GAAG,CAAqB;IACxB,MAAM,CAAqB;IAE5C,YAAY,MAAkB;QAC5B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,SAAS;QACP,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACpB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC;IACtC,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3F,MAAM,IAAI,KAAK,CACb,yDAAyD,WAAW,kEAAkE,CACvI,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
package/dist/lib/subgraph.d.ts
CHANGED
|
@@ -10,6 +10,6 @@ export interface GqlResponse<T> {
|
|
|
10
10
|
}>;
|
|
11
11
|
}
|
|
12
12
|
export declare function gqlRequest<T>(endpoint: string, query: string, variables?: Record<string, unknown>): Promise<T>;
|
|
13
|
-
/** Ported from frontend
|
|
14
|
-
export declare const
|
|
13
|
+
/** Ported from frontend gov-pools subgraph `proposalInteractions` query. */
|
|
14
|
+
export declare const PROPOSAL_INTERACTIONS_QUERY = "\n query ProposalInteractions($proposalId: String!, $first: Int!, $skip: Int!) {\n proposalInteractions(\n where: { proposal: $proposalId }\n first: $first\n skip: $skip\n orderBy: timestamp\n orderDirection: desc\n ) {\n id\n hash\n timestamp\n interactionType\n totalVote\n voter {\n id\n voter {\n id\n }\n }\n }\n }\n";
|
|
15
15
|
//# sourceMappingURL=subgraph.d.ts.map
|
|
@@ -1 +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,
|
|
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,4EAA4E;AAC5E,eAAO,MAAM,2BAA2B,2aAsBvC,CAAC"}
|
package/dist/lib/subgraph.js
CHANGED
|
@@ -15,22 +15,27 @@ export async function gqlRequest(endpoint, query, variables) {
|
|
|
15
15
|
throw new Error("Subgraph returned empty data");
|
|
16
16
|
return body.data;
|
|
17
17
|
}
|
|
18
|
-
/** Ported from frontend
|
|
19
|
-
export const
|
|
20
|
-
query
|
|
21
|
-
|
|
22
|
-
where: {
|
|
18
|
+
/** Ported from frontend gov-pools subgraph `proposalInteractions` query. */
|
|
19
|
+
export const PROPOSAL_INTERACTIONS_QUERY = /* GraphQL */ `
|
|
20
|
+
query ProposalInteractions($proposalId: String!, $first: Int!, $skip: Int!) {
|
|
21
|
+
proposalInteractions(
|
|
22
|
+
where: { proposal: $proposalId }
|
|
23
23
|
first: $first
|
|
24
24
|
skip: $skip
|
|
25
25
|
orderBy: timestamp
|
|
26
26
|
orderDirection: desc
|
|
27
27
|
) {
|
|
28
28
|
id
|
|
29
|
-
|
|
30
|
-
isVoteFor
|
|
31
|
-
totalRawVoted
|
|
29
|
+
hash
|
|
32
30
|
timestamp
|
|
33
|
-
|
|
31
|
+
interactionType
|
|
32
|
+
totalVote
|
|
33
|
+
voter {
|
|
34
|
+
id
|
|
35
|
+
voter {
|
|
36
|
+
id
|
|
37
|
+
}
|
|
38
|
+
}
|
|
34
39
|
}
|
|
35
40
|
}
|
|
36
41
|
`;
|
package/dist/lib/subgraph.js.map
CHANGED
|
@@ -1 +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,
|
|
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,4EAA4E;AAC5E,MAAM,CAAC,MAAM,2BAA2B,GAAG,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBxD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daoDeploy.d.ts","sourceRoot":"","sources":["../../src/tools/daoDeploy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"daoDeploy.d.ts","sourceRoot":"","sources":["../../src/tools/daoDeploy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAyJhD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAGhF"}
|