@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/registry.ts","../../src/chains/evm/chainIdParse.ts","../../src/protocols/evm/uniswap-v4/constants.ts","../../src/protocols/evm/uniswap-v4/index.ts","../../src/protocols/evm/curve-dao/support.ts","../../src/protocols/evm/curve-dao/index.ts","../../src/agent/commonParamDocs.ts","../../src/agent/mcpTools.ts","../../src/agent/catalog.ts"],"names":[],"mappings":"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","file":"catalog.js","sourcesContent":["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","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { getAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Canonical Uniswap token-allowance contract on most EVM chains. */\nexport const PERMIT2_ADDRESS: Address = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\n\nconst UNIVERSAL_ROUTER_SPENDER: Partial<Record<number, string>> = {\n 1: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n 5: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',\n 137: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n 80001: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 10: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n 420: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n 421613: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42220: '0xcb695bc5D3Aa22cAD1E6DF07801b061a05A0233A',\n 44787: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 56: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n 43114: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n 84531: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n 8453: '0x6fF5693b99212da76ad316178a184ab56d299b43',\n 81457: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n 7777777: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n 324: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n 480: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n 1301: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n 130: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n 10143: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n 84532: '0x492e6456d9528771018deb9e87ef7750ef184104',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 143: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n 4217: '0x1febb76be10aaf3a1402f04e8e835f2c382f7914',\n 196: '0x5507749f2c558bb3e162c6e90c314c092e7372ff',\n}\n\nexport function isUniswapV4ChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n if (chainId == null) return false\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n const a = UNIVERSAL_ROUTER_SPENDER[n]\n return typeof a === 'string' && a.startsWith('0x')\n}\n\nexport function getUniswapUniversalRouterSpenderOrThrow(chainId: number): Address {\n const raw = UNIVERSAL_ROUTER_SPENDER[chainId]\n if (!raw || !raw.startsWith('0x')) {\n throw new Error(\n `No Uniswap Universal Router (spender) is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or use a chain supported by the Uniswap SDK.`,\n )\n }\n return getAddress(raw)\n}\n\nexport const MAX_UINT160 = (1n << 160n) - 1n\nexport const MAX_UINT48 = (1n << 48n) - 1n\n\nexport const UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_TRADE_BASE_DEFAULT = 'https://trade-api.gateway.uniswap.org/v1'\nexport const UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT = '2.0'\nexport const UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES = 30\nexport const UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET = UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES * 60\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isUniswapV4ChainSupported } from './constants.js'\n\nexport * from './constants.js'\nexport * from './quote.js'\nexport * from './swapMultisign.js'\nexport * from './purpose.js'\nexport * from './support.js'\nexport * from './swap.js'\n\nexport {\n isUniswapV4SwapEvmSignRequest,\n resolveRouterSwapGasUnitsFromSignRequest,\n} from './swapMultisign.js'\n\nexport const UNISWAP_V4_PROTOCOL_ID = 'uniswap-v4'\n\nexport const uniswapV4ProtocolModule: ProtocolModule = {\n id: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isUniswapV4ChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'uniswap-v4.swap-exact-input',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap ERC-20 or native token via Uniswap V4 Universal Router (classic allowance path)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token (0x0 for native)' },\n tokenOut: { type: 'address', required: true, description: 'Output token address' },\n amount: { type: 'string', required: true, description: 'Human or wei amount per trade type' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage tolerance percent' },\n swapTransactionDeadlineUnix: {\n type: 'number',\n required: false,\n description: 'On-chain swap deadline (unix seconds)',\n },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API key' },\n },\n },\n {\n id: 'uniswap-v4.quote',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Fetch Uniswap Trade API quote',\n commonParams: ['keyGen'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token' },\n tokenOut: { type: 'address', required: true, description: 'Output token' },\n amount: { type: 'string', required: true, description: 'Amount for quote' },\n type: { type: 'EXACT_INPUT | EXACT_OUTPUT', required: true, description: 'Trade type' },\n },\n },\n ],\n}\n\nregisterProtocolModule(uniswapV4ProtocolModule)\n\nimport { uniswapTradeQuote } from './quote.js'\nimport { buildEvmMultisignBodyUniswapV4SkipPermit2Batch } from './swapMultisign.js'\nimport { swapExactInput as swapExactInputFn, quoteSwap, createSwap, swapFromQuote } from './swap.js'\n\nexport const uniswapV4 = {\n quoteSwap,\n createSwap,\n swapExactInput: swapExactInputFn,\n swapFromQuote,\n buildSwapMultisignBody: buildEvmMultisignBodyUniswapV4SkipPermit2Batch,\n quote: uniswapTradeQuote,\n isChainSupported: isUniswapV4ChainSupported,\n}\n","import { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nconst CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554,\n])\n\nexport function isCurveApiChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n return CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS.has(n)\n}\n\nexport { isCurveApiChainSupported as isCurveDaoChainSupported }\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isCurveApiChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './swapDestinations.js'\nexport * from './apiSession.js'\nexport * from './purpose.js'\nexport * from './executeHelpers.js'\nexport * from './multisign.js'\n\nexport const CURVE_DAO_PROTOCOL_ID = 'curve-dao'\n\nexport const curveDaoProtocolModule: ProtocolModule = {\n id: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isCurveApiChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'curve-dao.swap',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap via Curve Router NG (optional ERC-20 approve batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 token in (native uses WETH path in UI)' },\n tokenOut: { type: 'address', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage percent (0–100 exclusive)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(curveDaoProtocolModule)\n\nimport { buildEvmMultisignBodyCurveDaoBatch } from './multisign.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\n\nexport const curveDao = {\n buildSwapMultisignBody: buildEvmMultisignBodyCurveDaoBatch,\n isChainSupported: isCurveApiChainSupported,\n loadSession: loadFullCurveSessionForRpc,\n}\n","import type { ParamDoc } from '../core/types.js'\n\n/** Shared inputs documented once for all EVM multisign builders. */\nexport const EVM_COMMON_PARAM_DOCS: Record<string, ParamDoc> = {\n keyGen: {\n type: 'object',\n required: true,\n description:\n 'MPC key slice: { pubkeyhex: string (required), keylist: string[], ClientKeys?: Record<string,string> }. Used for pubKey/keyList on POST /multiSignRequest.',\n },\n purposeText: {\n type: 'string',\n required: true,\n description:\n 'Human-readable purpose for the sign request. Stored in bodyForSign.purpose (may be appended with an automatic batch suffix).',\n },\n useCustomGas: {\n type: 'boolean',\n required: true,\n description:\n 'When true, apply chain gas settings from chainDetail / customGasChainDetails instead of raw RPC estimates only.',\n },\n chainId: {\n type: 'number',\n required: true,\n description: 'EVM chain id (decimal). Becomes destinationChainID on the sign request.',\n },\n rpcUrl: {\n type: 'string',\n required: true,\n description: 'HTTPS JSON-RPC URL for gas estimation, nonce, and allowance reads.',\n },\n executorAddress: {\n type: 'address',\n required: true,\n description: 'MPC wallet address (from keyGen ethereumaddress) — tx sender for estimates and approvals.',\n },\n chainDetail: {\n type: 'object',\n required: true,\n description:\n 'Optional gas config: { legacy?, gasLimit?, gasMultiplier?, gasPrice?, baseFee?, priorityFee?, baseFeeMultiplier? }.',\n },\n customGasChainDetails: {\n type: 'object',\n required: false,\n description: 'Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true.',\n },\n}\n\nexport const MULTISIGN_OUTPUT_DOC = {\n description:\n 'Unsigned mpc-auth multiSignRequest payload. The caller must sign messageToSign (MetaMask personal_sign or Ed25519) and POST { ...bodyForSign, clientSig, signedMessage: messageToSign } to /multiSignRequest.',\n fields: {\n bodyForSign: {\n type: 'object',\n description:\n 'POST body fields without clientSig: keyList, pubKey, msgHash, msgRaw, destinationChainID, purpose, extraJSON, proposalTxParams (batch), messageHashes/messageRawBatch when N>1 txs.',\n },\n messageToSign: {\n type: 'string',\n description: 'JSON.stringify(bodyForSign) — exact string to sign before adding clientSig.',\n },\n },\n} as const\n","import type { ChainCategory, ParamDoc } from '../core/types.js'\nimport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC } from './commonParamDocs.js'\nimport { getProtocolModules } from '../core/registry.js'\n\n/** JSON-schema-like object for MCP tool `inputSchema` / `outputSchema`. */\nexport type McpSchemaProperty = {\n type: string\n description?: string\n}\n\nexport type McpJsonSchema = {\n type: string\n description?: string\n properties?: Record<string, McpSchemaProperty>\n required?: string[]\n items?: McpJsonSchema\n enum?: string[]\n}\n\nexport type McpToolHandler = {\n /** Import path subpath, e.g. protocols/evm/uniswap-v4 */\n importPath: string\n /** Named export to invoke */\n exportName: string\n}\n\nexport type McpToolDefinition = {\n /** Stable MCP tool name (snake_case). */\n name: string\n /** Registry action id, e.g. uniswap-v4.quote */\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n /** Long description for the LLM — what it does, when to use it, what it does NOT do. */\n description: string\n /** Prerequisites (other tools or data that must exist first). */\n prerequisites: string[]\n /** Typical next tools after this one succeeds. */\n followUp: string[]\n inputSchema: McpJsonSchema\n outputSchema: McpJsonSchema\n handler: McpToolHandler\n}\n\nfunction paramProperties(\n params: Record<string, ParamDoc>,\n includeCommon: Array<keyof typeof EVM_COMMON_PARAM_DOCS> = [],\n): Record<string, McpSchemaProperty> {\n const out: Record<string, McpSchemaProperty> = {}\n for (const k of includeCommon) {\n const d = EVM_COMMON_PARAM_DOCS[k]\n if (d) out[k] = { type: d.type, description: d.description }\n }\n for (const [k, d] of Object.entries(params)) {\n out[k] = { type: d.type, description: d.description }\n }\n return out\n}\n\nfunction requiredKeys(\n params: Record<string, ParamDoc>,\n includeCommon: Array<keyof typeof EVM_COMMON_PARAM_DOCS> = [],\n): string[] {\n const req: string[] = []\n for (const k of includeCommon) {\n if (EVM_COMMON_PARAM_DOCS[k]?.required) req.push(k)\n }\n for (const [k, d] of Object.entries(params)) {\n if (d.required) req.push(k)\n }\n return req\n}\n\nconst multisignOutputSchema: McpJsonSchema = {\n type: 'object',\n description: MULTISIGN_OUTPUT_DOC.description,\n properties: {\n bodyForSign: {\n type: 'object',\n description: MULTISIGN_OUTPUT_DOC.fields.bodyForSign.description,\n },\n messageToSign: {\n type: 'string',\n description: MULTISIGN_OUTPUT_DOC.fields.messageToSign.description,\n },\n },\n required: ['bodyForSign', 'messageToSign'],\n}\n\n/** Curated MCP tools with rich descriptions — use this to register MCP server tools. */\nexport const MCP_TOOL_DEFINITIONS: McpToolDefinition[] = [\n {\n name: 'ctm_uniswap_v4_quote',\n actionId: 'uniswap-v4.quote',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Fetch a Uniswap V4 Trade API quote (POST /v1/quote). Returns classic quote JSON including quote.input/output amounts and routing. Does NOT create a sign request — use ctm_uniswap_v4_create_swap and ctm_uniswap_v4_build_swap_multisign after quoting. Requires uniswapApiKey and swapper (MPC executor address) or keyGen + managementNodeUrl to resolve swapper.',\n prerequisites: ['Chain must be supported by Uniswap V4 (Universal Router map).'],\n followUp: ['ctm_uniswap_v4_create_swap', 'ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapTradeQuote' },\n inputSchema: {\n type: 'object',\n properties: paramProperties({\n type: { type: 'string', required: true, description: 'EXACT_INPUT or EXACT_OUTPUT' },\n amount: { type: 'string', required: true, description: 'Amount in token-in base units (wei string for ERC-20)' },\n tokenIn: { type: 'address', required: true, description: 'Input token; 0x0 for native ETH' },\n tokenOut: { type: 'address', required: true, description: 'Output token address' },\n chainId: { type: 'number', required: true, description: 'tokenInChainId / same-chain default' },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API x-api-key' },\n swapper: { type: 'address', required: false, description: 'MPC executor; omit if keyGen + managementNodeUrl provided' },\n slippage: { type: 'number', required: false, description: 'Slippage percent; omit for API auto slippage' },\n }),\n required: requiredKeys({\n type: { type: 'string', required: true, description: '' },\n amount: { type: 'string', required: true, description: '' },\n tokenIn: { type: 'address', required: true, description: '' },\n tokenOut: { type: 'address', required: true, description: '' },\n chainId: { type: 'number', required: true, description: '' },\n uniswapApiKey: { type: 'string', required: true, description: '' },\n }),\n },\n outputSchema: {\n type: 'object',\n description: 'Full Uniswap POST /quote JSON (includes nested quote object with input/output amounts).',\n },\n },\n {\n name: 'ctm_uniswap_v4_create_swap',\n actionId: 'uniswap-v4.create-swap',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Call Uniswap Trade API POST /v1/swap to build Universal Router calldata from a prior quote. Returns { swap: { to, data, value, gasLimit? }, requestId? }. Does NOT produce a multiSignRequest — call ctm_uniswap_v4_build_swap_multisign next.',\n prerequisites: ['ctm_uniswap_v4_quote output (fullQuoteFromPermit)'],\n followUp: ['ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapCreateSwap' },\n inputSchema: {\n type: 'object',\n properties: paramProperties({\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API key' },\n fullQuoteFromPermit: { type: 'object', required: true, description: 'Full quote JSON from ctm_uniswap_v4_quote' },\n swapTransactionDeadlineUnix: {\n type: 'number',\n required: false,\n description: 'On-chain deadline unix seconds; default ~30 min from now',\n },\n useServerProxy: {\n type: 'boolean',\n required: false,\n description: 'Set false in Node/agents; true only in browser via Next API route',\n },\n }),\n required: requiredKeys({\n uniswapApiKey: { type: 'string', required: true, description: '' },\n fullQuoteFromPermit: { type: 'object', required: true, description: '' },\n }),\n },\n outputSchema: {\n type: 'object',\n description: '{ swap: TransactionRequest, requestId?, gasFee? }',\n },\n },\n {\n name: 'ctm_uniswap_v4_build_swap_multisign',\n actionId: 'uniswap-v4.swap-exact-input',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest body for a Uniswap V4 swap. May batch 1–3 EVM txs: ERC-20 approve(s) to Permit2/router path + Universal Router swap (or 1 tx for native-in). Estimates gas, serializes unsigned txs, sets proposalTxParams. Output must be signed and POSTed to /multiSignRequest by the caller.',\n prerequisites: [\n 'ctm_uniswap_v4_create_swap output',\n 'keyGen with pubkeyhex',\n 'executorAddress matching MPC wallet',\n 'RPC URL and chainDetail from node chain config',\n ],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'buildEvmMultisignBodyUniswapV4SkipPermit2Batch' },\n inputSchema: {\n type: 'object',\n properties: paramProperties(\n {\n tokenIn: { type: 'address', required: true, description: 'Token in; 0x0 for native ETH' },\n swap: { type: 'object', required: true, description: 'swap field from create_swap response' },\n createSwapResponse: { type: 'object', required: true, description: 'Full create_swap response' },\n fullQuoteSnapshot: { type: 'object', required: true, description: 'Quote JSON used for the swap' },\n swapDeadlineUnix: { type: 'number', required: true, description: 'Same deadline passed to create_swap' },\n slippagePercent: { type: 'number', required: false, description: 'Extra approve headroom for EXACT_OUTPUT' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail', 'customGasChainDetails'],\n ),\n required: requiredKeys(\n {\n tokenIn: { type: 'address', required: true, description: '' },\n swap: { type: 'object', required: true, description: '' },\n createSwapResponse: { type: 'object', required: true, description: '' },\n fullQuoteSnapshot: { type: 'object', required: true, description: '' },\n swapDeadlineUnix: { type: 'number', required: true, description: '' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail'],\n ),\n },\n outputSchema: multisignOutputSchema,\n },\n {\n name: 'ctm_curve_dao_build_swap_multisign',\n actionId: 'curve-dao.swap',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n '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.',\n prerequisites: ['keyGen', 'executorAddress', 'tokenIn/tokenOut/amountHuman/slippage', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'buildEvmMultisignBodyCurveDaoBatch' },\n inputSchema: {\n type: 'object',\n properties: paramProperties(\n {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 sold (native in uses WETH path in UI)' },\n tokenOut: { type: 'string', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable amount of tokenIn' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage 0–100 exclusive' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail', 'customGasChainDetails'],\n ),\n required: requiredKeys(\n {\n tokenIn: { type: 'address', required: true, description: '' },\n tokenOut: { type: 'string', required: true, description: '' },\n amountHuman: { type: 'string', required: true, description: '' },\n slippagePercent: { type: 'number', required: true, description: '' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail'],\n ),\n },\n outputSchema: multisignOutputSchema,\n },\n]\n\nexport function getMcpToolDefinitions(): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS\n}\n\nexport function getMcpToolByName(name: string): McpToolDefinition | undefined {\n return MCP_TOOL_DEFINITIONS.find((t) => t.name === name)\n}\n\n/** Summary from protocol registry (shorter) plus full MCP tool list. */\nexport function getAgentCatalogForMcp() {\n return {\n tools: MCP_TOOL_DEFINITIONS,\n protocols: getProtocolModules(),\n commonParams: EVM_COMMON_PARAM_DOCS,\n multisignOutput: MULTISIGN_OUTPUT_DOC,\n workflow: {\n evmSwapTypical: [\n '1. Quote (protocol-specific API if needed)',\n '2. Build protocol calldata (e.g. create_swap)',\n '3. build_*_multisign → { bodyForSign, messageToSign }',\n '4. Sign messageToSign (MetaMask or Ed25519)',\n '5. POST /multiSignRequest with clientSig and signedMessage',\n ],\n },\n }\n}\n","import { getProtocolModules, getActionsByChainCategory, registerProtocolModule } from '../core/registry.js'\nimport { uniswapV4ProtocolModule } from '../protocols/evm/uniswap-v4/index.js'\nimport { curveDaoProtocolModule } from '../protocols/evm/curve-dao/index.js'\nimport { getAgentCatalogForMcp } from './mcpTools.js'\n\nexport {\n getMcpToolDefinitions,\n getMcpToolByName,\n getAgentCatalogForMcp,\n MCP_TOOL_DEFINITIONS,\n} from './mcpTools.js'\nexport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC } from './commonParamDocs.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\n\n/** Machine-readable catalog of protocol actions grouped by chain category. */\nexport function getAgentCatalog() {\n return {\n protocols: getProtocolModules(),\n byCategory: {\n evm: getActionsByChainCategory('evm'),\n solana: getActionsByChainCategory('solana'),\n near: getActionsByChainCategory('near'),\n },\n uniswapV4: uniswapV4ProtocolModule,\n curveDao: curveDaoProtocolModule,\n /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */\n mcp: getAgentCatalogForMcp(),\n }\n}\n\nexport { getProtocolModules, getActionsByChainCategory }\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/registry.ts","../../src/chains/evm/chainIdParse.ts","../../src/protocols/evm/uniswap-v4/constants.ts","../../src/protocols/evm/uniswap-v4/index.ts","../../src/protocols/evm/curve-dao/support.ts","../../src/protocols/evm/curve-dao/index.ts","../../src/agent/commonParamDocs.ts","../../src/agent/mcpTools.ts","../../src/agent/catalog.ts"],"names":[],"mappings":"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","file":"catalog.js","sourcesContent":["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","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { getAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Canonical Uniswap token-allowance contract on most EVM chains. */\nexport const PERMIT2_ADDRESS: Address = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\n\nconst UNIVERSAL_ROUTER_SPENDER: Partial<Record<number, string>> = {\n 1: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n 5: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',\n 137: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n 80001: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 10: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n 420: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n 421613: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42220: '0xcb695bc5D3Aa22cAD1E6DF07801b061a05A0233A',\n 44787: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 56: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n 43114: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n 84531: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n 8453: '0x6fF5693b99212da76ad316178a184ab56d299b43',\n 81457: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n 7777777: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n 324: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n 480: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n 1301: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n 130: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n 10143: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n 84532: '0x492e6456d9528771018deb9e87ef7750ef184104',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 143: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n 4217: '0x1febb76be10aaf3a1402f04e8e835f2c382f7914',\n 196: '0x5507749f2c558bb3e162c6e90c314c092e7372ff',\n}\n\nexport function isUniswapV4ChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n if (chainId == null) return false\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n const a = UNIVERSAL_ROUTER_SPENDER[n]\n return typeof a === 'string' && a.startsWith('0x')\n}\n\nexport function getUniswapUniversalRouterSpenderOrThrow(chainId: number): Address {\n const raw = UNIVERSAL_ROUTER_SPENDER[chainId]\n if (!raw || !raw.startsWith('0x')) {\n throw new Error(\n `No Uniswap Universal Router (spender) is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or use a chain supported by the Uniswap SDK.`,\n )\n }\n return getAddress(raw)\n}\n\nexport const MAX_UINT160 = (1n << 160n) - 1n\nexport const MAX_UINT48 = (1n << 48n) - 1n\n\nexport const UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_TRADE_BASE_DEFAULT = 'https://trade-api.gateway.uniswap.org/v1'\nexport const UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT = '2.0'\nexport const UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES = 30\nexport const UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET = UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES * 60\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isUniswapV4ChainSupported } from './constants.js'\n\nexport * from './constants.js'\nexport * from './quote.js'\nexport * from './swapMultisign.js'\nexport * from './purpose.js'\nexport * from './support.js'\nexport * from './swap.js'\n\nexport {\n isUniswapV4SwapEvmSignRequest,\n resolveRouterSwapGasUnitsFromSignRequest,\n} from './swapMultisign.js'\n\nexport const UNISWAP_V4_PROTOCOL_ID = 'uniswap-v4'\n\nexport const uniswapV4ProtocolModule: ProtocolModule = {\n id: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isUniswapV4ChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'uniswap-v4.swap-exact-input',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap ERC-20 or native token via Uniswap V4 Universal Router (classic allowance path)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token (0x0 for native)' },\n tokenOut: { type: 'address', required: true, description: 'Output token address' },\n amount: { type: 'string', required: true, description: 'Human or wei amount per trade type' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage tolerance percent' },\n swapTransactionDeadlineUnix: {\n type: 'number',\n required: false,\n description: 'On-chain swap deadline (unix seconds)',\n },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API key' },\n },\n },\n {\n id: 'uniswap-v4.quote',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Fetch Uniswap Trade API quote',\n commonParams: ['keyGen'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token' },\n tokenOut: { type: 'address', required: true, description: 'Output token' },\n amount: { type: 'string', required: true, description: 'Amount for quote' },\n type: { type: 'EXACT_INPUT | EXACT_OUTPUT', required: true, description: 'Trade type' },\n },\n },\n ],\n}\n\nregisterProtocolModule(uniswapV4ProtocolModule)\n\nimport { uniswapTradeQuote } from './quote.js'\nimport { buildEvmMultisignBodyUniswapV4SkipPermit2Batch } from './swapMultisign.js'\nimport { swapExactInput as swapExactInputFn, quoteSwap, createSwap, swapFromQuote } from './swap.js'\n\nexport const uniswapV4 = {\n quoteSwap,\n createSwap,\n swapExactInput: swapExactInputFn,\n swapFromQuote,\n buildSwapMultisignBody: buildEvmMultisignBodyUniswapV4SkipPermit2Batch,\n quote: uniswapTradeQuote,\n isChainSupported: isUniswapV4ChainSupported,\n}\n","import { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nconst CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554,\n])\n\nexport function isCurveApiChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n return CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS.has(n)\n}\n\nexport { isCurveApiChainSupported as isCurveDaoChainSupported }\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isCurveApiChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './swapDestinations.js'\nexport * from './apiSession.js'\nexport * from './purpose.js'\nexport * from './executeHelpers.js'\nexport * from './multisign.js'\n\nexport const CURVE_DAO_PROTOCOL_ID = 'curve-dao'\n\nexport const curveDaoProtocolModule: ProtocolModule = {\n id: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isCurveApiChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'curve-dao.swap',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap via Curve Router NG (optional ERC-20 approve batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 token in (native uses WETH path in UI)' },\n tokenOut: { type: 'address', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage percent (0–100 exclusive)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(curveDaoProtocolModule)\n\nimport { buildEvmMultisignBodyCurveDaoBatch } from './multisign.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\n\nexport const curveDao = {\n buildSwapMultisignBody: buildEvmMultisignBodyCurveDaoBatch,\n isChainSupported: isCurveApiChainSupported,\n loadSession: loadFullCurveSessionForRpc,\n}\n","import type { ParamDoc } from '../core/types.js'\n\n/** Shared inputs documented once for all EVM multisign builders. */\nexport const EVM_COMMON_PARAM_DOCS: Record<string, ParamDoc> = {\n keyGen: {\n type: 'object',\n required: true,\n description:\n 'MPC key slice: { pubkeyhex: string (required), keylist: string[], ClientKeys?: Record<string,string> }. Used for pubKey/keyList on POST /multiSignRequest.',\n },\n purposeText: {\n type: 'string',\n required: true,\n description:\n 'Human-readable purpose for the sign request. Stored in bodyForSign.purpose (may be appended with an automatic batch suffix).',\n },\n useCustomGas: {\n type: 'boolean',\n required: true,\n description:\n 'When true, apply chain gas settings from chainDetail / customGasChainDetails instead of raw RPC estimates only.',\n },\n chainId: {\n type: 'number',\n required: true,\n description: 'EVM chain id (decimal). Becomes destinationChainID on the sign request.',\n },\n rpcUrl: {\n type: 'string',\n required: true,\n description: 'HTTPS JSON-RPC URL for gas estimation, nonce, and allowance reads.',\n },\n executorAddress: {\n type: 'address',\n required: true,\n description: 'MPC wallet address (from keyGen ethereumaddress) — tx sender for estimates and approvals.',\n },\n chainDetail: {\n type: 'object',\n required: true,\n description:\n 'Optional gas config: { legacy?, gasLimit?, gasMultiplier?, gasPrice?, baseFee?, priorityFee?, baseFeeMultiplier? }.',\n },\n customGasChainDetails: {\n type: 'object',\n required: false,\n description: 'Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true.',\n },\n}\n\nexport const MULTISIGN_OUTPUT_DOC = {\n description:\n 'Unsigned mpc-auth multiSignRequest payload. The caller must sign messageToSign (MetaMask personal_sign or Ed25519) and POST { ...bodyForSign, clientSig, signedMessage: messageToSign } to /multiSignRequest.',\n fields: {\n bodyForSign: {\n type: 'object',\n description:\n 'POST body fields without clientSig: keyList, pubKey, msgHash, msgRaw, destinationChainID, purpose, extraJSON, proposalTxParams (batch), messageHashes/messageRawBatch when N>1 txs.',\n },\n messageToSign: {\n type: 'string',\n description: 'JSON.stringify(bodyForSign) — exact string to sign before adding clientSig.',\n },\n },\n} as const\n\n/** mpc-auth NodeMgtKeySig envelope for management POST routes (Get Sig, shelve, keyGen, groups, …). */\nexport const MANAGEMENT_SIG_DOC = {\n description:\n '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.',\n fields: {\n nonce: {\n type: 'number',\n description: 'From GET /getPublicMgtKeyNonce (Ed25519) or GET /getNodeMgtKeyNonce (Ethereum NodeMgtKey).',\n },\n clientSig: {\n type: 'string',\n description: 'Management signature; empty string in the message to sign.',\n },\n nodeKey: {\n type: 'string',\n description: 'Required. 128-hex MPC node id from GET /getNodeKey (no 0x prefix).',\n },\n },\n helpers: {\n managementSigFields: 'Base envelope with clientSig cleared.',\n buildManagementPostBody: 'Spread managementSigFields then endpoint fields.',\n messageToSignManagementBody: 'Canonical JSON string to sign.',\n withManagementClientSig: 'Attach signature to POST body.',\n fetchNodeKey: 'GET /getNodeKey via nodeFetchWithReadAuth.',\n fetchManagementNonce: 'GET nonce for Ed25519 or Ethereum management key.',\n },\n} as const\n","import type { ChainCategory, ParamDoc } from '../core/types.js'\nimport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\nimport { getProtocolModules } from '../core/registry.js'\n\n/** JSON-schema-like object for MCP tool `inputSchema` / `outputSchema`. */\nexport type McpSchemaProperty = {\n type: string\n description?: string\n}\n\nexport type McpJsonSchema = {\n type: string\n description?: string\n properties?: Record<string, McpSchemaProperty>\n required?: string[]\n items?: McpJsonSchema\n enum?: string[]\n}\n\nexport type McpToolHandler = {\n /** Import path subpath, e.g. protocols/evm/uniswap-v4 */\n importPath: string\n /** Named export to invoke */\n exportName: string\n}\n\nexport type McpToolDefinition = {\n /** Stable MCP tool name (snake_case). */\n name: string\n /** Registry action id, e.g. uniswap-v4.quote */\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n /** Long description for the LLM — what it does, when to use it, what it does NOT do. */\n description: string\n /** Prerequisites (other tools or data that must exist first). */\n prerequisites: string[]\n /** Typical next tools after this one succeeds. */\n followUp: string[]\n inputSchema: McpJsonSchema\n outputSchema: McpJsonSchema\n handler: McpToolHandler\n}\n\nfunction paramProperties(\n params: Record<string, ParamDoc>,\n includeCommon: Array<keyof typeof EVM_COMMON_PARAM_DOCS> = [],\n): Record<string, McpSchemaProperty> {\n const out: Record<string, McpSchemaProperty> = {}\n for (const k of includeCommon) {\n const d = EVM_COMMON_PARAM_DOCS[k]\n if (d) out[k] = { type: d.type, description: d.description }\n }\n for (const [k, d] of Object.entries(params)) {\n out[k] = { type: d.type, description: d.description }\n }\n return out\n}\n\nfunction requiredKeys(\n params: Record<string, ParamDoc>,\n includeCommon: Array<keyof typeof EVM_COMMON_PARAM_DOCS> = [],\n): string[] {\n const req: string[] = []\n for (const k of includeCommon) {\n if (EVM_COMMON_PARAM_DOCS[k]?.required) req.push(k)\n }\n for (const [k, d] of Object.entries(params)) {\n if (d.required) req.push(k)\n }\n return req\n}\n\nconst multisignOutputSchema: McpJsonSchema = {\n type: 'object',\n description: MULTISIGN_OUTPUT_DOC.description,\n properties: {\n bodyForSign: {\n type: 'object',\n description: MULTISIGN_OUTPUT_DOC.fields.bodyForSign.description,\n },\n messageToSign: {\n type: 'string',\n description: MULTISIGN_OUTPUT_DOC.fields.messageToSign.description,\n },\n },\n required: ['bodyForSign', 'messageToSign'],\n}\n\n/** Curated MCP tools with rich descriptions — use this to register MCP server tools. */\nexport const MCP_TOOL_DEFINITIONS: McpToolDefinition[] = [\n {\n name: 'ctm_uniswap_v4_quote',\n actionId: 'uniswap-v4.quote',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Fetch a Uniswap V4 Trade API quote (POST /v1/quote). Returns classic quote JSON including quote.input/output amounts and routing. Does NOT create a sign request — use ctm_uniswap_v4_create_swap and ctm_uniswap_v4_build_swap_multisign after quoting. Requires uniswapApiKey and swapper (MPC executor address) or keyGen + managementNodeUrl to resolve swapper.',\n prerequisites: ['Chain must be supported by Uniswap V4 (Universal Router map).'],\n followUp: ['ctm_uniswap_v4_create_swap', 'ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapTradeQuote' },\n inputSchema: {\n type: 'object',\n properties: paramProperties({\n type: { type: 'string', required: true, description: 'EXACT_INPUT or EXACT_OUTPUT' },\n amount: { type: 'string', required: true, description: 'Amount in token-in base units (wei string for ERC-20)' },\n tokenIn: { type: 'address', required: true, description: 'Input token; 0x0 for native ETH' },\n tokenOut: { type: 'address', required: true, description: 'Output token address' },\n chainId: { type: 'number', required: true, description: 'tokenInChainId / same-chain default' },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API x-api-key' },\n swapper: { type: 'address', required: false, description: 'MPC executor; omit if keyGen + managementNodeUrl provided' },\n slippage: { type: 'number', required: false, description: 'Slippage percent; omit for API auto slippage' },\n }),\n required: requiredKeys({\n type: { type: 'string', required: true, description: '' },\n amount: { type: 'string', required: true, description: '' },\n tokenIn: { type: 'address', required: true, description: '' },\n tokenOut: { type: 'address', required: true, description: '' },\n chainId: { type: 'number', required: true, description: '' },\n uniswapApiKey: { type: 'string', required: true, description: '' },\n }),\n },\n outputSchema: {\n type: 'object',\n description: 'Full Uniswap POST /quote JSON (includes nested quote object with input/output amounts).',\n },\n },\n {\n name: 'ctm_uniswap_v4_create_swap',\n actionId: 'uniswap-v4.create-swap',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Call Uniswap Trade API POST /v1/swap to build Universal Router calldata from a prior quote. Returns { swap: { to, data, value, gasLimit? }, requestId? }. Does NOT produce a multiSignRequest — call ctm_uniswap_v4_build_swap_multisign next.',\n prerequisites: ['ctm_uniswap_v4_quote output (fullQuoteFromPermit)'],\n followUp: ['ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapCreateSwap' },\n inputSchema: {\n type: 'object',\n properties: paramProperties({\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API key' },\n fullQuoteFromPermit: { type: 'object', required: true, description: 'Full quote JSON from ctm_uniswap_v4_quote' },\n swapTransactionDeadlineUnix: {\n type: 'number',\n required: false,\n description: 'On-chain deadline unix seconds; default ~30 min from now',\n },\n useServerProxy: {\n type: 'boolean',\n required: false,\n description: 'Set false in Node/agents; true only in browser via Next API route',\n },\n }),\n required: requiredKeys({\n uniswapApiKey: { type: 'string', required: true, description: '' },\n fullQuoteFromPermit: { type: 'object', required: true, description: '' },\n }),\n },\n outputSchema: {\n type: 'object',\n description: '{ swap: TransactionRequest, requestId?, gasFee? }',\n },\n },\n {\n name: 'ctm_uniswap_v4_build_swap_multisign',\n actionId: 'uniswap-v4.swap-exact-input',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest body for a Uniswap V4 swap. May batch 1–3 EVM txs: ERC-20 approve(s) to Permit2/router path + Universal Router swap (or 1 tx for native-in). Estimates gas, serializes unsigned txs, sets proposalTxParams. Output must be signed and POSTed to /multiSignRequest by the caller.',\n prerequisites: [\n 'ctm_uniswap_v4_create_swap output',\n 'keyGen with pubkeyhex',\n 'executorAddress matching MPC wallet',\n 'RPC URL and chainDetail from node chain config',\n ],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig and signedMessage'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'buildEvmMultisignBodyUniswapV4SkipPermit2Batch' },\n inputSchema: {\n type: 'object',\n properties: paramProperties(\n {\n tokenIn: { type: 'address', required: true, description: 'Token in; 0x0 for native ETH' },\n swap: { type: 'object', required: true, description: 'swap field from create_swap response' },\n createSwapResponse: { type: 'object', required: true, description: 'Full create_swap response' },\n fullQuoteSnapshot: { type: 'object', required: true, description: 'Quote JSON used for the swap' },\n swapDeadlineUnix: { type: 'number', required: true, description: 'Same deadline passed to create_swap' },\n slippagePercent: { type: 'number', required: false, description: 'Extra approve headroom for EXACT_OUTPUT' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail', 'customGasChainDetails'],\n ),\n required: requiredKeys(\n {\n tokenIn: { type: 'address', required: true, description: '' },\n swap: { type: 'object', required: true, description: '' },\n createSwapResponse: { type: 'object', required: true, description: '' },\n fullQuoteSnapshot: { type: 'object', required: true, description: '' },\n swapDeadlineUnix: { type: 'number', required: true, description: '' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail'],\n ),\n },\n outputSchema: multisignOutputSchema,\n },\n {\n name: 'ctm_curve_dao_build_swap_multisign',\n actionId: 'curve-dao.swap',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n '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.',\n prerequisites: ['keyGen', 'executorAddress', 'tokenIn/tokenOut/amountHuman/slippage', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig and signedMessage'],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'buildEvmMultisignBodyCurveDaoBatch' },\n inputSchema: {\n type: 'object',\n properties: paramProperties(\n {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 sold (native in uses WETH path in UI)' },\n tokenOut: { type: 'string', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable amount of tokenIn' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage 0–100 exclusive' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail', 'customGasChainDetails'],\n ),\n required: requiredKeys(\n {\n tokenIn: { type: 'address', required: true, description: '' },\n tokenOut: { type: 'string', required: true, description: '' },\n amountHuman: { type: 'string', required: true, description: '' },\n slippagePercent: { type: 'number', required: true, description: '' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail'],\n ),\n },\n outputSchema: multisignOutputSchema,\n },\n]\n\nexport function getMcpToolDefinitions(): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS\n}\n\nexport function getMcpToolByName(name: string): McpToolDefinition | undefined {\n return MCP_TOOL_DEFINITIONS.find((t) => t.name === name)\n}\n\n/** Summary from protocol registry (shorter) plus full MCP tool list. */\nexport function getAgentCatalogForMcp() {\n return {\n tools: MCP_TOOL_DEFINITIONS,\n protocols: getProtocolModules(),\n commonParams: EVM_COMMON_PARAM_DOCS,\n multisignOutput: MULTISIGN_OUTPUT_DOC,\n managementSig: MANAGEMENT_SIG_DOC,\n workflow: {\n evmSwapTypical: [\n '1. Quote (protocol-specific API if needed)',\n '2. Build protocol calldata (e.g. create_swap)',\n '3. build_*_multisign → { bodyForSign, messageToSign }',\n '4. Sign messageToSign (MetaMask or Ed25519)',\n '5. POST /multiSignRequest with clientSig and signedMessage',\n ],\n managementPostTypical: [\n '1. GET /getNodeKey → nodeKey (128 hex)',\n '2. GET /getPublicMgtKeyNonce or /getNodeMgtKeyNonce → nonce',\n '3. buildManagementPostBody(nonce, nodeKey, { …endpoint fields })',\n '4. messageToSignManagementBody(body) → sign → withManagementClientSig(body, sig)',\n '5. POST management route with signed body',\n ],\n },\n }\n}\n","import { getProtocolModules, getActionsByChainCategory, registerProtocolModule } from '../core/registry.js'\nimport { uniswapV4ProtocolModule } from '../protocols/evm/uniswap-v4/index.js'\nimport { curveDaoProtocolModule } from '../protocols/evm/curve-dao/index.js'\nimport { getAgentCatalogForMcp } from './mcpTools.js'\n\nexport {\n getMcpToolDefinitions,\n getMcpToolByName,\n getAgentCatalogForMcp,\n MCP_TOOL_DEFINITIONS,\n} from './mcpTools.js'\nexport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\n\n/** Machine-readable catalog of protocol actions grouped by chain category. */\nexport function getAgentCatalog() {\n return {\n protocols: getProtocolModules(),\n byCategory: {\n evm: getActionsByChainCategory('evm'),\n solana: getActionsByChainCategory('solana'),\n near: getActionsByChainCategory('near'),\n },\n uniswapV4: uniswapV4ProtocolModule,\n curveDao: curveDaoProtocolModule,\n /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */\n mcp: getAgentCatalogForMcp(),\n }\n}\n\nexport { getProtocolModules, getActionsByChainCategory }\n"]}
|
package/dist/core/index.cjs
CHANGED
|
@@ -113,16 +113,92 @@ function nodeFetchWithReadAuth(url, init, auth) {
|
|
|
113
113
|
return fetch(url, { ...init, headers });
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
// src/core/managementPostSig.ts
|
|
117
|
+
function normalizeManagementNodeKey(nodeKey) {
|
|
118
|
+
const nk = nodeKey?.trim().replace(/^0x/i, "");
|
|
119
|
+
if (!nk || !/^[0-9a-fA-F]{128}$/.test(nk)) {
|
|
120
|
+
throw new Error("nodeKey is required (128 hex from GET /getNodeKey).");
|
|
121
|
+
}
|
|
122
|
+
return nk.toLowerCase();
|
|
123
|
+
}
|
|
124
|
+
function managementSigFields(nonce, nodeKey) {
|
|
125
|
+
return { nonce, clientSig: "", nodeKey: normalizeManagementNodeKey(nodeKey) };
|
|
126
|
+
}
|
|
127
|
+
function buildManagementPostBody(nonce, nodeKey, fields = {}) {
|
|
128
|
+
return { ...managementSigFields(nonce, nodeKey), ...fields };
|
|
129
|
+
}
|
|
130
|
+
function messageToSignManagementBody(body) {
|
|
131
|
+
return JSON.stringify({ ...body, clientSig: "" });
|
|
132
|
+
}
|
|
133
|
+
function withManagementClientSig(body, clientSig) {
|
|
134
|
+
return { ...body, clientSig: clientSig.trim().replace(/^0x/i, "") };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// src/core/managementNonce.ts
|
|
138
|
+
function mpcAuthData(raw) {
|
|
139
|
+
const code = raw.Code ?? raw.code;
|
|
140
|
+
if (code !== 0 && code !== void 0) return void 0;
|
|
141
|
+
return raw.Data ?? raw.data;
|
|
142
|
+
}
|
|
143
|
+
async function fetchNodeKey(nodeUrl, readAuth = { bearerOnGet: false, jwt: null }) {
|
|
144
|
+
const base = nodeUrl.trim().replace(/\/$/, "");
|
|
145
|
+
const res = await nodeFetchWithReadAuth(`${base}/getNodeKey`, { cache: "no-store" }, readAuth);
|
|
146
|
+
const text = await res.text();
|
|
147
|
+
let raw;
|
|
148
|
+
try {
|
|
149
|
+
raw = JSON.parse(text);
|
|
150
|
+
} catch {
|
|
151
|
+
return { nodeKey: "", ok: false };
|
|
152
|
+
}
|
|
153
|
+
const data = mpcAuthData(raw);
|
|
154
|
+
const nk = typeof data === "string" ? data : data != null && typeof data === "object" && !Array.isArray(data) ? String(data.nodeKey ?? data.NodeKey ?? "") : data != null ? String(data) : "";
|
|
155
|
+
const trimmed = nk.trim().replace(/^0x/i, "");
|
|
156
|
+
if (!/^[0-9a-fA-F]{128}$/.test(trimmed)) {
|
|
157
|
+
return { nodeKey: "", ok: false };
|
|
158
|
+
}
|
|
159
|
+
return { nodeKey: trimmed.toLowerCase(), ok: res.ok };
|
|
160
|
+
}
|
|
161
|
+
async function fetchManagementNonce(nodeUrl, useEd25519, ed25519PublicKey, readAuth = { bearerOnGet: false, jwt: null }) {
|
|
162
|
+
const base = nodeUrl.trim().replace(/\/$/, "");
|
|
163
|
+
const path = useEd25519 ? "/getPublicMgtKeyNonce" : "/getNodeMgtKeyNonce";
|
|
164
|
+
const url = useEd25519 && ed25519PublicKey && /^[0-9a-fA-F]{64}$/.test(ed25519PublicKey.trim()) ? `${base}${path}?publicKey=${encodeURIComponent(ed25519PublicKey.trim())}` : `${base}${path}`;
|
|
165
|
+
const res = await nodeFetchWithReadAuth(url, { cache: "no-store" }, readAuth);
|
|
166
|
+
const text = await res.text();
|
|
167
|
+
let raw;
|
|
168
|
+
try {
|
|
169
|
+
raw = JSON.parse(text);
|
|
170
|
+
} catch {
|
|
171
|
+
return { nonce: 0, ok: false, code: -1 };
|
|
172
|
+
}
|
|
173
|
+
const code = raw.Code ?? raw.code;
|
|
174
|
+
const payload = mpcAuthData(raw) ?? raw.Data ?? raw.data;
|
|
175
|
+
let nonce = 0;
|
|
176
|
+
if (typeof payload === "number" && !Number.isNaN(payload)) {
|
|
177
|
+
nonce = payload;
|
|
178
|
+
} else if (payload && typeof payload === "object") {
|
|
179
|
+
const n = payload.nonce ?? payload.Nonce;
|
|
180
|
+
nonce = typeof n === "number" && !Number.isNaN(n) ? n : Number(n) || 0;
|
|
181
|
+
}
|
|
182
|
+
return { nonce, ok: res.ok && (code === 0 || code === void 0), code: code ?? -1 };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
exports.buildManagementPostBody = buildManagementPostBody;
|
|
116
186
|
exports.coreChainCategoryModule = coreChainCategoryModule;
|
|
187
|
+
exports.fetchManagementNonce = fetchManagementNonce;
|
|
188
|
+
exports.fetchNodeKey = fetchNodeKey;
|
|
117
189
|
exports.finalizeMultisign = finalizeMultisign;
|
|
118
190
|
exports.firstClientIdFromKeyGen = firstClientIdFromKeyGen;
|
|
119
191
|
exports.getActionsByChainCategory = getActionsByChainCategory;
|
|
120
192
|
exports.getProtocolModule = getProtocolModule;
|
|
121
193
|
exports.getProtocolModules = getProtocolModules;
|
|
122
194
|
exports.keyListFromKeyGen = keyListFromKeyGen;
|
|
195
|
+
exports.managementSigFields = managementSigFields;
|
|
123
196
|
exports.mergePurposeText = mergePurposeText;
|
|
197
|
+
exports.messageToSignManagementBody = messageToSignManagementBody;
|
|
124
198
|
exports.nodeFetchWithReadAuth = nodeFetchWithReadAuth;
|
|
199
|
+
exports.normalizeManagementNodeKey = normalizeManagementNodeKey;
|
|
125
200
|
exports.registerProtocolModule = registerProtocolModule;
|
|
126
201
|
exports.requirePubKeyHex = requirePubKeyHex;
|
|
202
|
+
exports.withManagementClientSig = withManagementClientSig;
|
|
127
203
|
//# sourceMappingURL=index.cjs.map
|
|
128
204
|
//# sourceMappingURL=index.cjs.map
|
package/dist/core/index.cjs.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.cjs","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.cjs","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/core/index.d.cts
CHANGED
|
@@ -2,9 +2,42 @@ export { C as ChainCategory, a as ChainSupportContext, E as EvmTokenKind, K as K
|
|
|
2
2
|
export { K as KeyGenSubsetForPermit, f as firstClientIdFromKeyGen, k as keyListFromKeyGen, r as requirePubKeyHex } from '../keygen-CfNp8yKJ.cjs';
|
|
3
3
|
export { C as ChainCategoryBuildInput, a as ChainCategoryModule, M as MultisignLeg, c as coreChainCategoryModule, f as finalizeMultisign } from '../envelope-DYDPnrHZ.cjs';
|
|
4
4
|
export { g as getActionsByChainCategory, a as getProtocolModule, b as getProtocolModules, r as registerProtocolModule } from '../registry-BwZoE668.cjs';
|
|
5
|
-
|
|
5
|
+
import { N as NodeReadAuth } from '../nodeRead-BnmSaMGO.cjs';
|
|
6
|
+
export { n as nodeFetchWithReadAuth } from '../nodeRead-BnmSaMGO.cjs';
|
|
6
7
|
|
|
7
8
|
/** Merge user purpose text with an optional batch / protocol suffix. */
|
|
8
9
|
declare function mergePurposeText(purposeText: string, purposeSuffix?: string): string;
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
/** mpc-auth NodeMgtKeySig envelope: `{ nonce, clientSig, nodeKey }` (all lowercase). */
|
|
12
|
+
type ManagementSigFields = {
|
|
13
|
+
nonce: number;
|
|
14
|
+
clientSig: string;
|
|
15
|
+
nodeKey: string;
|
|
16
|
+
};
|
|
17
|
+
declare function normalizeManagementNodeKey(nodeKey: string | null | undefined): string;
|
|
18
|
+
/** Base fields for NodeMgtKeySig-style POST bodies (`clientSig` cleared for signing). */
|
|
19
|
+
declare function managementSigFields(nonce: number, nodeKey: string | null | undefined): ManagementSigFields;
|
|
20
|
+
/** Spread management fields first, then endpoint-specific fields (preserves key order when spreading). */
|
|
21
|
+
declare function buildManagementPostBody(nonce: number, nodeKey: string | null | undefined, fields?: Record<string, unknown>): Record<string, unknown>;
|
|
22
|
+
/** Exact UTF-8 string to sign: same JSON with `clientSig` cleared. */
|
|
23
|
+
declare function messageToSignManagementBody(body: Record<string, unknown>): string;
|
|
24
|
+
declare function withManagementClientSig(body: Record<string, unknown>, clientSig: string): Record<string, unknown>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* GET /getNodeKey — 128-hex MPC node id required on all NodeMgtKeySig POST bodies.
|
|
28
|
+
*/
|
|
29
|
+
declare function fetchNodeKey(nodeUrl: string, readAuth?: NodeReadAuth): Promise<{
|
|
30
|
+
nodeKey: string;
|
|
31
|
+
ok: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Fetch management nonce: GET /getPublicMgtKeyNonce (Ed25519) or GET /getNodeMgtKeyNonce (Ethereum NodeMgtKey).
|
|
35
|
+
* For Ed25519 added keys, pass `?publicKey=<64-hex>`.
|
|
36
|
+
*/
|
|
37
|
+
declare function fetchManagementNonce(nodeUrl: string, useEd25519: boolean, ed25519PublicKey?: string, readAuth?: NodeReadAuth): Promise<{
|
|
38
|
+
nonce: number;
|
|
39
|
+
ok: boolean;
|
|
40
|
+
code: number;
|
|
41
|
+
}>;
|
|
42
|
+
|
|
43
|
+
export { type ManagementSigFields, NodeReadAuth, buildManagementPostBody, fetchManagementNonce, fetchNodeKey, managementSigFields, mergePurposeText, messageToSignManagementBody, normalizeManagementNodeKey, withManagementClientSig };
|
package/dist/core/index.d.ts
CHANGED
|
@@ -2,9 +2,42 @@ export { C as ChainCategory, a as ChainSupportContext, E as EvmTokenKind, K as K
|
|
|
2
2
|
export { K as KeyGenSubsetForPermit, f as firstClientIdFromKeyGen, k as keyListFromKeyGen, r as requirePubKeyHex } from '../keygen-DsINazx8.js';
|
|
3
3
|
export { C as ChainCategoryBuildInput, a as ChainCategoryModule, M as MultisignLeg, c as coreChainCategoryModule, f as finalizeMultisign } from '../envelope-CcE5Cz_q.js';
|
|
4
4
|
export { g as getActionsByChainCategory, a as getProtocolModule, b as getProtocolModules, r as registerProtocolModule } from '../registry-oMKlO_5z.js';
|
|
5
|
-
|
|
5
|
+
import { N as NodeReadAuth } from '../nodeRead-BnmSaMGO.js';
|
|
6
|
+
export { n as nodeFetchWithReadAuth } from '../nodeRead-BnmSaMGO.js';
|
|
6
7
|
|
|
7
8
|
/** Merge user purpose text with an optional batch / protocol suffix. */
|
|
8
9
|
declare function mergePurposeText(purposeText: string, purposeSuffix?: string): string;
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
/** mpc-auth NodeMgtKeySig envelope: `{ nonce, clientSig, nodeKey }` (all lowercase). */
|
|
12
|
+
type ManagementSigFields = {
|
|
13
|
+
nonce: number;
|
|
14
|
+
clientSig: string;
|
|
15
|
+
nodeKey: string;
|
|
16
|
+
};
|
|
17
|
+
declare function normalizeManagementNodeKey(nodeKey: string | null | undefined): string;
|
|
18
|
+
/** Base fields for NodeMgtKeySig-style POST bodies (`clientSig` cleared for signing). */
|
|
19
|
+
declare function managementSigFields(nonce: number, nodeKey: string | null | undefined): ManagementSigFields;
|
|
20
|
+
/** Spread management fields first, then endpoint-specific fields (preserves key order when spreading). */
|
|
21
|
+
declare function buildManagementPostBody(nonce: number, nodeKey: string | null | undefined, fields?: Record<string, unknown>): Record<string, unknown>;
|
|
22
|
+
/** Exact UTF-8 string to sign: same JSON with `clientSig` cleared. */
|
|
23
|
+
declare function messageToSignManagementBody(body: Record<string, unknown>): string;
|
|
24
|
+
declare function withManagementClientSig(body: Record<string, unknown>, clientSig: string): Record<string, unknown>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* GET /getNodeKey — 128-hex MPC node id required on all NodeMgtKeySig POST bodies.
|
|
28
|
+
*/
|
|
29
|
+
declare function fetchNodeKey(nodeUrl: string, readAuth?: NodeReadAuth): Promise<{
|
|
30
|
+
nodeKey: string;
|
|
31
|
+
ok: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Fetch management nonce: GET /getPublicMgtKeyNonce (Ed25519) or GET /getNodeMgtKeyNonce (Ethereum NodeMgtKey).
|
|
35
|
+
* For Ed25519 added keys, pass `?publicKey=<64-hex>`.
|
|
36
|
+
*/
|
|
37
|
+
declare function fetchManagementNonce(nodeUrl: string, useEd25519: boolean, ed25519PublicKey?: string, readAuth?: NodeReadAuth): Promise<{
|
|
38
|
+
nonce: number;
|
|
39
|
+
ok: boolean;
|
|
40
|
+
code: number;
|
|
41
|
+
}>;
|
|
42
|
+
|
|
43
|
+
export { type ManagementSigFields, NodeReadAuth, buildManagementPostBody, fetchManagementNonce, fetchNodeKey, managementSigFields, mergePurposeText, messageToSignManagementBody, normalizeManagementNodeKey, withManagementClientSig };
|
package/dist/core/index.js
CHANGED
|
@@ -111,6 +111,75 @@ function nodeFetchWithReadAuth(url, init, auth) {
|
|
|
111
111
|
return fetch(url, { ...init, headers });
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
|
|
114
|
+
// src/core/managementPostSig.ts
|
|
115
|
+
function normalizeManagementNodeKey(nodeKey) {
|
|
116
|
+
const nk = nodeKey?.trim().replace(/^0x/i, "");
|
|
117
|
+
if (!nk || !/^[0-9a-fA-F]{128}$/.test(nk)) {
|
|
118
|
+
throw new Error("nodeKey is required (128 hex from GET /getNodeKey).");
|
|
119
|
+
}
|
|
120
|
+
return nk.toLowerCase();
|
|
121
|
+
}
|
|
122
|
+
function managementSigFields(nonce, nodeKey) {
|
|
123
|
+
return { nonce, clientSig: "", nodeKey: normalizeManagementNodeKey(nodeKey) };
|
|
124
|
+
}
|
|
125
|
+
function buildManagementPostBody(nonce, nodeKey, fields = {}) {
|
|
126
|
+
return { ...managementSigFields(nonce, nodeKey), ...fields };
|
|
127
|
+
}
|
|
128
|
+
function messageToSignManagementBody(body) {
|
|
129
|
+
return JSON.stringify({ ...body, clientSig: "" });
|
|
130
|
+
}
|
|
131
|
+
function withManagementClientSig(body, clientSig) {
|
|
132
|
+
return { ...body, clientSig: clientSig.trim().replace(/^0x/i, "") };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/core/managementNonce.ts
|
|
136
|
+
function mpcAuthData(raw) {
|
|
137
|
+
const code = raw.Code ?? raw.code;
|
|
138
|
+
if (code !== 0 && code !== void 0) return void 0;
|
|
139
|
+
return raw.Data ?? raw.data;
|
|
140
|
+
}
|
|
141
|
+
async function fetchNodeKey(nodeUrl, readAuth = { bearerOnGet: false, jwt: null }) {
|
|
142
|
+
const base = nodeUrl.trim().replace(/\/$/, "");
|
|
143
|
+
const res = await nodeFetchWithReadAuth(`${base}/getNodeKey`, { cache: "no-store" }, readAuth);
|
|
144
|
+
const text = await res.text();
|
|
145
|
+
let raw;
|
|
146
|
+
try {
|
|
147
|
+
raw = JSON.parse(text);
|
|
148
|
+
} catch {
|
|
149
|
+
return { nodeKey: "", ok: false };
|
|
150
|
+
}
|
|
151
|
+
const data = mpcAuthData(raw);
|
|
152
|
+
const nk = typeof data === "string" ? data : data != null && typeof data === "object" && !Array.isArray(data) ? String(data.nodeKey ?? data.NodeKey ?? "") : data != null ? String(data) : "";
|
|
153
|
+
const trimmed = nk.trim().replace(/^0x/i, "");
|
|
154
|
+
if (!/^[0-9a-fA-F]{128}$/.test(trimmed)) {
|
|
155
|
+
return { nodeKey: "", ok: false };
|
|
156
|
+
}
|
|
157
|
+
return { nodeKey: trimmed.toLowerCase(), ok: res.ok };
|
|
158
|
+
}
|
|
159
|
+
async function fetchManagementNonce(nodeUrl, useEd25519, ed25519PublicKey, readAuth = { bearerOnGet: false, jwt: null }) {
|
|
160
|
+
const base = nodeUrl.trim().replace(/\/$/, "");
|
|
161
|
+
const path = useEd25519 ? "/getPublicMgtKeyNonce" : "/getNodeMgtKeyNonce";
|
|
162
|
+
const url = useEd25519 && ed25519PublicKey && /^[0-9a-fA-F]{64}$/.test(ed25519PublicKey.trim()) ? `${base}${path}?publicKey=${encodeURIComponent(ed25519PublicKey.trim())}` : `${base}${path}`;
|
|
163
|
+
const res = await nodeFetchWithReadAuth(url, { cache: "no-store" }, readAuth);
|
|
164
|
+
const text = await res.text();
|
|
165
|
+
let raw;
|
|
166
|
+
try {
|
|
167
|
+
raw = JSON.parse(text);
|
|
168
|
+
} catch {
|
|
169
|
+
return { nonce: 0, ok: false, code: -1 };
|
|
170
|
+
}
|
|
171
|
+
const code = raw.Code ?? raw.code;
|
|
172
|
+
const payload = mpcAuthData(raw) ?? raw.Data ?? raw.data;
|
|
173
|
+
let nonce = 0;
|
|
174
|
+
if (typeof payload === "number" && !Number.isNaN(payload)) {
|
|
175
|
+
nonce = payload;
|
|
176
|
+
} else if (payload && typeof payload === "object") {
|
|
177
|
+
const n = payload.nonce ?? payload.Nonce;
|
|
178
|
+
nonce = typeof n === "number" && !Number.isNaN(n) ? n : Number(n) || 0;
|
|
179
|
+
}
|
|
180
|
+
return { nonce, ok: res.ok && (code === 0 || code === void 0), code: code ?? -1 };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export { buildManagementPostBody, coreChainCategoryModule, fetchManagementNonce, fetchNodeKey, finalizeMultisign, firstClientIdFromKeyGen, getActionsByChainCategory, getProtocolModule, getProtocolModules, keyListFromKeyGen, managementSigFields, mergePurposeText, messageToSignManagementBody, nodeFetchWithReadAuth, normalizeManagementNodeKey, registerProtocolModule, requirePubKeyHex, withManagementClientSig };
|
|
115
184
|
//# sourceMappingURL=index.js.map
|
|
116
185
|
//# sourceMappingURL=index.js.map
|