@muhaven/mcp 0.2.5 → 0.2.6

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 CHANGED
@@ -7,6 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.6] — 2026-05-23
11
+
12
+ ### Fixed
13
+
14
+ - **`PLACEHOLDER_SIGNATURE` uses exact `@zerodev/sdk::DUMMY_ECDSA_SIG`
15
+ bytes** — NOT random `0xfe`-filled high-entropy bytes (the 0.2.5
16
+ regression). Per `@zerodev/permissions::toPermissionValidator.js`,
17
+ the canonical stub signature for paymaster simulation is:
18
+
19
+ concat(["0xff", signer.getDummySignature()])
20
+ ↓ ↓
21
+ "use root permission" DUMMY_ECDSA_SIG = "0xfffffff...7aa...aaa...1c"
22
+
23
+ The DUMMY_ECDSA_SIG is a CRAFTED 65-byte pattern (r is high-end of
24
+ secp256k1's field, s is `7aa...aaa`, v is `0x1c`) that the
25
+ PermissionValidator's `validateUserOp` simulation path recognizes
26
+ as a stub and skips real ecrecover. 0.2.5 had the right length (66
27
+ bytes) and the right `0xff` prefix, but filled the trailing 65
28
+ bytes with random `0xfe` — the validator ecrecovers them as if
29
+ real, gets a garbage address that doesn't match the bound session-
30
+ key, reverts with `AA23` → paymaster returns rpc_error → MCP maps
31
+ to `paymaster_rejected`.
32
+
33
+ The new `pathDFallbackDetail` echo (0.2.5) made this trivially
34
+ diagnosable on the very next smoke iteration — the surfaced
35
+ message was `zd_sponsorUserOperation → HTTP 400 → AA23 reverted`
36
+ which pinned the validator-revert layer.
37
+
38
+ Verified 2026-05-23 against `@zerodev/sdk@5.5.10`'s
39
+ `_cjs/constants.js::DUMMY_ECDSA_SIG` and
40
+ `@zerodev/permissions/_cjs/toPermissionValidator.js::getStubSignature`.
41
+
42
+ Regression tests pin: byte length (66), `0xff` prefix, trailing
43
+ 65-byte byte-for-byte match against DUMMY_ECDSA_SIG, v=0x1c,
44
+ s-component magic pattern (rejecting the 0.2.5 `0xfe`-filled
45
+ shape).
46
+
10
47
  ## [0.2.5] — 2026-05-23
11
48
 
12
49
  ### Fixed
package/dist/broker.cjs CHANGED
@@ -2783,7 +2783,7 @@ function printUsage() {
2783
2783
  }
2784
2784
  function getBrokerPackageVersion() {
2785
2785
  {
2786
- return "0.2.5";
2786
+ return "0.2.6";
2787
2787
  }
2788
2788
  }
2789
2789
  function printVersion() {
package/dist/broker.js CHANGED
@@ -2785,7 +2785,7 @@ function printUsage() {
2785
2785
  }
2786
2786
  function getBrokerPackageVersion() {
2787
2787
  {
2788
- return "0.2.5";
2788
+ return "0.2.6";
2789
2789
  }
2790
2790
  }
2791
2791
  function printVersion() {
package/dist/index.cjs CHANGED
@@ -1923,7 +1923,8 @@ var SUBSCRIPTION_PURCHASE_SELECTOR = viem.toFunctionSelector(
1923
1923
  var SUBSCRIPTION_PURCHASE_ABI = viem.parseAbi([
1924
1924
  "function purchase(address token, (uint256 ctHash, uint8 securityZone, uint8 utype, bytes signature) encShares, uint128 maxSharesHint, address ephemeralEOA)"
1925
1925
  ]);
1926
- var PLACEHOLDER_SIGNATURE = "0xff" + "fe".repeat(65);
1926
+ var ZERODEV_DUMMY_ECDSA_SIG = "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c";
1927
+ var PLACEHOLDER_SIGNATURE = `0xff${ZERODEV_DUMMY_ECDSA_SIG.slice(2)}`;
1927
1928
  function ok(data) {
1928
1929
  return { ok: true, data };
1929
1930
  }
@@ -3056,7 +3057,7 @@ var SERVER_NAME = "@muhaven/mcp";
3056
3057
  var SERVER_VERSION = resolveServerVersion();
3057
3058
  function resolveServerVersion() {
3058
3059
  {
3059
- return "0.2.5";
3060
+ return "0.2.6";
3060
3061
  }
3061
3062
  }
3062
3063
  function toJsonInputSchema(schema) {
package/dist/index.js CHANGED
@@ -1919,7 +1919,8 @@ var SUBSCRIPTION_PURCHASE_SELECTOR = toFunctionSelector(
1919
1919
  var SUBSCRIPTION_PURCHASE_ABI = parseAbi([
1920
1920
  "function purchase(address token, (uint256 ctHash, uint8 securityZone, uint8 utype, bytes signature) encShares, uint128 maxSharesHint, address ephemeralEOA)"
1921
1921
  ]);
1922
- var PLACEHOLDER_SIGNATURE = "0xff" + "fe".repeat(65);
1922
+ var ZERODEV_DUMMY_ECDSA_SIG = "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c";
1923
+ var PLACEHOLDER_SIGNATURE = `0xff${ZERODEV_DUMMY_ECDSA_SIG.slice(2)}`;
1923
1924
  function ok(data) {
1924
1925
  return { ok: true, data };
1925
1926
  }
@@ -3052,7 +3053,7 @@ var SERVER_NAME = "@muhaven/mcp";
3052
3053
  var SERVER_VERSION = resolveServerVersion();
3053
3054
  function resolveServerVersion() {
3054
3055
  {
3055
- return "0.2.5";
3056
+ return "0.2.6";
3056
3057
  }
3057
3058
  }
3058
3059
  function toJsonInputSchema(schema) {
package/manifest.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifest_version": "0.2",
4
4
  "name": "muhaven-mcp",
5
5
  "display_name": "MuHaven (RWA portfolio)",
6
- "version": "0.2.5",
6
+ "version": "0.2.6",
7
7
  "description": "Confidential RWA portfolio management on Fhenix CoFHE. Read your encrypted balances, propose yield claims and policy changes — all signing happens in a sibling broker daemon, the LLM never sees your private key.",
8
8
  "long_description": "MuHaven MCP exposes 24 tools across read.* / position.* / policy.* / issuer.* / governance.* groups for managing real-world asset (RWA) tokens with FHE-encrypted balances. Authentication uses a one-time device-code ceremony (run `muhaven-broker login`); subsequent tool calls fetch the JWT from the broker over a Unix socket. Position / governance tools deep-link to the dashboard for passkey signing — they NEVER auto-submit to a bundler. The companion `muhaven-broker` daemon must be running before tools can be invoked. See README for setup.",
9
9
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muhaven/mcp",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "MuHaven MCP server — read/position/policy toolsets bridging Claude Desktop / Cursor / Claude Code to the MuHaven backend, with a sibling muhaven-broker daemon holding the session-key private half over a local IPC socket",
5
5
  "type": "module",
6
6
  "repository": {