@continuumdao/ctm-mpc-defi 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/catalog.cjs +878 -141
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.cts +756 -12
- package/dist/agent/catalog.d.ts +756 -12
- package/dist/agent/catalog.js +829 -142
- package/dist/agent/catalog.js.map +1 -1
- package/dist/chains/evm/index.cjs +13 -0
- package/dist/chains/evm/index.cjs.map +1 -1
- package/dist/chains/evm/index.d.cts +3 -1
- package/dist/chains/evm/index.d.ts +3 -1
- package/dist/chains/evm/index.js +13 -1
- package/dist/chains/evm/index.js.map +1 -1
- package/dist/index.cjs +825 -141
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +825 -142
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +1987 -0
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -0
- package/dist/protocols/evm/aave-v4/index.d.cts +500 -0
- package/dist/protocols/evm/aave-v4/index.d.ts +500 -0
- package/dist/protocols/evm/aave-v4/index.js +1943 -0
- package/dist/protocols/evm/aave-v4/index.js.map +1 -0
- package/dist/protocols/evm/ethena/index.cjs +965 -0
- package/dist/protocols/evm/ethena/index.cjs.map +1 -0
- package/dist/protocols/evm/ethena/index.d.cts +161 -0
- package/dist/protocols/evm/ethena/index.d.ts +161 -0
- package/dist/protocols/evm/ethena/index.js +943 -0
- package/dist/protocols/evm/ethena/index.js.map +1 -0
- package/dist/protocols/evm/euler-v2/index.cjs +2263 -0
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -0
- package/dist/protocols/evm/euler-v2/index.d.cts +317 -0
- package/dist/protocols/evm/euler-v2/index.d.ts +317 -0
- package/dist/protocols/evm/euler-v2/index.js +2238 -0
- package/dist/protocols/evm/euler-v2/index.js.map +1 -0
- package/dist/protocols/evm/lido/index.cjs +834 -0
- package/dist/protocols/evm/lido/index.cjs.map +1 -0
- package/dist/protocols/evm/lido/index.d.cts +120 -0
- package/dist/protocols/evm/lido/index.d.ts +120 -0
- package/dist/protocols/evm/lido/index.js +809 -0
- package/dist/protocols/evm/lido/index.js.map +1 -0
- package/dist/protocols/evm/maple/index.cjs +707 -0
- package/dist/protocols/evm/maple/index.cjs.map +1 -0
- package/dist/protocols/evm/maple/index.d.cts +109 -0
- package/dist/protocols/evm/maple/index.d.ts +109 -0
- package/dist/protocols/evm/maple/index.js +693 -0
- package/dist/protocols/evm/maple/index.js.map +1 -0
- package/dist/protocols/evm/sky/index.cjs +1254 -0
- package/dist/protocols/evm/sky/index.cjs.map +1 -0
- package/dist/protocols/evm/sky/index.d.cts +218 -0
- package/dist/protocols/evm/sky/index.d.ts +218 -0
- package/dist/protocols/evm/sky/index.js +1229 -0
- package/dist/protocols/evm/sky/index.js.map +1 -0
- package/package.json +37 -3
package/dist/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","../src/core/managementPostSig.ts","../src/core/managementNonce.ts","../src/chains/evm/types.ts","../src/chains/evm/txParams.ts","../src/chains/evm/fees/chainFees.ts","../src/chains/evm/fees/eip1559Align.ts","../src/chains/evm/buildBatch.ts","../src/chains/evm/fees/customGas.ts","../src/chains/evm/chainIdParse.ts","../src/chains/solana/types.ts","../src/chains/solana/index.ts","../src/chains/near/types.ts","../src/chains/near/index.ts","../src/protocols/evm/uniswap-v4/constants.ts","../src/protocols/evm/uniswap-v4/quote.ts","../src/protocols/evm/uniswap-v4/swapMultisign.ts","../src/protocols/evm/uniswap-v4/swap.ts","../src/protocols/evm/uniswap-v4/index.ts","../src/protocols/evm/curve-dao/support.ts","../src/protocols/evm/curve-dao/swapDestinations.ts","../src/protocols/evm/curve-dao/apiSession.ts","../src/protocols/evm/curve-dao/executeHelpers.ts","../src/protocols/evm/curve-dao/multisign.ts","../src/protocols/evm/curve-dao/index.ts","../src/agent/commonParamDocs.ts","../src/agent/mcpTools.ts","../src/agent/catalog.ts","../src/index.ts"],"names":["getAddress","zeroAddress","defineChain","createPublicClient","http","formatUnits","gasPriceGwei","parseGwei","serializeTransaction","keccak256","res","text","parsed","decodeFunctionData","encodeFunctionData","erc20Abi","isAddress","ETH_PLACEHOLDER","parseAbi","parseUnits"],"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","import type { EvmTokenKind, MultisignCommonArgs } from '../../core/types.js'\nimport { getAddress, zeroAddress, type Address } from 'viem'\n\nexport type EvmChainDetail = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nexport interface EvmProtocolContext extends MultisignCommonArgs {\n chainCategory: 'evm'\n chainId: number\n rpcUrl: string\n executorAddress: Address\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n}\n\nexport type EvmTxStep = {\n to: Address\n data: `0x${string}`\n value: bigint\n /** Fallback when estimateGas reverts */\n fallbackGas?: bigint\n /** When set, use routerSwapGasLimitFromEstimate instead of plain estimate */\n routerSwap?: boolean\n}\n\nexport function isEvmNativeToken(address: string): boolean {\n try {\n return getAddress(address as `0x${string}`) === zeroAddress\n } catch {\n return address.toLowerCase() === zeroAddress\n }\n}\n\nexport function matchEvmTokenKind(\n kind: EvmTokenKind,\n address: string,\n): boolean {\n if (kind === 'native') return isEvmNativeToken(address)\n if (kind === 'erc20' || kind === 'ctmerc20' || kind === 'ctmrwa1') {\n return !isEvmNativeToken(address)\n }\n return true\n}\n","/**\n * Proposal-time EVM fields for POST /multiSignRequest (mpc-auth).\n * Same shape as trigger txParams and GET /getSignRequestById?tx_params=1.\n */\n\nexport type ProposalTxParams = {\n nonce: number\n gasLimit: string\n txType: 'eip1559' | 'legacy'\n maxFeePerGas?: string\n maxPriorityFeePerGas?: string\n gasPrice?: string\n}\n\nexport function gasLimitFromEstimateAndChainConfig(\n estimatedGas: bigint,\n chainGasLimit?: number,\n): bigint {\n if (chainGasLimit == null || !Number.isFinite(chainGasLimit) || chainGasLimit <= 0) {\n return estimatedGas\n }\n const cfg = BigInt(Math.floor(chainGasLimit))\n return cfg > estimatedGas ? cfg : estimatedGas\n}\n\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n\nexport function composeFeePayloadToTxParams(\n p: Record<string, unknown>,\n legacy: boolean,\n): ProposalTxParams | undefined {\n const gl = p.txGasLimit ?? p.txgaslimit\n if (gl == null || String(gl).trim() === '') return undefined\n const n = p.txNonce ?? p.txnonce\n let nonce = 0\n if (typeof n === 'bigint') nonce = Number(n)\n else if (typeof n === 'number') nonce = n\n else if (n != null) nonce = parseInt(String(n), 10)\n if (!Number.isFinite(nonce)) nonce = 0\n const gasLimit = String(gl)\n if (legacy) {\n const gp = p.txGasPrice ?? p.txgasprice\n return {\n nonce,\n gasLimit,\n txType: 'legacy',\n gasPrice: gp != null ? String(gp) : '0',\n }\n }\n return {\n nonce,\n gasLimit,\n txType: 'eip1559',\n maxFeePerGas: String(p.txMaxFeePerGas ?? ''),\n maxPriorityFeePerGas: String(p.txMaxPriorityFeePerGas ?? ''),\n }\n}\n\nexport function triggerTxParamsFromComposeBody(body: Record<string, unknown>): ProposalTxParams {\n const existing = body.txParams\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n const o = existing as ProposalTxParams & { gasLimit?: string }\n if (String(o.gasLimit ?? '').trim() !== '') {\n return { ...o }\n }\n }\n const pb = body.proposalTxParams\n if (Array.isArray(pb) && pb.length > 0 && typeof pb[0] === 'object' && pb[0] !== null) {\n const first = pb[0] as ProposalTxParams & { gasLimit?: string }\n if (String(first.gasLimit ?? '').trim() !== '') {\n return { ...first }\n }\n }\n const fromSnapshot = composeFeePayloadToTxParams(\n body,\n body.txMaxFeePerGas == null && body.txMaxPriorityFeePerGas == null,\n )\n if (fromSnapshot) return fromSnapshot\n return {\n nonce: 0,\n gasLimit: '',\n txType: 'legacy',\n gasPrice: '0',\n }\n}\n\nexport function proposalTxParamsToFeeSnapshot(\n params: ProposalTxParams,\n): Record<string, unknown> {\n if (params.txType === 'legacy') {\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txGasPrice: params.gasPrice ?? '0',\n }\n }\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txMaxFeePerGas: params.maxFeePerGas ?? '',\n txMaxPriorityFeePerGas: params.maxPriorityFeePerGas ?? '',\n }\n}\n","import { createPublicClient, http, defineChain, formatUnits } from 'viem'\n\nexport interface ChainFeeParams {\n isEip1559: boolean\n baseFeeGwei?: number\n priorityFeeGwei?: number\n gasPriceGwei?: number\n}\n\nexport async function fetchChainFeeParams(\n rpcUrl: string,\n chainId: number | string,\n): Promise<ChainFeeParams> {\n const url = rpcUrl.trim()\n if (!url) return { isEip1559: false }\n\n const chainIdNum = typeof chainId === 'string' ? parseInt(chainId, 10) : chainId\n if (Number.isNaN(chainIdNum)) return { isEip1559: false }\n\n const chain = defineChain({\n id: chainIdNum,\n name: 'Discovery',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [url] } },\n })\n\n const publicClient = createPublicClient({\n chain,\n transport: http(url),\n })\n\n const getGasPriceGwei = async (): Promise<number> => {\n const gasPriceWei = await publicClient.getGasPrice()\n return parseFloat(formatUnits(gasPriceWei, 9))\n }\n\n try {\n const block = await publicClient.getBlock({ blockTag: 'latest' })\n const baseFeePerGas = block?.baseFeePerGas\n if (baseFeePerGas == null || baseFeePerGas === undefined) {\n const gasPriceGwei = await getGasPriceGwei()\n return { isEip1559: false, gasPriceGwei }\n }\n\n const baseFeeGwei = parseFloat(formatUnits(baseFeePerGas, 9))\n\n let priorityFeeGwei: number | undefined\n try {\n const priorityWei = await publicClient.estimateMaxPriorityFeePerGas()\n priorityFeeGwei = parseFloat(formatUnits(priorityWei, 9))\n } catch {\n /* chain may not support eth_maxPriorityFeePerGas */\n }\n\n const gasPriceGwei = await getGasPriceGwei()\n return {\n isEip1559: true,\n baseFeeGwei,\n priorityFeeGwei,\n gasPriceGwei,\n }\n } catch {\n try {\n const gasPriceWei = await publicClient.getGasPrice()\n const gasPriceGwei = parseFloat(formatUnits(gasPriceWei, 9))\n return { isEip1559: false, gasPriceGwei }\n } catch {\n return { isEip1559: false }\n }\n }\n}\n","import { parseGwei } from 'viem'\n\nexport type ResolvedEip1559Fees = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n\nfunction finalizeEip1559Fees(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n floor: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint } | null | undefined,\n baseWei: bigint,\n): ResolvedEip1559Fees {\n let maxP = maxPriorityFeePerGas\n let maxF = maxFeePerGas\n if (floor) {\n if (maxP < floor.maxPriorityFeePerGas) maxP = floor.maxPriorityFeePerGas\n if (maxF < floor.maxFeePerGas) maxF = floor.maxFeePerGas\n }\n if (baseWei > 0n && maxF < baseWei + maxP) {\n maxF = baseWei + maxP + parseGwei('0.001')\n }\n if (maxF < maxP) {\n maxF = baseWei > 0n ? baseWei + maxP + parseGwei('0.001') : maxP * 2n\n }\n return { maxFeePerGas: maxF, maxPriorityFeePerGas: maxP }\n}\n\n/** Align EIP-1559 fees with the latest head base fee (same rules as Get Sig). */\nexport function alignEip1559FeesWithLatestBase(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n latestBlockBaseFeeWei: bigint,\n): ResolvedEip1559Fees {\n return finalizeEip1559Fees(maxFeePerGas, maxPriorityFeePerGas, null, latestBlockBaseFeeWei)\n}\n\nexport function gweiToDecimalString(n: number): string {\n if (!Number.isFinite(n)) return '0'\n if (n === 0) return '0'\n const s = String(n)\n if (s.indexOf('e') !== -1 || s.indexOf('E') !== -1) return n.toFixed(9).replace(/\\.?0+$/, '') || '0'\n return s\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/keygen.js'\nimport { fetchChainFeeParams } from './fees/chainFees.js'\nimport { alignEip1559FeesWithLatestBase, gweiToDecimalString } from './fees/eip1559Align.js'\nimport {\n gasLimitFromEstimateAndChainConfig,\n routerSwapGasLimitFromEstimate,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from './txParams.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import type { EvmChainDetail } from '../types.js'\n\n/** Snapshot chain gas config for extraJSON when Use Custom Gas is on. */\nexport function chainSnapshotForCustomGasExtraJSON(chainDetail: EvmChainDetail): Record<string, unknown> {\n const lr = chainDetail.legacy as boolean | string | undefined\n const legacy = lr === true || (typeof lr === 'string' && lr.toLowerCase() === 'true')\n\n const push = (o: Record<string, unknown>, key: string, v: unknown) => {\n if (v === undefined || v === null) return\n if (typeof v === 'string' && v.trim() === '') return\n o[key] = v\n }\n\n const fields: Record<string, unknown> = {}\n push(fields, 'gasLimit', chainDetail.gasLimit)\n if (legacy) {\n push(fields, 'gasMultiplier', chainDetail.gasMultiplier)\n push(fields, 'gasPrice', chainDetail.gasPrice)\n } else {\n push(fields, 'gasMultiplier', chainDetail.gasMultiplier)\n push(fields, 'baseFee', chainDetail.baseFee)\n push(fields, 'priorityFee', chainDetail.priorityFee)\n push(fields, 'baseFeeMultiplier', chainDetail.baseFeeMultiplier)\n }\n push(fields, 'legacy', legacy)\n return fields\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","/** Solana signing defaults — mirrors app NonEvmChainDetailRow.signingDefaults. */\nexport type SolanaSigningDefaults = {\n commitment?: 'confirmed' | 'finalized'\n computeUnitLimit?: number\n priorityFeeMicroLamports?: number\n}\n\nexport type SolanaChainDetail = {\n chainType: 'solana'\n chainId: string\n chainName: string\n rpcGateway: string\n endpointKind: 'json-rpc'\n testnet: boolean\n nativeSymbol: string\n nativeDecimals: number\n signingDefaults?: SolanaSigningDefaults\n}\n\nexport interface SolanaProtocolContext {\n chainCategory: 'solana'\n chainId: string\n rpcGateway: string\n executorAddress: string\n chainDetail: SolanaChainDetail\n useCustomFees: boolean\n keyGen: import('../../core/types.js').KeyGenSubset\n purposeText: string\n}\n\nexport class NotImplementedError extends Error {\n constructor(feature: string) {\n super(`${feature} is not implemented yet for chain category solana`)\n this.name = 'NotImplementedError'\n }\n}\n\nexport async function buildSolanaMultisignBatch(): Promise<never> {\n throw new NotImplementedError('buildSolanaMultisignBatch')\n}\n\nexport const solanaChainCategoryModule = {\n category: 'solana' as const,\n}\n","export * from './types.js'\n\nexport const SOLANA_CHAIN_CATEGORY = 'solana' as const\n","export type NearSigningDefaults = {\n gasPriceYocto?: string\n}\n\nexport type NearChainDetail = {\n chainType: 'near'\n chainId: string\n chainName: string\n rpcGateway: string\n endpointKind: 'json-rpc'\n testnet: boolean\n nativeSymbol: string\n nativeDecimals: number\n signingDefaults?: NearSigningDefaults\n}\n\nexport interface NearProtocolContext {\n chainCategory: 'near'\n chainId: string\n rpcGateway: string\n executorAddress: string\n chainDetail: NearChainDetail\n useCustomFees: boolean\n keyGen: import('../../core/types.js').KeyGenSubset\n purposeText: string\n}\n\nexport class NotImplementedError extends Error {\n constructor(feature: string) {\n super(`${feature} is not implemented yet for chain category near`)\n this.name = 'NotImplementedError'\n }\n}\n\nexport async function buildNearMultisignBatch(): Promise<never> {\n throw new NotImplementedError('buildNearMultisignBatch')\n}\n\nexport const nearChainCategoryModule = {\n category: 'near' as const,\n}\n","export * from './types.js'\n\nexport const NEAR_CHAIN_CATEGORY = 'near' as const\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 { formatUnits, parseUnits, getAddress, zeroAddress } from 'viem'\nimport type { NodeReadAuth } from '../../../core/nodeRead.js'\nimport { nodeFetchWithReadAuth } from '../../../core/nodeRead.js'\n\n/** POST /v1/quote `type` (same as `uniswap_trade_quote.py` `--type`). */\nexport type UniswapQuoteTradeType = 'EXACT_INPUT' | 'EXACT_OUTPUT'\n\nconst DEFAULT_TRADE_BASE = 'https://trade-api.gateway.uniswap.org/v1'\n\nconst UNISWAP_QUOTE_HEADERS_BASE: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'ctm-mpc-defi uniswapTradeQuote/1.0 (TS)',\n}\n\n/** Parse chain id like Python: decimal or 0x hex. */\nexport function parseUniswapChainId(value: string | number): number {\n if (typeof value === 'number') {\n if (!Number.isInteger(value) || value < 0) {\n throw new TypeError('chainId number must be a non-negative integer')\n }\n return value\n }\n const t = value.trim()\n if (t.toLowerCase().startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n\nfunction trimAddr(a: string): string {\n return a.trim()\n}\n\n/** `tokenIn` is the EVM address `0x0` used by the Trade API for the chain’s native (gas) token. */\nexport function isUniswapTokenInAddressNative(tokenIn: string | undefined | null): boolean {\n const t = (tokenIn ?? '').toString().trim()\n if (!t) return false\n try {\n return getAddress(t as `0x${string}`) === zeroAddress\n } catch {\n return t.toLowerCase() === '0x0000000000000000000000000000000000000000'\n }\n}\n\n/** `fullQuote` / stored quote response: top-level or nested has `quote.input` with a native or ERC-20 address. */\nexport function isUniswapFullQuoteResponseNativeIn(\n stored: Record<string, unknown> | null | undefined,\n): boolean {\n if (!stored) return false\n const q = (stored as { quote?: unknown }).quote\n if (!q || typeof q !== 'object' || Array.isArray(q)) return false\n const input = (q as Record<string, unknown>).input as Record<string, unknown> | undefined\n if (!input) return false\n const raw = (input.address ?? (input as { token?: string }).token ?? '').toString().trim()\n return isUniswapTokenInAddressNative(raw)\n}\n\n/**\n * GET /getKeyGenResultById and return `ethereumaddress` (swapper), same as\n * `uniswap_mpc_helpers.resolve_owner_from_keygen` in mpc-config.\n */\nexport async function fetchEthereumAddressForKeyGen(\n managementNodeUrl: string,\n keyGenId: string,\n readAuth: NodeReadAuth = { bearerOnGet: true, jwt: null },\n init?: RequestInit\n): Promise<string> {\n const base = managementNodeUrl.trim().replace(/\\/$/, '')\n if (!base) {\n throw new Error('managementNodeUrl is required to resolve keyGen')\n }\n const id = (keyGenId || '').trim()\n if (!id) {\n throw new Error('keyGen is required')\n }\n const url = `${base}/getKeyGenResultById?id=${encodeURIComponent(id)}`\n const res = await nodeFetchWithReadAuth(url, { ...init, method: 'GET', cache: 'no-store' }, readAuth)\n if (!res.ok) {\n const t = await res.text().catch(() => '')\n throw new Error(\n `getKeyGenResultById HTTP ${res.status}: ${t || res.statusText}`.trim()\n )\n }\n const raw = (await res.json()) as {\n Data?: { ethereumaddress?: string; [k: string]: unknown }\n data?: { ethereumaddress?: string; [k: string]: unknown }\n }\n const d = raw.Data ?? raw.data\n const eth = d?.ethereumaddress\n if (typeof eth !== 'string' || !eth.trim()) {\n throw new Error('getKeyGenResultById: ethereumaddress missing for this keyGen')\n }\n return eth.trim()\n}\n\nexport interface UniswapTradeQuoteParams {\n amount: string\n tokenIn: string\n tokenOut: string\n uniswapApiKey: string\n /**\n * KeyGen id — used to resolve `swapper` from GET /getKeyGenResultById unless `swapper` is set.\n * Required unless `swapper` is set.\n */\n keyGen?: string\n type: UniswapQuoteTradeType\n /**\n * Slippage as percent, e.g. `0.5` for 0.5%. If omitted, the body uses\n * `autoSlippage: \"DEFAULT\"` (same as the Python script when `--slippage` is not set).\n */\n slippage?: number | string\n /**\n * Chain id for the input side (`tokenInChainId` in the HTTP body; Python `--chain-id`).\n * You may set **`chainId` or `tokenInChainId`** (same meaning); if both are set, `chainId` wins.\n * Same-chain quote: set one chain here and omit `tokenOutChainId` (or set both to the same id).\n */\n chainId?: string | number\n /**\n * Same as `chainId` (input chain). If `chainId` is omitted, this must be set.\n */\n tokenInChainId?: string | number\n /**\n * Output chain id; defaults to the input chain when omitted (Python: empty `--token-out-chain-id`).\n */\n tokenOutChainId?: string | number\n /**\n * When `true`, sends `x-permit2-disabled: true` (Uniswap’s header for classic ERC-20 allowance; no permitData in the response).\n * Omit or set `false` for the default Trade API routing (default).\n */\n permit2Disabled?: boolean\n /**\n * MPC wallet (swapper) address. If omitted, `managementNodeUrl` is used with `keyGen`\n * to call GET /getKeyGenResultById.\n */\n swapper?: `0x${string}` | string\n /**\n * Management node base URL (MPC), required when `swapper` is not provided.\n */\n managementNodeUrl?: string\n /** For Browser HTTPS: Bearer on GET to /getKeyGenResultById. */\n nodeReadAuth?: NodeReadAuth\n /** Trade API base without `/quote` (default: Uniswap gateway v1). */\n baseUrl?: string\n /** `x-universal-router-version` (default `2.0`, aligned with Python / v4). */\n universalRouterVersion?: string\n signal?: AbortSignal\n /** Override for tests. */\n fetchImpl?: typeof fetch\n}\n\n/**\n * Build the same JSON body as `uniswap_trade_quote.py` (minus `swapper`, which you must set).\n */\n/**\n * `tokenInChainId` in the HTTP body (Python `--chain-id`).\n * Order: `chainId`, then `tokenInChainId`, else if only `tokenOutChainId` is set use it\n * (same in/out, e.g. same-chain with a single id).\n */\nfunction resolveInputChainId(\n p: Pick<UniswapTradeQuoteParams, 'chainId' | 'tokenInChainId' | 'tokenOutChainId'>\n): string | number {\n if (p.chainId !== undefined && p.chainId !== null && String(p.chainId).trim() !== '') {\n return p.chainId\n }\n if (p.tokenInChainId !== undefined && p.tokenInChainId !== null && String(p.tokenInChainId).trim() !== '') {\n return p.tokenInChainId\n }\n if (p.tokenOutChainId !== undefined && p.tokenOutChainId !== null && String(p.tokenOutChainId).trim() !== '') {\n return p.tokenOutChainId\n }\n throw new Error('Set chainId, tokenInChainId, or tokenOutChainId (same-chain) for the input side')\n}\n\nexport function buildUniswapQuoteRequestBody(\n args: Pick<\n UniswapTradeQuoteParams,\n | 'type'\n | 'amount'\n | 'tokenIn'\n | 'tokenOut'\n | 'slippage'\n | 'chainId'\n | 'tokenInChainId'\n | 'tokenOutChainId'\n > & { swapper: string }\n): Record<string, unknown> {\n const cIn = parseUniswapChainId(resolveInputChainId(args))\n const cOut =\n args.tokenOutChainId !== undefined && args.tokenOutChainId !== null && String(args.tokenOutChainId).trim() !== ''\n ? parseUniswapChainId(args.tokenOutChainId)\n : cIn\n const body: Record<string, unknown> = {\n type: args.type,\n amount: String(args.amount).trim(),\n tokenInChainId: cIn,\n tokenOutChainId: cOut,\n tokenIn: trimAddr(args.tokenIn),\n tokenOut: trimAddr(args.tokenOut),\n swapper: trimAddr(args.swapper),\n }\n if (args.slippage !== undefined && args.slippage !== null && String(args.slippage).trim() !== '') {\n const s =\n typeof args.slippage === 'number' ? args.slippage : Number.parseFloat(String(args.slippage).trim())\n if (Number.isNaN(s)) {\n throw new TypeError('slippage must be a number or a numeric string')\n }\n body.slippageTolerance = s\n } else {\n body.autoSlippage = 'DEFAULT'\n }\n return body\n}\n\n/**\n * Pull a user-facing string from Uniswap / generic JSON error bodies.\n */\nexport function errorMessageFromUniswapJsonBody(value: unknown): string | null {\n if (value == null) return null\n if (typeof value === 'string') {\n const t = value.trim()\n return t || null\n }\n if (typeof value !== 'object') return null\n if (Array.isArray(value)) {\n if (value.length === 0) return null\n return errorMessageFromUniswapJsonBody(value[0])\n }\n const o = value as Record<string, unknown>\n /** Uniswap Trade API, e.g. 404: `{ errorCode, detail, requestId }` */\n if (typeof o.detail === 'string' && o.detail.trim()) {\n const base = o.detail.trim()\n const code = typeof o.errorCode === 'string' && o.errorCode.trim() ? o.errorCode.trim() : ''\n const req = typeof o.requestId === 'string' && o.requestId.trim() ? o.requestId.trim() : ''\n if (code) {\n return req ? `${base} (${code}) [${req}]` : `${base} (${code})`\n }\n return req ? `${base} [${req}]` : base\n }\n if (typeof o.errorCode === 'string' && o.errorCode.trim()) {\n return o.errorCode.trim()\n }\n for (const k of ['message', 'detail', 'description', 'title', 'reason']) {\n const v = o[k]\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n if (typeof o.error === 'string' && o.error.trim()) return o.error.trim()\n if (o.error != null && typeof o.error === 'object') {\n const inner = errorMessageFromUniswapJsonBody(o.error)\n if (inner) return inner\n }\n if (Array.isArray(o.errors) && o.errors.length > 0) {\n const inner = errorMessageFromUniswapJsonBody(o.errors[0])\n if (inner) return inner\n }\n if (typeof o.code === 'string' && o.code.trim()) return o.code.trim()\n return null\n}\n\nfunction bodyLooksLikeHtml(t: string): boolean {\n const s = t.slice(0, 256).trimStart()\n return s.startsWith('<!') || s.toLowerCase().startsWith('<html')\n}\n\nfunction titleFromHtml(t: string): string | null {\n const m = t.match(/<title[^>]*>([^<]+)<\\/title>/i)\n if (!m?.[1]) return null\n const s = m[1].replace(/\\s+/g, ' ').trim()\n return s || null\n}\n\n/**\n * User-facing string from an HTTP body: JSON `message` / `error` / `detail` first,\n * else a short plain-text / HTML page title, not the raw document (avoids huge HTML in UI).\n */\nexport function messageFromUniswapHttpResponseBody(\n text: string,\n status: number,\n statusText = ''\n): string {\n const raw = (text ?? '').trim()\n const st = (statusText ?? '').trim()\n if (!raw) {\n if (status > 0) {\n return st ? `HTTP ${status} (${st})` : `HTTP ${status}`\n }\n return 'Empty response'\n }\n if (bodyLooksLikeHtml(raw)) {\n const title = titleFromHtml(raw)\n if (title) {\n return status > 0 ? `HTTP ${status}: ${title}` : title\n }\n return status > 0\n ? 'HTTP ' +\n String(status) +\n ': response was not JSON (HTML or error page). Check API key, token pair, and network.'\n : 'Response was not JSON (HTML or error page).'\n }\n const forParse = raw.replace(/^\\uFEFF/, '')\n try {\n const j = JSON.parse(forParse) as unknown\n if (j && typeof j === 'object') {\n const msg = errorMessageFromUniswapJsonBody(j)\n if (msg) {\n if (status >= 400) {\n return st ? `${msg} (HTTP ${status} ${st})` : `${msg} (HTTP ${status})`\n }\n return msg\n }\n }\n } catch {\n /* not JSON */\n }\n const oneLine = raw.replace(/\\s+/g, ' ').trim()\n const short = oneLine.length > 500 ? `${oneLine.slice(0, 500)}…` : oneLine\n if (status > 0) {\n return st && !short ? `HTTP ${status} (${st})` : st ? `HTTP ${status}: ${short} (${st})` : `HTTP ${status}: ${short}`\n }\n return short\n}\n\n/**\n * `POST` Uniswap Trade API `/v1/quote` — TypeScript version of\n * `mpc-config/recipes/uniswapV4/uniswap_trade_quote.py` (core HTTP call + KeyGen → swapper).\n *\n * CORS: calling the Trade API from a browser may be blocked. Prefer a server / route\n * handler, or use this in Node. KeyGen resolution uses a GET to your management node\n * and follows the same read-auth pattern as the app.\n */\nexport async function uniswapTradeQuote(\n args: UniswapTradeQuoteParams\n): Promise<Record<string, unknown>> {\n const apiKey = (args.uniswapApiKey || '').trim()\n if (!apiKey) {\n throw new Error('uniswapApiKey (x-api-key) is required')\n }\n const keyGen = (args.keyGen || '').trim()\n\n let swapper: string\n if ((args.swapper || '').trim()) {\n swapper = trimAddr(args.swapper as string)\n } else {\n if (!keyGen) {\n throw new Error('keyGen is required when swapper is not provided')\n }\n const mpc = (args.managementNodeUrl || '').trim()\n if (!mpc) {\n throw new Error('managementNodeUrl is required when swapper is not provided (to resolve keyGen)')\n }\n swapper = await fetchEthereumAddressForKeyGen(\n mpc,\n keyGen,\n args.nodeReadAuth ?? { bearerOnGet: true, jwt: null }\n )\n }\n\n const base =\n (args.baseUrl && args.baseUrl.trim()) ? args.baseUrl.trim().replace(/\\/$/, '') : DEFAULT_TRADE_BASE\n const quoteUrl = `${base}/quote`\n const urv = (args.universalRouterVersion && args.universalRouterVersion.trim()) || '2.0'\n\n const body = buildUniswapQuoteRequestBody({ ...args, swapper })\n const nativeIn = isUniswapTokenInAddressNative(args.tokenIn)\n const headers: Record<string, string> = {\n ...UNISWAP_QUOTE_HEADERS_BASE,\n 'x-api-key': apiKey,\n 'x-universal-router-version': urv,\n 'x-permit2-disabled': args.permit2Disabled === true ? 'true' : 'false',\n /** Native (0x0) as token in: Trade API needs this for classic routes and payable /swap. */\n 'x-erc20eth-enabled': nativeIn ? 'true' : 'false',\n }\n\n const fetchFn = args.fetchImpl ?? globalThis.fetch\n const res = await fetchFn(quoteUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: args.signal,\n })\n const text = await res.text()\n if (!res.ok) {\n throw new Error(messageFromUniswapHttpResponseBody(text, res.status, res.statusText))\n }\n const forParse = text.replace(/^\\uFEFF/, '')\n try {\n return JSON.parse(forParse) as Record<string, unknown>\n } catch {\n throw new Error(\n `Trade API: ${messageFromUniswapHttpResponseBody(text, res.status, res.statusText)}`\n )\n }\n}\n\n/**\n * Single-line JSON for mpc-config `uniswap_trade_swap.py --quote-json` (compact quote body).\n */\nexport function uniswapQuoteToJsonQuoteOneLine(quote: Record<string, unknown>): string {\n return JSON.stringify(quote)\n}\n\n/**\n * `quote.input.amount` / `quote.output.amount` as bigints, if present (classic response).\n */\nexport function parseUniswapQuoteClassicInOut(\n res: Record<string, unknown>\n): { inputWei: bigint; outputWei: bigint } | null {\n const inner = res.quote\n if (!inner || typeof inner !== 'object' || Array.isArray(inner)) return null\n const q = inner as Record<string, unknown>\n const input = q.input as { amount?: string } | undefined\n const output = q.output as { amount?: string } | undefined\n const inAm = input?.amount\n const outAm = output?.amount\n if (typeof inAm !== 'string' || !inAm || typeof outAm !== 'string' || !outAm) return null\n try {\n return { inputWei: BigInt(inAm), outputWei: BigInt(outAm) }\n } catch {\n return null\n }\n}\n\n/**\n * Fields from Uniswap Trade API `200` `quote` (e.g. {@link https://api-docs.uniswap.org/api-reference/swapping/quote} `ClassicQuote`):\n * - `slippage` — slippage tolerance (percent) used for the quote\n * - `priceImpact` — “impact the trade has on the market price of the pool, between 0-100 percent”\n */\nexport function parseUniswapQuoteSlippageInfo(res: Record<string, unknown>): {\n slippageTolerancePercent: number | null\n priceImpactPercent: number | null\n} {\n const inner = res.quote\n if (!inner || typeof inner !== 'object' || Array.isArray(inner)) {\n return { slippageTolerancePercent: null, priceImpactPercent: null }\n }\n const q = inner as Record<string, unknown>\n const sRaw = q.slippage ?? q.slippageTolerance\n let slippageTolerancePercent: number | null = null\n if (typeof sRaw === 'number' && Number.isFinite(sRaw)) {\n slippageTolerancePercent = sRaw\n } else if (typeof sRaw === 'string' && sRaw.trim()) {\n const p = Number.parseFloat(sRaw.trim().replace(/,/g, ''))\n if (Number.isFinite(p)) slippageTolerancePercent = p\n }\n const piRaw = q.priceImpact\n let priceImpactPercent: number | null = null\n if (typeof piRaw === 'number' && Number.isFinite(piRaw)) {\n priceImpactPercent = piRaw\n } else if (typeof piRaw === 'string' && piRaw.trim()) {\n const p = Number.parseFloat(piRaw.trim().replace(/,/g, ''))\n if (Number.isFinite(p)) priceImpactPercent = p\n }\n return { slippageTolerancePercent, priceImpactPercent }\n}\n\n/** Compact percent for UI (e.g. 0.5, 1.2345). */\nexport function formatUniswapPercentForUi(n: number): string {\n if (!Number.isFinite(n)) return '—'\n const t = n.toFixed(4).replace(/\\.?0+$/, '')\n return t || '0'\n}\n\n/** Human string for a modal amount field, trimmed of trailing fraction zeros. */\nexport function formatUniswapAmountFieldFromWei(wei: bigint, decimals: number): string {\n const s = formatUnits(wei, decimals)\n if (!s.includes('.')) return s\n const t = s.replace(/0+$/, '')\n return t.endsWith('.') ? t.slice(0, -1) : t\n}\n\n/**\n * One-line prefill for multi-sign \"purpose\" (user may append context below in the same field).\n */\nexport function buildUniswapV4PurposePrefill(args: {\n tradeType: UniswapQuoteTradeType\n tokenInSymbol: string\n tokenOutSymbol: string\n tokenInDecimals: number\n tokenOutDecimals: number\n amountInput: string\n quote: Record<string, unknown> | null\n slippageInput: string\n chainName: string\n chainId: number\n}): string {\n const symIn = (args.tokenInSymbol || '').trim() || 'token in'\n const symOut = (args.tokenOutSymbol || '').trim() || 'token out'\n const rawS = String(args.slippageInput || '0.5').trim().replace(/,/g, '')\n const parsedSlip = Number.parseFloat(rawS)\n const slip = Number.isFinite(parsedSlip) ? parsedSlip : 0.5\n const slipText = (Math.round(slip * 100) / 100).toString()\n const p = args.quote != null ? parseUniswapQuoteClassicInOut(args.quote) : null\n let inPart = '…'\n let outPart = '…'\n if (p) {\n inPart = `${formatUniswapAmountFieldFromWei(p.inputWei, args.tokenInDecimals)} ${symIn}`.replace(/\\s+/g, ' ').trim()\n outPart = `${formatUniswapAmountFieldFromWei(p.outputWei, args.tokenOutDecimals)} ${symOut}`.replace(/\\s+/g, ' ').trim()\n } else if (args.tradeType === 'EXACT_INPUT' && args.amountInput.trim()) {\n try {\n const w = parseUnits(args.amountInput.trim(), args.tokenInDecimals)\n inPart = `${formatUniswapAmountFieldFromWei(w, args.tokenInDecimals)} ${symIn}`.replace(/\\s+/g, ' ').trim()\n outPart = `… ${symOut}`\n } catch {\n /* keep … */\n }\n }\n const cname = (args.chainName || '').trim() || 'chain'\n return `Swap ${inPart} for ${outPart} with a slippage of ${slipText}% on ${cname} (chainId ${args.chainId})`\n}\n\n/**\n * Human-readable lines from a Trade API `/quote` 200 JSON body.\n * Classic quotes expose `quote.input` / `quote.output` with `amount` (base units as string).\n */\nexport function formatUniswapQuoteForDisplay(\n res: Record<string, unknown>,\n args: {\n tradeType: UniswapQuoteTradeType\n tokenInDecimals: number\n tokenOutDecimals: number\n tokenInSymbol: string\n tokenOutSymbol: string\n }\n): { title: string; lines: string[]; rawJson: string } {\n const { tradeType, tokenInDecimals, tokenOutDecimals, tokenInSymbol, tokenOutSymbol } = args\n const rawJson = JSON.stringify(res, null, 2)\n const routing = typeof res.routing === 'string' ? res.routing : undefined\n const requestId = typeof res.requestId === 'string' ? res.requestId : undefined\n\n const inner = res.quote\n if (inner && typeof inner === 'object' && !Array.isArray(inner)) {\n const q = inner as Record<string, unknown>\n const input = q.input as { amount?: string; token?: string } | undefined\n const output = q.output as { amount?: string; token?: string } | undefined\n const inAm = input?.amount\n const outAm = output?.amount\n if (typeof inAm === 'string' && inAm && typeof outAm === 'string' && outAm) {\n try {\n const inH = formatUnits(BigInt(inAm), tokenInDecimals)\n const outH = formatUnits(BigInt(outAm), tokenOutDecimals)\n const title =\n tradeType === 'EXACT_INPUT'\n ? `≈ ${outH} ${tokenOutSymbol} for ${inH} ${tokenInSymbol} (est.)`\n : `≈ ${inH} ${tokenInSymbol} for ${outH} ${tokenOutSymbol} (est.)`\n const lines: string[] = [\n `Input: ${inH} ${tokenInSymbol} (${inAm} wei)`,\n `Output: ${outH} ${tokenOutSymbol} (${outAm} wei)`,\n ]\n if (routing) lines.push(`Route: ${routing}`)\n if (requestId) lines.push(`Request: ${requestId.slice(0, 24)}…`)\n return { title, lines, rawJson }\n } catch {\n // non-classic or bigint parse error\n }\n }\n }\n\n const lines: string[] = ['(Could not parse classic input/output; see raw JSON below.)']\n if (routing) lines.push(`Route: ${routing}`)\n if (requestId) lines.push(`Request: ${requestId}`)\n return { title: 'Quote received', lines, rawJson }\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n encodeFunctionData,\n decodeFunctionData,\n erc20Abi,\n zeroAddress,\n type Address,\n} from 'viem'\nimport {\n firstClientIdFromKeyGen,\n type KeyGenSubsetForPermit,\n} from '../../../core/keygen.js'\nimport {\n PERMIT2_ADDRESS,\n getUniswapUniversalRouterSpenderOrThrow,\n MAX_UINT160,\n MAX_UINT48,\n UNISWAP_TRADE_BASE_DEFAULT,\n UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT,\n UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES,\n UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET,\n UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS,\n} from './constants.js'\nimport {\n gasLimitFromEstimateAndChainConfig,\n routerSwapGasLimitFromEstimate,\n type ProposalTxParams,\n} from '../../../chains/evm/txParams.js'\nimport { fetchChainFeeParams } from '../../../chains/evm/fees/chainFees.js'\nimport {\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n} from '../../../chains/evm/fees/eip1559Align.js'\nimport {\n isUniswapFullQuoteResponseNativeIn,\n messageFromUniswapHttpResponseBody,\n parseUniswapQuoteClassicInOut,\n} from './quote.js'\n\n/** Parse `gasLimit` from Trade API or chain config (decimal or 0x hex). */\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\nfunction parseExtraJsonObject(\n detail: Record<string, unknown> | null | undefined\n): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nfunction uniswapV4EvmTypeFromBatchMeta(\n ex: Record<string, unknown> | null,\n batchIndex: number\n): boolean {\n if (!ex) return false\n const bm = ex.batchMeta\n if (!Array.isArray(bm) || !bm[batchIndex] || typeof bm[batchIndex] !== 'object' || Array.isArray(bm[batchIndex])) {\n return false\n }\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (!evm0 || typeof evm0 !== 'object' || Array.isArray(evm0)) return false\n return String((evm0 as Record<string, unknown>).type ?? '') === 'uniswap_v4_swap_tx'\n}\n\nfunction uniswapV4AuditFromDetail(\n ex: Record<string, unknown> | null,\n batchIndex?: number\n): Record<string, unknown> | undefined {\n if (!ex) return undefined\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const nested = (bm[index] as Record<string, unknown>).uniswapV4\n if (nested && typeof nested === 'object' && !Array.isArray(nested)) {\n return nested as Record<string, unknown>\n }\n }\n const root = ex.uniswapV4\n if (root && typeof root === 'object' && !Array.isArray(root)) return root as Record<string, unknown>\n return undefined\n}\n\n/**\n * When `batchIndex` is set, check `batchMeta[i].evm`. Without `batchIndex`, also check `batchMeta[0]`\n * (native ETH-in single-tx requests store evm only under batchMeta, not top-level extraJSON.evm).\n */\nexport function isUniswapV4SwapEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0) {\n if (uniswapV4EvmTypeFromBatchMeta(ex, batchIndex)) return true\n } else if (uniswapV4EvmTypeFromBatchMeta(ex, 0)) {\n return true\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n return String((evm as Record<string, unknown>).type ?? '') === 'uniswap_v4_swap_tx'\n}\n\n/**\n * Gas units for Get Sig without `eth_estimateGas` (same calldata often reverts on estimate).\n * Order: proposal row[i] (or [0] / single `txParams`) / ExtraJSON uniswapV4 (audit, quote).\n * Pass `batchIndex` when the sign request is a multi-tx batch.\n */\nexport function resolveRouterSwapGasUnitsFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number\n): bigint | null {\n if (!detail) return null\n const propBatch = (detail.proposal_tx_params ??\n detail.proposalTxParams ??\n detail.ProposalTxParams) as unknown\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (Array.isArray(propBatch) && propBatch.length > index) {\n const row = propBatch[index]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n if (batchIndex == null || batchIndex === 0) {\n const tp = (detail.txParams ?? detail.TxParams) as Record<string, unknown> | undefined\n if (tp && typeof tp === 'object') {\n const gl = parseOptionalGasLimitString(\n (tp.gasLimit ?? tp.GasLimit ?? tp.txGasLimit) as string | number | undefined\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n const ex = parseExtraJsonObject(detail)\n const u4 = uniswapV4AuditFromDetail(ex, batchIndex)\n if (u4) {\n const uc = u4.uniswapCreateSwap as Record<string, unknown> | undefined\n const gb = (uc?.gasBuildSwap ?? uc?.gasBuild) as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gb?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n const snap = u4.fullQuoteFromPermitSnapshot as Record<string, unknown> | undefined\n const quote = snap?.quote as Record<string, unknown> | undefined\n const gue = parseOptionalGasLimitString(quote?.gasUseEstimate as string | number | undefined)\n if (gue != null && gue > 0n) return gue\n }\n return null\n}\n\n/**\n * Uniswap POST /swap `swap.gasLimit` is derived from the route; prefer it so we don't rely on\n * `eth_estimateGas`, which often reverts for Universal Router bundles (RPC simulation quirks).\n * When we must fall back, use a generous floor (L2s; adjust via chain `gasLimit` in app config).\n */\n/** Public for Get Sig when `eth_estimateGas` reverts on Universal Router calldata. */\nexport { UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS } from './constants.js'\nconst DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK = UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS\n\nexport {\n UNISWAP_TRADE_BASE_DEFAULT,\n UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT,\n UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES,\n UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET,\n} from './constants.js'\n\n/** `deadline` = `now` + `expiryMinutes * 60` (seconds). */\nexport function swapTransactionDeadlineUnixFromExpiryMinutes(\n expiryMinutes: number,\n nowSec: number = Math.floor(Date.now() / 1000)\n): number {\n const m = Number.isFinite(expiryMinutes) && expiryMinutes > 0 ? expiryMinutes : UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES\n return nowSec + Math.floor(m * 60)\n}\n\nfunction swapDeadlineUnixSeconds(args: { swapTransactionDeadlineUnix?: number }): number {\n const now = Math.floor(Date.now() / 1000)\n if (\n args.swapTransactionDeadlineUnix != null &&\n Number.isFinite(args.swapTransactionDeadlineUnix) &&\n args.swapTransactionDeadlineUnix > now\n ) {\n return Math.floor(args.swapTransactionDeadlineUnix)\n }\n return swapTransactionDeadlineUnixFromExpiryMinutes(UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES, now)\n}\n\n/** The stored `uniswapTradeQuote` is the full `POST /quote` JSON; `/swap` wants the **inner** classic quote. */\nexport function getClassicQuoteFromStoredUniswapResponse(stored: Record<string, unknown> | null | undefined): unknown {\n if (!stored) return null\n const q = (stored as Record<string, unknown>).quote\n return q != null && typeof q === 'object' ? q : null\n}\n\ntype TransactionRequest = {\n to: string\n from?: string\n data: string\n value: string\n /** Trade API or eth-style field name */\n gasLimit?: string\n gas?: string\n chainId?: number\n}\n\ntype CreateSwapResponse = {\n requestId?: string\n swap: TransactionRequest\n gasFee?: string\n}\n\n/**\n * `POST /v1/swap` — builds swap calldata (Universal Router) from a quote fetched with classic-allowance header `x-permit2-disabled: true`.\n * @see https://api-docs.uniswap.org/api-reference/swapping/swap\n */\nexport async function uniswapCreateSwap(\n args: {\n uniswapApiKey: string\n baseUrl?: string\n /** Full `POST /quote` JSON (must include classic `quote`). */\n fullQuoteFromPermit: Record<string, unknown>\n universalRouterVersion?: string\n fetchImpl?: typeof fetch\n /**\n * In the browser, direct `POST` to `trade-api.gateway.uniswap.org` is blocked by CORS.\n * When true (default in browser), the request goes to same-origin `POST /api/uniswap/swap` which proxies server-side. Set `false` to force a direct call (e.g. tests, Node scripts).\n */\n useServerProxy?: boolean\n /**\n * Universal Router swap deadline (unix seconds). Defaults to now + {@link UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET}.\n * Omitting this caused short API defaults and `TransactionDeadlinePassed` after MPC delay.\n */\n swapTransactionDeadlineUnix?: number\n }\n): Promise<CreateSwapResponse> {\n const deadline = swapDeadlineUnixSeconds(args)\n const useProxy = (args.useServerProxy !== false) && typeof globalThis !== 'undefined' && typeof (globalThis as { window?: unknown }).window !== 'undefined'\n if (useProxy) {\n const proxyPayload: Record<string, unknown> = {\n uniswapApiKey: args.uniswapApiKey,\n fullQuoteFromPermit: args.fullQuoteFromPermit,\n universalRouterVersion: args.universalRouterVersion,\n baseUrl: args.baseUrl,\n swapTransactionDeadlineUnix: deadline,\n }\n const res = await (args.fetchImpl ?? globalThis.fetch)('/api/uniswap/swap', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(proxyPayload),\n credentials: 'same-origin',\n })\n const text = await res.text()\n if (!res.ok) {\n let errMsg = res.statusText\n try {\n const j = JSON.parse(text) as { error?: string }\n if (j && typeof j.error === 'string' && j.error.trim()) errMsg = j.error.trim()\n } catch {\n if (text.trim()) errMsg = text.slice(0, 500)\n }\n throw new Error(`Uniswap swap proxy failed: ${errMsg}`)\n }\n const parsed = JSON.parse(text) as CreateSwapResponse\n if (!parsed?.swap || typeof parsed.swap !== 'object') {\n throw new Error('Uniswap /swap (proxy): missing `swap` in response.')\n }\n return parsed\n }\n const base = (args.baseUrl ?? UNISWAP_TRADE_BASE_DEFAULT).replace(/\\/$/, '')\n const url = `${base}/swap`\n const classic = getClassicQuoteFromStoredUniswapResponse(args.fullQuoteFromPermit) as Record<string, unknown> | null\n if (!classic) {\n throw new Error('Stored Uniswap quote is missing a classic `quote` object; cannot build swap calldata.')\n }\n const body: Record<string, unknown> = {\n quote: classic,\n deadline,\n }\n const urv = (args.universalRouterVersion ?? UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT).trim() || '2.0'\n const fn = args.fetchImpl ?? globalThis.fetch\n const nativeIn = isUniswapFullQuoteResponseNativeIn(args.fullQuoteFromPermit)\n const res = await fn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': args.uniswapApiKey.trim(),\n 'x-universal-router-version': urv,\n 'x-erc20eth-enabled': nativeIn ? 'true' : 'false',\n 'x-permit2-disabled': 'true',\n },\n body: JSON.stringify(body),\n })\n const text = await res.text()\n if (!res.ok) {\n throw new Error(\n `Uniswap POST /swap failed: ${messageFromUniswapHttpResponseBody(text, res.status, res.statusText)}`\n )\n }\n const parsed = JSON.parse(text) as CreateSwapResponse\n if (!parsed?.swap || typeof parsed.swap !== 'object') {\n throw new Error('Uniswap /swap: missing `swap` in response.')\n }\n return parsed\n}\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst permit2ApproveRouterAbi = [\n {\n name: 'approve',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint160' },\n { name: 'expiration', type: 'uint48' },\n ],\n outputs: [],\n },\n] as const\n\n/**\n * Trade `POST /swap` often returns calldata for `execute(router, token, amount, commands, inputs, deadline)` (dispatcher\n * entry). The **router** argument is the allowance-hub **spender**; the **amount** can exceed `quote.input.amount` (slippage /\n * route). We must approve at least that amount and the correct spender.\n */\nconst uniswapDispatchExecuteAbi = [\n {\n name: 'execute',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n { name: 'router', type: 'address' },\n { name: 'token', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'commands', type: 'bytes' },\n { name: 'inputs', type: 'bytes[]' },\n { name: 'deadline', type: 'uint256' },\n ],\n outputs: [],\n },\n] as const\n\n/** Parse payable `value` wei from Trade API `swap` (string hex/decimal, `Value`, or finite JSON number). */\nfunction parseSwapTxValueWei(swap: Record<string, unknown>): bigint {\n const raw = swap.value ?? swap.Value\n if (raw == null || raw === '') return 0n\n if (typeof raw === 'bigint') return raw > 0n ? raw : 0n\n if (typeof raw === 'number' && Number.isFinite(raw)) {\n try {\n return BigInt(Math.max(0, Math.trunc(raw)))\n } catch {\n return 0n\n }\n }\n const s = String(raw).trim()\n if (!s) return 0n\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s.replace(/^0x/i, ''))\n } catch {\n return 0n\n }\n}\n\n/**\n * Native ETH–in payable amount: prefer `swap.value` from POST /swap; if missing/zero, use dispatcher\n * `execute(..., amount, ...)` from calldata (Trade API sometimes omits top-level `value`); else classic quote input wei.\n */\nfunction nativeEthInPayableValueWei(args: {\n swap: TransactionRequest\n dataHex: `0x${string}`\n quoteInputWei: bigint\n}): bigint {\n const fromApi = parseSwapTxValueWei(args.swap as Record<string, unknown>)\n if (fromApi > 0n) return fromApi\n try {\n const d = decodeFunctionData({ abi: uniswapDispatchExecuteAbi, data: args.dataHex })\n if (d.functionName === 'execute') {\n const rawAmt = d.args[2]\n const amount = typeof rawAmt === 'bigint' ? rawAmt : BigInt(String(rawAmt))\n if (amount > 0n) return amount\n }\n } catch {\n /* calldata is not dispatcher `execute` */\n }\n return args.quoteInputWei > 0n ? args.quoteInputWei : 0n\n}\n\n/**\n * Apply UI slippage % on top of the base approve amount (EXACT_OUTPUT only at call sites; basis points, ceil wei).\n * Example: 0.5% → multiply by 1.005 (10050/10000). `undefined` / non‑positive leaves `baseWei` unchanged.\n */\nexport function applySlippagePercentToApproveWei(baseWei: bigint, slippagePercent: number | undefined): bigint {\n if (baseWei <= 0n) return baseWei\n const s = slippagePercent == null ? NaN : Number(slippagePercent)\n if (!Number.isFinite(s) || s <= 0) return baseWei\n const bps = Math.min(100_000, Math.round(s * 100))\n if (bps <= 0) return baseWei\n return (baseWei * BigInt(10_000 + bps) + 9_999n) / 10_000n\n}\n\nfunction permit2SpenderAndApproveWeiFromSwapCalldata(\n dataHex: `0x${string}`,\n tokenIn: Address,\n quoteInputWei: bigint,\n chainId: number\n): { permit2Spender: Address; approveWei: bigint; calldataAmountWei: bigint | null } {\n const canonical = getUniswapUniversalRouterSpenderOrThrow(chainId)\n try {\n const d = decodeFunctionData({ abi: uniswapDispatchExecuteAbi, data: dataHex })\n if (d.functionName !== 'execute') {\n return { permit2Spender: canonical, approveWei: quoteInputWei, calldataAmountWei: null }\n }\n const router = getAddress(d.args[0] as Address)\n const token = getAddress(d.args[1] as Address)\n const rawAmt = d.args[2]\n const amount = typeof rawAmt === 'bigint' ? rawAmt : BigInt(String(rawAmt))\n if (token.toLowerCase() !== tokenIn.toLowerCase()) {\n throw new Error(\n `Swap calldata token ${token} does not match token in ${tokenIn}. Refresh quote and /swap.`\n )\n }\n const calldataAmountWei = amount > 0n ? amount : null\n let approveWei = quoteInputWei\n if (calldataAmountWei != null && calldataAmountWei > approveWei) {\n approveWei = calldataAmountWei\n }\n return { permit2Spender: router, approveWei, calldataAmountWei }\n } catch (e) {\n if (e instanceof Error && e.message.includes('does not match token')) throw e\n return { permit2Spender: canonical, approveWei: quoteInputWei, calldataAmountWei: null }\n }\n}\n\ntype UniswapV4SkipPermit2BatchArg = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n /** `0x0` = native (ETH) in; otherwise ERC-20. */\n tokenIn: Address\n executorAddress: Address\n swap: TransactionRequest\n createSwapResponse: { requestId?: string; gasFee?: string; swap: TransactionRequest }\n fullQuoteSnapshot: Record<string, unknown>\n purposeText: string\n swapDeadlineUnix: number\n slippagePercent?: number\n}\n\n/**\n * **Native (ETH) input** — a single **payable** swap tx from `POST /swap` (`swap.value` > 0). No `approve` (no ERC-20 for token in).\n */\nasync function buildEvmMultisignBodyUniswapV4NativeInOnly(\n args: UniswapV4SkipPermit2BatchArg,\n quoteInputWei: bigint,\n): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n\n const toRouter = getAddress(\n (args.swap.to ?? '').trim().startsWith('0x') ? (args.swap.to.trim() as `0x${string}`) : `0x${args.swap.to.trim()}`,\n )\n const dataHex = (() => {\n const d = (args.swap.data ?? '0x').toString().trim()\n return d.startsWith('0x') ? d : `0x${d}`\n })() as `0x${string}`\n\n const valueWei = nativeEthInPayableValueWei({\n swap: args.swap,\n dataHex,\n quoteInputWei,\n })\n if (valueWei <= 0n) {\n throw new Error(\n 'Native (ETH) in swap: could not determine payable value (no `swap.value`, no `execute` amount in calldata, and quote input is zero). Refresh the quote and request /swap again.',\n )\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const feeParams = await fetchChainFeeParams(args.rpcUrl, args.chainId)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWeiNativeIn =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustomGas = args.useCustomGas\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const nonce = await publicClient.getTransactionCount({ address: args.executorAddress, blockTag: 'pending' })\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n\n const swapRecord = args.swap as Record<string, unknown>\n const fromTradeApi =\n parseOptionalGasLimitString(swapRecord.gasLimit as string | number | undefined) ??\n parseOptionalGasLimitString(swapRecord.gas as string | number | undefined)\n let gasBuildSource: 'tradeApi' | 'rpcEstimate' | 'estimateFailedFallback' = 'rpcEstimate'\n let estimateGasError: string | undefined\n let baseGasUnits1: bigint\n if (fromTradeApi != null && fromTradeApi > 0n) {\n baseGasUnits1 = fromTradeApi\n gasBuildSource = 'tradeApi'\n } else {\n try {\n baseGasUnits1 = await publicClient.estimateGas({\n to: toRouter,\n data: dataHex,\n value: valueWei,\n account: args.executorAddress,\n })\n gasBuildSource = 'rpcEstimate'\n } catch (e) {\n estimateGasError = e instanceof Error ? e.message : String(e)\n const minRouterGas = 500_000n\n if (useCustomGas) {\n const cfg = args.chainDetail?.gasLimit != null ? parseOptionalGasLimitString(String(args.chainDetail.gasLimit)) : null\n if (cfg != null && cfg >= minRouterGas) {\n baseGasUnits1 = cfg\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n gasBuildSource = 'estimateFailedFallback'\n }\n }\n const gasLimit1 = routerSwapGasLimitFromEstimate(baseGasUnits1, chainGasLimitRouter)\n const currentNonce0 = nonce\n\n let firstTxFeePayload: Record<string, unknown> = {}\n\n if (legacy) {\n let gasPriceWei1 = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei1 = (gasPriceWei1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei1) gasPriceWei1 = configured\n }\n firstTxFeePayload = { txNonce: nonce, txGasLimit: gasLimit1.toString(), txGasPrice: gasPriceWei1.toString() }\n const ser0 = serializeTransaction({\n type: 'legacy',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n gasPrice: gasPriceWei1,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit1.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei1.toString(),\n })\n } else {\n const fetchedBase1 = feeParams.baseFeeGwei ?? 0\n const fetchedPriority1 = feeParams.priorityFeeGwei ?? 0\n const configuredBase1 =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority1 =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei1 = Math.max(fetchedBase1, configuredBase1)\n const effectivePriorityFeeGwei1 = Math.max(fetchedPriority1, configuredPriority1)\n const baseFeeMultiplierPct1 =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei1 = (effectiveBaseFeeGwei1 * baseFeeMultiplierPct1) / 100\n const maxFeePerGasGwei1 = baseComponentGwei1 + effectivePriorityFeeGwei1\n let maxPriorityFeePerGas1 =\n effectivePriorityFeeGwei1 > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei1))\n : parseGwei('1')\n let maxFeePerGas1 = parseGwei(gweiToDecimalString(maxFeePerGasGwei1))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas1 = (maxPriorityFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas1 = (maxFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas: maxFeePerGas1, maxPriorityFeePerGas: maxPriorityFeePerGas1 } =\n alignEip1559FeesWithLatestBase(maxFeePerGas1, maxPriorityFeePerGas1, latestBaseFeeWeiNativeIn))\n firstTxFeePayload = {\n txNonce: nonce,\n txGasLimit: gasLimit1.toString(),\n txMaxFeePerGas: maxFeePerGas1.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas1.toString(),\n }\n const ser0 = serializeTransaction({\n type: 'eip1559',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n maxFeePerGas: maxFeePerGas1,\n maxPriorityFeePerGas: maxPriorityFeePerGas1,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit1.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas1.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas1.toString(),\n })\n }\n\n const dataNo0x = dataHex.startsWith('0x') ? dataHex.slice(2) : dataHex\n\n const audit: Record<string, unknown> = {\n skipPermit2Batch: true,\n inputKind: 'native_eth',\n noErc20Approve: true,\n quoteInputWei: quoteInputWei.toString(),\n swapValueWei: valueWei.toString(),\n uniswapCreateSwap: {\n requestId: args.createSwapResponse.requestId,\n gasFee: args.createSwapResponse.gasFee,\n gasBuildSwap: {\n useCustomGas,\n source: gasBuildSource,\n baseGasUnits: baseGasUnits1.toString(),\n ...(estimateGasError != null && estimateGasError !== '' ? { estimateGasError } : {}),\n },\n swap: {\n to: args.createSwapResponse.swap.to,\n value: args.createSwapResponse.swap.value,\n dataNibbles: (() => {\n const t = (args.createSwapResponse.swap.data ?? '').toString().trim()\n return t.startsWith('0x') ? t.length - 2 : t.length\n })(),\n },\n },\n fullQuoteFromPermitSnapshot: args.fullQuoteSnapshot,\n originalPurpose: args.purposeText,\n }\n\n const batchMeta: Record<string, unknown>[] = [\n {\n destinationAddress: toRouter,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'UniversalRouter (payable, native in)',\n note: 'Single tx from Trade POST /swap; no ERC-20 approve. Calldata in messageHashes[0] / messageRawBatch[0].',\n }),\n evm: { type: 'uniswap_v4_swap_tx', version: 1, chainId: String(args.chainId) },\n uniswapV4: audit,\n },\n ]\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustomGas) {\n const snap = args.customGasChainDetails\n if (snap && typeof snap === 'object' && !Array.isArray(snap) && Object.keys(snap).length > 0) {\n extraPayload.customGasChainDetails = snap\n }\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: dataNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: String(args.chainId),\n destinationAddress: toRouter,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n const batchDesc =\n 'Uniswap V4: 1-tx batch — native gas token in (no ERC-20 approve) — single payable swap (Trade /swap).'\n return (t ? `${t}\\n\\n` : '') + batchDesc\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\n/**\n * **Classic ERC-20 allowance** batch (on-chain approvals only), two shapes:\n *\n * - **`swap.to` == inner `router` (calldata arg)** — Universal Router is the tx target; tokens move via the **allowance hub**:\n * `ERC20→hub`, hub `approve(router)`, swap (3 txs).\n *\n * - **`swap.to` ≠ inner `router`** — Trade uses a **dispatcher** that calls `ERC20.transferFrom` with **`msg.sender` = `swap.to`**.\n * Approving only the hub is insufficient (`cast run` shows `transfer amount exceeds allowance`). Path:\n * `ERC20.approve(swap.to)`, swap (2 txs).\n *\n * Approved amount: `max(quote.input, calldata amount)`; with **EXACT_OUTPUT** trades, multiply by `(1 + slippage%)` from the quote modal (input can grow vs the quoted figure).\n */\nexport async function buildEvmMultisignBodyUniswapV4SkipPermit2Batch(\n args: UniswapV4SkipPermit2BatchArg,\n): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n\n const tokenIn = getAddress(args.tokenIn)\n const parsedInOut = parseUniswapQuoteClassicInOut(args.fullQuoteSnapshot)\n const quoteInputWei = parsedInOut?.inputWei\n if (quoteInputWei == null || quoteInputWei <= 0n) {\n throw new Error(\n 'Could not read a positive input amount from the quote. Refresh the quote and ensure the Trade API returned classic quote.input.amount.',\n )\n }\n\n if (tokenIn === zeroAddress) {\n return buildEvmMultisignBodyUniswapV4NativeInOnly(args, quoteInputWei)\n }\n\n const toRouter = getAddress(\n (args.swap.to ?? '').trim().startsWith('0x') ? (args.swap.to.trim() as `0x${string}`) : `0x${args.swap.to.trim()}`\n )\n const dataHex = (() => {\n const d = (args.swap.data ?? '0x').toString().trim()\n return d.startsWith('0x') ? d : `0x${d}`\n })() as `0x${string}`\n\n const canonicalUniversalRouter = getUniswapUniversalRouterSpenderOrThrow(args.chainId)\n const { permit2Spender, approveWei: baseApproveWei, calldataAmountWei } = permit2SpenderAndApproveWeiFromSwapCalldata(\n dataHex,\n tokenIn,\n quoteInputWei,\n args.chainId\n )\n const approveAmountWei = applySlippagePercentToApproveWei(baseApproveWei, args.slippagePercent)\n const usePermit2Triple = toRouter.toLowerCase() === permit2Spender.toLowerCase()\n if (usePermit2Triple && approveAmountWei > MAX_UINT160) {\n throw new Error('Approved transfer amount exceeds allowance-hub uint160 max; reduce trade size.')\n }\n\n let expiration48 = 0n\n if (usePermit2Triple) {\n const deadlineSec = Math.floor(Number(args.swapDeadlineUnix))\n if (!Number.isFinite(deadlineSec) || deadlineSec <= 0) {\n throw new Error('Invalid swapDeadlineUnix for allowance-hub approve expiration.')\n }\n expiration48 = BigInt(deadlineSec)\n if (expiration48 > MAX_UINT48) expiration48 = MAX_UINT48\n }\n\n const erc20ApproveSpender: Address = usePermit2Triple ? PERMIT2_ADDRESS : toRouter\n const approveData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [erc20ApproveSpender, approveAmountWei],\n }) as `0x${string}`\n const valueWei = (() => {\n const v = args.swap.value\n if (v == null || v === '') return 0n\n try {\n return BigInt(String(v).replace(/^0x/i, ''))\n } catch {\n return 0n\n }\n })()\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const feeParams = await fetchChainFeeParams(args.rpcUrl, args.chainId)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWeiSkipBatch =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustomGas = args.useCustomGas\n const gasLimitConfig =\n useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const nonce = await publicClient.getTransactionCount({ address: args.executorAddress, blockTag: 'pending' })\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n const approveMsgRawNo0x = approveData.startsWith('0x') ? approveData.slice(2) : approveData\n let firstTxFeePayload: Record<string, unknown> = {}\n\n // --- tx 0: ERC-20 approve — allowance hub (triple path) or dispatcher `swap.to` (direct transferFrom)\n const approveGas = await publicClient.estimateGas({\n to: tokenIn,\n data: approveData,\n value: 0n,\n account: args.executorAddress,\n })\n const gasLimit0 = useCustomGas ? gasLimitFromEstimateAndChainConfig(approveGas, gasLimitConfig) : approveGas\n const currentNonce0 = nonce\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n firstTxFeePayload = { txNonce: nonce, txGasLimit: gasLimit0.toString(), txGasPrice: gasPriceWei.toString() }\n const ser0 = serializeTransaction({\n type: 'legacy',\n to: tokenIn,\n data: approveData,\n value: 0n,\n gas: gasLimit0,\n gasPrice: gasPriceWei,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit0.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n })\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei)) : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWeiSkipBatch,\n ))\n firstTxFeePayload = {\n txNonce: nonce,\n txGasLimit: gasLimit0.toString(),\n txMaxFeePerGas: maxFeePerGas.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n const ser0 = serializeTransaction({\n type: 'eip1559',\n to: tokenIn,\n data: approveData,\n value: 0n,\n gas: gasLimit0,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit0.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n })\n }\n\n if (usePermit2Triple) {\n const permit2ApproveData = encodeFunctionData({\n abi: permit2ApproveRouterAbi,\n functionName: 'approve',\n args: [tokenIn, permit2Spender, approveAmountWei, Number(expiration48)],\n }) as `0x${string}`\n\n // --- tx 1: allowance hub approve(token, UniversalRouter, amount, expiration)\n const approveP2Gas = await publicClient.estimateGas({\n to: PERMIT2_ADDRESS,\n data: permit2ApproveData,\n value: 0n,\n account: args.executorAddress,\n })\n const gasLimitP2 = useCustomGas ? gasLimitFromEstimateAndChainConfig(approveP2Gas, gasLimitConfig) : approveP2Gas\n const currentNonceP2 = nonce + 1\n\n if (legacy) {\n let gasPriceWeiP2 = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWeiP2 = (gasPriceWeiP2 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWeiP2) gasPriceWeiP2 = configured\n }\n const serP2 = serializeTransaction({\n type: 'legacy',\n to: PERMIT2_ADDRESS,\n data: permit2ApproveData,\n value: 0n,\n gas: gasLimitP2,\n gasPrice: gasPriceWeiP2,\n nonce: currentNonceP2,\n chainId: args.chainId,\n })\n const hP2 = keccak256(serP2)\n messageHashes.push(hP2.startsWith('0x') ? hP2.slice(2) : hP2)\n messageRawBatch.push(serP2)\n proposalTxParamsBatch.push({\n nonce: currentNonceP2,\n gasLimit: gasLimitP2.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWeiP2.toString(),\n })\n } else {\n const fetchedBaseP2 = feeParams.baseFeeGwei ?? 0\n const fetchedPriorityP2 = feeParams.priorityFeeGwei ?? 0\n const configuredBaseP2 =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriorityP2 =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGweiP2 = Math.max(fetchedBaseP2, configuredBaseP2)\n const effectivePriorityFeeGweiP2 = Math.max(fetchedPriorityP2, configuredPriorityP2)\n const baseFeeMultiplierPctP2 =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGweiP2 = (effectiveBaseFeeGweiP2 * baseFeeMultiplierPctP2) / 100\n const maxFeePerGasGweiP2 = baseComponentGweiP2 + effectivePriorityFeeGweiP2\n let maxPriorityFeePerGasP2 =\n effectivePriorityFeeGweiP2 > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGweiP2)) : parseGwei('1')\n let maxFeePerGasP2 = parseGwei(gweiToDecimalString(maxFeePerGasGweiP2))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGasP2 = (maxPriorityFeePerGasP2 * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGasP2 = (maxFeePerGasP2 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas: maxFeePerGasP2, maxPriorityFeePerGas: maxPriorityFeePerGasP2 } =\n alignEip1559FeesWithLatestBase(maxFeePerGasP2, maxPriorityFeePerGasP2, latestBaseFeeWeiSkipBatch))\n const serP2 = serializeTransaction({\n type: 'eip1559',\n to: PERMIT2_ADDRESS,\n data: permit2ApproveData,\n value: 0n,\n gas: gasLimitP2,\n maxFeePerGas: maxFeePerGasP2,\n maxPriorityFeePerGas: maxPriorityFeePerGasP2,\n nonce: currentNonceP2,\n chainId: args.chainId,\n })\n const hP2 = keccak256(serP2)\n messageHashes.push(hP2.startsWith('0x') ? hP2.slice(2) : hP2)\n messageRawBatch.push(serP2)\n proposalTxParamsBatch.push({\n nonce: currentNonceP2,\n gasLimit: gasLimitP2.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGasP2.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGasP2.toString(),\n })\n }\n }\n\n // --- last tx: swap to `swap.to` (Universal Router or dispatcher)\n const swapRecord = args.swap as Record<string, unknown>\n const fromTradeApi =\n parseOptionalGasLimitString(swapRecord.gasLimit as string | number | undefined) ??\n parseOptionalGasLimitString(swapRecord.gas as string | number | undefined)\n let gasBuildSource: 'tradeApi' | 'rpcEstimate' | 'estimateFailedFallback' = 'rpcEstimate'\n let estimateGasError: string | undefined\n let baseGasUnits1: bigint\n if (fromTradeApi != null && fromTradeApi > 0n) {\n baseGasUnits1 = fromTradeApi\n gasBuildSource = 'tradeApi'\n } else {\n try {\n baseGasUnits1 = await publicClient.estimateGas({\n to: toRouter,\n data: dataHex,\n value: valueWei,\n account: args.executorAddress,\n })\n gasBuildSource = 'rpcEstimate'\n } catch (e) {\n estimateGasError = e instanceof Error ? e.message : String(e)\n const minRouterGas = 500_000n\n if (useCustomGas) {\n const cfg = args.chainDetail?.gasLimit != null ? parseOptionalGasLimitString(String(args.chainDetail.gasLimit)) : null\n if (cfg != null && cfg >= minRouterGas) {\n baseGasUnits1 = cfg\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n gasBuildSource = 'estimateFailedFallback'\n }\n }\n const gasLimit1 = routerSwapGasLimitFromEstimate(baseGasUnits1, chainGasLimitRouter)\n const currentNonce1 = nonce + (usePermit2Triple ? 2 : 1)\n if (legacy) {\n let gasPriceWei1 = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei1 = (gasPriceWei1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei1) gasPriceWei1 = configured\n }\n const ser1 = serializeTransaction({\n type: 'legacy',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n gasPrice: gasPriceWei1,\n nonce: currentNonce1,\n chainId: args.chainId,\n })\n const h1 = keccak256(ser1)\n messageHashes.push(h1.startsWith('0x') ? h1.slice(2) : h1)\n messageRawBatch.push(ser1)\n proposalTxParamsBatch.push({\n nonce: currentNonce1,\n gasLimit: gasLimit1.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei1.toString(),\n })\n } else {\n const fetchedBase1 = feeParams.baseFeeGwei ?? 0\n const fetchedPriority1 = feeParams.priorityFeeGwei ?? 0\n const configuredBase1 =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority1 =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei1 = Math.max(fetchedBase1, configuredBase1)\n const effectivePriorityFeeGwei1 = Math.max(fetchedPriority1, configuredPriority1)\n const baseFeeMultiplierPct1 =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei1 = (effectiveBaseFeeGwei1 * baseFeeMultiplierPct1) / 100\n const maxFeePerGasGwei1 = baseComponentGwei1 + effectivePriorityFeeGwei1\n let maxPriorityFeePerGas1 =\n effectivePriorityFeeGwei1 > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei1))\n : parseGwei('1')\n let maxFeePerGas1 = parseGwei(gweiToDecimalString(maxFeePerGasGwei1))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas1 = (maxPriorityFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas1 = (maxFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas: maxFeePerGas1, maxPriorityFeePerGas: maxPriorityFeePerGas1 } =\n alignEip1559FeesWithLatestBase(maxFeePerGas1, maxPriorityFeePerGas1, latestBaseFeeWeiSkipBatch))\n const ser1 = serializeTransaction({\n type: 'eip1559',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n maxFeePerGas: maxFeePerGas1,\n maxPriorityFeePerGas: maxPriorityFeePerGas1,\n nonce: currentNonce1,\n chainId: args.chainId,\n })\n const h1 = keccak256(ser1)\n messageHashes.push(h1.startsWith('0x') ? h1.slice(2) : h1)\n messageRawBatch.push(ser1)\n proposalTxParamsBatch.push({\n nonce: currentNonce1,\n gasLimit: gasLimit1.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas1.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas1.toString(),\n })\n }\n\n const swapMsgIndex = usePermit2Triple ? 2 : 1\n const audit: Record<string, unknown> = {\n skipPermit2Batch: true,\n approvalPath: usePermit2Triple ? 'permit2_triple' : 'dispatcher',\n approveAmount: {\n baseWeiBeforeSlippage: baseApproveWei.toString(),\n finalWei: approveAmountWei.toString(),\n slippagePercent: args.slippagePercent,\n quoteInputWei: quoteInputWei.toString(),\n ...(calldataAmountWei != null ? { swapCalldataAmountWei: calldataAmountWei.toString() } : {}),\n },\n uniswapCreateSwap: {\n requestId: args.createSwapResponse.requestId,\n gasFee: args.createSwapResponse.gasFee,\n gasBuildSwap: {\n useCustomGas,\n source: gasBuildSource,\n baseGasUnits: baseGasUnits1.toString(),\n ...(estimateGasError != null && estimateGasError !== '' ? { estimateGasError } : {}),\n },\n swap: {\n to: args.createSwapResponse.swap.to,\n value: args.createSwapResponse.swap.value,\n dataNibbles: (() => {\n const d = args.createSwapResponse.swap.data ?? ''\n const t = d.toString().trim()\n return t.startsWith('0x') ? t.length - 2 : t.length\n })(),\n },\n },\n fullQuoteFromPermitSnapshot: args.fullQuoteSnapshot,\n originalPurpose: args.purposeText,\n innerRouterFromCalldata: permit2Spender,\n swapToEqualsInnerRouter: usePermit2Triple,\n ...(usePermit2Triple\n ? {\n permit2Erc20Approve: {\n token: tokenIn,\n spender: PERMIT2_ADDRESS,\n amountWei: approveAmountWei.toString(),\n note: 'ERC-20 → allowance hub before hub approve(router).',\n },\n permit2ApproveUniversalRouter: {\n permit2: PERMIT2_ADDRESS,\n token: tokenIn,\n spender: permit2Spender,\n canonicalUniversalRouterFromAppMap: canonicalUniversalRouter,\n spenderMatchesCanonicalMap: permit2Spender.toLowerCase() === canonicalUniversalRouter.toLowerCase(),\n amountWei: approveAmountWei.toString(),\n expiration: expiration48.toString(),\n note: 'Allowance-hub spender must match the router in swap calldata.',\n },\n }\n : {\n erc20ApproveDispatcher: {\n token: tokenIn,\n spender: toRouter,\n amountWei: approveAmountWei.toString(),\n note:\n 'Dispatcher pulls via ERC20.transferFrom(user, universalRouter, amount); allowance must be on swap.to (see cast trace TRANSFER_FROM_FAILED when only the hub is approved).',\n },\n }),\n }\n\n const batchMeta: Record<string, unknown>[] = [\n {\n destinationAddress: tokenIn,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'ERC20.approve',\n to: usePermit2Triple ? 'allowance hub' : 'dispatcher(swap.to)',\n function: 'approve(address spender, uint256 amount)',\n spender: erc20ApproveSpender,\n amountWei: approveAmountWei.toString(),\n }),\n evm: {\n type: usePermit2Triple ? 'uniswap_v4_skip_permit2_approve' : 'uniswap_v4_skip_permit2_dispatcher_approve',\n version: 1,\n chainId: String(args.chainId),\n ...(usePermit2Triple ? { permit2: PERMIT2_ADDRESS } : { dispatcher: toRouter }),\n },\n },\n ]\n if (usePermit2Triple) {\n batchMeta.push({\n destinationAddress: PERMIT2_ADDRESS,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'AllowanceHub.approve',\n function: 'approve(address token, address spender, uint160 amount, uint48 expiration)',\n token: tokenIn,\n spender: permit2Spender,\n amountWei: approveAmountWei.toString(),\n expiration: expiration48.toString(),\n }),\n evm: {\n type: 'uniswap_v4_skip_permit2_permit2_approve',\n version: 1,\n chainId: String(args.chainId),\n permit2: PERMIT2_ADDRESS,\n permit2Spender,\n },\n })\n }\n batchMeta.push({\n destinationAddress: toRouter,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'UniversalRouter.execute',\n note: `Calldata from Trade API POST /swap; signed tx hash in messageHashes[${swapMsgIndex}].`,\n }),\n evm: { type: 'uniswap_v4_swap_tx', version: 1, chainId: String(args.chainId) },\n uniswapV4: audit,\n })\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustomGas) {\n const snap = args.customGasChainDetails\n if (snap && typeof snap === 'object' && !Array.isArray(snap) && Object.keys(snap).length > 0) {\n extraPayload.customGasChainDetails = snap\n }\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: approveMsgRawNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: String(args.chainId),\n destinationAddress: tokenIn,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n const batchDesc = usePermit2Triple\n ? 'Uniswap V4: 3-tx batch (classic allowance) — (1) ERC-20 approve allowance hub, (2) hub approve(Universal Router), (3) swap (Trade /swap).'\n : 'Uniswap V4: 2-tx batch (classic allowance, dispatcher) — (1) ERC-20 approve swap.to (dispatcher pulls tokens), (2) swap (Trade /swap).'\n return (t ? `${t}\\n\\n` : '') + batchDesc\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n","import type { Address } from 'viem'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/keygen.js'\nimport type { UniswapQuoteTradeType } from './quote.js'\nimport { uniswapTradeQuote } from './quote.js'\nimport { uniswapCreateSwap, buildEvmMultisignBodyUniswapV4SkipPermit2Batch } from './swapMultisign.js'\nimport { swapTransactionDeadlineUnixFromExpiryMinutes } from './swapMultisign.js'\n\nexport type SwapExactInputArgs = {\n keyGen: KeyGenSubsetForPermit\n purposeText: string\n chainId: number\n rpcUrl: string\n executorAddress: Address\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n tokenIn: Address\n uniswapApiKey: string\n fullQuote: Record<string, unknown>\n slippagePercent?: number\n swapTransactionDeadlineUnix?: number\n baseUrl?: string\n}\n\n/** Quote then build swap multisign body for EXACT_INPUT (caller must have fetched quote first for EXACT_OUTPUT). */\nexport async function swapFromQuote(args: SwapExactInputArgs & { swap: Awaited<ReturnType<typeof uniswapCreateSwap>> }) {\n const deadline =\n args.swapTransactionDeadlineUnix ??\n swapTransactionDeadlineUnixFromExpiryMinutes(30)\n return buildEvmMultisignBodyUniswapV4SkipPermit2Batch({\n keyGen: args.keyGen,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n tokenIn: args.tokenIn,\n executorAddress: args.executorAddress,\n swap: args.swap.swap,\n createSwapResponse: args.swap,\n fullQuoteSnapshot: args.fullQuote,\n purposeText: args.purposeText,\n swapDeadlineUnix: deadline,\n slippagePercent: args.slippagePercent,\n })\n}\n\nexport async function quoteSwap(\n args: Parameters<typeof uniswapTradeQuote>[0],\n): Promise<Record<string, unknown>> {\n return uniswapTradeQuote(args)\n}\n\nexport async function createSwap(\n args: Parameters<typeof uniswapCreateSwap>[0],\n): Promise<Awaited<ReturnType<typeof uniswapCreateSwap>>> {\n return uniswapCreateSwap(args)\n}\n\nexport async function swapExactInput(\n args: SwapExactInputArgs & {\n tradeType?: UniswapQuoteTradeType\n },\n) {\n const swap = await uniswapCreateSwap({\n uniswapApiKey: args.uniswapApiKey,\n fullQuoteFromPermit: args.fullQuote,\n baseUrl: args.baseUrl,\n swapTransactionDeadlineUnix: args.swapTransactionDeadlineUnix,\n useServerProxy: false,\n })\n return swapFromQuote({ ...args, swap })\n}\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 { formatUnits, getAddress, isAddress, parseUnits } from 'viem'\n\nexport const CURVE_NATIVE_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nconst ETH_PLACEHOLDER = CURVE_NATIVE_PLACEHOLDER\n\nfunction normalizeAddr(a: string): string {\n return a.toLowerCase()\n}\n\n/** Map token in list to the address shape Curve uses in pool graphs (native → 0xeeee…). */\nexport function toCurveTokenKey(tokenInAddress: string, wrappedNative: string | undefined): string {\n if (!isAddress(tokenInAddress)) return normalizeAddr(tokenInAddress)\n try {\n const a = getAddress(tokenInAddress)\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n return a.toLowerCase()\n } catch {\n return normalizeAddr(tokenInAddress)\n }\n}\n\n/**\n * Router / `getBestRouteAndOutput` expect the same coin id as the pool graph: wrapped native\n * is represented as `0xeeee…`, not the WETH (etc.) contract. Without this, route discovery can\n * return an empty route while BFS (which uses `toCurveTokenKey`) still finds a path.\n */\nexport function toCurveRouterTokenId(tokenAddress: string, wrappedNative: string | undefined): string {\n const t = (tokenAddress ?? '').trim().toLowerCase()\n if (t === ETH_PLACEHOLDER) return ETH_PLACEHOLDER\n if (!isAddress((tokenAddress ?? '').trim())) return normalizeAddr((tokenAddress ?? '').trim())\n try {\n const a = getAddress((tokenAddress ?? '').trim())\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n /** Lowercase matches pool graph keys and `@curvefi/api`’s `DECIMALS` lookups. */\n return a.toLowerCase()\n } catch {\n return normalizeAddr((tokenAddress ?? '').trim())\n }\n}\n\n/**\n * Turn the user’s decimal string into a canonical form using **this chain’s** token-in decimals\n * (from the asset row). `@curvefi/api` uses the same for `parseUnits` when building routes; an\n * over-long fraction (e.g. 1e-8 on USDC) can make internal calls fail and yield an empty route / 0.0.\n */\nexport function normalizeCurveRouterAmountString(raw: string, tokenInDecimals: number): string {\n const t = raw.trim().replace(/,/g, '')\n if (!t) return ''\n if (!Number.isInteger(tokenInDecimals) || tokenInDecimals < 0 || tokenInDecimals > 18) {\n throw new Error('Invalid token-in decimals for amount normalization.')\n }\n const wei = parseUnits(t, tokenInDecimals)\n return formatUnits(wei, tokenInDecimals)\n}\n\nfunction addEdge(adj: Map<string, Set<string>>, a: string, b: string) {\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/**\n * Build graph from the same pool list the Curve router uses (`getPool` / `getPoolList` on the\n * public `@curvefi/api` instance; `getPoolsData` is internal).\n */\nexport function buildCurveLiquidityGraphFromApi(curve: {\n getPoolList: () => string[]\n getPool: (id: string) => {\n underlyingCoinAddresses: string[] | undefined\n wrappedCoinAddresses: string[] | undefined\n }\n}): Map<string, Set<string>> {\n const adj = new Map<string, Set<string>>()\n for (const id of curve.getPoolList()) {\n try {\n const pool = curve.getPool(id)\n const w = (pool.wrappedCoinAddresses ?? []).map(normalizeAddr)\n const u = (pool.underlyingCoinAddresses ?? []).map(normalizeAddr)\n const all = [...new Set([...w, ...u])]\n for (let i = 0; i < all.length; i++) {\n for (let j = i + 1; j < all.length; j++) {\n addEdge(adj, all[i], all[j])\n }\n }\n } catch {\n /* pool constructor can throw for stale ids */\n }\n }\n return adj\n}\n\n/**\n * Add bidirectional edge between the SDK's native placeholder coin and WETH, when the chain uses\n * wrapped native in pools (mirrors the Curve dialog graph).\n */\nexport function addNativeWethBridge(adj: Map<string, Set<string>>, wrappedNative: string | undefined) {\n if (!wrappedNative) return\n const w = wrappedNative.toLowerCase()\n const a = ETH_PLACEHOLDER\n const b = w\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/** True when the token key appears in the graph with at least one swap neighbor. */\nexport function isCurveTokenKeySwappable(\n swappableNodeKeys: ReadonlySet<string>,\n graphTokenKey: string,\n): boolean {\n return swappableNodeKeys.has(graphTokenKey)\n}\n\n/**\n * All token keys in `adj` that have at least one pool neighbor (candidates to start a path from).\n */\nexport function swappableCurveGraphNodeKeys(adj: Map<string, Set<string>>): Set<string> {\n const out = new Set<string>()\n for (const [k, neigh] of adj) {\n if (neigh.size > 0) out.add(k)\n }\n return out\n}\n\n/**\n * All tokens in the same connected component as `start` (excluding `start`), for router discovery.\n */\nexport function bfsCurveSwapDestinations(adj: Map<string, Set<string>>, start: string): Set<string> {\n const s = normalizeAddr(start)\n const visited = new Set<string>([s])\n const q: string[] = [s]\n while (q.length) {\n const n = q.shift()!\n for (const nxt of adj.get(n) ?? []) {\n if (!visited.has(nxt)) {\n visited.add(nxt)\n q.push(nxt)\n }\n }\n }\n visited.delete(s)\n return visited\n}\n\nexport type CurveDestToken = {\n address: string\n symbol: string\n name: string\n /** From Curve `getCoinsData` (on-chain), when available. */\n decimals: number | null\n}\n","import {\n addNativeWethBridge,\n buildCurveLiquidityGraphFromApi,\n swappableCurveGraphNodeKeys,\n} from './swapDestinations.js'\n\n/** Live `@curvefi/api` instance with pools already fetched, plus the routing graph. */\nexport type CurveFullSession = {\n /** Same reference used for getCoinsData / router; pools already loaded. */\n curve: any\n adj: Map<string, Set<string>>\n swappableNodeKeys: ReadonlySet<string>\n wrappedNative: string | undefined\n}\n\n/**\n * Fetches all factory pools in parallel (best-effort; failures are ignored per factory,\n * same as the Curve dialog).\n */\nexport async function fetchAllCurvePools(curve: {\n factory: { fetchPools: () => Promise<unknown> }\n crvUSDFactory: { fetchPools: () => Promise<unknown> }\n EYWAFactory: { fetchPools: () => Promise<unknown> }\n cryptoFactory: { fetchPools: () => Promise<unknown> }\n twocryptoFactory: { fetchPools: () => Promise<unknown> }\n tricryptoFactory: { fetchPools: () => Promise<unknown> }\n stableNgFactory: { fetchPools: () => Promise<unknown> }\n}): Promise<void> {\n const run = (p: Promise<unknown>) => p.catch(() => undefined)\n await Promise.all([\n run(curve.factory.fetchPools()),\n run(curve.crvUSDFactory.fetchPools()),\n run(curve.EYWAFactory.fetchPools()),\n run(curve.cryptoFactory.fetchPools()),\n run(curve.twocryptoFactory.fetchPools()),\n run(curve.tricryptoFactory.fetchPools()),\n run(curve.stableNgFactory.fetchPools()),\n ])\n}\n\n/**\n * One init + `fetchAllCurvePools` + graph build. Reuse this session for the asset list and the\n * Curve dialog to avoid duplicating the Curve API work.\n */\nexport async function loadFullCurveSessionForRpc(rpcUrl: string): Promise<CurveFullSession | null> {\n const url = (rpcUrl ?? '').trim()\n if (!url) return null\n try {\n const { default: curve } = await import('@curvefi/api')\n await curve.init('JsonRpc', { url }, {})\n const wrapped = (curve.getNetworkConstants() as { NATIVE_COIN?: { wrappedAddress?: string } })\n .NATIVE_COIN?.wrappedAddress\n if (!curve.hasRouter || !curve.hasRouter()) {\n return {\n curve,\n adj: new Map(),\n swappableNodeKeys: new Set<string>(),\n wrappedNative: wrapped,\n }\n }\n await fetchAllCurvePools(curve)\n const adj = buildCurveLiquidityGraphFromApi(curve)\n addNativeWethBridge(adj, wrapped)\n return {\n curve,\n adj,\n swappableNodeKeys: swappableCurveGraphNodeKeys(adj),\n wrappedNative: wrapped,\n }\n } catch {\n return null\n }\n}\n\n","import type { ProposalTxParams } from '../../../chains/evm/txParams.js'\n\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nexport const CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS = 1_200_000n\n\nexport function isCurveDaoSwapEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0 && ex) {\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[batchIndex] && typeof bm[batchIndex] === 'object' && !Array.isArray(bm[batchIndex])) {\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n if (String((evm0 as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange') return true\n }\n }\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n return String((evm as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange'\n}\n\nexport function isCurveDaoErc20ApproveEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex?.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const evm0 = (bm[index] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n return t === 'curve_dao_erc20_approve'\n }\n }\n return false\n}\n\nexport function resolveCurveDaoRouterGasUnitsFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): bigint | null {\n if (!detail) return null\n const propBatch = (detail.proposal_tx_params ??\n detail.proposalTxParams ??\n detail.ProposalTxParams) as unknown\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (Array.isArray(propBatch) && propBatch.length > index) {\n const row = propBatch[index]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined,\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n const ex = parseExtraJsonObject(detail)\n const bm = ex?.batchMeta\n if (Array.isArray(bm)) {\n for (const item of bm) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue\n const cd = (item as Record<string, unknown>).curveDao as Record<string, unknown> | undefined\n const gb = cd?.gasBuildExchange as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gb?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n }\n }\n return null\n}\n\nexport type { ProposalTxParams }\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/keygen.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\nimport { toCurveRouterTokenId } from './swapDestinations.js'\nimport { CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS } from './executeHelpers.js'\nimport { routerSwapGasLimitFromEstimate } from '../../../chains/evm/txParams.js'\n\nconst ETH_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const\n\ntype CurveStepKind = 'approve' | 'exchange'\ntype CurveStep = EvmTxStep & { kind: CurveStepKind; routerSwap?: boolean; fallbackGas?: bigint }\n\nfunction txToViemStep(tx: {\n to?: string | null\n data?: string | null\n value?: string | bigint | number | null\n}): { to: Address; data: `0x${string}`; value: bigint } {\n if (!tx.to) throw new Error('Transaction missing `to`')\n const to = getAddress((tx.to ?? '').trim() as `0x${string}`)\n const raw = (tx.data ?? '0x').toString()\n const data = (raw.startsWith('0x') ? raw : `0x${raw}`) as `0x${string}`\n let value = 0n\n if (tx.value != null) {\n if (typeof tx.value === 'bigint') value = tx.value\n else value = BigInt(String(tx.value))\n }\n return { to, data, value }\n}\n\n/**\n * Build `POST /multiSignRequest` body: optional ERC-20 approve(s) to the Curve router, then\n * `CurveRouterNG.exchange` via `@curvefi/api` `router.populateSwap`.\n */\nexport async function buildEvmMultisignBodyCurveDaoBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n tokenIn: Address\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n executorAddress: Address\n purposeText: string\n}) {\n const tokenIn = getAddress(args.tokenIn)\n const executor = getAddress(args.executorAddress)\n\n const session = await loadFullCurveSessionForRpc(args.rpcUrl)\n if (!session?.curve?.router?.populateSwap) {\n throw new Error('Curve router is not available (load session failed or chain has no router).')\n }\n const { curve, wrappedNative } = session\n const wn = wrappedNative as string | undefined\n const tokenInId = toCurveRouterTokenId(tokenIn, wn)\n const outTrim = (args.tokenOut ?? '').trim()\n const tokenOutId = toCurveRouterTokenId(\n outTrim.toLowerCase() === ETH_PLACEHOLDER ? ETH_PLACEHOLDER : getAddress(outTrim),\n wn,\n )\n const isNativeIn = tokenInId.toLowerCase() === ETH_PLACEHOLDER\n const slip = args.slippagePercent\n if (!Number.isFinite(slip) || slip <= 0 || slip >= 100) {\n throw new Error('Slippage must be between 0 and 100 (exclusive).')\n }\n\n const swapPop = await curve.router.populateSwap(tokenInId, tokenOutId, args.amountHuman, slip)\n const swapBase = txToViemStep(swapPop as Parameters<typeof txToViemStep>[0])\n const rawTo = (swapPop as { to?: string | null })?.to\n if (rawTo == null || String(rawTo).trim() === '') {\n throw new Error('Curve populateSwap did not return a destination address (router).')\n }\n const routerAddr = getAddress(String(rawTo).trim() as `0x${string}`)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n ])\n const erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\n const steps: CurveStep[] = []\n\n if (!isNativeIn) {\n const decimalsN = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(decimalsN))\n const currentAllowance = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, routerAddr],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, 0n],\n })\n steps.push({ to: tokenIn, data: dataReset, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, amountWei],\n })\n steps.push({ to: tokenIn, data: dataApprove, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n }\n\n steps.push({\n ...swapBase,\n kind: 'exchange',\n routerSwap: true,\n fallbackGas: CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS,\n })\n\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n\n const gasLimitByIndex = new Map<number, bigint>()\n const n = steps.length\n const purposeSuffix =\n n === 1\n ? 'Curve (DAO): 1-tx — CurveRouterNG.exchange (native in or allowance already set).'\n : `Curve (DAO): ${n}-tx batch — ERC-20 approve Curve router, then CurveRouterNG.exchange.`\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n const payableValueWei = steps.filter((s) => s.kind === 'exchange').reduce((a, s) => a + s.value, 0n)\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n payableValueWei: payableValueWei > 0n ? payableValueWei : undefined,\n resolveGasLimit: async ({ step, index, estimatedGas }) => {\n const s = step as CurveStep\n let gasLimitI: bigint\n if (s.kind === 'exchange') {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = estimatedGas\n }\n gasLimitByIndex.set(index, gasLimitI)\n return gasLimitI\n },\n buildBatchMeta: ({ step, index, gasLimit }) => {\n const s = step as CurveStep\n const gl = gasLimitByIndex.get(index) ?? gasLimit\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'ERC20.approve',\n to: 'Curve router',\n function: 'approve(address spender, uint256 amount)',\n spender: routerAddr,\n amountHuman: args.amountHuman,\n note: 'Allowance approved for this swap amount only (not unlimited).',\n }),\n evm: { type: 'curve_dao_erc20_approve', version: 1, chainId: String(args.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'CurveRouterNG.exchange',\n note: 'Calldata from @curvefi/api `router.populateSwap` (same on-chain as router `exchange`).',\n }),\n evm: { type: 'curve_dao_router_exchange', version: 1, chainId: String(args.chainId) },\n curveDao: {\n slippagePercent: slip,\n amountHuman: args.amountHuman,\n tokenIn: tokenInId,\n tokenOut: tokenOutId,\n isNativeIn,\n gasBuildExchange: { baseGasUnits: gl.toString() },\n },\n }\n },\n })\n}\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","export * from './core/index.js'\nexport * from './chains/evm/index.js'\nexport { solanaChainCategoryModule, SOLANA_CHAIN_CATEGORY } from './chains/solana/index.js'\nexport { nearChainCategoryModule, NEAR_CHAIN_CATEGORY } from './chains/near/index.js'\nexport { getAgentCatalog } from './agent/catalog.js'\nexport { uniswapV4ProtocolModule, uniswapV4 } from './protocols/evm/uniswap-v4/index.js'\nexport { curveDaoProtocolModule, curveDao } from './protocols/evm/curve-dao/index.js'\nimport { registerProtocolModule } from './core/registry.js'\nimport { uniswapV4ProtocolModule } from './protocols/evm/uniswap-v4/index.js'\nimport { curveDaoProtocolModule } from './protocols/evm/curve-dao/index.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\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","../src/chains/evm/types.ts","../src/chains/evm/txParams.ts","../src/chains/evm/fees/chainFees.ts","../src/chains/evm/fees/eip1559Align.ts","../src/chains/evm/buildBatch.ts","../src/chains/evm/fees/customGas.ts","../src/chains/evm/chainIdParse.ts","../src/chains/evm/rpcUrl.ts","../src/chains/solana/types.ts","../src/chains/solana/index.ts","../src/chains/near/types.ts","../src/chains/near/index.ts","../src/protocols/evm/uniswap-v4/constants.ts","../src/protocols/evm/uniswap-v4/quote.ts","../src/protocols/evm/uniswap-v4/swapMultisign.ts","../src/protocols/evm/uniswap-v4/swap.ts","../src/protocols/evm/uniswap-v4/index.ts","../src/protocols/evm/curve-dao/support.ts","../src/protocols/evm/curve-dao/swapDestinations.ts","../src/protocols/evm/curve-dao/apiSession.ts","../src/protocols/evm/curve-dao/executeHelpers.ts","../src/protocols/evm/curve-dao/multisign.ts","../src/protocols/evm/curve-dao/index.ts","../src/agent/commonParamDocs.ts","../src/agent/zodToMcpJsonSchema.ts","../src/agent/schemas/common.ts","../src/agent/schemas/uniswapV4.ts","../src/agent/schemas/curveDao.ts","../src/agent/schemas/protocols.ts","../src/agent/mcpProtocolTools.ts","../src/agent/mcpTools.ts","../src/protocols/evm/lido/mainnet.ts","../src/protocols/evm/lido/index.ts","../src/protocols/evm/ethena/constants.ts","../src/protocols/evm/ethena/index.ts","../src/protocols/evm/maple/constants.ts","../src/protocols/evm/maple/index.ts","../src/protocols/evm/sky/mainnet.ts","../src/protocols/evm/sky/index.ts","../src/protocols/evm/aave-v4/index.ts","../src/protocols/evm/euler-v2/index.ts","../src/agent/catalog.ts","../src/index.ts"],"names":["getAddress","zeroAddress","defineChain","createPublicClient","http","formatUnits","gasPriceGwei","parseGwei","serializeTransaction","keccak256","res","text","parsed","decodeFunctionData","encodeFunctionData","erc20Abi","isAddress","ETH_PLACEHOLDER","parseAbi","parseUnits","zodToJsonSchema","z"],"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","import type { EvmTokenKind, MultisignCommonArgs } from '../../core/types.js'\nimport { getAddress, zeroAddress, type Address } from 'viem'\n\nexport type EvmChainDetail = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nexport interface EvmProtocolContext extends MultisignCommonArgs {\n chainCategory: 'evm'\n chainId: number\n rpcUrl: string\n executorAddress: Address\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n}\n\nexport type EvmTxStep = {\n to: Address\n data: `0x${string}`\n value: bigint\n /** Fallback when estimateGas reverts */\n fallbackGas?: bigint\n /** When set, use routerSwapGasLimitFromEstimate instead of plain estimate */\n routerSwap?: boolean\n}\n\nexport function isEvmNativeToken(address: string): boolean {\n try {\n return getAddress(address as `0x${string}`) === zeroAddress\n } catch {\n return address.toLowerCase() === zeroAddress\n }\n}\n\nexport function matchEvmTokenKind(\n kind: EvmTokenKind,\n address: string,\n): boolean {\n if (kind === 'native') return isEvmNativeToken(address)\n if (kind === 'erc20' || kind === 'ctmerc20' || kind === 'ctmrwa1') {\n return !isEvmNativeToken(address)\n }\n return true\n}\n","/**\n * Proposal-time EVM fields for POST /multiSignRequest (mpc-auth).\n * Same shape as trigger txParams and GET /getSignRequestById?tx_params=1.\n */\n\nexport type ProposalTxParams = {\n nonce: number\n gasLimit: string\n txType: 'eip1559' | 'legacy'\n maxFeePerGas?: string\n maxPriorityFeePerGas?: string\n gasPrice?: string\n}\n\nexport function gasLimitFromEstimateAndChainConfig(\n estimatedGas: bigint,\n chainGasLimit?: number,\n): bigint {\n if (chainGasLimit == null || !Number.isFinite(chainGasLimit) || chainGasLimit <= 0) {\n return estimatedGas\n }\n const cfg = BigInt(Math.floor(chainGasLimit))\n return cfg > estimatedGas ? cfg : estimatedGas\n}\n\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n\nexport function composeFeePayloadToTxParams(\n p: Record<string, unknown>,\n legacy: boolean,\n): ProposalTxParams | undefined {\n const gl = p.txGasLimit ?? p.txgaslimit\n if (gl == null || String(gl).trim() === '') return undefined\n const n = p.txNonce ?? p.txnonce\n let nonce = 0\n if (typeof n === 'bigint') nonce = Number(n)\n else if (typeof n === 'number') nonce = n\n else if (n != null) nonce = parseInt(String(n), 10)\n if (!Number.isFinite(nonce)) nonce = 0\n const gasLimit = String(gl)\n if (legacy) {\n const gp = p.txGasPrice ?? p.txgasprice\n return {\n nonce,\n gasLimit,\n txType: 'legacy',\n gasPrice: gp != null ? String(gp) : '0',\n }\n }\n return {\n nonce,\n gasLimit,\n txType: 'eip1559',\n maxFeePerGas: String(p.txMaxFeePerGas ?? ''),\n maxPriorityFeePerGas: String(p.txMaxPriorityFeePerGas ?? ''),\n }\n}\n\nexport function triggerTxParamsFromComposeBody(body: Record<string, unknown>): ProposalTxParams {\n const existing = body.txParams\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n const o = existing as ProposalTxParams & { gasLimit?: string }\n if (String(o.gasLimit ?? '').trim() !== '') {\n return { ...o }\n }\n }\n const pb = body.proposalTxParams\n if (Array.isArray(pb) && pb.length > 0 && typeof pb[0] === 'object' && pb[0] !== null) {\n const first = pb[0] as ProposalTxParams & { gasLimit?: string }\n if (String(first.gasLimit ?? '').trim() !== '') {\n return { ...first }\n }\n }\n const fromSnapshot = composeFeePayloadToTxParams(\n body,\n body.txMaxFeePerGas == null && body.txMaxPriorityFeePerGas == null,\n )\n if (fromSnapshot) return fromSnapshot\n return {\n nonce: 0,\n gasLimit: '',\n txType: 'legacy',\n gasPrice: '0',\n }\n}\n\nexport function proposalTxParamsToFeeSnapshot(\n params: ProposalTxParams,\n): Record<string, unknown> {\n if (params.txType === 'legacy') {\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txGasPrice: params.gasPrice ?? '0',\n }\n }\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txMaxFeePerGas: params.maxFeePerGas ?? '',\n txMaxPriorityFeePerGas: params.maxPriorityFeePerGas ?? '',\n }\n}\n","import { createPublicClient, http, defineChain, formatUnits } from 'viem'\n\nexport interface ChainFeeParams {\n isEip1559: boolean\n baseFeeGwei?: number\n priorityFeeGwei?: number\n gasPriceGwei?: number\n}\n\nexport async function fetchChainFeeParams(\n rpcUrl: string,\n chainId: number | string,\n): Promise<ChainFeeParams> {\n const url = rpcUrl.trim()\n if (!url) return { isEip1559: false }\n\n const chainIdNum = typeof chainId === 'string' ? parseInt(chainId, 10) : chainId\n if (Number.isNaN(chainIdNum)) return { isEip1559: false }\n\n const chain = defineChain({\n id: chainIdNum,\n name: 'Discovery',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [url] } },\n })\n\n const publicClient = createPublicClient({\n chain,\n transport: http(url),\n })\n\n const getGasPriceGwei = async (): Promise<number> => {\n const gasPriceWei = await publicClient.getGasPrice()\n return parseFloat(formatUnits(gasPriceWei, 9))\n }\n\n try {\n const block = await publicClient.getBlock({ blockTag: 'latest' })\n const baseFeePerGas = block?.baseFeePerGas\n if (baseFeePerGas == null || baseFeePerGas === undefined) {\n const gasPriceGwei = await getGasPriceGwei()\n return { isEip1559: false, gasPriceGwei }\n }\n\n const baseFeeGwei = parseFloat(formatUnits(baseFeePerGas, 9))\n\n let priorityFeeGwei: number | undefined\n try {\n const priorityWei = await publicClient.estimateMaxPriorityFeePerGas()\n priorityFeeGwei = parseFloat(formatUnits(priorityWei, 9))\n } catch {\n /* chain may not support eth_maxPriorityFeePerGas */\n }\n\n const gasPriceGwei = await getGasPriceGwei()\n return {\n isEip1559: true,\n baseFeeGwei,\n priorityFeeGwei,\n gasPriceGwei,\n }\n } catch {\n try {\n const gasPriceWei = await publicClient.getGasPrice()\n const gasPriceGwei = parseFloat(formatUnits(gasPriceWei, 9))\n return { isEip1559: false, gasPriceGwei }\n } catch {\n return { isEip1559: false }\n }\n }\n}\n","import { parseGwei } from 'viem'\n\nexport type ResolvedEip1559Fees = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n\nfunction finalizeEip1559Fees(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n floor: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint } | null | undefined,\n baseWei: bigint,\n): ResolvedEip1559Fees {\n let maxP = maxPriorityFeePerGas\n let maxF = maxFeePerGas\n if (floor) {\n if (maxP < floor.maxPriorityFeePerGas) maxP = floor.maxPriorityFeePerGas\n if (maxF < floor.maxFeePerGas) maxF = floor.maxFeePerGas\n }\n if (baseWei > 0n && maxF < baseWei + maxP) {\n maxF = baseWei + maxP + parseGwei('0.001')\n }\n if (maxF < maxP) {\n maxF = baseWei > 0n ? baseWei + maxP + parseGwei('0.001') : maxP * 2n\n }\n return { maxFeePerGas: maxF, maxPriorityFeePerGas: maxP }\n}\n\n/** Align EIP-1559 fees with the latest head base fee (same rules as Get Sig). */\nexport function alignEip1559FeesWithLatestBase(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n latestBlockBaseFeeWei: bigint,\n): ResolvedEip1559Fees {\n return finalizeEip1559Fees(maxFeePerGas, maxPriorityFeePerGas, null, latestBlockBaseFeeWei)\n}\n\nexport function gweiToDecimalString(n: number): string {\n if (!Number.isFinite(n)) return '0'\n if (n === 0) return '0'\n const s = String(n)\n if (s.indexOf('e') !== -1 || s.indexOf('E') !== -1) return n.toFixed(9).replace(/\\.?0+$/, '') || '0'\n return s\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/keygen.js'\nimport { fetchChainFeeParams } from './fees/chainFees.js'\nimport { alignEip1559FeesWithLatestBase, gweiToDecimalString } from './fees/eip1559Align.js'\nimport {\n gasLimitFromEstimateAndChainConfig,\n routerSwapGasLimitFromEstimate,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from './txParams.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import type { EvmChainDetail } from '../types.js'\n\n/** Snapshot chain gas config for extraJSON when Use Custom Gas is on. */\nexport function chainSnapshotForCustomGasExtraJSON(chainDetail: EvmChainDetail): Record<string, unknown> {\n const lr = chainDetail.legacy as boolean | string | undefined\n const legacy = lr === true || (typeof lr === 'string' && lr.toLowerCase() === 'true')\n\n const push = (o: Record<string, unknown>, key: string, v: unknown) => {\n if (v === undefined || v === null) return\n if (typeof v === 'string' && v.trim() === '') return\n o[key] = v\n }\n\n const fields: Record<string, unknown> = {}\n push(fields, 'gasLimit', chainDetail.gasLimit)\n if (legacy) {\n push(fields, 'gasMultiplier', chainDetail.gasMultiplier)\n push(fields, 'gasPrice', chainDetail.gasPrice)\n } else {\n push(fields, 'gasMultiplier', chainDetail.gasMultiplier)\n push(fields, 'baseFee', chainDetail.baseFee)\n push(fields, 'priorityFee', chainDetail.priorityFee)\n push(fields, 'baseFeeMultiplier', chainDetail.baseFeeMultiplier)\n }\n push(fields, 'legacy', legacy)\n return fields\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","export function isValidRpcUrl(url: string): boolean {\n const t = url.trim()\n if (!t) return false\n try {\n const u = new URL(t)\n return u.protocol === 'http:' || u.protocol === 'https:'\n } catch {\n return false\n }\n}\n","/** Solana signing defaults — mirrors app NonEvmChainDetailRow.signingDefaults. */\nexport type SolanaSigningDefaults = {\n commitment?: 'confirmed' | 'finalized'\n computeUnitLimit?: number\n priorityFeeMicroLamports?: number\n}\n\nexport type SolanaChainDetail = {\n chainType: 'solana'\n chainId: string\n chainName: string\n rpcGateway: string\n endpointKind: 'json-rpc'\n testnet: boolean\n nativeSymbol: string\n nativeDecimals: number\n signingDefaults?: SolanaSigningDefaults\n}\n\nexport interface SolanaProtocolContext {\n chainCategory: 'solana'\n chainId: string\n rpcGateway: string\n executorAddress: string\n chainDetail: SolanaChainDetail\n useCustomFees: boolean\n keyGen: import('../../core/types.js').KeyGenSubset\n purposeText: string\n}\n\nexport class NotImplementedError extends Error {\n constructor(feature: string) {\n super(`${feature} is not implemented yet for chain category solana`)\n this.name = 'NotImplementedError'\n }\n}\n\nexport async function buildSolanaMultisignBatch(): Promise<never> {\n throw new NotImplementedError('buildSolanaMultisignBatch')\n}\n\nexport const solanaChainCategoryModule = {\n category: 'solana' as const,\n}\n","export * from './types.js'\n\nexport const SOLANA_CHAIN_CATEGORY = 'solana' as const\n","export type NearSigningDefaults = {\n gasPriceYocto?: string\n}\n\nexport type NearChainDetail = {\n chainType: 'near'\n chainId: string\n chainName: string\n rpcGateway: string\n endpointKind: 'json-rpc'\n testnet: boolean\n nativeSymbol: string\n nativeDecimals: number\n signingDefaults?: NearSigningDefaults\n}\n\nexport interface NearProtocolContext {\n chainCategory: 'near'\n chainId: string\n rpcGateway: string\n executorAddress: string\n chainDetail: NearChainDetail\n useCustomFees: boolean\n keyGen: import('../../core/types.js').KeyGenSubset\n purposeText: string\n}\n\nexport class NotImplementedError extends Error {\n constructor(feature: string) {\n super(`${feature} is not implemented yet for chain category near`)\n this.name = 'NotImplementedError'\n }\n}\n\nexport async function buildNearMultisignBatch(): Promise<never> {\n throw new NotImplementedError('buildNearMultisignBatch')\n}\n\nexport const nearChainCategoryModule = {\n category: 'near' as const,\n}\n","export * from './types.js'\n\nexport const NEAR_CHAIN_CATEGORY = 'near' as const\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 { formatUnits, parseUnits, getAddress, zeroAddress } from 'viem'\nimport type { NodeReadAuth } from '../../../core/nodeRead.js'\nimport { nodeFetchWithReadAuth } from '../../../core/nodeRead.js'\n\n/** POST /v1/quote `type` (same as `uniswap_trade_quote.py` `--type`). */\nexport type UniswapQuoteTradeType = 'EXACT_INPUT' | 'EXACT_OUTPUT'\n\nconst DEFAULT_TRADE_BASE = 'https://trade-api.gateway.uniswap.org/v1'\n\nconst UNISWAP_QUOTE_HEADERS_BASE: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'ctm-mpc-defi uniswapTradeQuote/1.0 (TS)',\n}\n\n/** Parse chain id like Python: decimal or 0x hex. */\nexport function parseUniswapChainId(value: string | number): number {\n if (typeof value === 'number') {\n if (!Number.isInteger(value) || value < 0) {\n throw new TypeError('chainId number must be a non-negative integer')\n }\n return value\n }\n const t = value.trim()\n if (t.toLowerCase().startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n\nfunction trimAddr(a: string): string {\n return a.trim()\n}\n\n/** `tokenIn` is the EVM address `0x0` used by the Trade API for the chain’s native (gas) token. */\nexport function isUniswapTokenInAddressNative(tokenIn: string | undefined | null): boolean {\n const t = (tokenIn ?? '').toString().trim()\n if (!t) return false\n try {\n return getAddress(t as `0x${string}`) === zeroAddress\n } catch {\n return t.toLowerCase() === '0x0000000000000000000000000000000000000000'\n }\n}\n\n/** `fullQuote` / stored quote response: top-level or nested has `quote.input` with a native or ERC-20 address. */\nexport function isUniswapFullQuoteResponseNativeIn(\n stored: Record<string, unknown> | null | undefined,\n): boolean {\n if (!stored) return false\n const q = (stored as { quote?: unknown }).quote\n if (!q || typeof q !== 'object' || Array.isArray(q)) return false\n const input = (q as Record<string, unknown>).input as Record<string, unknown> | undefined\n if (!input) return false\n const raw = (input.address ?? (input as { token?: string }).token ?? '').toString().trim()\n return isUniswapTokenInAddressNative(raw)\n}\n\n/**\n * GET /getKeyGenResultById and return `ethereumaddress` (swapper), same as\n * `uniswap_mpc_helpers.resolve_owner_from_keygen` in mpc-config.\n */\nexport async function fetchEthereumAddressForKeyGen(\n managementNodeUrl: string,\n keyGenId: string,\n readAuth: NodeReadAuth = { bearerOnGet: true, jwt: null },\n init?: RequestInit\n): Promise<string> {\n const base = managementNodeUrl.trim().replace(/\\/$/, '')\n if (!base) {\n throw new Error('managementNodeUrl is required to resolve keyGen')\n }\n const id = (keyGenId || '').trim()\n if (!id) {\n throw new Error('keyGen is required')\n }\n const url = `${base}/getKeyGenResultById?id=${encodeURIComponent(id)}`\n const res = await nodeFetchWithReadAuth(url, { ...init, method: 'GET', cache: 'no-store' }, readAuth)\n if (!res.ok) {\n const t = await res.text().catch(() => '')\n throw new Error(\n `getKeyGenResultById HTTP ${res.status}: ${t || res.statusText}`.trim()\n )\n }\n const raw = (await res.json()) as {\n Data?: { ethereumaddress?: string; [k: string]: unknown }\n data?: { ethereumaddress?: string; [k: string]: unknown }\n }\n const d = raw.Data ?? raw.data\n const eth = d?.ethereumaddress\n if (typeof eth !== 'string' || !eth.trim()) {\n throw new Error('getKeyGenResultById: ethereumaddress missing for this keyGen')\n }\n return eth.trim()\n}\n\nexport interface UniswapTradeQuoteParams {\n amount: string\n tokenIn: string\n tokenOut: string\n uniswapApiKey: string\n /**\n * KeyGen id — used to resolve `swapper` from GET /getKeyGenResultById unless `swapper` is set.\n * Required unless `swapper` is set.\n */\n keyGen?: string\n type: UniswapQuoteTradeType\n /**\n * Slippage as percent, e.g. `0.5` for 0.5%. If omitted, the body uses\n * `autoSlippage: \"DEFAULT\"` (same as the Python script when `--slippage` is not set).\n */\n slippage?: number | string\n /**\n * Chain id for the input side (`tokenInChainId` in the HTTP body; Python `--chain-id`).\n * You may set **`chainId` or `tokenInChainId`** (same meaning); if both are set, `chainId` wins.\n * Same-chain quote: set one chain here and omit `tokenOutChainId` (or set both to the same id).\n */\n chainId?: string | number\n /**\n * Same as `chainId` (input chain). If `chainId` is omitted, this must be set.\n */\n tokenInChainId?: string | number\n /**\n * Output chain id; defaults to the input chain when omitted (Python: empty `--token-out-chain-id`).\n */\n tokenOutChainId?: string | number\n /**\n * When `true`, sends `x-permit2-disabled: true` (Uniswap’s header for classic ERC-20 allowance; no permitData in the response).\n * Omit or set `false` for the default Trade API routing (default).\n */\n permit2Disabled?: boolean\n /**\n * MPC wallet (swapper) address. If omitted, `managementNodeUrl` is used with `keyGen`\n * to call GET /getKeyGenResultById.\n */\n swapper?: `0x${string}` | string\n /**\n * Management node base URL (MPC), required when `swapper` is not provided.\n */\n managementNodeUrl?: string\n /** For Browser HTTPS: Bearer on GET to /getKeyGenResultById. */\n nodeReadAuth?: NodeReadAuth\n /** Trade API base without `/quote` (default: Uniswap gateway v1). */\n baseUrl?: string\n /** `x-universal-router-version` (default `2.0`, aligned with Python / v4). */\n universalRouterVersion?: string\n signal?: AbortSignal\n /** Override for tests. */\n fetchImpl?: typeof fetch\n}\n\n/**\n * Build the same JSON body as `uniswap_trade_quote.py` (minus `swapper`, which you must set).\n */\n/**\n * `tokenInChainId` in the HTTP body (Python `--chain-id`).\n * Order: `chainId`, then `tokenInChainId`, else if only `tokenOutChainId` is set use it\n * (same in/out, e.g. same-chain with a single id).\n */\nfunction resolveInputChainId(\n p: Pick<UniswapTradeQuoteParams, 'chainId' | 'tokenInChainId' | 'tokenOutChainId'>\n): string | number {\n if (p.chainId !== undefined && p.chainId !== null && String(p.chainId).trim() !== '') {\n return p.chainId\n }\n if (p.tokenInChainId !== undefined && p.tokenInChainId !== null && String(p.tokenInChainId).trim() !== '') {\n return p.tokenInChainId\n }\n if (p.tokenOutChainId !== undefined && p.tokenOutChainId !== null && String(p.tokenOutChainId).trim() !== '') {\n return p.tokenOutChainId\n }\n throw new Error('Set chainId, tokenInChainId, or tokenOutChainId (same-chain) for the input side')\n}\n\nexport function buildUniswapQuoteRequestBody(\n args: Pick<\n UniswapTradeQuoteParams,\n | 'type'\n | 'amount'\n | 'tokenIn'\n | 'tokenOut'\n | 'slippage'\n | 'chainId'\n | 'tokenInChainId'\n | 'tokenOutChainId'\n > & { swapper: string }\n): Record<string, unknown> {\n const cIn = parseUniswapChainId(resolveInputChainId(args))\n const cOut =\n args.tokenOutChainId !== undefined && args.tokenOutChainId !== null && String(args.tokenOutChainId).trim() !== ''\n ? parseUniswapChainId(args.tokenOutChainId)\n : cIn\n const body: Record<string, unknown> = {\n type: args.type,\n amount: String(args.amount).trim(),\n tokenInChainId: cIn,\n tokenOutChainId: cOut,\n tokenIn: trimAddr(args.tokenIn),\n tokenOut: trimAddr(args.tokenOut),\n swapper: trimAddr(args.swapper),\n }\n if (args.slippage !== undefined && args.slippage !== null && String(args.slippage).trim() !== '') {\n const s =\n typeof args.slippage === 'number' ? args.slippage : Number.parseFloat(String(args.slippage).trim())\n if (Number.isNaN(s)) {\n throw new TypeError('slippage must be a number or a numeric string')\n }\n body.slippageTolerance = s\n } else {\n body.autoSlippage = 'DEFAULT'\n }\n return body\n}\n\n/**\n * Pull a user-facing string from Uniswap / generic JSON error bodies.\n */\nexport function errorMessageFromUniswapJsonBody(value: unknown): string | null {\n if (value == null) return null\n if (typeof value === 'string') {\n const t = value.trim()\n return t || null\n }\n if (typeof value !== 'object') return null\n if (Array.isArray(value)) {\n if (value.length === 0) return null\n return errorMessageFromUniswapJsonBody(value[0])\n }\n const o = value as Record<string, unknown>\n /** Uniswap Trade API, e.g. 404: `{ errorCode, detail, requestId }` */\n if (typeof o.detail === 'string' && o.detail.trim()) {\n const base = o.detail.trim()\n const code = typeof o.errorCode === 'string' && o.errorCode.trim() ? o.errorCode.trim() : ''\n const req = typeof o.requestId === 'string' && o.requestId.trim() ? o.requestId.trim() : ''\n if (code) {\n return req ? `${base} (${code}) [${req}]` : `${base} (${code})`\n }\n return req ? `${base} [${req}]` : base\n }\n if (typeof o.errorCode === 'string' && o.errorCode.trim()) {\n return o.errorCode.trim()\n }\n for (const k of ['message', 'detail', 'description', 'title', 'reason']) {\n const v = o[k]\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n if (typeof o.error === 'string' && o.error.trim()) return o.error.trim()\n if (o.error != null && typeof o.error === 'object') {\n const inner = errorMessageFromUniswapJsonBody(o.error)\n if (inner) return inner\n }\n if (Array.isArray(o.errors) && o.errors.length > 0) {\n const inner = errorMessageFromUniswapJsonBody(o.errors[0])\n if (inner) return inner\n }\n if (typeof o.code === 'string' && o.code.trim()) return o.code.trim()\n return null\n}\n\nfunction bodyLooksLikeHtml(t: string): boolean {\n const s = t.slice(0, 256).trimStart()\n return s.startsWith('<!') || s.toLowerCase().startsWith('<html')\n}\n\nfunction titleFromHtml(t: string): string | null {\n const m = t.match(/<title[^>]*>([^<]+)<\\/title>/i)\n if (!m?.[1]) return null\n const s = m[1].replace(/\\s+/g, ' ').trim()\n return s || null\n}\n\n/**\n * User-facing string from an HTTP body: JSON `message` / `error` / `detail` first,\n * else a short plain-text / HTML page title, not the raw document (avoids huge HTML in UI).\n */\nexport function messageFromUniswapHttpResponseBody(\n text: string,\n status: number,\n statusText = ''\n): string {\n const raw = (text ?? '').trim()\n const st = (statusText ?? '').trim()\n if (!raw) {\n if (status > 0) {\n return st ? `HTTP ${status} (${st})` : `HTTP ${status}`\n }\n return 'Empty response'\n }\n if (bodyLooksLikeHtml(raw)) {\n const title = titleFromHtml(raw)\n if (title) {\n return status > 0 ? `HTTP ${status}: ${title}` : title\n }\n return status > 0\n ? 'HTTP ' +\n String(status) +\n ': response was not JSON (HTML or error page). Check API key, token pair, and network.'\n : 'Response was not JSON (HTML or error page).'\n }\n const forParse = raw.replace(/^\\uFEFF/, '')\n try {\n const j = JSON.parse(forParse) as unknown\n if (j && typeof j === 'object') {\n const msg = errorMessageFromUniswapJsonBody(j)\n if (msg) {\n if (status >= 400) {\n return st ? `${msg} (HTTP ${status} ${st})` : `${msg} (HTTP ${status})`\n }\n return msg\n }\n }\n } catch {\n /* not JSON */\n }\n const oneLine = raw.replace(/\\s+/g, ' ').trim()\n const short = oneLine.length > 500 ? `${oneLine.slice(0, 500)}…` : oneLine\n if (status > 0) {\n return st && !short ? `HTTP ${status} (${st})` : st ? `HTTP ${status}: ${short} (${st})` : `HTTP ${status}: ${short}`\n }\n return short\n}\n\n/**\n * `POST` Uniswap Trade API `/v1/quote` — TypeScript version of\n * `mpc-config/recipes/uniswapV4/uniswap_trade_quote.py` (core HTTP call + KeyGen → swapper).\n *\n * CORS: calling the Trade API from a browser may be blocked. Prefer a server / route\n * handler, or use this in Node. KeyGen resolution uses a GET to your management node\n * and follows the same read-auth pattern as the app.\n */\nexport async function uniswapTradeQuote(\n args: UniswapTradeQuoteParams\n): Promise<Record<string, unknown>> {\n const apiKey = (args.uniswapApiKey || '').trim()\n if (!apiKey) {\n throw new Error('uniswapApiKey (x-api-key) is required')\n }\n const keyGen = (args.keyGen || '').trim()\n\n let swapper: string\n if ((args.swapper || '').trim()) {\n swapper = trimAddr(args.swapper as string)\n } else {\n if (!keyGen) {\n throw new Error('keyGen is required when swapper is not provided')\n }\n const mpc = (args.managementNodeUrl || '').trim()\n if (!mpc) {\n throw new Error('managementNodeUrl is required when swapper is not provided (to resolve keyGen)')\n }\n swapper = await fetchEthereumAddressForKeyGen(\n mpc,\n keyGen,\n args.nodeReadAuth ?? { bearerOnGet: true, jwt: null }\n )\n }\n\n const base =\n (args.baseUrl && args.baseUrl.trim()) ? args.baseUrl.trim().replace(/\\/$/, '') : DEFAULT_TRADE_BASE\n const quoteUrl = `${base}/quote`\n const urv = (args.universalRouterVersion && args.universalRouterVersion.trim()) || '2.0'\n\n const body = buildUniswapQuoteRequestBody({ ...args, swapper })\n const nativeIn = isUniswapTokenInAddressNative(args.tokenIn)\n const headers: Record<string, string> = {\n ...UNISWAP_QUOTE_HEADERS_BASE,\n 'x-api-key': apiKey,\n 'x-universal-router-version': urv,\n 'x-permit2-disabled': args.permit2Disabled === true ? 'true' : 'false',\n /** Native (0x0) as token in: Trade API needs this for classic routes and payable /swap. */\n 'x-erc20eth-enabled': nativeIn ? 'true' : 'false',\n }\n\n const fetchFn = args.fetchImpl ?? globalThis.fetch\n const res = await fetchFn(quoteUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: args.signal,\n })\n const text = await res.text()\n if (!res.ok) {\n throw new Error(messageFromUniswapHttpResponseBody(text, res.status, res.statusText))\n }\n const forParse = text.replace(/^\\uFEFF/, '')\n try {\n return JSON.parse(forParse) as Record<string, unknown>\n } catch {\n throw new Error(\n `Trade API: ${messageFromUniswapHttpResponseBody(text, res.status, res.statusText)}`\n )\n }\n}\n\n/**\n * Single-line JSON for mpc-config `uniswap_trade_swap.py --quote-json` (compact quote body).\n */\nexport function uniswapQuoteToJsonQuoteOneLine(quote: Record<string, unknown>): string {\n return JSON.stringify(quote)\n}\n\n/**\n * `quote.input.amount` / `quote.output.amount` as bigints, if present (classic response).\n */\nexport function parseUniswapQuoteClassicInOut(\n res: Record<string, unknown>\n): { inputWei: bigint; outputWei: bigint } | null {\n const inner = res.quote\n if (!inner || typeof inner !== 'object' || Array.isArray(inner)) return null\n const q = inner as Record<string, unknown>\n const input = q.input as { amount?: string } | undefined\n const output = q.output as { amount?: string } | undefined\n const inAm = input?.amount\n const outAm = output?.amount\n if (typeof inAm !== 'string' || !inAm || typeof outAm !== 'string' || !outAm) return null\n try {\n return { inputWei: BigInt(inAm), outputWei: BigInt(outAm) }\n } catch {\n return null\n }\n}\n\n/**\n * Fields from Uniswap Trade API `200` `quote` (e.g. {@link https://api-docs.uniswap.org/api-reference/swapping/quote} `ClassicQuote`):\n * - `slippage` — slippage tolerance (percent) used for the quote\n * - `priceImpact` — “impact the trade has on the market price of the pool, between 0-100 percent”\n */\nexport function parseUniswapQuoteSlippageInfo(res: Record<string, unknown>): {\n slippageTolerancePercent: number | null\n priceImpactPercent: number | null\n} {\n const inner = res.quote\n if (!inner || typeof inner !== 'object' || Array.isArray(inner)) {\n return { slippageTolerancePercent: null, priceImpactPercent: null }\n }\n const q = inner as Record<string, unknown>\n const sRaw = q.slippage ?? q.slippageTolerance\n let slippageTolerancePercent: number | null = null\n if (typeof sRaw === 'number' && Number.isFinite(sRaw)) {\n slippageTolerancePercent = sRaw\n } else if (typeof sRaw === 'string' && sRaw.trim()) {\n const p = Number.parseFloat(sRaw.trim().replace(/,/g, ''))\n if (Number.isFinite(p)) slippageTolerancePercent = p\n }\n const piRaw = q.priceImpact\n let priceImpactPercent: number | null = null\n if (typeof piRaw === 'number' && Number.isFinite(piRaw)) {\n priceImpactPercent = piRaw\n } else if (typeof piRaw === 'string' && piRaw.trim()) {\n const p = Number.parseFloat(piRaw.trim().replace(/,/g, ''))\n if (Number.isFinite(p)) priceImpactPercent = p\n }\n return { slippageTolerancePercent, priceImpactPercent }\n}\n\n/** Compact percent for UI (e.g. 0.5, 1.2345). */\nexport function formatUniswapPercentForUi(n: number): string {\n if (!Number.isFinite(n)) return '—'\n const t = n.toFixed(4).replace(/\\.?0+$/, '')\n return t || '0'\n}\n\n/** Human string for a modal amount field, trimmed of trailing fraction zeros. */\nexport function formatUniswapAmountFieldFromWei(wei: bigint, decimals: number): string {\n const s = formatUnits(wei, decimals)\n if (!s.includes('.')) return s\n const t = s.replace(/0+$/, '')\n return t.endsWith('.') ? t.slice(0, -1) : t\n}\n\n/**\n * One-line prefill for multi-sign \"purpose\" (user may append context below in the same field).\n */\nexport function buildUniswapV4PurposePrefill(args: {\n tradeType: UniswapQuoteTradeType\n tokenInSymbol: string\n tokenOutSymbol: string\n tokenInDecimals: number\n tokenOutDecimals: number\n amountInput: string\n quote: Record<string, unknown> | null\n slippageInput: string\n chainName: string\n chainId: number\n}): string {\n const symIn = (args.tokenInSymbol || '').trim() || 'token in'\n const symOut = (args.tokenOutSymbol || '').trim() || 'token out'\n const rawS = String(args.slippageInput || '0.5').trim().replace(/,/g, '')\n const parsedSlip = Number.parseFloat(rawS)\n const slip = Number.isFinite(parsedSlip) ? parsedSlip : 0.5\n const slipText = (Math.round(slip * 100) / 100).toString()\n const p = args.quote != null ? parseUniswapQuoteClassicInOut(args.quote) : null\n let inPart = '…'\n let outPart = '…'\n if (p) {\n inPart = `${formatUniswapAmountFieldFromWei(p.inputWei, args.tokenInDecimals)} ${symIn}`.replace(/\\s+/g, ' ').trim()\n outPart = `${formatUniswapAmountFieldFromWei(p.outputWei, args.tokenOutDecimals)} ${symOut}`.replace(/\\s+/g, ' ').trim()\n } else if (args.tradeType === 'EXACT_INPUT' && args.amountInput.trim()) {\n try {\n const w = parseUnits(args.amountInput.trim(), args.tokenInDecimals)\n inPart = `${formatUniswapAmountFieldFromWei(w, args.tokenInDecimals)} ${symIn}`.replace(/\\s+/g, ' ').trim()\n outPart = `… ${symOut}`\n } catch {\n /* keep … */\n }\n }\n const cname = (args.chainName || '').trim() || 'chain'\n return `Swap ${inPart} for ${outPart} with a slippage of ${slipText}% on ${cname} (chainId ${args.chainId})`\n}\n\n/**\n * Human-readable lines from a Trade API `/quote` 200 JSON body.\n * Classic quotes expose `quote.input` / `quote.output` with `amount` (base units as string).\n */\nexport function formatUniswapQuoteForDisplay(\n res: Record<string, unknown>,\n args: {\n tradeType: UniswapQuoteTradeType\n tokenInDecimals: number\n tokenOutDecimals: number\n tokenInSymbol: string\n tokenOutSymbol: string\n }\n): { title: string; lines: string[]; rawJson: string } {\n const { tradeType, tokenInDecimals, tokenOutDecimals, tokenInSymbol, tokenOutSymbol } = args\n const rawJson = JSON.stringify(res, null, 2)\n const routing = typeof res.routing === 'string' ? res.routing : undefined\n const requestId = typeof res.requestId === 'string' ? res.requestId : undefined\n\n const inner = res.quote\n if (inner && typeof inner === 'object' && !Array.isArray(inner)) {\n const q = inner as Record<string, unknown>\n const input = q.input as { amount?: string; token?: string } | undefined\n const output = q.output as { amount?: string; token?: string } | undefined\n const inAm = input?.amount\n const outAm = output?.amount\n if (typeof inAm === 'string' && inAm && typeof outAm === 'string' && outAm) {\n try {\n const inH = formatUnits(BigInt(inAm), tokenInDecimals)\n const outH = formatUnits(BigInt(outAm), tokenOutDecimals)\n const title =\n tradeType === 'EXACT_INPUT'\n ? `≈ ${outH} ${tokenOutSymbol} for ${inH} ${tokenInSymbol} (est.)`\n : `≈ ${inH} ${tokenInSymbol} for ${outH} ${tokenOutSymbol} (est.)`\n const lines: string[] = [\n `Input: ${inH} ${tokenInSymbol} (${inAm} wei)`,\n `Output: ${outH} ${tokenOutSymbol} (${outAm} wei)`,\n ]\n if (routing) lines.push(`Route: ${routing}`)\n if (requestId) lines.push(`Request: ${requestId.slice(0, 24)}…`)\n return { title, lines, rawJson }\n } catch {\n // non-classic or bigint parse error\n }\n }\n }\n\n const lines: string[] = ['(Could not parse classic input/output; see raw JSON below.)']\n if (routing) lines.push(`Route: ${routing}`)\n if (requestId) lines.push(`Request: ${requestId}`)\n return { title: 'Quote received', lines, rawJson }\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n encodeFunctionData,\n decodeFunctionData,\n erc20Abi,\n zeroAddress,\n type Address,\n} from 'viem'\nimport {\n firstClientIdFromKeyGen,\n type KeyGenSubsetForPermit,\n} from '../../../core/keygen.js'\nimport {\n PERMIT2_ADDRESS,\n getUniswapUniversalRouterSpenderOrThrow,\n MAX_UINT160,\n MAX_UINT48,\n UNISWAP_TRADE_BASE_DEFAULT,\n UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT,\n UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES,\n UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET,\n UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS,\n} from './constants.js'\nimport {\n gasLimitFromEstimateAndChainConfig,\n routerSwapGasLimitFromEstimate,\n type ProposalTxParams,\n} from '../../../chains/evm/txParams.js'\nimport { fetchChainFeeParams } from '../../../chains/evm/fees/chainFees.js'\nimport {\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n} from '../../../chains/evm/fees/eip1559Align.js'\nimport {\n isUniswapFullQuoteResponseNativeIn,\n messageFromUniswapHttpResponseBody,\n parseUniswapQuoteClassicInOut,\n} from './quote.js'\n\n/** Parse `gasLimit` from Trade API or chain config (decimal or 0x hex). */\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\nfunction parseExtraJsonObject(\n detail: Record<string, unknown> | null | undefined\n): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nfunction uniswapV4EvmTypeFromBatchMeta(\n ex: Record<string, unknown> | null,\n batchIndex: number\n): boolean {\n if (!ex) return false\n const bm = ex.batchMeta\n if (!Array.isArray(bm) || !bm[batchIndex] || typeof bm[batchIndex] !== 'object' || Array.isArray(bm[batchIndex])) {\n return false\n }\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (!evm0 || typeof evm0 !== 'object' || Array.isArray(evm0)) return false\n return String((evm0 as Record<string, unknown>).type ?? '') === 'uniswap_v4_swap_tx'\n}\n\nfunction uniswapV4AuditFromDetail(\n ex: Record<string, unknown> | null,\n batchIndex?: number\n): Record<string, unknown> | undefined {\n if (!ex) return undefined\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const nested = (bm[index] as Record<string, unknown>).uniswapV4\n if (nested && typeof nested === 'object' && !Array.isArray(nested)) {\n return nested as Record<string, unknown>\n }\n }\n const root = ex.uniswapV4\n if (root && typeof root === 'object' && !Array.isArray(root)) return root as Record<string, unknown>\n return undefined\n}\n\n/**\n * When `batchIndex` is set, check `batchMeta[i].evm`. Without `batchIndex`, also check `batchMeta[0]`\n * (native ETH-in single-tx requests store evm only under batchMeta, not top-level extraJSON.evm).\n */\nexport function isUniswapV4SwapEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0) {\n if (uniswapV4EvmTypeFromBatchMeta(ex, batchIndex)) return true\n } else if (uniswapV4EvmTypeFromBatchMeta(ex, 0)) {\n return true\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n return String((evm as Record<string, unknown>).type ?? '') === 'uniswap_v4_swap_tx'\n}\n\n/**\n * Gas units for Get Sig without `eth_estimateGas` (same calldata often reverts on estimate).\n * Order: proposal row[i] (or [0] / single `txParams`) / ExtraJSON uniswapV4 (audit, quote).\n * Pass `batchIndex` when the sign request is a multi-tx batch.\n */\nexport function resolveRouterSwapGasUnitsFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number\n): bigint | null {\n if (!detail) return null\n const propBatch = (detail.proposal_tx_params ??\n detail.proposalTxParams ??\n detail.ProposalTxParams) as unknown\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (Array.isArray(propBatch) && propBatch.length > index) {\n const row = propBatch[index]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n if (batchIndex == null || batchIndex === 0) {\n const tp = (detail.txParams ?? detail.TxParams) as Record<string, unknown> | undefined\n if (tp && typeof tp === 'object') {\n const gl = parseOptionalGasLimitString(\n (tp.gasLimit ?? tp.GasLimit ?? tp.txGasLimit) as string | number | undefined\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n const ex = parseExtraJsonObject(detail)\n const u4 = uniswapV4AuditFromDetail(ex, batchIndex)\n if (u4) {\n const uc = u4.uniswapCreateSwap as Record<string, unknown> | undefined\n const gb = (uc?.gasBuildSwap ?? uc?.gasBuild) as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gb?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n const snap = u4.fullQuoteFromPermitSnapshot as Record<string, unknown> | undefined\n const quote = snap?.quote as Record<string, unknown> | undefined\n const gue = parseOptionalGasLimitString(quote?.gasUseEstimate as string | number | undefined)\n if (gue != null && gue > 0n) return gue\n }\n return null\n}\n\n/**\n * Uniswap POST /swap `swap.gasLimit` is derived from the route; prefer it so we don't rely on\n * `eth_estimateGas`, which often reverts for Universal Router bundles (RPC simulation quirks).\n * When we must fall back, use a generous floor (L2s; adjust via chain `gasLimit` in app config).\n */\n/** Public for Get Sig when `eth_estimateGas` reverts on Universal Router calldata. */\nexport { UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS } from './constants.js'\nconst DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK = UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS\n\nexport {\n UNISWAP_TRADE_BASE_DEFAULT,\n UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT,\n UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES,\n UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET,\n} from './constants.js'\n\n/** `deadline` = `now` + `expiryMinutes * 60` (seconds). */\nexport function swapTransactionDeadlineUnixFromExpiryMinutes(\n expiryMinutes: number,\n nowSec: number = Math.floor(Date.now() / 1000)\n): number {\n const m = Number.isFinite(expiryMinutes) && expiryMinutes > 0 ? expiryMinutes : UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES\n return nowSec + Math.floor(m * 60)\n}\n\nfunction swapDeadlineUnixSeconds(args: { swapTransactionDeadlineUnix?: number }): number {\n const now = Math.floor(Date.now() / 1000)\n if (\n args.swapTransactionDeadlineUnix != null &&\n Number.isFinite(args.swapTransactionDeadlineUnix) &&\n args.swapTransactionDeadlineUnix > now\n ) {\n return Math.floor(args.swapTransactionDeadlineUnix)\n }\n return swapTransactionDeadlineUnixFromExpiryMinutes(UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES, now)\n}\n\n/** The stored `uniswapTradeQuote` is the full `POST /quote` JSON; `/swap` wants the **inner** classic quote. */\nexport function getClassicQuoteFromStoredUniswapResponse(stored: Record<string, unknown> | null | undefined): unknown {\n if (!stored) return null\n const q = (stored as Record<string, unknown>).quote\n return q != null && typeof q === 'object' ? q : null\n}\n\ntype TransactionRequest = {\n to: string\n from?: string\n data: string\n value: string\n /** Trade API or eth-style field name */\n gasLimit?: string\n gas?: string\n chainId?: number\n}\n\ntype CreateSwapResponse = {\n requestId?: string\n swap: TransactionRequest\n gasFee?: string\n}\n\n/**\n * `POST /v1/swap` — builds swap calldata (Universal Router) from a quote fetched with classic-allowance header `x-permit2-disabled: true`.\n * @see https://api-docs.uniswap.org/api-reference/swapping/swap\n */\nexport async function uniswapCreateSwap(\n args: {\n uniswapApiKey: string\n baseUrl?: string\n /** Full `POST /quote` JSON (must include classic `quote`). */\n fullQuoteFromPermit: Record<string, unknown>\n universalRouterVersion?: string\n fetchImpl?: typeof fetch\n /**\n * In the browser, direct `POST` to `trade-api.gateway.uniswap.org` is blocked by CORS.\n * When true (default in browser), the request goes to same-origin `POST /api/uniswap/swap` which proxies server-side. Set `false` to force a direct call (e.g. tests, Node scripts).\n */\n useServerProxy?: boolean\n /**\n * Universal Router swap deadline (unix seconds). Defaults to now + {@link UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET}.\n * Omitting this caused short API defaults and `TransactionDeadlinePassed` after MPC delay.\n */\n swapTransactionDeadlineUnix?: number\n }\n): Promise<CreateSwapResponse> {\n const deadline = swapDeadlineUnixSeconds(args)\n const useProxy = (args.useServerProxy !== false) && typeof globalThis !== 'undefined' && typeof (globalThis as { window?: unknown }).window !== 'undefined'\n if (useProxy) {\n const proxyPayload: Record<string, unknown> = {\n uniswapApiKey: args.uniswapApiKey,\n fullQuoteFromPermit: args.fullQuoteFromPermit,\n universalRouterVersion: args.universalRouterVersion,\n baseUrl: args.baseUrl,\n swapTransactionDeadlineUnix: deadline,\n }\n const res = await (args.fetchImpl ?? globalThis.fetch)('/api/uniswap/swap', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(proxyPayload),\n credentials: 'same-origin',\n })\n const text = await res.text()\n if (!res.ok) {\n let errMsg = res.statusText\n try {\n const j = JSON.parse(text) as { error?: string }\n if (j && typeof j.error === 'string' && j.error.trim()) errMsg = j.error.trim()\n } catch {\n if (text.trim()) errMsg = text.slice(0, 500)\n }\n throw new Error(`Uniswap swap proxy failed: ${errMsg}`)\n }\n const parsed = JSON.parse(text) as CreateSwapResponse\n if (!parsed?.swap || typeof parsed.swap !== 'object') {\n throw new Error('Uniswap /swap (proxy): missing `swap` in response.')\n }\n return parsed\n }\n const base = (args.baseUrl ?? UNISWAP_TRADE_BASE_DEFAULT).replace(/\\/$/, '')\n const url = `${base}/swap`\n const classic = getClassicQuoteFromStoredUniswapResponse(args.fullQuoteFromPermit) as Record<string, unknown> | null\n if (!classic) {\n throw new Error('Stored Uniswap quote is missing a classic `quote` object; cannot build swap calldata.')\n }\n const body: Record<string, unknown> = {\n quote: classic,\n deadline,\n }\n const urv = (args.universalRouterVersion ?? UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT).trim() || '2.0'\n const fn = args.fetchImpl ?? globalThis.fetch\n const nativeIn = isUniswapFullQuoteResponseNativeIn(args.fullQuoteFromPermit)\n const res = await fn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': args.uniswapApiKey.trim(),\n 'x-universal-router-version': urv,\n 'x-erc20eth-enabled': nativeIn ? 'true' : 'false',\n 'x-permit2-disabled': 'true',\n },\n body: JSON.stringify(body),\n })\n const text = await res.text()\n if (!res.ok) {\n throw new Error(\n `Uniswap POST /swap failed: ${messageFromUniswapHttpResponseBody(text, res.status, res.statusText)}`\n )\n }\n const parsed = JSON.parse(text) as CreateSwapResponse\n if (!parsed?.swap || typeof parsed.swap !== 'object') {\n throw new Error('Uniswap /swap: missing `swap` in response.')\n }\n return parsed\n}\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst permit2ApproveRouterAbi = [\n {\n name: 'approve',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'token', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'amount', type: 'uint160' },\n { name: 'expiration', type: 'uint48' },\n ],\n outputs: [],\n },\n] as const\n\n/**\n * Trade `POST /swap` often returns calldata for `execute(router, token, amount, commands, inputs, deadline)` (dispatcher\n * entry). The **router** argument is the allowance-hub **spender**; the **amount** can exceed `quote.input.amount` (slippage /\n * route). We must approve at least that amount and the correct spender.\n */\nconst uniswapDispatchExecuteAbi = [\n {\n name: 'execute',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n { name: 'router', type: 'address' },\n { name: 'token', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'commands', type: 'bytes' },\n { name: 'inputs', type: 'bytes[]' },\n { name: 'deadline', type: 'uint256' },\n ],\n outputs: [],\n },\n] as const\n\n/** Parse payable `value` wei from Trade API `swap` (string hex/decimal, `Value`, or finite JSON number). */\nfunction parseSwapTxValueWei(swap: Record<string, unknown>): bigint {\n const raw = swap.value ?? swap.Value\n if (raw == null || raw === '') return 0n\n if (typeof raw === 'bigint') return raw > 0n ? raw : 0n\n if (typeof raw === 'number' && Number.isFinite(raw)) {\n try {\n return BigInt(Math.max(0, Math.trunc(raw)))\n } catch {\n return 0n\n }\n }\n const s = String(raw).trim()\n if (!s) return 0n\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s.replace(/^0x/i, ''))\n } catch {\n return 0n\n }\n}\n\n/**\n * Native ETH–in payable amount: prefer `swap.value` from POST /swap; if missing/zero, use dispatcher\n * `execute(..., amount, ...)` from calldata (Trade API sometimes omits top-level `value`); else classic quote input wei.\n */\nfunction nativeEthInPayableValueWei(args: {\n swap: TransactionRequest\n dataHex: `0x${string}`\n quoteInputWei: bigint\n}): bigint {\n const fromApi = parseSwapTxValueWei(args.swap as Record<string, unknown>)\n if (fromApi > 0n) return fromApi\n try {\n const d = decodeFunctionData({ abi: uniswapDispatchExecuteAbi, data: args.dataHex })\n if (d.functionName === 'execute') {\n const rawAmt = d.args[2]\n const amount = typeof rawAmt === 'bigint' ? rawAmt : BigInt(String(rawAmt))\n if (amount > 0n) return amount\n }\n } catch {\n /* calldata is not dispatcher `execute` */\n }\n return args.quoteInputWei > 0n ? args.quoteInputWei : 0n\n}\n\n/**\n * Apply UI slippage % on top of the base approve amount (EXACT_OUTPUT only at call sites; basis points, ceil wei).\n * Example: 0.5% → multiply by 1.005 (10050/10000). `undefined` / non‑positive leaves `baseWei` unchanged.\n */\nexport function applySlippagePercentToApproveWei(baseWei: bigint, slippagePercent: number | undefined): bigint {\n if (baseWei <= 0n) return baseWei\n const s = slippagePercent == null ? NaN : Number(slippagePercent)\n if (!Number.isFinite(s) || s <= 0) return baseWei\n const bps = Math.min(100_000, Math.round(s * 100))\n if (bps <= 0) return baseWei\n return (baseWei * BigInt(10_000 + bps) + 9_999n) / 10_000n\n}\n\nfunction permit2SpenderAndApproveWeiFromSwapCalldata(\n dataHex: `0x${string}`,\n tokenIn: Address,\n quoteInputWei: bigint,\n chainId: number\n): { permit2Spender: Address; approveWei: bigint; calldataAmountWei: bigint | null } {\n const canonical = getUniswapUniversalRouterSpenderOrThrow(chainId)\n try {\n const d = decodeFunctionData({ abi: uniswapDispatchExecuteAbi, data: dataHex })\n if (d.functionName !== 'execute') {\n return { permit2Spender: canonical, approveWei: quoteInputWei, calldataAmountWei: null }\n }\n const router = getAddress(d.args[0] as Address)\n const token = getAddress(d.args[1] as Address)\n const rawAmt = d.args[2]\n const amount = typeof rawAmt === 'bigint' ? rawAmt : BigInt(String(rawAmt))\n if (token.toLowerCase() !== tokenIn.toLowerCase()) {\n throw new Error(\n `Swap calldata token ${token} does not match token in ${tokenIn}. Refresh quote and /swap.`\n )\n }\n const calldataAmountWei = amount > 0n ? amount : null\n let approveWei = quoteInputWei\n if (calldataAmountWei != null && calldataAmountWei > approveWei) {\n approveWei = calldataAmountWei\n }\n return { permit2Spender: router, approveWei, calldataAmountWei }\n } catch (e) {\n if (e instanceof Error && e.message.includes('does not match token')) throw e\n return { permit2Spender: canonical, approveWei: quoteInputWei, calldataAmountWei: null }\n }\n}\n\ntype UniswapV4SkipPermit2BatchArg = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n /** `0x0` = native (ETH) in; otherwise ERC-20. */\n tokenIn: Address\n executorAddress: Address\n swap: TransactionRequest\n createSwapResponse: { requestId?: string; gasFee?: string; swap: TransactionRequest }\n fullQuoteSnapshot: Record<string, unknown>\n purposeText: string\n swapDeadlineUnix: number\n slippagePercent?: number\n}\n\n/**\n * **Native (ETH) input** — a single **payable** swap tx from `POST /swap` (`swap.value` > 0). No `approve` (no ERC-20 for token in).\n */\nasync function buildEvmMultisignBodyUniswapV4NativeInOnly(\n args: UniswapV4SkipPermit2BatchArg,\n quoteInputWei: bigint,\n): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n\n const toRouter = getAddress(\n (args.swap.to ?? '').trim().startsWith('0x') ? (args.swap.to.trim() as `0x${string}`) : `0x${args.swap.to.trim()}`,\n )\n const dataHex = (() => {\n const d = (args.swap.data ?? '0x').toString().trim()\n return d.startsWith('0x') ? d : `0x${d}`\n })() as `0x${string}`\n\n const valueWei = nativeEthInPayableValueWei({\n swap: args.swap,\n dataHex,\n quoteInputWei,\n })\n if (valueWei <= 0n) {\n throw new Error(\n 'Native (ETH) in swap: could not determine payable value (no `swap.value`, no `execute` amount in calldata, and quote input is zero). Refresh the quote and request /swap again.',\n )\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const feeParams = await fetchChainFeeParams(args.rpcUrl, args.chainId)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWeiNativeIn =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustomGas = args.useCustomGas\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const nonce = await publicClient.getTransactionCount({ address: args.executorAddress, blockTag: 'pending' })\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n\n const swapRecord = args.swap as Record<string, unknown>\n const fromTradeApi =\n parseOptionalGasLimitString(swapRecord.gasLimit as string | number | undefined) ??\n parseOptionalGasLimitString(swapRecord.gas as string | number | undefined)\n let gasBuildSource: 'tradeApi' | 'rpcEstimate' | 'estimateFailedFallback' = 'rpcEstimate'\n let estimateGasError: string | undefined\n let baseGasUnits1: bigint\n if (fromTradeApi != null && fromTradeApi > 0n) {\n baseGasUnits1 = fromTradeApi\n gasBuildSource = 'tradeApi'\n } else {\n try {\n baseGasUnits1 = await publicClient.estimateGas({\n to: toRouter,\n data: dataHex,\n value: valueWei,\n account: args.executorAddress,\n })\n gasBuildSource = 'rpcEstimate'\n } catch (e) {\n estimateGasError = e instanceof Error ? e.message : String(e)\n const minRouterGas = 500_000n\n if (useCustomGas) {\n const cfg = args.chainDetail?.gasLimit != null ? parseOptionalGasLimitString(String(args.chainDetail.gasLimit)) : null\n if (cfg != null && cfg >= minRouterGas) {\n baseGasUnits1 = cfg\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n gasBuildSource = 'estimateFailedFallback'\n }\n }\n const gasLimit1 = routerSwapGasLimitFromEstimate(baseGasUnits1, chainGasLimitRouter)\n const currentNonce0 = nonce\n\n let firstTxFeePayload: Record<string, unknown> = {}\n\n if (legacy) {\n let gasPriceWei1 = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei1 = (gasPriceWei1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei1) gasPriceWei1 = configured\n }\n firstTxFeePayload = { txNonce: nonce, txGasLimit: gasLimit1.toString(), txGasPrice: gasPriceWei1.toString() }\n const ser0 = serializeTransaction({\n type: 'legacy',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n gasPrice: gasPriceWei1,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit1.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei1.toString(),\n })\n } else {\n const fetchedBase1 = feeParams.baseFeeGwei ?? 0\n const fetchedPriority1 = feeParams.priorityFeeGwei ?? 0\n const configuredBase1 =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority1 =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei1 = Math.max(fetchedBase1, configuredBase1)\n const effectivePriorityFeeGwei1 = Math.max(fetchedPriority1, configuredPriority1)\n const baseFeeMultiplierPct1 =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei1 = (effectiveBaseFeeGwei1 * baseFeeMultiplierPct1) / 100\n const maxFeePerGasGwei1 = baseComponentGwei1 + effectivePriorityFeeGwei1\n let maxPriorityFeePerGas1 =\n effectivePriorityFeeGwei1 > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei1))\n : parseGwei('1')\n let maxFeePerGas1 = parseGwei(gweiToDecimalString(maxFeePerGasGwei1))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas1 = (maxPriorityFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas1 = (maxFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas: maxFeePerGas1, maxPriorityFeePerGas: maxPriorityFeePerGas1 } =\n alignEip1559FeesWithLatestBase(maxFeePerGas1, maxPriorityFeePerGas1, latestBaseFeeWeiNativeIn))\n firstTxFeePayload = {\n txNonce: nonce,\n txGasLimit: gasLimit1.toString(),\n txMaxFeePerGas: maxFeePerGas1.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas1.toString(),\n }\n const ser0 = serializeTransaction({\n type: 'eip1559',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n maxFeePerGas: maxFeePerGas1,\n maxPriorityFeePerGas: maxPriorityFeePerGas1,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit1.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas1.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas1.toString(),\n })\n }\n\n const dataNo0x = dataHex.startsWith('0x') ? dataHex.slice(2) : dataHex\n\n const audit: Record<string, unknown> = {\n skipPermit2Batch: true,\n inputKind: 'native_eth',\n noErc20Approve: true,\n quoteInputWei: quoteInputWei.toString(),\n swapValueWei: valueWei.toString(),\n uniswapCreateSwap: {\n requestId: args.createSwapResponse.requestId,\n gasFee: args.createSwapResponse.gasFee,\n gasBuildSwap: {\n useCustomGas,\n source: gasBuildSource,\n baseGasUnits: baseGasUnits1.toString(),\n ...(estimateGasError != null && estimateGasError !== '' ? { estimateGasError } : {}),\n },\n swap: {\n to: args.createSwapResponse.swap.to,\n value: args.createSwapResponse.swap.value,\n dataNibbles: (() => {\n const t = (args.createSwapResponse.swap.data ?? '').toString().trim()\n return t.startsWith('0x') ? t.length - 2 : t.length\n })(),\n },\n },\n fullQuoteFromPermitSnapshot: args.fullQuoteSnapshot,\n originalPurpose: args.purposeText,\n }\n\n const batchMeta: Record<string, unknown>[] = [\n {\n destinationAddress: toRouter,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'UniversalRouter (payable, native in)',\n note: 'Single tx from Trade POST /swap; no ERC-20 approve. Calldata in messageHashes[0] / messageRawBatch[0].',\n }),\n evm: { type: 'uniswap_v4_swap_tx', version: 1, chainId: String(args.chainId) },\n uniswapV4: audit,\n },\n ]\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustomGas) {\n const snap = args.customGasChainDetails\n if (snap && typeof snap === 'object' && !Array.isArray(snap) && Object.keys(snap).length > 0) {\n extraPayload.customGasChainDetails = snap\n }\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: dataNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: String(args.chainId),\n destinationAddress: toRouter,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n const batchDesc =\n 'Uniswap V4: 1-tx batch — native gas token in (no ERC-20 approve) — single payable swap (Trade /swap).'\n return (t ? `${t}\\n\\n` : '') + batchDesc\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\n/**\n * **Classic ERC-20 allowance** batch (on-chain approvals only), two shapes:\n *\n * - **`swap.to` == inner `router` (calldata arg)** — Universal Router is the tx target; tokens move via the **allowance hub**:\n * `ERC20→hub`, hub `approve(router)`, swap (3 txs).\n *\n * - **`swap.to` ≠ inner `router`** — Trade uses a **dispatcher** that calls `ERC20.transferFrom` with **`msg.sender` = `swap.to`**.\n * Approving only the hub is insufficient (`cast run` shows `transfer amount exceeds allowance`). Path:\n * `ERC20.approve(swap.to)`, swap (2 txs).\n *\n * Approved amount: `max(quote.input, calldata amount)`; with **EXACT_OUTPUT** trades, multiply by `(1 + slippage%)` from the quote modal (input can grow vs the quoted figure).\n */\nexport async function buildEvmMultisignBodyUniswapV4SkipPermit2Batch(\n args: UniswapV4SkipPermit2BatchArg,\n): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n\n const tokenIn = getAddress(args.tokenIn)\n const parsedInOut = parseUniswapQuoteClassicInOut(args.fullQuoteSnapshot)\n const quoteInputWei = parsedInOut?.inputWei\n if (quoteInputWei == null || quoteInputWei <= 0n) {\n throw new Error(\n 'Could not read a positive input amount from the quote. Refresh the quote and ensure the Trade API returned classic quote.input.amount.',\n )\n }\n\n if (tokenIn === zeroAddress) {\n return buildEvmMultisignBodyUniswapV4NativeInOnly(args, quoteInputWei)\n }\n\n const toRouter = getAddress(\n (args.swap.to ?? '').trim().startsWith('0x') ? (args.swap.to.trim() as `0x${string}`) : `0x${args.swap.to.trim()}`\n )\n const dataHex = (() => {\n const d = (args.swap.data ?? '0x').toString().trim()\n return d.startsWith('0x') ? d : `0x${d}`\n })() as `0x${string}`\n\n const canonicalUniversalRouter = getUniswapUniversalRouterSpenderOrThrow(args.chainId)\n const { permit2Spender, approveWei: baseApproveWei, calldataAmountWei } = permit2SpenderAndApproveWeiFromSwapCalldata(\n dataHex,\n tokenIn,\n quoteInputWei,\n args.chainId\n )\n const approveAmountWei = applySlippagePercentToApproveWei(baseApproveWei, args.slippagePercent)\n const usePermit2Triple = toRouter.toLowerCase() === permit2Spender.toLowerCase()\n if (usePermit2Triple && approveAmountWei > MAX_UINT160) {\n throw new Error('Approved transfer amount exceeds allowance-hub uint160 max; reduce trade size.')\n }\n\n let expiration48 = 0n\n if (usePermit2Triple) {\n const deadlineSec = Math.floor(Number(args.swapDeadlineUnix))\n if (!Number.isFinite(deadlineSec) || deadlineSec <= 0) {\n throw new Error('Invalid swapDeadlineUnix for allowance-hub approve expiration.')\n }\n expiration48 = BigInt(deadlineSec)\n if (expiration48 > MAX_UINT48) expiration48 = MAX_UINT48\n }\n\n const erc20ApproveSpender: Address = usePermit2Triple ? PERMIT2_ADDRESS : toRouter\n const approveData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [erc20ApproveSpender, approveAmountWei],\n }) as `0x${string}`\n const valueWei = (() => {\n const v = args.swap.value\n if (v == null || v === '') return 0n\n try {\n return BigInt(String(v).replace(/^0x/i, ''))\n } catch {\n return 0n\n }\n })()\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const feeParams = await fetchChainFeeParams(args.rpcUrl, args.chainId)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWeiSkipBatch =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustomGas = args.useCustomGas\n const gasLimitConfig =\n useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const nonce = await publicClient.getTransactionCount({ address: args.executorAddress, blockTag: 'pending' })\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n const approveMsgRawNo0x = approveData.startsWith('0x') ? approveData.slice(2) : approveData\n let firstTxFeePayload: Record<string, unknown> = {}\n\n // --- tx 0: ERC-20 approve — allowance hub (triple path) or dispatcher `swap.to` (direct transferFrom)\n const approveGas = await publicClient.estimateGas({\n to: tokenIn,\n data: approveData,\n value: 0n,\n account: args.executorAddress,\n })\n const gasLimit0 = useCustomGas ? gasLimitFromEstimateAndChainConfig(approveGas, gasLimitConfig) : approveGas\n const currentNonce0 = nonce\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n firstTxFeePayload = { txNonce: nonce, txGasLimit: gasLimit0.toString(), txGasPrice: gasPriceWei.toString() }\n const ser0 = serializeTransaction({\n type: 'legacy',\n to: tokenIn,\n data: approveData,\n value: 0n,\n gas: gasLimit0,\n gasPrice: gasPriceWei,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit0.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n })\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei)) : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWeiSkipBatch,\n ))\n firstTxFeePayload = {\n txNonce: nonce,\n txGasLimit: gasLimit0.toString(),\n txMaxFeePerGas: maxFeePerGas.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n const ser0 = serializeTransaction({\n type: 'eip1559',\n to: tokenIn,\n data: approveData,\n value: 0n,\n gas: gasLimit0,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce0,\n chainId: args.chainId,\n })\n const h0 = keccak256(ser0)\n messageHashes.push(h0.startsWith('0x') ? h0.slice(2) : h0)\n messageRawBatch.push(ser0)\n proposalTxParamsBatch.push({\n nonce: currentNonce0,\n gasLimit: gasLimit0.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n })\n }\n\n if (usePermit2Triple) {\n const permit2ApproveData = encodeFunctionData({\n abi: permit2ApproveRouterAbi,\n functionName: 'approve',\n args: [tokenIn, permit2Spender, approveAmountWei, Number(expiration48)],\n }) as `0x${string}`\n\n // --- tx 1: allowance hub approve(token, UniversalRouter, amount, expiration)\n const approveP2Gas = await publicClient.estimateGas({\n to: PERMIT2_ADDRESS,\n data: permit2ApproveData,\n value: 0n,\n account: args.executorAddress,\n })\n const gasLimitP2 = useCustomGas ? gasLimitFromEstimateAndChainConfig(approveP2Gas, gasLimitConfig) : approveP2Gas\n const currentNonceP2 = nonce + 1\n\n if (legacy) {\n let gasPriceWeiP2 = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWeiP2 = (gasPriceWeiP2 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWeiP2) gasPriceWeiP2 = configured\n }\n const serP2 = serializeTransaction({\n type: 'legacy',\n to: PERMIT2_ADDRESS,\n data: permit2ApproveData,\n value: 0n,\n gas: gasLimitP2,\n gasPrice: gasPriceWeiP2,\n nonce: currentNonceP2,\n chainId: args.chainId,\n })\n const hP2 = keccak256(serP2)\n messageHashes.push(hP2.startsWith('0x') ? hP2.slice(2) : hP2)\n messageRawBatch.push(serP2)\n proposalTxParamsBatch.push({\n nonce: currentNonceP2,\n gasLimit: gasLimitP2.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWeiP2.toString(),\n })\n } else {\n const fetchedBaseP2 = feeParams.baseFeeGwei ?? 0\n const fetchedPriorityP2 = feeParams.priorityFeeGwei ?? 0\n const configuredBaseP2 =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriorityP2 =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGweiP2 = Math.max(fetchedBaseP2, configuredBaseP2)\n const effectivePriorityFeeGweiP2 = Math.max(fetchedPriorityP2, configuredPriorityP2)\n const baseFeeMultiplierPctP2 =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGweiP2 = (effectiveBaseFeeGweiP2 * baseFeeMultiplierPctP2) / 100\n const maxFeePerGasGweiP2 = baseComponentGweiP2 + effectivePriorityFeeGweiP2\n let maxPriorityFeePerGasP2 =\n effectivePriorityFeeGweiP2 > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGweiP2)) : parseGwei('1')\n let maxFeePerGasP2 = parseGwei(gweiToDecimalString(maxFeePerGasGweiP2))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGasP2 = (maxPriorityFeePerGasP2 * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGasP2 = (maxFeePerGasP2 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas: maxFeePerGasP2, maxPriorityFeePerGas: maxPriorityFeePerGasP2 } =\n alignEip1559FeesWithLatestBase(maxFeePerGasP2, maxPriorityFeePerGasP2, latestBaseFeeWeiSkipBatch))\n const serP2 = serializeTransaction({\n type: 'eip1559',\n to: PERMIT2_ADDRESS,\n data: permit2ApproveData,\n value: 0n,\n gas: gasLimitP2,\n maxFeePerGas: maxFeePerGasP2,\n maxPriorityFeePerGas: maxPriorityFeePerGasP2,\n nonce: currentNonceP2,\n chainId: args.chainId,\n })\n const hP2 = keccak256(serP2)\n messageHashes.push(hP2.startsWith('0x') ? hP2.slice(2) : hP2)\n messageRawBatch.push(serP2)\n proposalTxParamsBatch.push({\n nonce: currentNonceP2,\n gasLimit: gasLimitP2.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGasP2.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGasP2.toString(),\n })\n }\n }\n\n // --- last tx: swap to `swap.to` (Universal Router or dispatcher)\n const swapRecord = args.swap as Record<string, unknown>\n const fromTradeApi =\n parseOptionalGasLimitString(swapRecord.gasLimit as string | number | undefined) ??\n parseOptionalGasLimitString(swapRecord.gas as string | number | undefined)\n let gasBuildSource: 'tradeApi' | 'rpcEstimate' | 'estimateFailedFallback' = 'rpcEstimate'\n let estimateGasError: string | undefined\n let baseGasUnits1: bigint\n if (fromTradeApi != null && fromTradeApi > 0n) {\n baseGasUnits1 = fromTradeApi\n gasBuildSource = 'tradeApi'\n } else {\n try {\n baseGasUnits1 = await publicClient.estimateGas({\n to: toRouter,\n data: dataHex,\n value: valueWei,\n account: args.executorAddress,\n })\n gasBuildSource = 'rpcEstimate'\n } catch (e) {\n estimateGasError = e instanceof Error ? e.message : String(e)\n const minRouterGas = 500_000n\n if (useCustomGas) {\n const cfg = args.chainDetail?.gasLimit != null ? parseOptionalGasLimitString(String(args.chainDetail.gasLimit)) : null\n if (cfg != null && cfg >= minRouterGas) {\n baseGasUnits1 = cfg\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n } else {\n baseGasUnits1 = DEFAULT_UNIVERSAL_ROUTER_GAS_FALLBACK\n }\n gasBuildSource = 'estimateFailedFallback'\n }\n }\n const gasLimit1 = routerSwapGasLimitFromEstimate(baseGasUnits1, chainGasLimitRouter)\n const currentNonce1 = nonce + (usePermit2Triple ? 2 : 1)\n if (legacy) {\n let gasPriceWei1 = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei1 = (gasPriceWei1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei1) gasPriceWei1 = configured\n }\n const ser1 = serializeTransaction({\n type: 'legacy',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n gasPrice: gasPriceWei1,\n nonce: currentNonce1,\n chainId: args.chainId,\n })\n const h1 = keccak256(ser1)\n messageHashes.push(h1.startsWith('0x') ? h1.slice(2) : h1)\n messageRawBatch.push(ser1)\n proposalTxParamsBatch.push({\n nonce: currentNonce1,\n gasLimit: gasLimit1.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei1.toString(),\n })\n } else {\n const fetchedBase1 = feeParams.baseFeeGwei ?? 0\n const fetchedPriority1 = feeParams.priorityFeeGwei ?? 0\n const configuredBase1 =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority1 =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei1 = Math.max(fetchedBase1, configuredBase1)\n const effectivePriorityFeeGwei1 = Math.max(fetchedPriority1, configuredPriority1)\n const baseFeeMultiplierPct1 =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei1 = (effectiveBaseFeeGwei1 * baseFeeMultiplierPct1) / 100\n const maxFeePerGasGwei1 = baseComponentGwei1 + effectivePriorityFeeGwei1\n let maxPriorityFeePerGas1 =\n effectivePriorityFeeGwei1 > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei1))\n : parseGwei('1')\n let maxFeePerGas1 = parseGwei(gweiToDecimalString(maxFeePerGasGwei1))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas1 = (maxPriorityFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas1 = (maxFeePerGas1 * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas: maxFeePerGas1, maxPriorityFeePerGas: maxPriorityFeePerGas1 } =\n alignEip1559FeesWithLatestBase(maxFeePerGas1, maxPriorityFeePerGas1, latestBaseFeeWeiSkipBatch))\n const ser1 = serializeTransaction({\n type: 'eip1559',\n to: toRouter,\n data: dataHex,\n value: valueWei,\n gas: gasLimit1,\n maxFeePerGas: maxFeePerGas1,\n maxPriorityFeePerGas: maxPriorityFeePerGas1,\n nonce: currentNonce1,\n chainId: args.chainId,\n })\n const h1 = keccak256(ser1)\n messageHashes.push(h1.startsWith('0x') ? h1.slice(2) : h1)\n messageRawBatch.push(ser1)\n proposalTxParamsBatch.push({\n nonce: currentNonce1,\n gasLimit: gasLimit1.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas1.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas1.toString(),\n })\n }\n\n const swapMsgIndex = usePermit2Triple ? 2 : 1\n const audit: Record<string, unknown> = {\n skipPermit2Batch: true,\n approvalPath: usePermit2Triple ? 'permit2_triple' : 'dispatcher',\n approveAmount: {\n baseWeiBeforeSlippage: baseApproveWei.toString(),\n finalWei: approveAmountWei.toString(),\n slippagePercent: args.slippagePercent,\n quoteInputWei: quoteInputWei.toString(),\n ...(calldataAmountWei != null ? { swapCalldataAmountWei: calldataAmountWei.toString() } : {}),\n },\n uniswapCreateSwap: {\n requestId: args.createSwapResponse.requestId,\n gasFee: args.createSwapResponse.gasFee,\n gasBuildSwap: {\n useCustomGas,\n source: gasBuildSource,\n baseGasUnits: baseGasUnits1.toString(),\n ...(estimateGasError != null && estimateGasError !== '' ? { estimateGasError } : {}),\n },\n swap: {\n to: args.createSwapResponse.swap.to,\n value: args.createSwapResponse.swap.value,\n dataNibbles: (() => {\n const d = args.createSwapResponse.swap.data ?? ''\n const t = d.toString().trim()\n return t.startsWith('0x') ? t.length - 2 : t.length\n })(),\n },\n },\n fullQuoteFromPermitSnapshot: args.fullQuoteSnapshot,\n originalPurpose: args.purposeText,\n innerRouterFromCalldata: permit2Spender,\n swapToEqualsInnerRouter: usePermit2Triple,\n ...(usePermit2Triple\n ? {\n permit2Erc20Approve: {\n token: tokenIn,\n spender: PERMIT2_ADDRESS,\n amountWei: approveAmountWei.toString(),\n note: 'ERC-20 → allowance hub before hub approve(router).',\n },\n permit2ApproveUniversalRouter: {\n permit2: PERMIT2_ADDRESS,\n token: tokenIn,\n spender: permit2Spender,\n canonicalUniversalRouterFromAppMap: canonicalUniversalRouter,\n spenderMatchesCanonicalMap: permit2Spender.toLowerCase() === canonicalUniversalRouter.toLowerCase(),\n amountWei: approveAmountWei.toString(),\n expiration: expiration48.toString(),\n note: 'Allowance-hub spender must match the router in swap calldata.',\n },\n }\n : {\n erc20ApproveDispatcher: {\n token: tokenIn,\n spender: toRouter,\n amountWei: approveAmountWei.toString(),\n note:\n 'Dispatcher pulls via ERC20.transferFrom(user, universalRouter, amount); allowance must be on swap.to (see cast trace TRANSFER_FROM_FAILED when only the hub is approved).',\n },\n }),\n }\n\n const batchMeta: Record<string, unknown>[] = [\n {\n destinationAddress: tokenIn,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'ERC20.approve',\n to: usePermit2Triple ? 'allowance hub' : 'dispatcher(swap.to)',\n function: 'approve(address spender, uint256 amount)',\n spender: erc20ApproveSpender,\n amountWei: approveAmountWei.toString(),\n }),\n evm: {\n type: usePermit2Triple ? 'uniswap_v4_skip_permit2_approve' : 'uniswap_v4_skip_permit2_dispatcher_approve',\n version: 1,\n chainId: String(args.chainId),\n ...(usePermit2Triple ? { permit2: PERMIT2_ADDRESS } : { dispatcher: toRouter }),\n },\n },\n ]\n if (usePermit2Triple) {\n batchMeta.push({\n destinationAddress: PERMIT2_ADDRESS,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'AllowanceHub.approve',\n function: 'approve(address token, address spender, uint160 amount, uint48 expiration)',\n token: tokenIn,\n spender: permit2Spender,\n amountWei: approveAmountWei.toString(),\n expiration: expiration48.toString(),\n }),\n evm: {\n type: 'uniswap_v4_skip_permit2_permit2_approve',\n version: 1,\n chainId: String(args.chainId),\n permit2: PERMIT2_ADDRESS,\n permit2Spender,\n },\n })\n }\n batchMeta.push({\n destinationAddress: toRouter,\n signatureText: JSON.stringify({\n kind: 'UniswapV4',\n name: 'UniversalRouter.execute',\n note: `Calldata from Trade API POST /swap; signed tx hash in messageHashes[${swapMsgIndex}].`,\n }),\n evm: { type: 'uniswap_v4_swap_tx', version: 1, chainId: String(args.chainId) },\n uniswapV4: audit,\n })\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustomGas) {\n const snap = args.customGasChainDetails\n if (snap && typeof snap === 'object' && !Array.isArray(snap) && Object.keys(snap).length > 0) {\n extraPayload.customGasChainDetails = snap\n }\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: approveMsgRawNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: String(args.chainId),\n destinationAddress: tokenIn,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n const batchDesc = usePermit2Triple\n ? 'Uniswap V4: 3-tx batch (classic allowance) — (1) ERC-20 approve allowance hub, (2) hub approve(Universal Router), (3) swap (Trade /swap).'\n : 'Uniswap V4: 2-tx batch (classic allowance, dispatcher) — (1) ERC-20 approve swap.to (dispatcher pulls tokens), (2) swap (Trade /swap).'\n return (t ? `${t}\\n\\n` : '') + batchDesc\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n","import type { Address } from 'viem'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/keygen.js'\nimport type { UniswapQuoteTradeType } from './quote.js'\nimport { uniswapTradeQuote } from './quote.js'\nimport { uniswapCreateSwap, buildEvmMultisignBodyUniswapV4SkipPermit2Batch } from './swapMultisign.js'\nimport { swapTransactionDeadlineUnixFromExpiryMinutes } from './swapMultisign.js'\n\nexport type SwapExactInputArgs = {\n keyGen: KeyGenSubsetForPermit\n purposeText: string\n chainId: number\n rpcUrl: string\n executorAddress: Address\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n tokenIn: Address\n uniswapApiKey: string\n fullQuote: Record<string, unknown>\n slippagePercent?: number\n swapTransactionDeadlineUnix?: number\n baseUrl?: string\n}\n\n/** Quote then build swap multisign body for EXACT_INPUT (caller must have fetched quote first for EXACT_OUTPUT). */\nexport async function swapFromQuote(args: SwapExactInputArgs & { swap: Awaited<ReturnType<typeof uniswapCreateSwap>> }) {\n const deadline =\n args.swapTransactionDeadlineUnix ??\n swapTransactionDeadlineUnixFromExpiryMinutes(30)\n return buildEvmMultisignBodyUniswapV4SkipPermit2Batch({\n keyGen: args.keyGen,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n tokenIn: args.tokenIn,\n executorAddress: args.executorAddress,\n swap: args.swap.swap,\n createSwapResponse: args.swap,\n fullQuoteSnapshot: args.fullQuote,\n purposeText: args.purposeText,\n swapDeadlineUnix: deadline,\n slippagePercent: args.slippagePercent,\n })\n}\n\nexport async function quoteSwap(\n args: Parameters<typeof uniswapTradeQuote>[0],\n): Promise<Record<string, unknown>> {\n return uniswapTradeQuote(args)\n}\n\nexport async function createSwap(\n args: Parameters<typeof uniswapCreateSwap>[0],\n): Promise<Awaited<ReturnType<typeof uniswapCreateSwap>>> {\n return uniswapCreateSwap(args)\n}\n\nexport async function swapExactInput(\n args: SwapExactInputArgs & {\n tradeType?: UniswapQuoteTradeType\n },\n) {\n const swap = await uniswapCreateSwap({\n uniswapApiKey: args.uniswapApiKey,\n fullQuoteFromPermit: args.fullQuote,\n baseUrl: args.baseUrl,\n swapTransactionDeadlineUnix: args.swapTransactionDeadlineUnix,\n useServerProxy: false,\n })\n return swapFromQuote({ ...args, swap })\n}\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 { formatUnits, getAddress, isAddress, parseUnits } from 'viem'\n\nexport const CURVE_NATIVE_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nconst ETH_PLACEHOLDER = CURVE_NATIVE_PLACEHOLDER\n\nfunction normalizeAddr(a: string): string {\n return a.toLowerCase()\n}\n\n/** Map token in list to the address shape Curve uses in pool graphs (native → 0xeeee…). */\nexport function toCurveTokenKey(tokenInAddress: string, wrappedNative: string | undefined): string {\n if (!isAddress(tokenInAddress)) return normalizeAddr(tokenInAddress)\n try {\n const a = getAddress(tokenInAddress)\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n return a.toLowerCase()\n } catch {\n return normalizeAddr(tokenInAddress)\n }\n}\n\n/**\n * Router / `getBestRouteAndOutput` expect the same coin id as the pool graph: wrapped native\n * is represented as `0xeeee…`, not the WETH (etc.) contract. Without this, route discovery can\n * return an empty route while BFS (which uses `toCurveTokenKey`) still finds a path.\n */\nexport function toCurveRouterTokenId(tokenAddress: string, wrappedNative: string | undefined): string {\n const t = (tokenAddress ?? '').trim().toLowerCase()\n if (t === ETH_PLACEHOLDER) return ETH_PLACEHOLDER\n if (!isAddress((tokenAddress ?? '').trim())) return normalizeAddr((tokenAddress ?? '').trim())\n try {\n const a = getAddress((tokenAddress ?? '').trim())\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n /** Lowercase matches pool graph keys and `@curvefi/api`’s `DECIMALS` lookups. */\n return a.toLowerCase()\n } catch {\n return normalizeAddr((tokenAddress ?? '').trim())\n }\n}\n\n/**\n * Turn the user’s decimal string into a canonical form using **this chain’s** token-in decimals\n * (from the asset row). `@curvefi/api` uses the same for `parseUnits` when building routes; an\n * over-long fraction (e.g. 1e-8 on USDC) can make internal calls fail and yield an empty route / 0.0.\n */\nexport function normalizeCurveRouterAmountString(raw: string, tokenInDecimals: number): string {\n const t = raw.trim().replace(/,/g, '')\n if (!t) return ''\n if (!Number.isInteger(tokenInDecimals) || tokenInDecimals < 0 || tokenInDecimals > 18) {\n throw new Error('Invalid token-in decimals for amount normalization.')\n }\n const wei = parseUnits(t, tokenInDecimals)\n return formatUnits(wei, tokenInDecimals)\n}\n\nfunction addEdge(adj: Map<string, Set<string>>, a: string, b: string) {\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/**\n * Build graph from the same pool list the Curve router uses (`getPool` / `getPoolList` on the\n * public `@curvefi/api` instance; `getPoolsData` is internal).\n */\nexport function buildCurveLiquidityGraphFromApi(curve: {\n getPoolList: () => string[]\n getPool: (id: string) => {\n underlyingCoinAddresses: string[] | undefined\n wrappedCoinAddresses: string[] | undefined\n }\n}): Map<string, Set<string>> {\n const adj = new Map<string, Set<string>>()\n for (const id of curve.getPoolList()) {\n try {\n const pool = curve.getPool(id)\n const w = (pool.wrappedCoinAddresses ?? []).map(normalizeAddr)\n const u = (pool.underlyingCoinAddresses ?? []).map(normalizeAddr)\n const all = [...new Set([...w, ...u])]\n for (let i = 0; i < all.length; i++) {\n for (let j = i + 1; j < all.length; j++) {\n addEdge(adj, all[i], all[j])\n }\n }\n } catch {\n /* pool constructor can throw for stale ids */\n }\n }\n return adj\n}\n\n/**\n * Add bidirectional edge between the SDK's native placeholder coin and WETH, when the chain uses\n * wrapped native in pools (mirrors the Curve dialog graph).\n */\nexport function addNativeWethBridge(adj: Map<string, Set<string>>, wrappedNative: string | undefined) {\n if (!wrappedNative) return\n const w = wrappedNative.toLowerCase()\n const a = ETH_PLACEHOLDER\n const b = w\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/** True when the token key appears in the graph with at least one swap neighbor. */\nexport function isCurveTokenKeySwappable(\n swappableNodeKeys: ReadonlySet<string>,\n graphTokenKey: string,\n): boolean {\n return swappableNodeKeys.has(graphTokenKey)\n}\n\n/**\n * All token keys in `adj` that have at least one pool neighbor (candidates to start a path from).\n */\nexport function swappableCurveGraphNodeKeys(adj: Map<string, Set<string>>): Set<string> {\n const out = new Set<string>()\n for (const [k, neigh] of adj) {\n if (neigh.size > 0) out.add(k)\n }\n return out\n}\n\n/**\n * All tokens in the same connected component as `start` (excluding `start`), for router discovery.\n */\nexport function bfsCurveSwapDestinations(adj: Map<string, Set<string>>, start: string): Set<string> {\n const s = normalizeAddr(start)\n const visited = new Set<string>([s])\n const q: string[] = [s]\n while (q.length) {\n const n = q.shift()!\n for (const nxt of adj.get(n) ?? []) {\n if (!visited.has(nxt)) {\n visited.add(nxt)\n q.push(nxt)\n }\n }\n }\n visited.delete(s)\n return visited\n}\n\nexport type CurveDestToken = {\n address: string\n symbol: string\n name: string\n /** From Curve `getCoinsData` (on-chain), when available. */\n decimals: number | null\n}\n","import {\n addNativeWethBridge,\n buildCurveLiquidityGraphFromApi,\n swappableCurveGraphNodeKeys,\n} from './swapDestinations.js'\n\n/** Live `@curvefi/api` instance with pools already fetched, plus the routing graph. */\nexport type CurveFullSession = {\n /** Same reference used for getCoinsData / router; pools already loaded. */\n curve: any\n adj: Map<string, Set<string>>\n swappableNodeKeys: ReadonlySet<string>\n wrappedNative: string | undefined\n}\n\n/**\n * Fetches all factory pools in parallel (best-effort; failures are ignored per factory,\n * same as the Curve dialog).\n */\nexport async function fetchAllCurvePools(curve: {\n factory: { fetchPools: () => Promise<unknown> }\n crvUSDFactory: { fetchPools: () => Promise<unknown> }\n EYWAFactory: { fetchPools: () => Promise<unknown> }\n cryptoFactory: { fetchPools: () => Promise<unknown> }\n twocryptoFactory: { fetchPools: () => Promise<unknown> }\n tricryptoFactory: { fetchPools: () => Promise<unknown> }\n stableNgFactory: { fetchPools: () => Promise<unknown> }\n}): Promise<void> {\n const run = (p: Promise<unknown>) => p.catch(() => undefined)\n await Promise.all([\n run(curve.factory.fetchPools()),\n run(curve.crvUSDFactory.fetchPools()),\n run(curve.EYWAFactory.fetchPools()),\n run(curve.cryptoFactory.fetchPools()),\n run(curve.twocryptoFactory.fetchPools()),\n run(curve.tricryptoFactory.fetchPools()),\n run(curve.stableNgFactory.fetchPools()),\n ])\n}\n\n/**\n * One init + `fetchAllCurvePools` + graph build. Reuse this session for the asset list and the\n * Curve dialog to avoid duplicating the Curve API work.\n */\nexport async function loadFullCurveSessionForRpc(rpcUrl: string): Promise<CurveFullSession | null> {\n const url = (rpcUrl ?? '').trim()\n if (!url) return null\n try {\n const { default: curve } = await import('@curvefi/api')\n await curve.init('JsonRpc', { url }, {})\n const wrapped = (curve.getNetworkConstants() as { NATIVE_COIN?: { wrappedAddress?: string } })\n .NATIVE_COIN?.wrappedAddress\n if (!curve.hasRouter || !curve.hasRouter()) {\n return {\n curve,\n adj: new Map(),\n swappableNodeKeys: new Set<string>(),\n wrappedNative: wrapped,\n }\n }\n await fetchAllCurvePools(curve)\n const adj = buildCurveLiquidityGraphFromApi(curve)\n addNativeWethBridge(adj, wrapped)\n return {\n curve,\n adj,\n swappableNodeKeys: swappableCurveGraphNodeKeys(adj),\n wrappedNative: wrapped,\n }\n } catch {\n return null\n }\n}\n\n","import type { ProposalTxParams } from '../../../chains/evm/txParams.js'\n\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nexport const CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS = 1_200_000n\n\nexport function isCurveDaoSwapEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0 && ex) {\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[batchIndex] && typeof bm[batchIndex] === 'object' && !Array.isArray(bm[batchIndex])) {\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n if (String((evm0 as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange') return true\n }\n }\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n return String((evm as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange'\n}\n\nexport function isCurveDaoErc20ApproveEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex?.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const evm0 = (bm[index] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n return t === 'curve_dao_erc20_approve'\n }\n }\n return false\n}\n\nexport function resolveCurveDaoRouterGasUnitsFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): bigint | null {\n if (!detail) return null\n const propBatch = (detail.proposal_tx_params ??\n detail.proposalTxParams ??\n detail.ProposalTxParams) as unknown\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (Array.isArray(propBatch) && propBatch.length > index) {\n const row = propBatch[index]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined,\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n const ex = parseExtraJsonObject(detail)\n const bm = ex?.batchMeta\n if (Array.isArray(bm)) {\n for (const item of bm) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue\n const cd = (item as Record<string, unknown>).curveDao as Record<string, unknown> | undefined\n const gb = cd?.gasBuildExchange as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gb?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n }\n }\n return null\n}\n\nexport type { ProposalTxParams }\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/keygen.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\nimport { toCurveRouterTokenId } from './swapDestinations.js'\nimport { CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS } from './executeHelpers.js'\nimport { routerSwapGasLimitFromEstimate } from '../../../chains/evm/txParams.js'\n\nconst ETH_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const\n\ntype CurveStepKind = 'approve' | 'exchange'\ntype CurveStep = EvmTxStep & { kind: CurveStepKind; routerSwap?: boolean; fallbackGas?: bigint }\n\nfunction txToViemStep(tx: {\n to?: string | null\n data?: string | null\n value?: string | bigint | number | null\n}): { to: Address; data: `0x${string}`; value: bigint } {\n if (!tx.to) throw new Error('Transaction missing `to`')\n const to = getAddress((tx.to ?? '').trim() as `0x${string}`)\n const raw = (tx.data ?? '0x').toString()\n const data = (raw.startsWith('0x') ? raw : `0x${raw}`) as `0x${string}`\n let value = 0n\n if (tx.value != null) {\n if (typeof tx.value === 'bigint') value = tx.value\n else value = BigInt(String(tx.value))\n }\n return { to, data, value }\n}\n\n/**\n * Build `POST /multiSignRequest` body: optional ERC-20 approve(s) to the Curve router, then\n * `CurveRouterNG.exchange` via `@curvefi/api` `router.populateSwap`.\n */\nexport async function buildEvmMultisignBodyCurveDaoBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n tokenIn: Address\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n executorAddress: Address\n purposeText: string\n}) {\n const tokenIn = getAddress(args.tokenIn)\n const executor = getAddress(args.executorAddress)\n\n const session = await loadFullCurveSessionForRpc(args.rpcUrl)\n if (!session?.curve?.router?.populateSwap) {\n throw new Error('Curve router is not available (load session failed or chain has no router).')\n }\n const { curve, wrappedNative } = session\n const wn = wrappedNative as string | undefined\n const tokenInId = toCurveRouterTokenId(tokenIn, wn)\n const outTrim = (args.tokenOut ?? '').trim()\n const tokenOutId = toCurveRouterTokenId(\n outTrim.toLowerCase() === ETH_PLACEHOLDER ? ETH_PLACEHOLDER : getAddress(outTrim),\n wn,\n )\n const isNativeIn = tokenInId.toLowerCase() === ETH_PLACEHOLDER\n const slip = args.slippagePercent\n if (!Number.isFinite(slip) || slip <= 0 || slip >= 100) {\n throw new Error('Slippage must be between 0 and 100 (exclusive).')\n }\n\n const swapPop = await curve.router.populateSwap(tokenInId, tokenOutId, args.amountHuman, slip)\n const swapBase = txToViemStep(swapPop as Parameters<typeof txToViemStep>[0])\n const rawTo = (swapPop as { to?: string | null })?.to\n if (rawTo == null || String(rawTo).trim() === '') {\n throw new Error('Curve populateSwap did not return a destination address (router).')\n }\n const routerAddr = getAddress(String(rawTo).trim() as `0x${string}`)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n ])\n const erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\n const steps: CurveStep[] = []\n\n if (!isNativeIn) {\n const decimalsN = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(decimalsN))\n const currentAllowance = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, routerAddr],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, 0n],\n })\n steps.push({ to: tokenIn, data: dataReset, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, amountWei],\n })\n steps.push({ to: tokenIn, data: dataApprove, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n }\n\n steps.push({\n ...swapBase,\n kind: 'exchange',\n routerSwap: true,\n fallbackGas: CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS,\n })\n\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n\n const gasLimitByIndex = new Map<number, bigint>()\n const n = steps.length\n const purposeSuffix =\n n === 1\n ? 'Curve (DAO): 1-tx — CurveRouterNG.exchange (native in or allowance already set).'\n : `Curve (DAO): ${n}-tx batch — ERC-20 approve Curve router, then CurveRouterNG.exchange.`\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n const payableValueWei = steps.filter((s) => s.kind === 'exchange').reduce((a, s) => a + s.value, 0n)\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n payableValueWei: payableValueWei > 0n ? payableValueWei : undefined,\n resolveGasLimit: async ({ step, index, estimatedGas }) => {\n const s = step as CurveStep\n let gasLimitI: bigint\n if (s.kind === 'exchange') {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = estimatedGas\n }\n gasLimitByIndex.set(index, gasLimitI)\n return gasLimitI\n },\n buildBatchMeta: ({ step, index, gasLimit }) => {\n const s = step as CurveStep\n const gl = gasLimitByIndex.get(index) ?? gasLimit\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'ERC20.approve',\n to: 'Curve router',\n function: 'approve(address spender, uint256 amount)',\n spender: routerAddr,\n amountHuman: args.amountHuman,\n note: 'Allowance approved for this swap amount only (not unlimited).',\n }),\n evm: { type: 'curve_dao_erc20_approve', version: 1, chainId: String(args.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'CurveRouterNG.exchange',\n note: 'Calldata from @curvefi/api `router.populateSwap` (same on-chain as router `exchange`).',\n }),\n evm: { type: 'curve_dao_router_exchange', version: 1, chainId: String(args.chainId) },\n curveDao: {\n slippagePercent: slip,\n amountHuman: args.amountHuman,\n tokenIn: tokenInId,\n tokenOut: tokenOutId,\n isNativeIn,\n gasBuildExchange: { baseGasUnits: gl.toString() },\n },\n }\n },\n })\n}\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 { zodToJsonSchema } from 'zod-to-json-schema'\nimport type { z } from 'zod'\nimport type { McpJsonSchema } from './mcpTypes.js'\n\n/**\n * Convert a Zod schema to MCP-compatible JSON Schema (`inputSchema` / `outputSchema`).\n * Zod is the source of truth; JSON Schema is derived for MCP server registration only.\n */\nexport function zodSchemaToMcpJsonSchema(schema: z.ZodType): McpJsonSchema {\n const raw = zodToJsonSchema(schema, {\n target: 'openApi3',\n $refStrategy: 'none',\n }) as Record<string, unknown>\n if (raw.type === 'object' || raw.type === 'array' || raw.type === 'string') {\n const { $schema: _s, ...rest } = raw\n return rest as McpJsonSchema\n }\n // zod-to-json-schema may wrap named schemas in definitions — unwrap first entry.\n const defs = raw.definitions as Record<string, Record<string, unknown>> | undefined\n if (defs) {\n const first = Object.values(defs)[0]\n if (first?.type) {\n const { $schema: _s, ...rest } = first\n return rest as McpJsonSchema\n }\n }\n return raw as McpJsonSchema\n}\n","import { z } from 'zod'\n\n/** EVM address (0x + 40 hex). Handlers may normalize via viem `getAddress`. */\nexport const evmAddressSchema = z\n .string()\n .min(1)\n .describe('EVM address (0x-prefixed, 40 hex nibbles)')\n\n/** MPC key slice for POST /multiSignRequest (pubKey, keyList). */\nexport const keyGenSchema = z\n .object({\n pubkeyhex: z.string().min(1).describe('MPC secp256k1 public key hex (required for multiSignRequest pubKey)'),\n keylist: z.array(z.string()).optional().describe('Key list on the sign request'),\n ClientKeys: z.record(z.string()).optional().describe('Optional client key map from keyGen'),\n })\n .describe(\n 'MPC key slice: { pubkeyhex, keylist?, ClientKeys? }. Used for pubKey/keyList on POST /multiSignRequest.',\n )\n\n/** Chain gas config row from GET /getChainDetails (subset). */\nexport const chainDetailSchema = z\n .object({\n legacy: z.boolean().optional(),\n gasLimit: z.number().optional(),\n gasMultiplier: z.number().optional(),\n gasPrice: z.number().optional(),\n baseFee: z.number().optional(),\n priorityFee: z.number().optional(),\n baseFeeMultiplier: z.number().optional(),\n })\n .passthrough()\n .describe(\n 'Optional gas config: { legacy?, gasLimit?, gasMultiplier?, gasPrice?, baseFee?, priorityFee?, baseFeeMultiplier? }.',\n )\n\n/** Shared inputs for all EVM multisign MCP tools. */\nexport const evmMultisignCommonInputSchema = z.object({\n keyGen: keyGenSchema,\n purposeText: z\n .string()\n .min(1)\n .describe(\n 'Human-readable purpose for the sign request. Stored in bodyForSign.purpose (may be appended with an automatic batch suffix).',\n ),\n useCustomGas: z\n .boolean()\n .describe(\n 'When true, apply chain gas settings from chainDetail / customGasChainDetails instead of raw RPC estimates only.',\n ),\n chainId: z.number().int().positive().describe('EVM chain id (decimal). Becomes destinationChainID on the sign request.'),\n rpcUrl: z.string().min(1).describe('HTTPS JSON-RPC URL for gas estimation, nonce, and allowance reads.'),\n executorAddress: evmAddressSchema.describe(\n 'MPC wallet address (from keyGen ethereumaddress) — tx sender for estimates and approvals.',\n ),\n chainDetail: chainDetailSchema,\n customGasChainDetails: z\n .record(z.unknown())\n .optional()\n .describe('Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true.'),\n})\n\n/** Standard output of all `build_*_multisign` MCP tools. */\nexport const multisignOutputSchema = z\n .object({\n bodyForSign: z\n .record(z.unknown())\n .describe(\n 'POST body fields without clientSig: keyList, pubKey, msgHash, msgRaw, destinationChainID, purpose, extraJSON, proposalTxParams (batch), messageHashes/messageRawBatch when N>1 txs.',\n ),\n messageToSign: z\n .string()\n .describe('JSON.stringify(bodyForSign) — exact string to sign before adding clientSig.'),\n })\n .describe(\n 'Unsigned mpc-auth multiSignRequest payload. Sign messageToSign and POST { ...bodyForSign, clientSig, signedMessage } to /multiSignRequest.',\n )\n\n/** Loose JSON object for protocol API responses passed between MCP tools. */\nexport const jsonObjectSchema = z.record(z.unknown())\n\nexport type EvmMultisignCommonInput = z.infer<typeof evmMultisignCommonInputSchema>\nexport type MultisignOutput = z.infer<typeof multisignOutputSchema>\nexport type KeyGenMcpInput = z.infer<typeof keyGenSchema>\nexport type ChainDetailMcpInput = z.infer<typeof chainDetailSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema, jsonObjectSchema } from './common.js'\n\nexport const uniswapQuoteTradeTypeSchema = z.enum(['EXACT_INPUT', 'EXACT_OUTPUT'])\n\n/** Input for MCP tool `ctm_uniswap_v4_quote` → handler `uniswapTradeQuote`. */\nexport const mcpUniswapV4QuoteInputSchema = z.object({\n type: uniswapQuoteTradeTypeSchema.describe('EXACT_INPUT or EXACT_OUTPUT'),\n amount: z.string().min(1).describe('Amount in token-in base units (wei string for ERC-20)'),\n tokenIn: z.string().min(1).describe('Input token; 0x0 for native ETH'),\n tokenOut: z.string().min(1).describe('Output token address'),\n chainId: z.union([z.number().int().positive(), z.string().min(1)]).describe('tokenInChainId / same-chain default'),\n uniswapApiKey: z.string().min(1).describe('Uniswap Trade API x-api-key'),\n swapper: evmAddressSchema.optional().describe('MPC executor; omit if keyGen + managementNodeUrl provided'),\n slippage: z.union([z.number(), z.string()]).optional().describe('Slippage percent; omit for API auto slippage'),\n keyGen: z.string().optional().describe('KeyGen id — resolves swapper via GET /getKeyGenResultById when swapper omitted'),\n managementNodeUrl: z\n .string()\n .min(1)\n .optional()\n .describe('MPC node base URL; required with keyGen when swapper is omitted'),\n tokenInChainId: z.union([z.number(), z.string()]).optional(),\n tokenOutChainId: z.union([z.number(), z.string()]).optional(),\n permit2Disabled: z.boolean().optional(),\n baseUrl: z.string().optional(),\n universalRouterVersion: z.string().optional(),\n})\n\n/** Output: full Uniswap POST /quote JSON (dynamic shape from Trade API). */\nexport const mcpUniswapV4QuoteOutputSchema = jsonObjectSchema.describe(\n 'Full Uniswap POST /quote JSON (includes nested quote object with input/output amounts).',\n)\n\n/** Input for MCP tool `ctm_uniswap_v4_create_swap` → handler `uniswapCreateSwap`. */\nexport const mcpUniswapV4CreateSwapInputSchema = z.object({\n uniswapApiKey: z.string().min(1).describe('Uniswap Trade API key'),\n fullQuoteFromPermit: jsonObjectSchema.describe('Full quote JSON from ctm_uniswap_v4_quote'),\n swapTransactionDeadlineUnix: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('On-chain deadline unix seconds; default ~30 min from now'),\n useServerProxy: z\n .boolean()\n .optional()\n .describe('Set false in Node/agents; true only in browser via Next API route'),\n baseUrl: z.string().optional(),\n universalRouterVersion: z.string().optional(),\n})\n\nexport const mcpUniswapV4CreateSwapOutputSchema = z\n .object({\n swap: jsonObjectSchema.describe('Universal Router tx: { to, data, value, gasLimit? }'),\n requestId: z.string().optional(),\n gasFee: z.string().optional(),\n })\n .passthrough()\n .describe('{ swap: TransactionRequest, requestId?, gasFee? }')\n\nconst swapTxRequestSchema = jsonObjectSchema.describe('swap field from create_swap response (to, data, value)')\n\n/** Input for MCP tool `ctm_uniswap_v4_build_swap_multisign`. */\nexport const mcpUniswapV4BuildSwapMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n tokenIn: evmAddressSchema.describe('Token in; 0x0 for native ETH'),\n swap: swapTxRequestSchema,\n createSwapResponse: z\n .object({\n swap: swapTxRequestSchema,\n requestId: z.string().optional(),\n gasFee: z.string().optional(),\n })\n .passthrough()\n .describe('Full create_swap response'),\n fullQuoteSnapshot: jsonObjectSchema.describe('Quote JSON used for the swap'),\n swapDeadlineUnix: z.number().describe('Same deadline passed to create_swap'),\n slippagePercent: z.number().optional().describe('Extra approve headroom for EXACT_OUTPUT'),\n})\n\nexport type McpUniswapV4QuoteInput = z.infer<typeof mcpUniswapV4QuoteInputSchema>\nexport type McpUniswapV4QuoteOutput = z.infer<typeof mcpUniswapV4QuoteOutputSchema>\nexport type McpUniswapV4CreateSwapInput = z.infer<typeof mcpUniswapV4CreateSwapInputSchema>\nexport type McpUniswapV4CreateSwapOutput = z.infer<typeof mcpUniswapV4CreateSwapOutputSchema>\nexport type McpUniswapV4BuildSwapMultisignInput = z.infer<typeof mcpUniswapV4BuildSwapMultisignInputSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema } from './common.js'\n\n/** Input for MCP tool `ctm_curve_dao_build_swap_multisign`. */\nexport const mcpCurveDaoBuildSwapMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n tokenIn: evmAddressSchema.describe('ERC-20 sold (native in uses WETH path in UI)'),\n tokenOut: z.string().min(1).describe('Output token or 0xeeee… native placeholder'),\n amountHuman: z.string().min(1).describe('Human-readable amount of tokenIn'),\n slippagePercent: z\n .number()\n .gt(0)\n .lt(100)\n .describe('Slippage 0–100 exclusive'),\n})\n\nexport type McpCurveDaoBuildSwapMultisignInput = z.infer<typeof mcpCurveDaoBuildSwapMultisignInputSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema, jsonObjectSchema, multisignOutputSchema } from './common.js'\n\n/** Extend common multisign inputs with protocol-specific fields. */\nexport function mcpMultisignInput(fields: z.ZodRawShape) {\n return evmMultisignCommonInputSchema.extend(fields)\n}\n\nexport { multisignOutputSchema as mcpMultisignOutputSchema }\n\n// —— Lido ——\nexport const mcpLidoSubmitInputSchema = mcpMultisignInput({\n valueWei: z.string().min(1).describe('ETH to stake (wei decimal string)'),\n referral: evmAddressSchema.optional(),\n})\n\nexport const mcpLidoRequestWithdrawalsInputSchema = mcpMultisignInput({\n stEthAmountsWei: z.array(z.string()).min(1).describe('stETH amounts per withdrawal request (wei strings)'),\n})\n\nexport const mcpLidoClaimWithdrawalInputSchema = mcpMultisignInput({\n requestId: z.union([z.string(), z.number()]).describe('Withdrawal queue request id'),\n})\n\nexport const mcpLidoWrapStEthInputSchema = mcpMultisignInput({\n stEthAmountWei: z.string().min(1),\n})\n\nexport const mcpLidoUnwrapWstEthInputSchema = mcpMultisignInput({\n wstEthAmountWei: z.string().min(1),\n})\n\n// —— Ethena ——\nexport const mcpEthenaStakeInputSchema = mcpMultisignInput({\n usdeAmountHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaRedeemInputSchema = mcpMultisignInput({\n susdeSharesHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaCooldownInputSchema = mcpMultisignInput({\n susdeSharesHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaClaimInputSchema = mcpMultisignInput({\n susdeVault: evmAddressSchema.optional(),\n})\n\n// —— Maple ——\nexport const mcpMapleDepositInputSchema = mcpMultisignInput({\n syrupRouter: evmAddressSchema,\n pool: evmAddressSchema,\n asset: evmAddressSchema,\n amountHuman: z.string().min(1),\n authorizeSig: jsonObjectSchema.optional(),\n})\n\nexport const mcpMapleRequestRedeemInputSchema = mcpMultisignInput({\n pool: evmAddressSchema,\n sharesHuman: z.string().min(1),\n receiver: evmAddressSchema,\n})\n\n// —— Sky Lockstake ——\nexport const mcpSkyLockstakeStakeInputSchema = mcpMultisignInput({\n skyAmountHuman: z.string().min(1),\n usdsDrawHuman: z.string().optional(),\n farmRef: z.string().optional(),\n})\n\nexport const mcpSkyLockstakeDrawInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeWipeInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeCloseInputSchema = mcpMultisignInput({\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeGetRewardInputSchema = mcpMultisignInput({\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkySusdsDepositInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n})\n\nexport const mcpSkySusdsRedeemInputSchema = mcpMultisignInput({\n sharesHuman: z.string().min(1),\n})\n\n// —— Aave v4 ——\nexport const mcpAaveV4DepositInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4WithdrawInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4BorrowInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4RepayInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\n// —— Euler v2 ——\nexport const mcpEulerV2IsolatedLendInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n assetAmountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2IsolatedBorrowInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n borrowAsset: evmAddressSchema,\n collateralAmountHuman: z.string().min(1),\n loopBorrowWeis: z.array(z.string()).min(1),\n})\n\nexport const mcpEulerV2VaultWithdrawInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n sharesHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2BorrowRepayInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2CollateralDepositInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2CollateralWithdrawInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport type McpLidoSubmitInput = z.infer<typeof mcpLidoSubmitInputSchema>\nexport type McpEthenaStakeInput = z.infer<typeof mcpEthenaStakeInputSchema>\nexport type McpMapleDepositInput = z.infer<typeof mcpMapleDepositInputSchema>\nexport type McpSkyLockstakeStakeInput = z.infer<typeof mcpSkyLockstakeStakeInputSchema>\nexport type McpAaveV4DepositInput = z.infer<typeof mcpAaveV4DepositInputSchema>\nexport type McpEulerV2IsolatedLendInput = z.infer<typeof mcpEulerV2IsolatedLendInputSchema>\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nimport type { McpToolDefinition, McpToolHandler } from './mcpTypes.js'\nimport {\n mcpAaveV4BorrowInputSchema,\n mcpAaveV4DepositInputSchema,\n mcpAaveV4RepayInputSchema,\n mcpAaveV4WithdrawInputSchema,\n mcpEthenaClaimInputSchema,\n mcpEthenaCooldownInputSchema,\n mcpEthenaRedeemInputSchema,\n mcpEthenaStakeInputSchema,\n mcpEulerV2BorrowRepayInputSchema,\n mcpEulerV2CollateralDepositInputSchema,\n mcpEulerV2CollateralWithdrawInputSchema,\n mcpEulerV2IsolatedBorrowInputSchema,\n mcpEulerV2IsolatedLendInputSchema,\n mcpEulerV2VaultWithdrawInputSchema,\n mcpLidoClaimWithdrawalInputSchema,\n mcpLidoRequestWithdrawalsInputSchema,\n mcpLidoSubmitInputSchema,\n mcpLidoUnwrapWstEthInputSchema,\n mcpLidoWrapStEthInputSchema,\n mcpMapleDepositInputSchema,\n mcpMapleRequestRedeemInputSchema,\n mcpMultisignOutputSchema,\n mcpSkyLockstakeCloseInputSchema,\n mcpSkyLockstakeDrawInputSchema,\n mcpSkyLockstakeGetRewardInputSchema,\n mcpSkyLockstakeStakeInputSchema,\n mcpSkyLockstakeWipeInputSchema,\n mcpSkySusdsDepositInputSchema,\n mcpSkySusdsRedeemInputSchema,\n} from './schemas/protocols.js'\n\nfunction defineProtocolMcpTool<TInput>(def: {\n name: string\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n description: string\n prerequisites: string[]\n followUp: string[]\n inputZod: z.ZodType<TInput>\n handler: McpToolHandler\n}): McpToolDefinition<TInput, z.infer<typeof mcpMultisignOutputSchema>> {\n return {\n ...def,\n outputZod: mcpMultisignOutputSchema,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(mcpMultisignOutputSchema),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => mcpMultisignOutputSchema.parse(data),\n }\n}\n\n/** MCP tools for Lido, Ethena, Maple, Sky, Aave v4, and Euler v2 multisign builders. */\nexport const MCP_PROTOCOL_TOOL_DEFINITIONS = [\n defineProtocolMcpTool({\n name: 'ctm_lido_build_submit_multisign',\n actionId: 'lido.submit',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build mpc-auth multiSignRequest for Lido ETH stake (submit).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoSubmit' },\n inputZod: mcpLidoSubmitInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_request_withdrawals_multisign',\n actionId: 'lido.request-withdrawals',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build batch for Lido withdrawal queue (approve + requestWithdrawals).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoRequestWithdrawals' },\n inputZod: mcpLidoRequestWithdrawalsInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_claim_withdrawal_multisign',\n actionId: 'lido.claim-withdrawal',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build tx for Lido claimWithdrawal.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoClaimWithdrawal' },\n inputZod: mcpLidoClaimWithdrawalInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_wrap_steth_multisign',\n actionId: 'lido.wrap-steth',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build batch for wstETH wrap.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoWrapStEth' },\n inputZod: mcpLidoWrapStEthInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_unwrap_wsteth_multisign',\n actionId: 'lido.unwrap-wsteth',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build tx for wstETH unwrap.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoUnwrapWstEth' },\n inputZod: mcpLidoUnwrapWstEthInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_stake_multisign',\n actionId: 'ethena.stake-usde',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build batch: USDe approve + sUSDe deposit.',\n prerequisites: ['keyGen', 'executorAddress', 'Ethereum mainnet RPC'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaUsdeStakeToSusde' },\n inputZod: mcpEthenaStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_redeem_multisign',\n actionId: 'ethena.redeem-susde',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build sUSDe redeem when cooldown is off.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaSusdeRedeemToUsde' },\n inputZod: mcpEthenaRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_cooldown_multisign',\n actionId: 'ethena.cooldown-shares',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build sUSDe cooldownShares batch step.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaSusdeCooldownShares' },\n inputZod: mcpEthenaCooldownInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_claim_multisign',\n actionId: 'ethena.claim-unstake',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build unstake claim after cooldown.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaUnstakeClaim' },\n inputZod: mcpEthenaClaimInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_maple_build_deposit_multisign',\n actionId: 'maple-syrup.deposit',\n protocolId: 'maple-syrup',\n chainCategory: 'evm',\n description: 'Build Maple Syrup router deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'router + pool addresses'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/maple', exportName: 'buildEvmMultisignBodyMapleSyrupDeposit' },\n inputZod: mcpMapleDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_maple_build_request_redeem_multisign',\n actionId: 'maple-syrup.request-redeem',\n protocolId: 'maple-syrup',\n chainCategory: 'evm',\n description: 'Build Maple PoolV2 requestRedeem batch.',\n prerequisites: ['keyGen', 'executorAddress', 'pool address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/maple', exportName: 'buildEvmMultisignBodyMaplePoolRequestRedeem' },\n inputZod: mcpMapleRequestRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_stake_multisign',\n actionId: 'sky.lockstake-stake',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Sky Lockstake open/stake batch.',\n prerequisites: ['keyGen', 'executorAddress', 'Ethereum mainnet RPC'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeStakePositionBatch' },\n inputZod: mcpSkyLockstakeStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_draw_multisign',\n actionId: 'sky.lockstake-draw',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake draw (borrow USDS).',\n prerequisites: ['keyGen', 'executorAddress', 'open urn'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeDrawBatch' },\n inputZod: mcpSkyLockstakeDrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_wipe_multisign',\n actionId: 'sky.lockstake-wipe',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake repay/wipe batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeWipeBatch' },\n inputZod: mcpSkyLockstakeWipeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_close_multisign',\n actionId: 'sky.lockstake-close',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake close position batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeCloseBatch' },\n inputZod: mcpSkyLockstakeCloseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_get_reward_multisign',\n actionId: 'sky.lockstake-get-reward',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake getReward batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeGetRewardBatch' },\n inputZod: mcpSkyLockstakeGetRewardInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_susds_deposit_multisign',\n actionId: 'sky.susds-deposit',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build USDS → sUSDS ERC-4626 deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkySusdsDepositFromUsdsBatch' },\n inputZod: mcpSkySusdsDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_susds_redeem_multisign',\n actionId: 'sky.susds-redeem',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build sUSDS redeem to USDS batch.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkySusdsRedeemToUsdsBatch' },\n inputZod: mcpSkySusdsRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_deposit_multisign',\n actionId: 'aave-v4.deposit',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke supply/deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4DepositBatch' },\n inputZod: mcpAaveV4DepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_withdraw_multisign',\n actionId: 'aave-v4.withdraw',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke withdraw batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeWithdraw' },\n inputZod: mcpAaveV4WithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_borrow_multisign',\n actionId: 'aave-v4.borrow',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke borrow batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeBorrow' },\n inputZod: mcpAaveV4BorrowInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_repay_multisign',\n actionId: 'aave-v4.repay',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke repay batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeRepay' },\n inputZod: mcpAaveV4RepayInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_isolated_lend_multisign',\n actionId: 'euler-v2.isolated-lend',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 vault deposit/lend batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch' },\n inputZod: mcpEulerV2IsolatedLendInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_isolated_borrow_multisign',\n actionId: 'euler-v2.isolated-borrow',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 isolated borrow loop batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2IsolatedBorrowBatch' },\n inputZod: mcpEulerV2IsolatedBorrowInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_vault_withdraw_multisign',\n actionId: 'euler-v2.vault-withdraw',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 vault withdraw/redeem batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2VaultWithdrawBatch' },\n inputZod: mcpEulerV2VaultWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_borrow_repay_multisign',\n actionId: 'euler-v2.borrow-repay',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow repay batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowRepayBatch' },\n inputZod: mcpEulerV2BorrowRepayInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_collateral_deposit_multisign',\n actionId: 'euler-v2.collateral-deposit',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow collateral deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral asset'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch' },\n inputZod: mcpEulerV2CollateralDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_collateral_withdraw_multisign',\n actionId: 'euler-v2.collateral-withdraw',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow collateral withdraw batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral asset'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch' },\n inputZod: mcpEulerV2CollateralWithdrawInputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\nimport { getProtocolModules } from '../core/registry.js'\nimport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nimport type { McpToolDefinition, McpToolHandler } from './mcpTypes.js'\nimport {\n mcpCurveDaoBuildSwapMultisignInputSchema,\n mcpUniswapV4BuildSwapMultisignInputSchema,\n mcpUniswapV4CreateSwapInputSchema,\n mcpUniswapV4CreateSwapOutputSchema,\n mcpUniswapV4QuoteInputSchema,\n mcpUniswapV4QuoteOutputSchema,\n multisignOutputSchema,\n} from './schemas/index.js'\nimport { MCP_PROTOCOL_TOOL_DEFINITIONS } from './mcpProtocolTools.js'\n\nexport type { McpJsonSchema, McpSchemaProperty, McpToolHandler, McpToolDefinition } from './mcpTypes.js'\n\nfunction defineMcpTool<TInput, TOutput>(def: {\n name: string\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n description: string\n prerequisites: string[]\n followUp: string[]\n inputZod: z.ZodType<TInput>\n outputZod: z.ZodType<TOutput>\n handler: McpToolHandler\n}): McpToolDefinition<TInput, TOutput> {\n return {\n ...def,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(def.outputZod),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => def.outputZod.parse(data),\n }\n}\n\n/** Curated MCP tools — Uniswap/Curve core + all protocol multisign builders. */\nconst CORE_MCP_TOOL_DEFINITIONS = [\n defineMcpTool({\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 inputZod: mcpUniswapV4QuoteInputSchema,\n outputZod: mcpUniswapV4QuoteOutputSchema,\n }),\n defineMcpTool({\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 inputZod: mcpUniswapV4CreateSwapInputSchema,\n outputZod: mcpUniswapV4CreateSwapOutputSchema,\n }),\n defineMcpTool({\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 inputZod: mcpUniswapV4BuildSwapMultisignInputSchema,\n outputZod: multisignOutputSchema,\n }),\n defineMcpTool({\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 inputZod: mcpCurveDaoBuildSwapMultisignInputSchema,\n outputZod: multisignOutputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n\nexport const MCP_TOOL_DEFINITIONS: readonly McpToolDefinition[] = [\n ...CORE_MCP_TOOL_DEFINITIONS,\n ...MCP_PROTOCOL_TOOL_DEFINITIONS,\n]\n\nfunction buildToolSchemaMap(kind: 'input' | 'output'): Record<string, z.ZodType> {\n const out: Record<string, z.ZodType> = {}\n for (const tool of MCP_TOOL_DEFINITIONS) {\n out[tool.name] = kind === 'input' ? tool.inputZod : tool.outputZod\n }\n return out\n}\n\n/** Map tool name → input Zod schema (for typed dispatch in MCP servers). */\nexport const MCP_TOOL_INPUT_SCHEMAS = buildToolSchemaMap('input')\n\n/** Map tool name → output Zod schema. */\nexport const MCP_TOOL_OUTPUT_SCHEMAS = buildToolSchemaMap('output')\n\n/** Union of registered MCP tool names. */\nexport type McpToolName = (typeof MCP_TOOL_DEFINITIONS)[number]['name']\n\nexport type McpToolInputMap = {\n [K in McpToolName]: z.infer<(typeof MCP_TOOL_INPUT_SCHEMAS)[K]>\n}\n\nexport type McpToolOutputMap = {\n [K in McpToolName]: z.infer<(typeof MCP_TOOL_OUTPUT_SCHEMAS)[K]>\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\nexport function getMcpToolInputSchema(name: McpToolName): z.ZodType {\n const schema = MCP_TOOL_INPUT_SCHEMAS[name]\n if (!schema) throw new Error(`Unknown MCP tool: ${name}`)\n return schema\n}\n\nexport function getMcpToolOutputSchema(name: McpToolName): z.ZodType {\n const schema = MCP_TOOL_OUTPUT_SCHEMAS[name]\n if (!schema) throw new Error(`Unknown MCP tool: ${name}`)\n return schema\n}\n\n/** Parse and validate MCP tool arguments with the registered Zod schema. */\nexport function parseMcpToolInput(name: McpToolName, data: unknown): unknown {\n return getMcpToolInputSchema(name).parse(data)\n}\n\n/** Parse and validate MCP tool handler output. */\nexport function parseMcpToolOutput(name: McpToolName, data: unknown): unknown {\n return getMcpToolOutputSchema(name).parse(data)\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 /** Zod schemas for MCP tool I/O — source of truth for continuum-mcp-server validation. */\n inputSchemas: MCP_TOOL_INPUT_SCHEMAS,\n outputSchemas: MCP_TOOL_OUTPUT_SCHEMAS,\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 { getAddress, zeroAddress, type Address } from 'viem'\n\n/** Lido staking / stERC-20 (“stETH”) on Ethereum mainnet — same proxy for `submit` + ERC‑20 balances. */\nexport const LIDO_STETH_CONTRACT_MAINNET = getAddress(\n '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n)\n\n/** Lido Wrapped stETH (ERC-20): `wrap` / `unwrap`. */\nexport const LIDO_WSTETH_CONTRACT_MAINNET = getAddress(\n '0x7f39C581F595B853cBbF37C12FfeeA971C5a5bEa',\n)\n\n/** EIP-7623-era Withdrawal Queue (NFT-backed requests). */\nexport const LIDO_WITHDRAWAL_QUEUE_MAINNET = getAddress('0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1')\n\nexport const LIDO_ETHEREUM_MAINNET_CHAIN_ID = 1\n\n/** Accepted referral pad for `submit`; zero is valid. */\nexport const LIDO_SUBMIT_REFERRAL_MAINNET = zeroAddress satisfies Address\n\nexport function isEthereumMainnetChainId(chainIdStr: string | undefined | null): boolean {\n return String(chainIdStr ?? '').trim() === String(LIDO_ETHEREUM_MAINNET_CHAIN_ID)\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { LIDO_ETHEREUM_MAINNET_CHAIN_ID } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './multisign.js'\n\nexport const LIDO_PROTOCOL_ID = 'lido'\n\nexport const lidoProtocolModule: ProtocolModule = {\n id: LIDO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return Number(ctx.chainId) === LIDO_ETHEREUM_MAINNET_CHAIN_ID\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'lido.submit', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake ETH via Lido submit()', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { valueWei: { type: 'string', required: true, description: 'ETH to stake (wei string)' } } },\n { id: 'lido.request-withdrawals', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Queue stETH withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.claim-withdrawal', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim finalized withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.wrap-steth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Wrap stETH to wstETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.unwrap-wsteth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Unwrap wstETH to stETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(lidoProtocolModule)\n","/**\n * Ethena USDe (synthetic USD) — published contract addresses and EVM chain coverage.\n * @see https://docs.ethena.fi/solution-design/key-addresses\n */\nimport { getAddress } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nexport const ETHENA_LABS_GITHUB = 'https://github.com/ethena-labs'\nexport const ETHENA_KEY_ADDRESSES_DOC = 'https://docs.ethena.fi/solution-design/key-addresses'\n\nexport const USDE_ETHEREUM_MAINNET = '0x4c9edd5852cd905f086c759e8383e09bff1e68b3' as const\n/** sUSDe (StakedUSDe / ERC-4626 vault share) on Ethereum mainnet. @see Ethena key addresses */\nexport const SUSDE_ETHEREUM_MAINNET = '0x9d39a5de30e57443bff2a8307a4256c8797a3497' as const\n/** “Most L2s” in Ethena’s key-addresses table (same bytecode address on many networks). */\nexport const USDE_MOST_L2S = '0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34' as const\nexport const USDE_ZKSYNC_ERA = '0x39Fe7a0DACcE31Bd90418e3e659fb0b5f0B3Db0d' as const\n\nconst L2_SAME_ADDRESS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 42161, // Arbitrum One\n 10, // Optimism\n 8453, // Base\n 56, // BNB Chain\n 59144, // Linea\n 5000, // Mantle\n 81457, // Blast\n 169, // Manta Pacific\n 534352, // Scroll\n 252, // Fraxtal\n 34443, // Mode\n 196, // X Layer\n 1088, // Metis\n 80084, // Berachain\n 2222, // Kava\n 2818, // Morph\n 1923, // Swell\n 48900, // Zircuit\n])\n\n/** Human-readable default label when the node’s chain list has no name for that id. */\nconst FALLBACK_NAME_BY_ID: Readonly<Record<number, string>> = {\n 1: 'Ethereum',\n 42161: 'Arbitrum One',\n 10: 'Optimism',\n 8453: 'Base',\n 56: 'BNB Chain',\n 59144: 'Linea',\n 5000: 'Mantle',\n 81457: 'Blast',\n 169: 'Manta Pacific',\n 534352: 'Scroll',\n 252: 'Fraxtal',\n 34443: 'Mode',\n 196: 'X Layer',\n 1088: 'Metis',\n 80084: 'Berachain',\n 2222: 'Kava',\n 2818: 'Morph',\n 1923: 'Swell',\n 48900: 'Zircuit',\n 324: 'ZKSync Era',\n}\n\n/**\n * USDe address on a chain, or `null` if we do not model USDe for that EVM id (e.g. testnets / unlisted L2s).\n */\nexport function usdeTokenAddressOnEvmChain(chainId: number): `0x${string}` | null {\n if (chainId === 1) return USDE_ETHEREUM_MAINNET\n if (chainId === 324) return USDE_ZKSYNC_ERA\n if (L2_SAME_ADDRESS_CHAIN_IDS.has(chainId)) return USDE_MOST_L2S\n return null\n}\n\nexport function isEthenaUsdeOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = usdeTokenAddressOnEvmChain(n)\n if (!expected) return false\n try {\n return getAddress(contractAddress) === getAddress(expected)\n } catch {\n return false\n }\n}\n\nexport type EthenaUsdeEvmNetworkRow = {\n chainId: number\n /** Static fallback; UI may prefer a name from the node’s chain list. */\n label: string\n usde: `0x${string}`\n}\n\n/**\n * EVM mainnets with a known USDe deployment for the “networks” table in the Ethena dialog.\n * ZKSync uses a different address; all other listed L2s here share `USDE_MOST_L2S`.\n */\nexport function listEthenaUsdeEvmNetworkRows(): EthenaUsdeEvmNetworkRow[] {\n const rows: EthenaUsdeEvmNetworkRow[] = [\n { chainId: 1, label: FALLBACK_NAME_BY_ID[1]!, usde: USDE_ETHEREUM_MAINNET },\n ]\n const l2 = [...L2_SAME_ADDRESS_CHAIN_IDS].sort((a, b) => a - b)\n for (const id of l2) {\n rows.push({\n chainId: id,\n label: FALLBACK_NAME_BY_ID[id] ?? `Chain ${id}`,\n usde: USDE_MOST_L2S,\n })\n }\n rows.push({ chainId: 324, label: FALLBACK_NAME_BY_ID[324]!, usde: USDE_ZKSYNC_ERA })\n return rows.sort((a, b) => {\n if (a.chainId === 1) return -1\n if (b.chainId === 1) return 1\n return a.chainId - b.chainId\n })\n}\n\nexport function isEvmChainInEthenaUsdeList(chainId: number): boolean {\n return usdeTokenAddressOnEvmChain(chainId) != null\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isEvmChainInEthenaUsdeList } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\n\nexport const ETHENA_PROTOCOL_ID = 'ethena'\n\nexport const ethenaProtocolModule: ProtocolModule = {\n id: ETHENA_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isEvmChainInEthenaUsdeList(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'ethena.stake-usde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake USDe → sUSDe', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { amountHuman: { type: 'string', required: true, description: 'USDe amount' } } },\n { id: 'ethena.redeem-susde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem sUSDe → USDe (no cooldown)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.cooldown-shares', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Start sUSDe cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.claim-unstake', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim after cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(ethenaProtocolModule)\n","/** Public Maple Syrup (PoolV2 + SyrupRouter) integration constants. */\n\n/** Attributed deposits per Maple partner guidance (`bytes32` string label). */\nexport const MAPLE_SYRUP_DEPOSIT_DATA_ASCII = '0:continuumdao'\n\nexport const MAPLE_INTEGRATION_DOCS_URL =\n 'https://docs.maple.finance/integrate/ethereum-mainnet/frontend-integration'\n\nexport function mapleGraphqlEndpointForChain(chainId: number): string | null {\n if (chainId === 1) return 'https://api.maple.finance/v2/graphql'\n if (chainId === 11155111) return 'https://sepolia.api.maple.finance/v2/graphql'\n return null\n}\n\nexport function isMapleSyrupSupportedChain(chainId: number): boolean {\n return chainId === 1 || chainId === 11155111\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isMapleSyrupSupportedChain } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\n\nexport const MAPLE_PROTOCOL_ID = 'maple-syrup'\n\nexport const mapleProtocolModule: ProtocolModule = {\n id: MAPLE_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isMapleSyrupSupportedChain(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'maple-syrup.deposit', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Maple Syrup pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'maple-syrup.request-redeem', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Request redeem from pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(mapleProtocolModule)\n","/**\n * Sky LockStake on Ethereum mainnet.\n * @see https://developers.skyeco.com/protocol/rewards/staking-engine/\n * @see https://developers.skyeco.com/guides/sky/token-governance-upgrade/key-info/ (contract list)\n */\n/** Sky (SKY token) on Ethereum mainnet. */\nexport const SKY_ETHEREUM_MAINNET = '0x56072C95FAA701256059aa122697B133aDEd9279'\nexport const SKY_ETHEREUM_MAINNET_CHAIN_ID = 1\nexport const USDS_ETHEREUM_MAINNET = '0xdC035D45d973E3EC169d2276DDab16f1e407384F'\n\n/** sUSDS ERC-4626 vault (share token); deposit USDS → mint shares, redeem shares → USDS. @see https://developers.skyeco.com/protocol/tokens/susds/ */\nexport const SUSDS_VAULT_ERC4626_MAINNET = '0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD'\n\n/**\n * Staking Engine (LockStake) — **Chief V3 / SKY** (active; `LSEV2-SKY-A` ilk). This is the contract users should call.\n * Do not use Seal Engine V1 (`0x2b16C07D…`, MKR / Chief V2 legacy); it has little traffic and is not the current SKY engine.\n * Dual entrypoints: legacy `lock`/`free` (MKR path) vs **`lockSky`/`freeSky`** for SKY collateral via `mkrSky`.\n */\nexport const SKY_LOCKSTAKE_ENGINE_MAINNET = '0xCe01C90dE7FD1bcFa39e237FE6D8D9F569e8A6a3'\n\n/**\n * Wrapped SKY used inside the urn after `lockSky`; StakingRewards farms must list this ERC-20 as `stakingToken()`.\n * @see Symbol `lsSKY`.\n */\nexport const SKY_LS_SKY_ERC20_MAINNET = '0xf9A9cfD3229E985B91F99Bc866d42938044FFa1C'\n\n/**\n * Default staking rewards farm on {@link SKY_LOCKSTAKE_ENGINE_MAINNET} — must be ACTIVE and `stakingToken() === lsSKY`.\n * (Older Seal-engine farm addresses are not whitelisted on the current engine.)\n */\nexport const SKY_LOCKSTAKE_DEFAULT_FARM_MAINNET = '0xB44C2Fb4181D7Cb06bdFf34A46FdFe4a259B40Fc'\nexport const SKY_LOCKSTAKE_DEFAULT_FARM_REF = 1\n\n/**\n * Rough UI collateral factor for “remaining borrow (USD)” estimate in the LockStake dialog only.\n * Not protocol liquidation collateralization; see `SkyLockstakeDialog` disclosures.\n */\nexport const SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR = 0.65\n\nexport const SKY_TOKEN_DECIMALS = 18\nexport const USDS_DECIMALS = 18\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { SKY_ETHEREUM_MAINNET_CHAIN_ID } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './lockstakeMultisign.js'\nexport * from './susdsMultisign.js'\n\nexport const SKY_PROTOCOL_ID = 'sky'\n\nexport const skyProtocolModule: ProtocolModule = {\n id: SKY_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return Number(ctx.chainId) === SKY_ETHEREUM_MAINNET_CHAIN_ID\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'sky.lockstake-stake', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Open Lockstake position', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-draw', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow USDS from Lockstake', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-wipe', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Lockstake debt', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-close', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Close Lockstake position', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.susds-deposit', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit USDS into sUSDS vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.susds-redeem', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem sUSDS to USDS', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(skyProtocolModule)\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './api.js'\nexport * from './spokeOnChain.js'\nexport * from './multisign.js'\n\nexport const AAVE_V4_PROTOCOL_ID = 'aave-v4'\n\nexport const aaveV4ProtocolModule: ProtocolModule = {\n id: AAVE_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'aave-v4.deposit', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Supply to Aave v4 Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.withdraw', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.borrow', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.repay', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Spoke debt', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(aaveV4ProtocolModule)\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './sameAssetBorrowLoop.js'\nexport * from './borrowCollateralMaxWithdrawWei.js'\nexport * from './vaultWithdrawMultisign.js'\nexport * from './isolatedLendMultisign.js'\nexport * from './isolatedBorrowMultisign.js'\nexport * from './borrowRepayMultisign.js'\nexport * from './borrowCollateralDepositMultisign.js'\nexport * from './borrowCollateralWithdrawMultisign.js'\n\nexport const EULER_V2_PROTOCOL_ID = 'euler-v2'\n\nexport const eulerV2ProtocolModule: ProtocolModule = {\n id: EULER_V2_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'euler-v2.isolated-lend', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.isolated-borrow', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.vault-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.borrow-repay', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Euler borrow', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-deposit', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(eulerV2ProtocolModule)\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'\nimport { lidoProtocolModule } from '../protocols/evm/lido/index.js'\nimport { ethenaProtocolModule } from '../protocols/evm/ethena/index.js'\nimport { mapleProtocolModule } from '../protocols/evm/maple/index.js'\nimport { skyProtocolModule } from '../protocols/evm/sky/index.js'\nimport { aaveV4ProtocolModule } from '../protocols/evm/aave-v4/index.js'\nimport { eulerV2ProtocolModule } from '../protocols/evm/euler-v2/index.js'\n\nexport {\n getMcpToolDefinitions,\n getMcpToolByName,\n getAgentCatalogForMcp,\n getMcpToolInputSchema,\n getMcpToolOutputSchema,\n parseMcpToolInput,\n parseMcpToolOutput,\n MCP_TOOL_DEFINITIONS,\n MCP_TOOL_INPUT_SCHEMAS,\n MCP_TOOL_OUTPUT_SCHEMAS,\n} from './mcpTools.js'\nexport type {\n McpToolDefinition,\n McpToolHandler,\n McpJsonSchema,\n McpSchemaProperty,\n McpToolName,\n McpToolInputMap,\n McpToolOutputMap,\n} from './mcpTools.js'\nexport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\nexport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nexport * from './schemas/index.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\nregisterProtocolModule(lidoProtocolModule)\nregisterProtocolModule(ethenaProtocolModule)\nregisterProtocolModule(mapleProtocolModule)\nregisterProtocolModule(skyProtocolModule)\nregisterProtocolModule(aaveV4ProtocolModule)\nregisterProtocolModule(eulerV2ProtocolModule)\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 lido: lidoProtocolModule,\n ethena: ethenaProtocolModule,\n maple: mapleProtocolModule,\n sky: skyProtocolModule,\n aaveV4: aaveV4ProtocolModule,\n eulerV2: eulerV2ProtocolModule,\n /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */\n mcp: getAgentCatalogForMcp(),\n }\n}\n\nexport { getProtocolModules, getActionsByChainCategory }\n","export * from './core/index.js'\nexport * from './chains/evm/index.js'\nexport { solanaChainCategoryModule, SOLANA_CHAIN_CATEGORY } from './chains/solana/index.js'\nexport { nearChainCategoryModule, NEAR_CHAIN_CATEGORY } from './chains/near/index.js'\nexport { getAgentCatalog } from './agent/catalog.js'\nexport { uniswapV4ProtocolModule, uniswapV4 } from './protocols/evm/uniswap-v4/index.js'\nexport { curveDaoProtocolModule, curveDao } from './protocols/evm/curve-dao/index.js'\nimport { registerProtocolModule } from './core/registry.js'\nimport { uniswapV4ProtocolModule } from './protocols/evm/uniswap-v4/index.js'\nimport { curveDaoProtocolModule } from './protocols/evm/curve-dao/index.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\n"]}
|