@continuumdao/ctm-mpc-defi 0.1.3 → 0.1.4
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/README.md +16 -1
- package/dist/agent/catalog.cjs +36 -2
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.cts +79 -1
- package/dist/agent/catalog.d.ts +79 -1
- package/dist/agent/catalog.js +36 -3
- package/dist/agent/catalog.js.map +1 -1
- package/dist/core/index.cjs +76 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +35 -2
- package/dist/core/index.d.ts +35 -2
- package/dist/core/index.js +70 -1
- package/dist/core/index.js.map +1 -1
- package/dist/index.cjs +111 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +105 -3
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.cjs +31 -11
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.d.cts +2 -1
- package/dist/protocols/evm/uniswap-v4/index.d.ts +2 -1
- package/dist/protocols/evm/uniswap-v4/index.js +31 -11
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- package/package.json +1 -1
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/keygen.ts","../../src/core/purpose.ts","../../src/core/envelope.ts","../../src/core/registry.ts","../../src/core/nodeRead.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { KeyGenSubset } from './types.js'\n\nexport type { KeyGenSubset }\n\n/** App-compatible alias used by existing multisign builders. */\nexport type KeyGenSubsetForPermit = KeyGenSubset\n\nexport function firstClientIdFromKeyGen(data: KeyGenSubset | null | undefined): string | null {\n const map = data?.ClientKeys\n if (!map || typeof map !== 'object') return null\n for (const v of Object.values(map)) {\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n return null\n}\n\nexport function requirePubKeyHex(keyGen: KeyGenSubset): string {\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n return ph\n}\n\nexport function keyListFromKeyGen(keyGen: KeyGenSubset): string[] {\n return keyGen.keylist ?? []\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult } from './types.js'\nimport type { KeyGenSubset } from './keygen.js'\nimport { firstClientIdFromKeyGen } from './keygen.js'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** GET requests to mpc-auth management node with optional Bearer JWT (Browser HTTPS). */\nexport type NodeReadAuth = {\n bearerOnGet: boolean\n jwt: string | null\n}\n\nexport function nodeFetchWithReadAuth(\n url: string,\n init: RequestInit | undefined,\n auth: NodeReadAuth,\n): Promise<Response> {\n const method = (init?.method ?? 'GET').toUpperCase()\n const headers = new Headers(init?.headers)\n if (auth.bearerOnGet && method === 'GET' && auth.jwt && auth.jwt.trim()) {\n headers.set('Authorization', `Bearer ${auth.jwt.trim()}`)\n }\n return fetch(url, { ...init, headers })\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/keygen.ts","../../src/core/purpose.ts","../../src/core/envelope.ts","../../src/core/registry.ts","../../src/core/nodeRead.ts","../../src/core/managementPostSig.ts","../../src/core/managementNonce.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { KeyGenSubset } from './types.js'\n\nexport type { KeyGenSubset }\n\n/** App-compatible alias used by existing multisign builders. */\nexport type KeyGenSubsetForPermit = KeyGenSubset\n\nexport function firstClientIdFromKeyGen(data: KeyGenSubset | null | undefined): string | null {\n const map = data?.ClientKeys\n if (!map || typeof map !== 'object') return null\n for (const v of Object.values(map)) {\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n return null\n}\n\nexport function requirePubKeyHex(keyGen: KeyGenSubset): string {\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n return ph\n}\n\nexport function keyListFromKeyGen(keyGen: KeyGenSubset): string[] {\n return keyGen.keylist ?? []\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult } from './types.js'\nimport type { KeyGenSubset } from './keygen.js'\nimport { firstClientIdFromKeyGen } from './keygen.js'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** GET requests to mpc-auth management node with optional Bearer JWT (Browser HTTPS). */\nexport type NodeReadAuth = {\n bearerOnGet: boolean\n jwt: string | null\n}\n\nexport function nodeFetchWithReadAuth(\n url: string,\n init: RequestInit | undefined,\n auth: NodeReadAuth,\n): Promise<Response> {\n const method = (init?.method ?? 'GET').toUpperCase()\n const headers = new Headers(init?.headers)\n if (auth.bearerOnGet && method === 'GET' && auth.jwt && auth.jwt.trim()) {\n headers.set('Authorization', `Bearer ${auth.jwt.trim()}`)\n }\n return fetch(url, { ...init, headers })\n}\n","/** mpc-auth NodeMgtKeySig envelope: `{ nonce, clientSig, nodeKey }` (all lowercase). */\n\nexport type ManagementSigFields = {\n nonce: number\n clientSig: string\n nodeKey: string\n}\n\nexport function normalizeManagementNodeKey(nodeKey: string | null | undefined): string {\n const nk = nodeKey?.trim().replace(/^0x/i, '')\n if (!nk || !/^[0-9a-fA-F]{128}$/.test(nk)) {\n throw new Error('nodeKey is required (128 hex from GET /getNodeKey).')\n }\n return nk.toLowerCase()\n}\n\n/** Base fields for NodeMgtKeySig-style POST bodies (`clientSig` cleared for signing). */\nexport function managementSigFields(\n nonce: number,\n nodeKey: string | null | undefined,\n): ManagementSigFields {\n return { nonce, clientSig: '', nodeKey: normalizeManagementNodeKey(nodeKey) }\n}\n\n/** Spread management fields first, then endpoint-specific fields (preserves key order when spreading). */\nexport function buildManagementPostBody(\n nonce: number,\n nodeKey: string | null | undefined,\n fields: Record<string, unknown> = {},\n): Record<string, unknown> {\n return { ...managementSigFields(nonce, nodeKey), ...fields }\n}\n\n/** Exact UTF-8 string to sign: same JSON with `clientSig` cleared. */\nexport function messageToSignManagementBody(body: Record<string, unknown>): string {\n return JSON.stringify({ ...body, clientSig: '' })\n}\n\nexport function withManagementClientSig(\n body: Record<string, unknown>,\n clientSig: string,\n): Record<string, unknown> {\n return { ...body, clientSig: clientSig.trim().replace(/^0x/i, '') }\n}\n","import { nodeFetchWithReadAuth, type NodeReadAuth } from './nodeRead.js'\n\nfunction mpcAuthData(raw: Record<string, unknown>): unknown {\n const code = (raw.Code ?? raw.code) as number | undefined\n if (code !== 0 && code !== undefined) return undefined\n return raw.Data ?? raw.data\n}\n\n/**\n * GET /getNodeKey — 128-hex MPC node id required on all NodeMgtKeySig POST bodies.\n */\nexport async function fetchNodeKey(\n nodeUrl: string,\n readAuth: NodeReadAuth = { bearerOnGet: false, jwt: null },\n): Promise<{ nodeKey: string; ok: boolean }> {\n const base = nodeUrl.trim().replace(/\\/$/, '')\n const res = await nodeFetchWithReadAuth(`${base}/getNodeKey`, { cache: 'no-store' }, readAuth)\n const text = await res.text()\n let raw: Record<string, unknown>\n try {\n raw = JSON.parse(text) as Record<string, unknown>\n } catch {\n return { nodeKey: '', ok: false }\n }\n const data = mpcAuthData(raw)\n const nk =\n typeof data === 'string'\n ? data\n : data != null && typeof data === 'object' && !Array.isArray(data)\n ? String((data as Record<string, unknown>).nodeKey ?? (data as Record<string, unknown>).NodeKey ?? '')\n : data != null\n ? String(data)\n : ''\n const trimmed = nk.trim().replace(/^0x/i, '')\n if (!/^[0-9a-fA-F]{128}$/.test(trimmed)) {\n return { nodeKey: '', ok: false }\n }\n return { nodeKey: trimmed.toLowerCase(), ok: res.ok }\n}\n\n/**\n * Fetch management nonce: GET /getPublicMgtKeyNonce (Ed25519) or GET /getNodeMgtKeyNonce (Ethereum NodeMgtKey).\n * For Ed25519 added keys, pass `?publicKey=<64-hex>`.\n */\nexport async function fetchManagementNonce(\n nodeUrl: string,\n useEd25519: boolean,\n ed25519PublicKey?: string,\n readAuth: NodeReadAuth = { bearerOnGet: false, jwt: null },\n): Promise<{ nonce: number; ok: boolean; code: number }> {\n const base = nodeUrl.trim().replace(/\\/$/, '')\n const path = useEd25519 ? '/getPublicMgtKeyNonce' : '/getNodeMgtKeyNonce'\n const url =\n useEd25519 && ed25519PublicKey && /^[0-9a-fA-F]{64}$/.test(ed25519PublicKey.trim())\n ? `${base}${path}?publicKey=${encodeURIComponent(ed25519PublicKey.trim())}`\n : `${base}${path}`\n const res = await nodeFetchWithReadAuth(url, { cache: 'no-store' }, readAuth)\n const text = await res.text()\n let raw: Record<string, unknown>\n try {\n raw = JSON.parse(text) as Record<string, unknown>\n } catch {\n return { nonce: 0, ok: false, code: -1 }\n }\n const code = (raw.Code ?? raw.code) as number | undefined\n const payload = mpcAuthData(raw) ?? raw.Data ?? raw.data\n let nonce = 0\n if (typeof payload === 'number' && !Number.isNaN(payload)) {\n nonce = payload\n } else if (payload && typeof payload === 'object') {\n const n = (payload as Record<string, unknown>).nonce ?? (payload as Record<string, unknown>).Nonce\n nonce = typeof n === 'number' && !Number.isNaN(n) ? n : Number(n) || 0\n }\n return { nonce, ok: res.ok && (code === 0 || code === undefined), code: code ?? -1 }\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -114,6 +114,75 @@ function nodeFetchWithReadAuth(url, init, auth) {
|
|
|
114
114
|
}
|
|
115
115
|
return fetch(url, { ...init, headers });
|
|
116
116
|
}
|
|
117
|
+
|
|
118
|
+
// src/core/managementPostSig.ts
|
|
119
|
+
function normalizeManagementNodeKey(nodeKey) {
|
|
120
|
+
const nk = nodeKey?.trim().replace(/^0x/i, "");
|
|
121
|
+
if (!nk || !/^[0-9a-fA-F]{128}$/.test(nk)) {
|
|
122
|
+
throw new Error("nodeKey is required (128 hex from GET /getNodeKey).");
|
|
123
|
+
}
|
|
124
|
+
return nk.toLowerCase();
|
|
125
|
+
}
|
|
126
|
+
function managementSigFields(nonce, nodeKey) {
|
|
127
|
+
return { nonce, clientSig: "", nodeKey: normalizeManagementNodeKey(nodeKey) };
|
|
128
|
+
}
|
|
129
|
+
function buildManagementPostBody(nonce, nodeKey, fields = {}) {
|
|
130
|
+
return { ...managementSigFields(nonce, nodeKey), ...fields };
|
|
131
|
+
}
|
|
132
|
+
function messageToSignManagementBody(body) {
|
|
133
|
+
return JSON.stringify({ ...body, clientSig: "" });
|
|
134
|
+
}
|
|
135
|
+
function withManagementClientSig(body, clientSig) {
|
|
136
|
+
return { ...body, clientSig: clientSig.trim().replace(/^0x/i, "") };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// src/core/managementNonce.ts
|
|
140
|
+
function mpcAuthData(raw) {
|
|
141
|
+
const code = raw.Code ?? raw.code;
|
|
142
|
+
if (code !== 0 && code !== void 0) return void 0;
|
|
143
|
+
return raw.Data ?? raw.data;
|
|
144
|
+
}
|
|
145
|
+
async function fetchNodeKey(nodeUrl, readAuth = { bearerOnGet: false, jwt: null }) {
|
|
146
|
+
const base = nodeUrl.trim().replace(/\/$/, "");
|
|
147
|
+
const res = await nodeFetchWithReadAuth(`${base}/getNodeKey`, { cache: "no-store" }, readAuth);
|
|
148
|
+
const text = await res.text();
|
|
149
|
+
let raw;
|
|
150
|
+
try {
|
|
151
|
+
raw = JSON.parse(text);
|
|
152
|
+
} catch {
|
|
153
|
+
return { nodeKey: "", ok: false };
|
|
154
|
+
}
|
|
155
|
+
const data = mpcAuthData(raw);
|
|
156
|
+
const nk = typeof data === "string" ? data : data != null && typeof data === "object" && !Array.isArray(data) ? String(data.nodeKey ?? data.NodeKey ?? "") : data != null ? String(data) : "";
|
|
157
|
+
const trimmed = nk.trim().replace(/^0x/i, "");
|
|
158
|
+
if (!/^[0-9a-fA-F]{128}$/.test(trimmed)) {
|
|
159
|
+
return { nodeKey: "", ok: false };
|
|
160
|
+
}
|
|
161
|
+
return { nodeKey: trimmed.toLowerCase(), ok: res.ok };
|
|
162
|
+
}
|
|
163
|
+
async function fetchManagementNonce(nodeUrl, useEd25519, ed25519PublicKey, readAuth = { bearerOnGet: false, jwt: null }) {
|
|
164
|
+
const base = nodeUrl.trim().replace(/\/$/, "");
|
|
165
|
+
const path = useEd25519 ? "/getPublicMgtKeyNonce" : "/getNodeMgtKeyNonce";
|
|
166
|
+
const url = useEd25519 && ed25519PublicKey && /^[0-9a-fA-F]{64}$/.test(ed25519PublicKey.trim()) ? `${base}${path}?publicKey=${encodeURIComponent(ed25519PublicKey.trim())}` : `${base}${path}`;
|
|
167
|
+
const res = await nodeFetchWithReadAuth(url, { cache: "no-store" }, readAuth);
|
|
168
|
+
const text = await res.text();
|
|
169
|
+
let raw;
|
|
170
|
+
try {
|
|
171
|
+
raw = JSON.parse(text);
|
|
172
|
+
} catch {
|
|
173
|
+
return { nonce: 0, ok: false, code: -1 };
|
|
174
|
+
}
|
|
175
|
+
const code = raw.Code ?? raw.code;
|
|
176
|
+
const payload = mpcAuthData(raw) ?? raw.Data ?? raw.data;
|
|
177
|
+
let nonce = 0;
|
|
178
|
+
if (typeof payload === "number" && !Number.isNaN(payload)) {
|
|
179
|
+
nonce = payload;
|
|
180
|
+
} else if (payload && typeof payload === "object") {
|
|
181
|
+
const n = payload.nonce ?? payload.Nonce;
|
|
182
|
+
nonce = typeof n === "number" && !Number.isNaN(n) ? n : Number(n) || 0;
|
|
183
|
+
}
|
|
184
|
+
return { nonce, ok: res.ok && (code === 0 || code === void 0), code: code ?? -1 };
|
|
185
|
+
}
|
|
117
186
|
function isEvmNativeToken(address) {
|
|
118
187
|
try {
|
|
119
188
|
return viem.getAddress(address) === viem.zeroAddress;
|
|
@@ -2221,6 +2290,31 @@ var MULTISIGN_OUTPUT_DOC = {
|
|
|
2221
2290
|
}
|
|
2222
2291
|
}
|
|
2223
2292
|
};
|
|
2293
|
+
var MANAGEMENT_SIG_DOC = {
|
|
2294
|
+
description: "Management POST bodies embed NodeMgtKeySig: { nonce, clientSig, nodeKey }. Sign JSON with clientSig cleared; POST with clientSig set to the Ed25519 128-hex or EIP-191 signature. Legacy Nonce/Sig/sig field names are not accepted.",
|
|
2295
|
+
fields: {
|
|
2296
|
+
nonce: {
|
|
2297
|
+
type: "number",
|
|
2298
|
+
description: "From GET /getPublicMgtKeyNonce (Ed25519) or GET /getNodeMgtKeyNonce (Ethereum NodeMgtKey)."
|
|
2299
|
+
},
|
|
2300
|
+
clientSig: {
|
|
2301
|
+
type: "string",
|
|
2302
|
+
description: "Management signature; empty string in the message to sign."
|
|
2303
|
+
},
|
|
2304
|
+
nodeKey: {
|
|
2305
|
+
type: "string",
|
|
2306
|
+
description: "Required. 128-hex MPC node id from GET /getNodeKey (no 0x prefix)."
|
|
2307
|
+
}
|
|
2308
|
+
},
|
|
2309
|
+
helpers: {
|
|
2310
|
+
managementSigFields: "Base envelope with clientSig cleared.",
|
|
2311
|
+
buildManagementPostBody: "Spread managementSigFields then endpoint fields.",
|
|
2312
|
+
messageToSignManagementBody: "Canonical JSON string to sign.",
|
|
2313
|
+
withManagementClientSig: "Attach signature to POST body.",
|
|
2314
|
+
fetchNodeKey: "GET /getNodeKey via nodeFetchWithReadAuth.",
|
|
2315
|
+
fetchManagementNonce: "GET nonce for Ed25519 or Ethereum management key."
|
|
2316
|
+
}
|
|
2317
|
+
};
|
|
2224
2318
|
|
|
2225
2319
|
// src/agent/mcpTools.ts
|
|
2226
2320
|
function paramProperties(params, includeCommon = []) {
|
|
@@ -2342,7 +2436,7 @@ var MCP_TOOL_DEFINITIONS = [
|
|
|
2342
2436
|
"executorAddress matching MPC wallet",
|
|
2343
2437
|
"RPC URL and chainDetail from node chain config"
|
|
2344
2438
|
],
|
|
2345
|
-
followUp: ["Sign messageToSign", "POST /multiSignRequest with clientSig"],
|
|
2439
|
+
followUp: ["Sign messageToSign", "POST /multiSignRequest with clientSig and signedMessage"],
|
|
2346
2440
|
handler: { importPath: "protocols/evm/uniswap-v4", exportName: "buildEvmMultisignBodyUniswapV4SkipPermit2Batch" },
|
|
2347
2441
|
inputSchema: {
|
|
2348
2442
|
type: "object",
|
|
@@ -2377,7 +2471,7 @@ var MCP_TOOL_DEFINITIONS = [
|
|
|
2377
2471
|
chainCategory: "evm",
|
|
2378
2472
|
description: "Build mpc-auth multiSignRequest for a Curve Router NG swap via @curvefi/api populateSwap. Optionally batches ERC-20 approve txs when allowance is insufficient, then exchange. Requires JSON-RPC and Curve-supported chain.",
|
|
2379
2473
|
prerequisites: ["keyGen", "executorAddress", "tokenIn/tokenOut/amountHuman/slippage", "RPC URL"],
|
|
2380
|
-
followUp: ["Sign messageToSign", "POST /multiSignRequest"],
|
|
2474
|
+
followUp: ["Sign messageToSign", "POST /multiSignRequest with clientSig and signedMessage"],
|
|
2381
2475
|
handler: { importPath: "protocols/evm/curve-dao", exportName: "buildEvmMultisignBodyCurveDaoBatch" },
|
|
2382
2476
|
inputSchema: {
|
|
2383
2477
|
type: "object",
|
|
@@ -2409,6 +2503,7 @@ function getAgentCatalogForMcp() {
|
|
|
2409
2503
|
protocols: getProtocolModules(),
|
|
2410
2504
|
commonParams: EVM_COMMON_PARAM_DOCS,
|
|
2411
2505
|
multisignOutput: MULTISIGN_OUTPUT_DOC,
|
|
2506
|
+
managementSig: MANAGEMENT_SIG_DOC,
|
|
2412
2507
|
workflow: {
|
|
2413
2508
|
evmSwapTypical: [
|
|
2414
2509
|
"1. Quote (protocol-specific API if needed)",
|
|
@@ -2416,6 +2511,13 @@ function getAgentCatalogForMcp() {
|
|
|
2416
2511
|
"3. build_*_multisign \u2192 { bodyForSign, messageToSign }",
|
|
2417
2512
|
"4. Sign messageToSign (MetaMask or Ed25519)",
|
|
2418
2513
|
"5. POST /multiSignRequest with clientSig and signedMessage"
|
|
2514
|
+
],
|
|
2515
|
+
managementPostTypical: [
|
|
2516
|
+
"1. GET /getNodeKey \u2192 nodeKey (128 hex)",
|
|
2517
|
+
"2. GET /getPublicMgtKeyNonce or /getNodeMgtKeyNonce \u2192 nonce",
|
|
2518
|
+
"3. buildManagementPostBody(nonce, nodeKey, { \u2026endpoint fields })",
|
|
2519
|
+
"4. messageToSignManagementBody(body) \u2192 sign \u2192 withManagementClientSig(body, sig)",
|
|
2520
|
+
"5. POST management route with signed body"
|
|
2419
2521
|
]
|
|
2420
2522
|
}
|
|
2421
2523
|
};
|
|
@@ -2447,6 +2549,7 @@ exports.NEAR_CHAIN_CATEGORY = NEAR_CHAIN_CATEGORY;
|
|
|
2447
2549
|
exports.SOLANA_CHAIN_CATEGORY = SOLANA_CHAIN_CATEGORY;
|
|
2448
2550
|
exports.alignEip1559FeesWithLatestBase = alignEip1559FeesWithLatestBase;
|
|
2449
2551
|
exports.buildEvmMultisignBatch = buildEvmMultisignBatch;
|
|
2552
|
+
exports.buildManagementPostBody = buildManagementPostBody;
|
|
2450
2553
|
exports.chainSnapshotForCustomGasExtraJSON = chainSnapshotForCustomGasExtraJSON;
|
|
2451
2554
|
exports.composeFeePayloadToTxParams = composeFeePayloadToTxParams;
|
|
2452
2555
|
exports.coreChainCategoryModule = coreChainCategoryModule;
|
|
@@ -2454,6 +2557,8 @@ exports.curveDao = curveDao;
|
|
|
2454
2557
|
exports.curveDaoProtocolModule = curveDaoProtocolModule;
|
|
2455
2558
|
exports.evmChainCategoryModule = evmChainCategoryModule;
|
|
2456
2559
|
exports.fetchChainFeeParams = fetchChainFeeParams;
|
|
2560
|
+
exports.fetchManagementNonce = fetchManagementNonce;
|
|
2561
|
+
exports.fetchNodeKey = fetchNodeKey;
|
|
2457
2562
|
exports.finalizeMultisign = finalizeMultisign;
|
|
2458
2563
|
exports.firstClientIdFromKeyGen = firstClientIdFromKeyGen;
|
|
2459
2564
|
exports.gasLimitFromEstimateAndChainConfig = gasLimitFromEstimateAndChainConfig;
|
|
@@ -2464,10 +2569,13 @@ exports.getProtocolModules = getProtocolModules;
|
|
|
2464
2569
|
exports.gweiToDecimalString = gweiToDecimalString;
|
|
2465
2570
|
exports.isEvmNativeToken = isEvmNativeToken;
|
|
2466
2571
|
exports.keyListFromKeyGen = keyListFromKeyGen;
|
|
2572
|
+
exports.managementSigFields = managementSigFields;
|
|
2467
2573
|
exports.matchEvmTokenKind = matchEvmTokenKind;
|
|
2468
2574
|
exports.mergePurposeText = mergePurposeText;
|
|
2575
|
+
exports.messageToSignManagementBody = messageToSignManagementBody;
|
|
2469
2576
|
exports.nearChainCategoryModule = nearChainCategoryModule;
|
|
2470
2577
|
exports.nodeFetchWithReadAuth = nodeFetchWithReadAuth;
|
|
2578
|
+
exports.normalizeManagementNodeKey = normalizeManagementNodeKey;
|
|
2471
2579
|
exports.parseEvmChainIdToNumber = parseEvmChainIdToNumber;
|
|
2472
2580
|
exports.proposalTxParamsToFeeSnapshot = proposalTxParamsToFeeSnapshot;
|
|
2473
2581
|
exports.registerProtocolModule = registerProtocolModule;
|
|
@@ -2477,5 +2585,6 @@ exports.solanaChainCategoryModule = solanaChainCategoryModule;
|
|
|
2477
2585
|
exports.triggerTxParamsFromComposeBody = triggerTxParamsFromComposeBody;
|
|
2478
2586
|
exports.uniswapV4 = uniswapV4;
|
|
2479
2587
|
exports.uniswapV4ProtocolModule = uniswapV4ProtocolModule;
|
|
2588
|
+
exports.withManagementClientSig = withManagementClientSig;
|
|
2480
2589
|
//# sourceMappingURL=index.cjs.map
|
|
2481
2590
|
//# sourceMappingURL=index.cjs.map
|