{"_id":"@0xinfrax/mpc-sdk","_rev":"4-2030a84e0c8313940a10323033c06b53","name":"@0xinfrax/mpc-sdk","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@0xinfrax/mpc-sdk","version":"0.1.0","keywords":["infrax","mpc","wallet","session","key-shard","email-recovery"],"author":{"name":"InfraX"},"license":"MIT","_id":"@0xinfrax/mpc-sdk@0.1.0","maintainers":[{"name":"stevenwang000x","email":"apply.wang@hotmail.com"}],"dist":{"shasum":"fe8dbb7e3a406b653e2e4fa2d677552426104ce6","tarball":"https://registry.npmjs.org/@0xinfrax/mpc-sdk/-/mpc-sdk-0.1.0.tgz","fileCount":14,"integrity":"sha512-gXiKITstkG20MOw6xQ2iF6YTWdpvm65nCP2j1v3AcnwU0hsB6LH38rJrIIk70PbFfTCsAd4kIaJGMu/Uu6YEWg==","signatures":[{"sig":"MEQCIFtiryDemPz/X2pHTLEe56SGtvjntH9Uh7sCnthbYUWiAiAvW3ay8GBvKcDkfgcHCr/P5T5aujiJOE/Gpa3D6U6Bdw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25438},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"da48e4240d4ebfca8f74512a174e81f0da680ce3","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"stevenwang000x","email":"apply.wang@hotmail.com"},"_npmVersion":"10.8.2","description":"InfraX MPC SDK — lightweight independent client for the MPC wallet microservice (email-based key-shard wallets). Wallet module (sendCode/register/recover/status/createWallet) + Session module (unlock/lock/status). No dependency on infrax-dk.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mpc-sdk_0.1.0_1786153026493_0.8162494489989152","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@0xinfrax/mpc-sdk","version":"0.2.0","keywords":["infrax","mpc","wallet","session","key-shard","email-recovery"],"author":{"name":"InfraX"},"license":"MIT","_id":"@0xinfrax/mpc-sdk@0.2.0","maintainers":[{"name":"stevenwang000x","email":"apply.wang@hotmail.com"}],"dist":{"shasum":"80749b436591dfe9b21807e4721055a519c66e71","tarball":"https://registry.npmjs.org/@0xinfrax/mpc-sdk/-/mpc-sdk-0.2.0.tgz","fileCount":14,"integrity":"sha512-1PLzYZqTE1tgHlNkW/PIetPJ/ogx16UWjdsEvE2yWPkF0NniN59HFl1jWSJPRewQnnzJvLKRYNSb6SShvVRpEQ==","signatures":[{"sig":"MEQCIFvZ4p7b2/i7GpMKlY18ZLi0GsVKm2gD+5wcObuL+k14AiB0H5bSccPv7TM9+ocA6s1xKaOsqJqivcvS7MbZYBOurg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28294},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"8ea9e5e23b0d7c0b3de4e06769d043e3d057ae3b","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"stevenwang000x","email":"apply.wang@hotmail.com"},"_npmVersion":"10.8.2","description":"InfraX MPC SDK — lightweight independent client for the MPC wallet microservice (email-based key-shard wallets). Wallet module (sendCode/register/recover/status/listWallets/createWallet) + Session module (unlock/lock/status). E-4④: single email → 1:N sub-","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mpc-sdk_0.2.0_1786237818586_0.9824504643073926","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@0xinfrax/mpc-sdk","version":"0.3.0","keywords":["infrax","mpc","wallet","session","chain","key-shard","email-recovery","tss"],"author":{"name":"InfraX"},"license":"MIT","_id":"@0xinfrax/mpc-sdk@0.3.0","maintainers":[{"name":"stevenwang000x","email":"apply.wang@hotmail.com"}],"dist":{"shasum":"e523913098fe59b4bb6daa1b04f0d58d950cd9b9","tarball":"https://registry.npmjs.org/@0xinfrax/mpc-sdk/-/mpc-sdk-0.3.0.tgz","fileCount":16,"integrity":"sha512-jETONELJnRvo8ymryz/8ABVfDjqnPNu5TQl9P9rI43SN4HlVK3IfGG51Ri+kveJoPEd+/zQV/okzjV3m0+iMcw==","signatures":[{"sig":"MEUCIB8ofiOyBI+sZ2BwWZjGhosfLqYG1r+j+6p4PyLFDWIhAiEA4XfEo56VxMamaLrO7JJbLvRAstmWaRkHWZDLQSlXv3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38516},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"8bd979c62a13053ecb336ccbf314a332b22d824b","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"stevenwang000x","email":"apply.wang@hotmail.com"},"_npmVersion":"10.8.2","description":"InfraX MPC SDK — lightweight independent client for the MPC wallet microservice (email-based key-shard wallets). Wallet module (sendCode/register/recover/status/listWallets/createWallet) + Session module (unlock/lock/status) + Chain module (balance/signMe","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mpc-sdk_0.3.0_1786250826674_0.0851808459771417","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"_id":"@0xinfrax/mpc-sdk@0.4.0","dist":{"shasum":"25ed981e8d63907b0c3ef56913c6bd2d3d560bf4","tarball":"https://registry.npmjs.org/@0xinfrax/mpc-sdk/-/mpc-sdk-0.4.0.tgz","fileCount":18,"integrity":"sha512-sJMl4mDQWdNk0x3kcOZWni1gOxb3rjdJC2ec4nuNbUfeNWkaXZZGA3iXDkgaW5Ht8GY6xakovhA88/1xWnKLfg==","signatures":[{"sig":"MEUCIFsE1NA+1wqaghtzYnErcbl8Hf1TVTEOyCxKA28k5VTRAiEAzuZY0DTPxjHBdjTnpJvwC12H95dYasCmnOrhqtE5Bxw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEw+SDlB60XRcLDJOR6tWvf7NgfP30nxnPaJNUb1Ppy6AiEA9O5egUcMZJDWu/SWkYm4B9QIQD4/OlvyR6kqifujvBg="}],"unpackedSize":57024},"main":"dist/index.js","name":"@0xinfrax/mpc-sdk","types":"dist/index.d.ts","author":{"name":"InfraX"},"engines":{"node":">=18"},"gitHead":"e4f960a91999704a3288590925b3a2de48a652c9","license":"MIT","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"version":"0.4.0","_npmUser":{"name":"stevenwang000x","email":"apply.wang@hotmail.com"},"keywords":["infrax","mpc","wallet","session","chain","key-shard","email-recovery","tss","solana","ed25519","frost"],"_npmVersion":"11.17.0","description":"InfraX MPC SDK — lightweight independent client for the MPC wallet microservice (email-based key-shard wallets). Wallet module (sendCode/register/recover/status/listWallets/createWallet) + Session module (unlock/lock/status) + Chain module (balance/signMe","directories":{},"maintainers":[{"name":"stevenwang000x","email":"apply.wang@hotmail.com"}],"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mpc-sdk_0.4.0_1789854878661_0.22180742718525348"}}},"time":{"created":"2026-08-08T01:37:06.328Z","modified":"2026-09-19T21:54:38.980Z","0.1.0":"2026-08-08T01:37:06.641Z","0.2.0":"2026-08-09T01:10:18.728Z","0.3.0":"2026-08-09T04:47:06.801Z","0.4.0":"2026-09-19T21:54:38.756Z"},"author":{"name":"InfraX"},"license":"MIT","keywords":["infrax","mpc","wallet","session","chain","key-shard","email-recovery","tss","solana","ed25519","frost"],"description":"InfraX MPC SDK — lightweight independent client for the MPC wallet microservice (email-based key-shard wallets). Wallet module (sendCode/register/recover/status/listWallets/createWallet) + Session module (unlock/lock/status) + Chain module (balance/signMe","maintainers":[{"name":"stevenwang000x","email":"apply.wang@hotmail.com"}],"readme":"# @0xinfrax/mpc-sdk\n\nInfraX MPC 独立轻量 SDK —— 面向 MPC 微服务（邮箱分片托管钱包）的零依赖 TypeScript 客户端。\n不依赖整包 `infrax-dk`，版本独立演进（MQ-10 补充 E-5）。\n\n**当前覆盖四个模块（19 方法，E-4④ 起支持单邮箱 1:N 多子钱包；链上模块 E-5d 接 TSS 分片签名；Solana 模块 MPC-SOL-5 接 FROST Ed25519 分片签名）**：\n\n| 模块 | 方法 | 端点 |\n|---|---|---|\n| 钱包 | `wallet.sendCode` | `POST /api/v2/mpc/send-code` |\n| 钱包 | `wallet.register` | `POST /api/v2/mpc/register`（每次注册新建一个子钱包，返回 `walletId`） |\n| 钱包 | `wallet.recover` | `POST /api/v2/mpc/recover`（`walletId` 可指定子钱包，缺省首个） |\n| 钱包 | `wallet.status` | `GET /api/v2/mpc/status`（email 可带 `walletId` 定位子钱包） |\n| 钱包 | `wallet.listWallets` | `GET /api/v2/mpc/wallets`（同邮箱全部子钱包） |\n| 钱包 | `wallet.createWallet` | `POST /api/v2/mpc/send-code`（组合入口） |\n| 会话 | `session.unlock` | `POST /api/v2/mpc/session/unlock`（`walletId` 可指定子钱包） |\n| 会话 | `session.lock` | `POST /api/v2/mpc/session/lock` |\n| 会话 | `session.status` | `GET /api/v2/mpc/session/status` |\n| 链上（EVM） | `chain.balance` | `POST /api/v2/mpc/balance`（原生币 + 可选 ERC20） |\n| 链上（EVM） | `chain.signMessage` | `POST /api/v2/mpc/sign-message`（EIP-191，TSS 分片签名） |\n| 链上（EVM） | `chain.signTypedData` | `POST /api/v2/mpc/sign-typed-data`（EIP-712，TSS 分片签名） |\n| 链上（EVM） | `chain.sendTransaction` | `POST /api/v2/mpc/send-transaction`（原生币 / ERC20 transfer） |\n| 链上（EVM） | `chain.contractRead` | `POST /api/v2/mpc/contract-read`（只读 eth_call） |\n| 链上（EVM） | `chain.contractWrite` | `POST /api/v2/mpc/contract-write`（staticCall 模拟 + TSS 签名广播） |\n| 链上（EVM） | `chain.gasEstimate` | `POST /api/v2/mpc/gas-estimate` |\n| Solana | `solana.sign` | `POST /api/v2/mpc/solana/sign`（原始 message → 64B Ed25519 签名，FROST 2-of-3） |\n| Solana | `solana.sendTransaction` | `POST /api/v2/mpc/solana/send-transaction`（base64 已签名交易 → 广播 + 确认轮询） |\n| Solana | `solana.balance` | `POST {chainRpcUrl}/v1/rpc/solana`（`getBalance`，**读 chain-rpc 网关**，非 MPC 服务） |\n\n> **E-4④ 单邮箱 1:N**：一个邮箱可派生多个 Agent 子钱包（如 50 子钱包并发模型）。`register` 每次创建新钱包返回 `walletId`；`recover` / `status` / `session.unlock` 带 `walletId` 精确命中子钱包，缺省作用于同邮箱首个（向后兼容）。token 一经解锁即绑定到该子钱包，后续链上操作无需再带 `walletId`。\n\n> **E-5d 链上模块（TSS 就绪）**：服务端四签名/交易端点已迁移 cggmp24 TSS 2-of-2 分片签名（服务端仅持分片、不再重建完整私钥，见 `docs/TSS_EVALUATION.md`）；SDK 侧为纯 HTTP 封装——签名端点返回 65B 序列化签名（`0x + r||s||v`），交易端点返回 `txHash`；交易类数量参数统一用字符串（服务端 parseUnits/parseEther 自理）。\n\n> **MPC-SOL-5 Solana 模块（ed25519 / FROST 就绪）**：钱包须为 ed25519 曲线（`register({ curve: 'ed25519' })`，或用 `seed` 导入存量 32B 种子），服务端走独立 FROST 2-of-3 签名链路（`projects/mpc-ed25519`），与 EVM 路径**物理隔离**（独立进程 9210/9211/9212）。三处与 EVM 模块的关键差异：\n> 1. **待签数据是原始 message 字节**（hex，≤ 4096B），**不是 32B 摘要** —— Ed25519 内部才做 SHA-512，且 Ed25519ph 预哈希变体 Solana 运行时不支持。\n> 2. **签名是 64B `R‖z`（128 hex，无 `0x`）**，且**无恢复 id `v`** —— 验签靠公钥而非恢复地址（`@solana/web3.js` v1 未导出 Ed25519 验签 API，用 `tweetnacl`）。\n> 3. **交易模型由客户端持有**：`@solana/web3.js` 构建交易 → `serializeMessage()` 交 `solana.sign` → `tx.addSignature()` 组装 → base64 交 `solana.sendTransaction`。服务端不重写交易模型。\n>\n> **EVM 专属端点对 ed25519 钱包返 400（不静默降级）**：`balance` / `sign-message` / `sign-typed-data` / `sign-digest` / `sign` / `send-transaction` / `contract-read` / `contract-write` / `gas-estimate`；反向 `/solana/*` 只接受 ed25519 钱包。因此 `solana.balance` **不经 MPC 服务**，由 SDK 直读 chain-rpc 网关（构造时传 `chainRpcUrl` + `chainRpcReadKey`）。\n\n## 安装\n\n```bash\nnpm i @0xinfrax/mpc-sdk\n```\n\nNode.js >= 18（使用原生 fetch，零运行时依赖）。\n\n## QuickStart\n\n```ts\nimport { MpcClient, MpcApiError } from '@0xinfrax/mpc-sdk';\n\nconst mpc = new MpcClient({\n  baseUrl: process.env.MPC_URL ?? 'http://127.0.0.1:9104', // 生产按实际可达地址\n  apiKey: process.env.MPC_API_KEY, // MPC 服务鉴权 key（出站 X-API-Key）\n});\n\n// 1. 发验证码 → 邮箱收码\nawait mpc.wallet.sendCode({ email: 'agent@example.com' });\n\n// 2. 注册托管钱包\nconst reg = await mpc.wallet.register({ email: 'agent@example.com', code: '123456' });\nconsole.log(reg.data.walletAddress);\n\n// 3. 解锁会话（后续链上操作的凭证）\nconst s = await mpc.session.unlock({ email: 'agent@example.com', code: '123456' });\nconst token = s.data.token;\n\n// 4. 会话状态\nconst st = await mpc.session.status({ token });\nconsole.log(st.data.unlocked, st.data.remainingSeconds);\n\n// 5. 链上操作（E-5d，token 即凭证）\nconst bal = await mpc.chain.balance({ token, chain: 'sepolia' });\nconsole.log(bal.data.nativeBalance, bal.data.nativeSymbol);\n\nconst sig = await mpc.chain.signMessage({ token, message: 'hello' });\nconsole.log(sig.data.signature, sig.data.address);\n\nconst tx = await mpc.chain.sendTransaction({\n  token, to: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', amount: '0.01', chain: 'sepolia',\n});\nconsole.log(tx.data.txHash);\n\n// 6. 锁定会话\nawait mpc.session.lock(token);\n\n// 7. 邮箱恢复（封装「验证码 → 分片重建 → 地址校验」完整流程）\nconst recovered = await mpc.wallet.recover({\n  email: 'agent@example.com',\n  code: '654321',\n  expectedAddress: reg.data.walletAddress, // 可选：客户端二次地址校验\n});\nconsole.log(recovered.data.walletAddress === reg.data.walletAddress);\n```\n\n## Solana（ed25519）用法\n\n```ts\nimport { Connection, PublicKey, SystemProgram, Transaction } from '@solana/web3.js';\n\nconst mpc = new MpcClient({\n  baseUrl: process.env.MPC_URL!,                        // MPC 服务（sign / sendTransaction）\n  apiKey: process.env.MPC_API_KEY,\n  chainRpcUrl: process.env.CHAIN_RPC_URL,               // 默认 http://127.0.0.1:9130\n  chainRpcReadKey: process.env.CHAIN_RPC_READ_KEY,      // 平台读 key 或订阅 rx_ key（仅 solana.balance 需要）\n});\n\n// 0) 钱包（一次性）：创建 ed25519 钱包；已有存量 Solana 私钥可用 seed 导入（地址逐字节一致）\nawait mpc.wallet.sendCode({ email: 'agent@example.com' });\nconst reg = await mpc.wallet.register({\n  email: 'agent@example.com', code: '123456',\n  curve: 'ed25519',\n  // seed: 'a5c9…'   // 可选：32B 种子 hex（64 hex），导入存量 Solana 私钥\n});\nconsole.log(reg.data.walletAddress, reg.data.curve);    // base58 地址 / 'ed25519'\n\n// 1) 解锁会话（token 绑定该子钱包，后续 solana.* 凭 token）\nconst { data: sess } = await mpc.session.unlock({ email: 'agent@example.com', code: '654321' });\n\n// 2) 余额（经 chain-rpc 网关 getBalance；lamports 与 SOL 双单位）\nconst { data: bal } = await mpc.solana.balance({ address: sess.address });\nconsole.log(bal.lamports, bal.sol);                     // '4995000' '0.004995'\n// ⚠️ fee payer 余额须 > 890880 lamports（免租门槛），否则广播报 InsufficientFundsForRent\n\n// 3) 构建交易（交易模型由客户端持有）→ message 原文交 MPC 签名 → 组装 → 广播\nconst conn = new Connection('https://api.mainnet-beta.solana.com');\nconst tx = new Transaction().add(SystemProgram.transfer({\n  fromPubkey: new PublicKey(sess.address),\n  toPubkey: new PublicKey('GmaDrppBC7P5ARKV8g3djiwP89vz1jLK23V2GBjuAEGB'),\n  lamports: 1000,\n}));\ntx.feePayer = new PublicKey(sess.address);\ntx.recentBlockhash = (await conn.getLatestBlockhash()).blockhash;\n\nconst { data: signed } = await mpc.solana.sign({\n  token: sess.token,\n  message: tx.serializeMessage().toString('hex'),   // ← 原始 message（非 32B 摘要）\n});\ntx.addSignature(new PublicKey(signed.address), Buffer.from(signed.signature, 'hex'));\nif (!tx.verifySignatures()) throw new Error('signature mismatch');   // web3.js 内部验签\n\nconst { data: sent } = await mpc.solana.sendTransaction({\n  token: sess.token,\n  transaction: tx.serialize({ requireAllSignatures: true }).toString('base64'),\n});\nconsole.log(sent.txHash, sent.confirmed, sent.signatureStatus?.confirmationStatus);\n```\n\n要点：\n\n- **FROST 签名非确定性**：同一 message 两次调用返回不同签名，**均有效**（每方独立随机 nonce）。\n- `sign` 的 `partnerIndex`：`1`（默认，片2）/ `2`（片3，仅 2-of-3 钱包可用）。\n- `sendTransaction` 的 `wait`：默认 `true` 轮询 `getSignatureStatuses` 至 `confirmed`/`finalized`；`false` 仅广播（`confirmed:false` / `reason:'wait=false'`）；`reason:'timeout'` **不代表失败**，须以 `txHash` 复核。\n- base58 地址**大小写敏感**：任何环节（含 `recover({ expectedAddress })` 客户端校验）都不可 `toLowerCase()`。\n- 服务端计费：`solana_sign` 1e14 wei / `solana_send_transaction` 1e15 wei（余额不足 → 402）。\n\n## 错误处理\n\n所有失败均抛 `MpcApiError`（含 HTTP 状态 + 业务 code + 语义 kind）；网络/超时抛 `MpcNetworkError`。\n\n| kind | 语义 | 典型场景 |\n|---|---|---|\n| `unauthorized` (401) | 未授权 | 缺/错 key；会话不存在或过期 |\n| `forbidden` (403) | 禁止 | 外部签发 key 被禁用 |\n| `bad_request` (400) | 参数错误 | 验证码错误/过期（业务 code 1001） |\n| `not_found` (404) | 未找到 | 未注册钱包（1004） |\n| `conflict` (409) | 冲突 | 恢复地址与期望不一致（SDK 40900） |\n| `rate_limited` (429) | 限流 | 验证码尝试次数超限 |\n| `server_error` (5xx) | 服务端错误 | 分片解密失败（500/1007） |\n\n```ts\ntry {\n  await mpc.wallet.register({ email, code: '000000' });\n} catch (e) {\n  if (e instanceof MpcApiError) {\n    console.log(e.kind, e.status, e.code, e.message);\n    // → bad_request 400 1001 Invalid code\n  }\n}\n```\n\n## 与 MCP 对应关系\n\n本 SDK 方法对应 Wallet MCP 工具（`mcp-server/src/index.ts`）：`mpc_send_code` ↔ `wallet.sendCode`、`mpc_register` ↔ `wallet.register`、`mpc_recover` ↔ `wallet.recover`、`mpc_status` ↔ `wallet.status`、`mpc_create_wallet` ↔ `wallet.createWallet`、`mpc_session_unlock/lock/status` ↔ `session.unlock/lock/status`。入站（经 MCP 调用）沿用 `inboundAuth`（`MCP_API_KEY`），出站（本 SDK）统一 `X-API-Key`。\n\n## 开发\n\n```bash\nnpm run build   # tsc → dist/\nnpm publish     # 发布 @0xinfrax/mpc-sdk（@0xinfrax scope）\n```\n","readmeFilename":"README.md"}