dexe-mcp 0.8.3 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +156 -12
  2. package/README.md +6 -5
  3. package/dist/bootstrap.d.ts +14 -0
  4. package/dist/bootstrap.d.ts.map +1 -1
  5. package/dist/bootstrap.js +24 -2
  6. package/dist/bootstrap.js.map +1 -1
  7. package/dist/config.d.ts +22 -0
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +30 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/diag/checks.d.ts.map +1 -1
  12. package/dist/diag/checks.js +5 -4
  13. package/dist/diag/checks.js.map +1 -1
  14. package/dist/env/schema.d.ts +21 -0
  15. package/dist/env/schema.d.ts.map +1 -1
  16. package/dist/env/schema.js +21 -0
  17. package/dist/env/schema.js.map +1 -1
  18. package/dist/lib/amount.d.ts +23 -0
  19. package/dist/lib/amount.d.ts.map +1 -0
  20. package/dist/lib/amount.js +30 -0
  21. package/dist/lib/amount.js.map +1 -0
  22. package/dist/lib/broadcastGuards.d.ts +10 -0
  23. package/dist/lib/broadcastGuards.d.ts.map +1 -1
  24. package/dist/lib/broadcastGuards.js +11 -1
  25. package/dist/lib/broadcastGuards.js.map +1 -1
  26. package/dist/lib/controllingVoters.d.ts +44 -0
  27. package/dist/lib/controllingVoters.d.ts.map +1 -0
  28. package/dist/lib/controllingVoters.js +152 -0
  29. package/dist/lib/controllingVoters.js.map +1 -0
  30. package/dist/lib/dangerousSelectors.d.ts +1 -1
  31. package/dist/lib/dangerousSelectors.d.ts.map +1 -1
  32. package/dist/lib/dangerousSelectors.js +12 -22
  33. package/dist/lib/dangerousSelectors.js.map +1 -1
  34. package/dist/lib/decoders.d.ts +20 -0
  35. package/dist/lib/decoders.d.ts.map +1 -1
  36. package/dist/lib/decoders.js +52 -0
  37. package/dist/lib/decoders.js.map +1 -1
  38. package/dist/lib/govProposalView.d.ts +37 -0
  39. package/dist/lib/govProposalView.d.ts.map +1 -0
  40. package/dist/lib/govProposalView.js +42 -0
  41. package/dist/lib/govProposalView.js.map +1 -0
  42. package/dist/lib/ipfs.d.ts +14 -0
  43. package/dist/lib/ipfs.d.ts.map +1 -1
  44. package/dist/lib/ipfs.js +31 -1
  45. package/dist/lib/ipfs.js.map +1 -1
  46. package/dist/lib/markdownToSlate.d.ts +9 -0
  47. package/dist/lib/markdownToSlate.d.ts.map +1 -1
  48. package/dist/lib/markdownToSlate.js +24 -0
  49. package/dist/lib/markdownToSlate.js.map +1 -1
  50. package/dist/lib/multicall.d.ts.map +1 -1
  51. package/dist/lib/multicall.js +12 -2
  52. package/dist/lib/multicall.js.map +1 -1
  53. package/dist/lib/protocolAdvisories.d.ts +25 -0
  54. package/dist/lib/protocolAdvisories.d.ts.map +1 -0
  55. package/dist/lib/protocolAdvisories.js +46 -0
  56. package/dist/lib/protocolAdvisories.js.map +1 -0
  57. package/dist/lib/quorumRisk.d.ts +92 -0
  58. package/dist/lib/quorumRisk.d.ts.map +1 -0
  59. package/dist/lib/quorumRisk.js +159 -0
  60. package/dist/lib/quorumRisk.js.map +1 -0
  61. package/dist/lib/redact.d.ts +36 -0
  62. package/dist/lib/redact.d.ts.map +1 -0
  63. package/dist/lib/redact.js +72 -0
  64. package/dist/lib/redact.js.map +1 -0
  65. package/dist/lib/sanitize.d.ts +31 -0
  66. package/dist/lib/sanitize.d.ts.map +1 -0
  67. package/dist/lib/sanitize.js +51 -0
  68. package/dist/lib/sanitize.js.map +1 -0
  69. package/dist/lib/signer.d.ts +11 -0
  70. package/dist/lib/signer.d.ts.map +1 -1
  71. package/dist/lib/signer.js +16 -0
  72. package/dist/lib/signer.js.map +1 -1
  73. package/dist/lib/subgraph.d.ts +7 -0
  74. package/dist/lib/subgraph.d.ts.map +1 -1
  75. package/dist/lib/subgraph.js +24 -2
  76. package/dist/lib/subgraph.js.map +1 -1
  77. package/dist/rpc.d.ts.map +1 -1
  78. package/dist/rpc.js +2 -1
  79. package/dist/rpc.js.map +1 -1
  80. package/dist/tools/dao.d.ts.map +1 -1
  81. package/dist/tools/dao.js +2 -1
  82. package/dist/tools/dao.js.map +1 -1
  83. package/dist/tools/daoDeploy.d.ts.map +1 -1
  84. package/dist/tools/daoDeploy.js +32 -0
  85. package/dist/tools/daoDeploy.js.map +1 -1
  86. package/dist/tools/flow.d.ts +6 -0
  87. package/dist/tools/flow.d.ts.map +1 -1
  88. package/dist/tools/flow.js +149 -14
  89. package/dist/tools/flow.js.map +1 -1
  90. package/dist/tools/getConfig.d.ts.map +1 -1
  91. package/dist/tools/getConfig.js +2 -1
  92. package/dist/tools/getConfig.js.map +1 -1
  93. package/dist/tools/gov.d.ts.map +1 -1
  94. package/dist/tools/gov.js +41 -11
  95. package/dist/tools/gov.js.map +1 -1
  96. package/dist/tools/index.d.ts.map +1 -1
  97. package/dist/tools/index.js +2 -0
  98. package/dist/tools/index.js.map +1 -1
  99. package/dist/tools/otc.d.ts +32 -0
  100. package/dist/tools/otc.d.ts.map +1 -1
  101. package/dist/tools/otc.js +217 -74
  102. package/dist/tools/otc.js.map +1 -1
  103. package/dist/tools/proposalBuild.d.ts.map +1 -1
  104. package/dist/tools/proposalBuild.js +20 -5
  105. package/dist/tools/proposalBuild.js.map +1 -1
  106. package/dist/tools/proposalBuildComplex.d.ts.map +1 -1
  107. package/dist/tools/proposalBuildComplex.js +50 -11
  108. package/dist/tools/proposalBuildComplex.js.map +1 -1
  109. package/dist/tools/proposalBuildMore.d.ts.map +1 -1
  110. package/dist/tools/proposalBuildMore.js +12 -4
  111. package/dist/tools/proposalBuildMore.js.map +1 -1
  112. package/dist/tools/read.d.ts +1 -0
  113. package/dist/tools/read.d.ts.map +1 -1
  114. package/dist/tools/read.js +61 -18
  115. package/dist/tools/read.js.map +1 -1
  116. package/dist/tools/risk.d.ts +4 -0
  117. package/dist/tools/risk.d.ts.map +1 -0
  118. package/dist/tools/risk.js +255 -0
  119. package/dist/tools/risk.js.map +1 -0
  120. package/dist/tools/safe.d.ts.map +1 -1
  121. package/dist/tools/safe.js +13 -0
  122. package/dist/tools/safe.js.map +1 -1
  123. package/dist/tools/subgraph.d.ts.map +1 -1
  124. package/dist/tools/subgraph.js +19 -15
  125. package/dist/tools/subgraph.js.map +1 -1
  126. package/dist/tools/txSend.d.ts +6 -0
  127. package/dist/tools/txSend.d.ts.map +1 -1
  128. package/dist/tools/txSend.js +26 -3
  129. package/dist/tools/txSend.js.map +1 -1
  130. package/dist/tools/voteBuild.d.ts.map +1 -1
  131. package/dist/tools/voteBuild.js +40 -25
  132. package/dist/tools/voteBuild.js.map +1 -1
  133. package/package.json +2 -2
@@ -12,6 +12,27 @@ export const ENV_SPEC = {
12
12
  example: "",
13
13
  doc: "Override the DeXe-Protocol checkout path. Auto-managed when unset.",
14
14
  },
15
+ DEXE_MIN_SAFE_QUORUM_PCT: {
16
+ schema: intStr.optional(),
17
+ category: "core",
18
+ required: false,
19
+ example: "50",
20
+ doc: "Minimum safe quorum percent (0–100). Quorum below this is flagged as a governance-safety risk for treasury-moving proposals. Default 50.",
21
+ },
22
+ DEXE_TREASURY_GUARD: {
23
+ schema: z.enum(["off", "warn"]).optional(),
24
+ category: "core",
25
+ required: false,
26
+ example: "warn",
27
+ doc: "Treasury-safety advisory posture: off | warn. 'warn' (default) emits advisories/alerts everywhere (build, deploy, execute, risk_assess) but NEVER blocks; 'off' silences them.",
28
+ },
29
+ DEXE_CONTROLLING_TOPN: {
30
+ schema: intStr.optional(),
31
+ category: "core",
32
+ required: false,
33
+ example: "5",
34
+ doc: "Top-N token holders (by voting weight) in the treasury-guard controlling set, alongside validators. The guard checks whether ≥1 member voted For. Subgraph/mainnet-only. Default 5.",
35
+ },
15
36
  // ─── rpc ──────────────────────────────────────────────────────────────────
16
37
  DEXE_RPC_URL: {
17
38
  schema: optionalUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/env/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/env/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Strict parsing of user-supplied unsigned-integer (wei / id) strings.
3
+ *
4
+ * `BigInt()` silently accepts inputs that are almost never what the caller
5
+ * intended, producing a structurally-valid but semantically-wrong calldata:
6
+ *
7
+ * BigInt("") === 0n → a blank amount field becomes a 0-value tx
8
+ * BigInt(" ") === 0n → whitespace likewise coerces to 0
9
+ * BigInt("0x10") === 16n → a hex string is reinterpreted as a number
10
+ * BigInt("-5") === -5n → a negative wraps to a huge uint256 on-chain
11
+ *
12
+ * and `BigInt("1.5")` throws an opaque `SyntaxError` with no field context.
13
+ *
14
+ * This guard accepts only a plain base-10, non-negative integer string and
15
+ * returns the parsed `bigint`; otherwise it throws a clear, field-named error.
16
+ * Builders run inside the MCP tool callback, so a throw surfaces to the caller
17
+ * as a normal error result rather than a silent mis-encode.
18
+ *
19
+ * Use this everywhere a user-provided amount / id / nftId string flows into
20
+ * `BigInt(...)` before being encoded into transaction calldata.
21
+ */
22
+ export declare function parseUintString(value: string, field?: string): bigint;
23
+ //# sourceMappingURL=amount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount.d.ts","sourceRoot":"","sources":["../../src/lib/amount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAW,GAAG,MAAM,CASvE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Strict parsing of user-supplied unsigned-integer (wei / id) strings.
3
+ *
4
+ * `BigInt()` silently accepts inputs that are almost never what the caller
5
+ * intended, producing a structurally-valid but semantically-wrong calldata:
6
+ *
7
+ * BigInt("") === 0n → a blank amount field becomes a 0-value tx
8
+ * BigInt(" ") === 0n → whitespace likewise coerces to 0
9
+ * BigInt("0x10") === 16n → a hex string is reinterpreted as a number
10
+ * BigInt("-5") === -5n → a negative wraps to a huge uint256 on-chain
11
+ *
12
+ * and `BigInt("1.5")` throws an opaque `SyntaxError` with no field context.
13
+ *
14
+ * This guard accepts only a plain base-10, non-negative integer string and
15
+ * returns the parsed `bigint`; otherwise it throws a clear, field-named error.
16
+ * Builders run inside the MCP tool callback, so a throw surfaces to the caller
17
+ * as a normal error result rather than a silent mis-encode.
18
+ *
19
+ * Use this everywhere a user-provided amount / id / nftId string flows into
20
+ * `BigInt(...)` before being encoded into transaction calldata.
21
+ */
22
+ export function parseUintString(value, field = "amount") {
23
+ if (typeof value !== "string" || !/^[0-9]+$/.test(value)) {
24
+ throw new Error(`Invalid ${field}: ${JSON.stringify(value)}. ` +
25
+ `Expected a base-10 wei/id integer string — digits only, ` +
26
+ `no decimals, hex (0x…), sign, whitespace, or empty value.`);
27
+ }
28
+ return BigInt(value);
29
+ }
30
+ //# sourceMappingURL=amount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount.js","sourceRoot":"","sources":["../../src/lib/amount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAK,GAAG,QAAQ;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,WAAW,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI;YAC5C,0DAA0D;YAC1D,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
@@ -35,6 +35,16 @@ export declare class BroadcastGuardError extends Error {
35
35
  }
36
36
  /** Reset the B10 window. Test-only. */
37
37
  export declare function __resetBroadcastWindow(): void;
38
+ /**
39
+ * B6 + B7: the stateless destination-allowlist and value-cap checks. Unlike B9
40
+ * (sim) and B10 (rate limit), these are safe to apply to ANY signed/queued tx —
41
+ * including a Safe-TX-Service propose (L-1), which previously signed and queued
42
+ * without any guard.
43
+ */
44
+ export declare function assertAllowlistAndValueCap(tx: {
45
+ to: string;
46
+ value: string;
47
+ }, cfg: DexeConfig): void;
38
48
  export declare function runBroadcastGuards(tx: BroadcastTx, cfg: DexeConfig, opts?: {
39
49
  skipSimulation?: boolean;
40
50
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"broadcastGuards.d.ts","sourceRoot":"","sources":["../../src/lib/broadcastGuards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yFAAyF;AACzF,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM;CAKlB;AASD,uCAAuC;AACvC,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
1
+ {"version":3,"file":"broadcastGuards.d.ts","sourceRoot":"","sources":["../../src/lib/broadcastGuards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yFAAyF;AACzF,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM;CAKlB;AASD,uCAAuC;AACvC,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAwBnG;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,UAAU,EACf,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -20,7 +20,13 @@ const broadcastTimestamps = [];
20
20
  export function __resetBroadcastWindow() {
21
21
  broadcastTimestamps.length = 0;
22
22
  }
23
- export async function runBroadcastGuards(tx, cfg, opts) {
23
+ /**
24
+ * B6 + B7: the stateless destination-allowlist and value-cap checks. Unlike B9
25
+ * (sim) and B10 (rate limit), these are safe to apply to ANY signed/queued tx —
26
+ * including a Safe-TX-Service propose (L-1), which previously signed and queued
27
+ * without any guard.
28
+ */
29
+ export function assertAllowlistAndValueCap(tx, cfg) {
24
30
  // ---- B6: destination allowlist ----------------------------------------
25
31
  if (cfg.signerAllowlist && cfg.signerAllowlist.length > 0) {
26
32
  const to = tx.to.toLowerCase();
@@ -37,6 +43,10 @@ export async function runBroadcastGuards(tx, cfg, opts) {
37
43
  `Refusing to broadcast.`);
38
44
  }
39
45
  }
46
+ }
47
+ export async function runBroadcastGuards(tx, cfg, opts) {
48
+ // ---- B6 + B7: destination allowlist & value cap -----------------------
49
+ assertAllowlistAndValueCap(tx, cfg);
40
50
  // ---- B9: auto-simulation (eth_call preflight) -------------------------
41
51
  // Reuses the shared sim core; aborts before spending gas if the call would
42
52
  // revert. Must run against the SAME chain the broadcast targets — otherwise
@@ -1 +1 @@
1
- {"version":3,"file":"broadcastGuards.js","sourceRoot":"","sources":["../../src/lib/broadcastGuards.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"broadcastGuards.js","sourceRoot":"","sources":["../../src/lib/broadcastGuards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Controlling-holder participation signal for the treasury-safety advisory.
3
+ *
4
+ * Resolves whether at least one member of a DAO's "controlling set" voted For a
5
+ * given proposal. The controlling set (a product decision) is:
6
+ * validators ∪ top-N token holders by voting weight.
7
+ * "Voted For" is lenient: ≥1 member among the For-voters ⇒ `true`.
8
+ *
9
+ * Posture: **fail-soft, never throws.** Any missing subgraph, non-mainnet chain,
10
+ * empty set, or subgraph/RPC error ⇒ `null` (unknown). Informational only — a
11
+ * `false` (set non-empty, nobody voted For) adds an advisory note; it never
12
+ * blocks. We only return `false` when we positively enumerated the set AND
13
+ * confirmed no member voted For on-chain.
14
+ *
15
+ * The set is enumerated via subgraph (cheap, but untrusted for vote direction);
16
+ * each member's vote direction is then confirmed ON-CHAIN via
17
+ * `GovPool.getTotalVotes` (authoritative). We OR across PersonalVote /
18
+ * MicropoolVote / DelegatedVote so a member who voted via delegation or a
19
+ * micropool is not mistaken for a non-voter.
20
+ */
21
+ import { type JsonRpcProvider } from "ethers";
22
+ import type { DexeConfig } from "../config.js";
23
+ /**
24
+ * Identical to the fragment in src/tools/vote.ts / src/tools/inbox.ts. Kept
25
+ * local + exported so the unit test can assert ethers parses it (ethers
26
+ * silently drops malformed fragments — see govProposalView Phase-A gotcha).
27
+ */
28
+ export declare const GET_TOTAL_VOTES_FRAGMENT = "function getTotalVotes(uint256 proposalId, address voter, uint8 voteType) view returns (uint256 totalVoted, uint256 totalRawVoted, uint256 votesForNow, bool isVoteFor)";
29
+ /**
30
+ * Did ≥1 controlling-set member vote For proposal `proposalId`?
31
+ * - `true` — at least one member voted For (any vote type).
32
+ * - `false` — set was enumerated, non-empty, and NONE voted For.
33
+ * - `null` — cannot determine (no subgraph / non-mainnet / empty set / error).
34
+ * Never throws.
35
+ */
36
+ export declare function resolveControllingHoldersVotedFor(args: {
37
+ provider: JsonRpcProvider;
38
+ govPool: string;
39
+ proposalId: number;
40
+ cfg: DexeConfig;
41
+ chainId: number;
42
+ topN?: number;
43
+ }): Promise<boolean | null>;
44
+ //# sourceMappingURL=controllingVoters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controllingVoters.d.ts","sourceRoot":"","sources":["../../src/lib/controllingVoters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAC;AAGzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,4KACsI,CAAC;AA+E5K;;;;;;GAMG;AACH,wBAAsB,iCAAiC,CAAC,IAAI,EAAE;IAC5D,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CA6C1B"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Controlling-holder participation signal for the treasury-safety advisory.
3
+ *
4
+ * Resolves whether at least one member of a DAO's "controlling set" voted For a
5
+ * given proposal. The controlling set (a product decision) is:
6
+ * validators ∪ top-N token holders by voting weight.
7
+ * "Voted For" is lenient: ≥1 member among the For-voters ⇒ `true`.
8
+ *
9
+ * Posture: **fail-soft, never throws.** Any missing subgraph, non-mainnet chain,
10
+ * empty set, or subgraph/RPC error ⇒ `null` (unknown). Informational only — a
11
+ * `false` (set non-empty, nobody voted For) adds an advisory note; it never
12
+ * blocks. We only return `false` when we positively enumerated the set AND
13
+ * confirmed no member voted For on-chain.
14
+ *
15
+ * The set is enumerated via subgraph (cheap, but untrusted for vote direction);
16
+ * each member's vote direction is then confirmed ON-CHAIN via
17
+ * `GovPool.getTotalVotes` (authoritative). We OR across PersonalVote /
18
+ * MicropoolVote / DelegatedVote so a member who voted via delegation or a
19
+ * micropool is not mistaken for a non-voter.
20
+ */
21
+ import { Interface } from "ethers";
22
+ import { multicall } from "./multicall.js";
23
+ import { gqlRequest } from "./subgraph.js";
24
+ /**
25
+ * Identical to the fragment in src/tools/vote.ts / src/tools/inbox.ts. Kept
26
+ * local + exported so the unit test can assert ethers parses it (ethers
27
+ * silently drops malformed fragments — see govProposalView Phase-A gotcha).
28
+ */
29
+ export const GET_TOTAL_VOTES_FRAGMENT = "function getTotalVotes(uint256 proposalId, address voter, uint8 voteType) view returns (uint256 totalVoted, uint256 totalRawVoted, uint256 votesForNow, bool isVoteFor)";
30
+ /** PersonalVote=0, MicropoolVote=1, DelegatedVote=2 (TreasuryVote=3 omitted). */
31
+ const VOTE_TYPES = [0, 1, 2];
32
+ /** Default top-N token holders when neither arg nor config overrides it. */
33
+ const DEFAULT_TOP_N = 5;
34
+ /** Trimmed from src/tools/subgraph.ts VALIDATORS_QUERY (fields we need only). */
35
+ const VALIDATORS_QUERY = /* GraphQL */ `
36
+ query getDaoPoolValidators($offset: Int!, $limit: Int!, $address: String!) {
37
+ validatorInPools(
38
+ skip: $offset
39
+ first: $limit
40
+ orderBy: balance
41
+ orderDirection: desc
42
+ where: { pool: $address }
43
+ ) {
44
+ validatorAddress
45
+ }
46
+ }
47
+ `;
48
+ /** Trimmed from src/tools/subgraph.ts DAO_MEMBERS_QUERY (fields we need only). */
49
+ const DAO_MEMBERS_QUERY = /* GraphQL */ `
50
+ query getVotersInPool($poolId: String!, $offset: Int!, $limit: Int!) {
51
+ voterInPools(skip: $offset, first: $limit, where: { pool: $poolId }) {
52
+ receivedDelegation
53
+ voter {
54
+ id
55
+ totalVotes
56
+ }
57
+ }
58
+ }
59
+ `;
60
+ function toBig(s) {
61
+ try {
62
+ return s ? BigInt(s) : 0n;
63
+ }
64
+ catch {
65
+ return 0n;
66
+ }
67
+ }
68
+ /** Validator addresses for `pool` (lowercased). Fail-soft → []. */
69
+ async function fetchValidators(cfg, pool) {
70
+ try {
71
+ const data = await gqlRequest(cfg.subgraphValidatorsUrl, VALIDATORS_QUERY, { offset: 0, limit: 100, address: pool });
72
+ return (data.validatorInPools ?? [])
73
+ .map((v) => v.validatorAddress?.toLowerCase())
74
+ .filter((a) => !!a);
75
+ }
76
+ catch {
77
+ return [];
78
+ }
79
+ }
80
+ /** Top-N holders by (totalVotes + receivedDelegation), lowercased. Fail-soft → []. */
81
+ async function fetchTopHolders(cfg, pool, topN) {
82
+ try {
83
+ const data = await gqlRequest(cfg.subgraphPoolsUrl, DAO_MEMBERS_QUERY, { poolId: pool, offset: 0, limit: 50 });
84
+ const weighted = (data.voterInPools ?? [])
85
+ .map((r) => ({
86
+ addr: r.voter?.id?.toLowerCase(),
87
+ weight: toBig(r.voter?.totalVotes) + toBig(r.receivedDelegation),
88
+ }))
89
+ .filter((x) => !!x.addr);
90
+ weighted.sort((a, b) => (a.weight < b.weight ? 1 : a.weight > b.weight ? -1 : 0));
91
+ return weighted.slice(0, Math.max(0, topN)).map((x) => x.addr);
92
+ }
93
+ catch {
94
+ return [];
95
+ }
96
+ }
97
+ /**
98
+ * Did ≥1 controlling-set member vote For proposal `proposalId`?
99
+ * - `true` — at least one member voted For (any vote type).
100
+ * - `false` — set was enumerated, non-empty, and NONE voted For.
101
+ * - `null` — cannot determine (no subgraph / non-mainnet / empty set / error).
102
+ * Never throws.
103
+ */
104
+ export async function resolveControllingHoldersVotedFor(args) {
105
+ const { provider, govPool, proposalId, cfg, chainId } = args;
106
+ const topN = args.topN ?? cfg.controllingTopN ?? DEFAULT_TOP_N;
107
+ // Gate: subgraph exists only on mainnet (56). Testnet (97) ⇒ unknown.
108
+ if (chainId !== 56)
109
+ return null;
110
+ if (!cfg.subgraphValidatorsUrl || !cfg.subgraphPoolsUrl)
111
+ return null;
112
+ const pool = govPool.toLowerCase();
113
+ // Enumerate each source independently — a transient failure of one source
114
+ // only shrinks the set, which can only make `false` LESS likely (the safe
115
+ // direction: fewer wrongful refuses).
116
+ const [validators, holders] = await Promise.all([
117
+ fetchValidators(cfg, pool),
118
+ fetchTopHolders(cfg, pool, topN),
119
+ ]);
120
+ const members = [...new Set([...validators, ...holders])];
121
+ if (members.length === 0)
122
+ return null;
123
+ try {
124
+ const iface = new Interface([GET_TOTAL_VOTES_FRAGMENT]);
125
+ const calls = [];
126
+ for (const member of members) {
127
+ for (const vt of VOTE_TYPES) {
128
+ calls.push({
129
+ target: govPool,
130
+ iface,
131
+ method: "getTotalVotes",
132
+ args: [proposalId, member, vt],
133
+ allowFailure: true,
134
+ });
135
+ }
136
+ }
137
+ const results = await multicall(provider, calls);
138
+ for (const r of results) {
139
+ if (!r.success || r.value == null)
140
+ continue;
141
+ // getTotalVotes returns a 4-tuple: [totalVoted, totalRawVoted, votesForNow, isVoteFor]
142
+ const v = r.value;
143
+ if (v[2] > 0n && v[3] === true)
144
+ return true;
145
+ }
146
+ return false; // set non-empty, confirmed nobody voted For
147
+ }
148
+ catch {
149
+ return null; // RPC/decoding failure ⇒ unknown, never a refuse
150
+ }
151
+ }
152
+ //# sourceMappingURL=controllingVoters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controllingVoters.js","sourceRoot":"","sources":["../../src/lib/controllingVoters.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export declare function selectorOf(data: string): string | null;
11
11
  * denylisted, else null. `data` is raw calldata (0x-hex).
12
12
  */
13
13
  export declare function findForbiddenSelector(data: string): ForbiddenSelector | null;
14
- /** Human-readable hard-refusal explaining why the selector is blocked (C-2). */
14
+ /** Human-readable hard-refusal explaining why the selector is blocked. */
15
15
  export declare function dangerousSelectorError(match: ForbiddenSelector, target?: string): string;
16
16
  /** The full denylist — for docs, tests, and introspection. */
17
17
  export declare function forbiddenSelectors(): ForbiddenSelector[];
@@ -1 +1 @@
1
- {"version":3,"file":"dangerousSelectors.d.ts","sourceRoot":"","sources":["../../src/lib/dangerousSelectors.ts"],"names":[],"mappings":"AAyCA,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAI5E;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAYxF;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CAExD"}
1
+ {"version":3,"file":"dangerousSelectors.d.ts","sourceRoot":"","sources":["../../src/lib/dangerousSelectors.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAI5E;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAUxF;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CAExD"}
@@ -1,27 +1,19 @@
1
1
  import { id } from "ethers";
2
2
  /**
3
- * C-2 guardrailforbidden proposal-action selectors.
3
+ * Forbidden proposal-action selectorshard guard.
4
4
  *
5
5
  * Every function below lives on `GovUserKeeper` and is `onlyOwner` (the owner is
6
6
  * the GovPool). GovPool invokes them internally on behalf of users through its
7
7
  * own deposit/withdraw/delegate entrypoints — they are NOT meant to be the
8
8
  * `executor` + `data` of a raw governance proposal action.
9
9
  *
10
- * They are dangerous as proposal targets because the `payer` / `delegator`
11
- * argument is decoupled from the funds' owner: e.g.
12
- * `withdrawTokens(payer, receiver, amount)` debits `_usersInfo[payer]` and pays
13
- * `receiver`. A proposal can therefore name an arbitrary victim as `payer` and
14
- * the attacker as `receiver`.
15
- *
16
- * The DeXe protocol's INTERNAL allowlist
17
- * (`GovPoolCreate._handleDataForInternalProposal`) is supposed to make these
18
- * unreachable-by-proposal, but it only runs when the *last* action's executor is
19
- * a registered INTERNAL executor. A proposal whose trailing action routes to
20
- * DEFAULT skips the allowlist entirely, so these selectors slip through —
21
- * finding C-2. This guard refuses to build any proposal action carrying one of
22
- * them, regardless of routing. It is harm-reduction at the MCP layer ONLY: the
23
- * root cause is in the protocol contracts, and an attacker can still hand-craft
24
- * the calldata. See docs/security/C2-default-routing-bypass.md.
10
+ * They are unsafe as proposal targets because the `payer` / `delegator`
11
+ * argument is decoupled from the funds' owner (e.g. `withdrawTokens(payer,
12
+ * receiver, amount)` debits `payer` and pays `receiver`), so a proposal could
13
+ * name an account other than the proposer. This guard refuses to build any
14
+ * proposal action carrying one of these selectors. Defense-in-depth at the MCP
15
+ * layer; users deposit/withdraw/delegate their OWN funds through the GovPool
16
+ * entrypoints, never via a proposal.
25
17
  */
26
18
  const FORBIDDEN_SIGNATURES = [
27
19
  "withdrawTokens(address,address,uint256)",
@@ -61,17 +53,15 @@ export function findForbiddenSelector(data) {
61
53
  return null;
62
54
  return FORBIDDEN_BY_SELECTOR.get(sel) ?? null;
63
55
  }
64
- /** Human-readable hard-refusal explaining why the selector is blocked (C-2). */
56
+ /** Human-readable hard-refusal explaining why the selector is blocked. */
65
57
  export function dangerousSelectorError(match, target) {
66
58
  return (`Refusing to build: calldata selector ${match.selector} is ` +
67
59
  `GovUserKeeper.${match.signature}, a privileged onlyOwner accounting function ` +
68
60
  `that must never be a governance proposal action` +
69
61
  (target ? ` (target ${target})` : "") +
70
- `. Encoding it enables finding C-2: a DEFAULT-routed proposal bypasses the ` +
71
- `GovPoolCreate INTERNAL allowlist and can drain an arbitrary depositor's ` +
72
- `unlocked balance the function takes a free 'payer'/'delegator' decoupled ` +
73
- `from the caller. Users deposit/withdraw/delegate their OWN funds through the ` +
74
- `GovPool entrypoints, never via a proposal. Hard block, no override.`);
62
+ `. These functions take a 'payer'/'delegator' argument decoupled from the ` +
63
+ `caller; users deposit/withdraw/delegate their OWN funds through the GovPool ` +
64
+ `entrypoints, never via a proposal. Hard block, no override.`);
75
65
  }
76
66
  /** The full denylist — for docs, tests, and introspection. */
77
67
  export function forbiddenSelectors() {
@@ -1 +1 @@
1
- {"version":3,"file":"dangerousSelectors.js","sourceRoot":"","sources":["../../src/lib/dangerousSelectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,oBAAoB,GAAG;IAC3B,yCAAyC;IACzC,wCAAwC;IACxC,yCAAyC;IACzC,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;IAC3C,yCAAyC;IACzC,wCAAwC;IACxC,yCAAyC;IACzC,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;CACnC,CAAC;AASX;;;GAGG;AACH,MAAM,qBAAqB,GAA2C,IAAI,GAAG,CAC3E,oBAAoB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAU,CAAC;AACtD,CAAC,CAAC,CACH,CAAC;AAEF,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,KAAwB,EAAE,MAAe;IAC9E,OAAO,CACL,wCAAwC,KAAK,CAAC,QAAQ,MAAM;QAC5D,iBAAiB,KAAK,CAAC,SAAS,+CAA+C;QAC/E,iDAAiD;QACjD,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,4EAA4E;QAC5E,0EAA0E;QAC1E,6EAA6E;QAC7E,+EAA+E;QAC/E,qEAAqE,CACtE,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"dangerousSelectors.js","sourceRoot":"","sources":["../../src/lib/dangerousSelectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,oBAAoB,GAAG;IAC3B,yCAAyC;IACzC,wCAAwC;IACxC,yCAAyC;IACzC,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;IAC3C,yCAAyC;IACzC,wCAAwC;IACxC,yCAAyC;IACzC,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;CACnC,CAAC;AASX;;;GAGG;AACH,MAAM,qBAAqB,GAA2C,IAAI,GAAG,CAC3E,oBAAoB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAU,CAAC;AACtD,CAAC,CAAC,CACH,CAAC;AAEF,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB,CAAC,KAAwB,EAAE,MAAe;IAC9E,OAAO,CACL,wCAAwC,KAAK,CAAC,QAAQ,MAAM;QAC5D,iBAAiB,KAAK,CAAC,SAAS,+CAA+C;QAC/E,iDAAiD;QACjD,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,2EAA2E;QAC3E,8EAA8E;QAC9E,6DAA6D,CAC9D,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -10,6 +10,14 @@ export interface DecodedCall {
10
10
  args: Record<string, unknown>;
11
11
  /** Raw positional args — useful for agents that want the tuple directly. */
12
12
  argsArray: unknown[];
13
+ /** True if this selector is a privileged accounting function (unsafe as a proposal action). */
14
+ privileged?: boolean;
15
+ /**
16
+ * Calls discovered inside this call's calldata args — e.g. the inner calls of
17
+ * a `multicall(bytes[])`, or the actions of a nested `createProposal`. Lets a
18
+ * reviewer see hidden privileged calls instead of just the wrapper.
19
+ */
20
+ nested?: DecodedCall[];
13
21
  }
14
22
  export interface DecodedProposalAction {
15
23
  side: "for" | "against";
@@ -28,10 +36,22 @@ export declare class CalldataDecoder {
28
36
  * is tried. Otherwise every artifact whose selector matches is tried in
29
37
  * turn; the first successful parse wins (with alternatives in `.alternatives`).
30
38
  */
39
+ static readonly MAX_NEST_DEPTH = 4;
40
+ /**
41
+ * Decode calldata and recursively unwrap any well-formed nested calldata
42
+ * found in its arguments — `multicall(bytes[])`, a nested `createProposal`'s
43
+ * `ProposalAction[]`, `tryExecute`, etc. The decoded `primary` carries a
44
+ * `privileged` flag for privileged-class selectors and a `nested` tree so a
45
+ * reviewer reading the text sees hidden inner calls, not just the wrapper.
46
+ */
31
47
  decodeCalldata(data: string, contractName?: string): {
32
48
  primary: DecodedCall | null;
33
49
  alternatives: DecodedCall[];
34
50
  };
51
+ private decodeEnriched;
52
+ /** Walk decoded args; recurse into any value that is itself well-formed calldata. */
53
+ private collectNested;
54
+ private decodeOnce;
35
55
  /**
36
56
  * Given a ProposalAction tuple, find the executor contract and decode `data`
37
57
  * against its ABI. Strategy: try to find an artifact whose runtime bytecode
@@ -1 +1 @@
1
- {"version":3,"file":"decoders.d.ts","sourceRoot":"","sources":["../../src/lib/decoders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,iGAAiG;IACjG,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,4EAA4E;IAC5E,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,aAAa;IAG3C;;;;OAIG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB;QAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,YAAY,EAAE,WAAW,EAAE,CAAA;KAAE;IA4C/D;;;;;;;;OAQG;IACH,oBAAoB,CAAC,MAAM,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;KACzB,GAAG,qBAAqB;CAU1B"}
1
+ {"version":3,"file":"decoders.d.ts","sourceRoot":"","sources":["../../src/lib/decoders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,MAAM,WAAW,WAAW;IAC1B,iGAAiG;IACjG,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,4EAA4E;IAC5E,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,aAAa;IAG3C;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,cAAc,KAAK;IAEnC;;;;;;OAMG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB;QAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,YAAY,EAAE,WAAW,EAAE,CAAA;KAAE;IAI/D,OAAO,CAAC,cAAc;IAiBtB,qFAAqF;IACrF,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,UAAU;IA+ClB;;;;;;;;OAQG;IACH,oBAAoB,CAAC,MAAM,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;KACzB,GAAG,qBAAqB;CAU1B"}
@@ -1,4 +1,5 @@
1
1
  import { Interface } from "ethers";
2
+ import { findForbiddenSelector } from "./dangerousSelectors.js";
2
3
  export class CalldataDecoder {
3
4
  artifacts;
4
5
  selectors;
@@ -11,7 +12,46 @@ export class CalldataDecoder {
11
12
  * is tried. Otherwise every artifact whose selector matches is tried in
12
13
  * turn; the first successful parse wins (with alternatives in `.alternatives`).
13
14
  */
15
+ static MAX_NEST_DEPTH = 4;
16
+ /**
17
+ * Decode calldata and recursively unwrap any well-formed nested calldata
18
+ * found in its arguments — `multicall(bytes[])`, a nested `createProposal`'s
19
+ * `ProposalAction[]`, `tryExecute`, etc. The decoded `primary` carries a
20
+ * `privileged` flag for privileged-class selectors and a `nested` tree so a
21
+ * reviewer reading the text sees hidden inner calls, not just the wrapper.
22
+ */
14
23
  decodeCalldata(data, contractName) {
24
+ return this.decodeEnriched(data, contractName, 0);
25
+ }
26
+ decodeEnriched(data, contractName, depth) {
27
+ const res = this.decodeOnce(data, contractName);
28
+ if (res.primary) {
29
+ res.primary.privileged = findForbiddenSelector(res.primary.selector) != null;
30
+ if (depth < CalldataDecoder.MAX_NEST_DEPTH) {
31
+ const nested = [];
32
+ this.collectNested(res.primary.argsArray, depth + 1, nested);
33
+ if (nested.length > 0)
34
+ res.primary.nested = nested;
35
+ }
36
+ }
37
+ return res;
38
+ }
39
+ /** Walk decoded args; recurse into any value that is itself well-formed calldata. */
40
+ collectNested(value, depth, out) {
41
+ if (typeof value === "string") {
42
+ if (looksLikeCalldata(value)) {
43
+ const r = this.decodeEnriched(value, undefined, depth);
44
+ if (r.primary)
45
+ out.push(r.primary);
46
+ }
47
+ return;
48
+ }
49
+ if (Array.isArray(value)) {
50
+ for (const el of value)
51
+ this.collectNested(el, depth, out);
52
+ }
53
+ }
54
+ decodeOnce(data, contractName) {
15
55
  if (!data || data.length < 10 || !data.startsWith("0x")) {
16
56
  return { primary: null, alternatives: [] };
17
57
  }
@@ -119,4 +159,16 @@ function normalize(v) {
119
159
  }
120
160
  return v;
121
161
  }
162
+ /**
163
+ * Heuristic: does `v` look like ABI calldata (a 4-byte selector followed by
164
+ * whole 32-byte words)? This filters out addresses (20 bytes), bytes32 hashes,
165
+ * and arbitrary blobs, so recursion only follows real nested calls.
166
+ */
167
+ function looksLikeCalldata(v) {
168
+ if (!/^0x[0-9a-fA-F]+$/.test(v))
169
+ return false;
170
+ if (v.length < 10)
171
+ return false; // need at least the 4-byte selector
172
+ return (v.length - 10) % 64 === 0; // selector + N 32-byte words
173
+ }
122
174
  //# sourceMappingURL=decoders.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decoders.js","sourceRoot":"","sources":["../../src/lib/decoders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decoders.js","sourceRoot":"","sources":["../../src/lib/decoders.ts"],"names":[],"mappings":"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"}