@continuumdao/ctm-mpc-defi 0.1.3
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/LICENSE +18 -0
- package/README.md +111 -0
- package/dist/agent/catalog.cjs +484 -0
- package/dist/agent/catalog.cjs.map +1 -0
- package/dist/agent/catalog.d.cts +117 -0
- package/dist/agent/catalog.d.ts +117 -0
- package/dist/agent/catalog.js +474 -0
- package/dist/agent/catalog.js.map +1 -0
- package/dist/chains/evm/index.cjs +474 -0
- package/dist/chains/evm/index.cjs.map +1 -0
- package/dist/chains/evm/index.d.cts +62 -0
- package/dist/chains/evm/index.d.ts +62 -0
- package/dist/chains/evm/index.js +459 -0
- package/dist/chains/evm/index.js.map +1 -0
- package/dist/chains/near/index.cjs +25 -0
- package/dist/chains/near/index.cjs.map +1 -0
- package/dist/chains/near/index.d.cts +37 -0
- package/dist/chains/near/index.d.ts +37 -0
- package/dist/chains/near/index.js +20 -0
- package/dist/chains/near/index.js.map +1 -0
- package/dist/chains/solana/index.cjs +25 -0
- package/dist/chains/solana/index.cjs.map +1 -0
- package/dist/chains/solana/index.d.cts +40 -0
- package/dist/chains/solana/index.d.ts +40 -0
- package/dist/chains/solana/index.js +20 -0
- package/dist/chains/solana/index.js.map +1 -0
- package/dist/core/index.cjs +128 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +10 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.js +116 -0
- package/dist/core/index.js.map +1 -0
- package/dist/envelope-CcE5Cz_q.d.ts +35 -0
- package/dist/envelope-DYDPnrHZ.d.cts +35 -0
- package/dist/index.cjs +2481 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +2446 -0
- package/dist/index.js.map +1 -0
- package/dist/keygen-CfNp8yKJ.d.cts +9 -0
- package/dist/keygen-DsINazx8.d.ts +9 -0
- package/dist/nodeRead-BnmSaMGO.d.cts +8 -0
- package/dist/nodeRead-BnmSaMGO.d.ts +8 -0
- package/dist/protocols/evm/curve-dao/index.cjs +869 -0
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -0
- package/dist/protocols/evm/curve-dao/index.d.cts +147 -0
- package/dist/protocols/evm/curve-dao/index.d.ts +147 -0
- package/dist/protocols/evm/curve-dao/index.js +846 -0
- package/dist/protocols/evm/curve-dao/index.js.map +1 -0
- package/dist/protocols/evm/uniswap-v4/index.cjs +1700 -0
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -0
- package/dist/protocols/evm/uniswap-v4/index.d.cts +323 -0
- package/dist/protocols/evm/uniswap-v4/index.d.ts +323 -0
- package/dist/protocols/evm/uniswap-v4/index.js +1659 -0
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -0
- package/dist/registry-BwZoE668.d.cts +8 -0
- package/dist/registry-oMKlO_5z.d.ts +8 -0
- package/dist/txParams-BC7ogvdR.d.cts +19 -0
- package/dist/txParams-BC7ogvdR.d.ts +19 -0
- package/dist/types-5u863Fd9.d.ts +34 -0
- package/dist/types-B8idm_gu.d.cts +34 -0
- package/dist/types-Ce2qNHai.d.cts +57 -0
- package/dist/types-Ce2qNHai.d.ts +57 -0
- package/package.json +94 -0
|
@@ -0,0 +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/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":["gasPriceGwei","defineChain","createPublicClient","http","getAddress","parseGwei","zeroAddress","res","text","parsed","serializeTransaction","keccak256","ETH_PLACEHOLDER","parseUnits","encodeFunctionData"],"mappings":"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","file":"index.js","sourcesContent":["import type { KeyGenSubset } from './types.js'\n\nexport type { KeyGenSubset }\n\n/** App-compatible alias used by existing multisign builders. */\nexport type KeyGenSubsetForPermit = KeyGenSubset\n\nexport function firstClientIdFromKeyGen(data: KeyGenSubset | null | undefined): string | null {\n const map = data?.ClientKeys\n if (!map || typeof map !== 'object') return null\n for (const v of Object.values(map)) {\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n return null\n}\n\nexport function requirePubKeyHex(keyGen: KeyGenSubset): string {\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n return ph\n}\n\nexport function keyListFromKeyGen(keyGen: KeyGenSubset): string[] {\n return keyGen.keylist ?? []\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult } from './types.js'\nimport type { KeyGenSubset } from './keygen.js'\nimport { firstClientIdFromKeyGen } from './keygen.js'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** GET requests to mpc-auth management node with optional Bearer JWT (Browser HTTPS). */\nexport type NodeReadAuth = {\n bearerOnGet: boolean\n jwt: string | null\n}\n\nexport function nodeFetchWithReadAuth(\n url: string,\n init: RequestInit | undefined,\n auth: NodeReadAuth,\n): Promise<Response> {\n const method = (init?.method ?? 'GET').toUpperCase()\n const headers = new Headers(init?.headers)\n if (auth.bearerOnGet && method === 'GET' && auth.jwt && auth.jwt.trim()) {\n headers.set('Authorization', `Bearer ${auth.jwt.trim()}`)\n }\n return fetch(url, { ...init, headers })\n}\n","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\n/**\n * When `batchIndex` is set, allow per-item `batchMeta[i].evm` when present; else top-level `evm` in ExtraJSON.\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 && 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 ?? '') === 'uniswap_v4_swap_tx') 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 ?? '') === '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 = ex?.uniswapV4 as Record<string, unknown> | undefined\n if (u4 && typeof u4 === 'object') {\n const uc = u4.uniswapCreateSwap as Record<string, unknown> | undefined\n const gb = 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","import type { ChainCategory, ParamDoc } from '../core/types.js'\nimport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC } from './commonParamDocs.js'\nimport { getProtocolModules } from '../core/registry.js'\n\n/** JSON-schema-like object for MCP tool `inputSchema` / `outputSchema`. */\nexport type McpSchemaProperty = {\n type: string\n description?: string\n}\n\nexport type McpJsonSchema = {\n type: string\n description?: string\n properties?: Record<string, McpSchemaProperty>\n required?: string[]\n items?: McpJsonSchema\n enum?: string[]\n}\n\nexport type McpToolHandler = {\n /** Import path subpath, e.g. protocols/evm/uniswap-v4 */\n importPath: string\n /** Named export to invoke */\n exportName: string\n}\n\nexport type McpToolDefinition = {\n /** Stable MCP tool name (snake_case). */\n name: string\n /** Registry action id, e.g. uniswap-v4.quote */\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n /** Long description for the LLM — what it does, when to use it, what it does NOT do. */\n description: string\n /** Prerequisites (other tools or data that must exist first). */\n prerequisites: string[]\n /** Typical next tools after this one succeeds. */\n followUp: string[]\n inputSchema: McpJsonSchema\n outputSchema: McpJsonSchema\n handler: McpToolHandler\n}\n\nfunction paramProperties(\n params: Record<string, ParamDoc>,\n includeCommon: Array<keyof typeof EVM_COMMON_PARAM_DOCS> = [],\n): Record<string, McpSchemaProperty> {\n const out: Record<string, McpSchemaProperty> = {}\n for (const k of includeCommon) {\n const d = EVM_COMMON_PARAM_DOCS[k]\n if (d) out[k] = { type: d.type, description: d.description }\n }\n for (const [k, d] of Object.entries(params)) {\n out[k] = { type: d.type, description: d.description }\n }\n return out\n}\n\nfunction requiredKeys(\n params: Record<string, ParamDoc>,\n includeCommon: Array<keyof typeof EVM_COMMON_PARAM_DOCS> = [],\n): string[] {\n const req: string[] = []\n for (const k of includeCommon) {\n if (EVM_COMMON_PARAM_DOCS[k]?.required) req.push(k)\n }\n for (const [k, d] of Object.entries(params)) {\n if (d.required) req.push(k)\n }\n return req\n}\n\nconst multisignOutputSchema: McpJsonSchema = {\n type: 'object',\n description: MULTISIGN_OUTPUT_DOC.description,\n properties: {\n bodyForSign: {\n type: 'object',\n description: MULTISIGN_OUTPUT_DOC.fields.bodyForSign.description,\n },\n messageToSign: {\n type: 'string',\n description: MULTISIGN_OUTPUT_DOC.fields.messageToSign.description,\n },\n },\n required: ['bodyForSign', 'messageToSign'],\n}\n\n/** Curated MCP tools with rich descriptions — use this to register MCP server tools. */\nexport const MCP_TOOL_DEFINITIONS: McpToolDefinition[] = [\n {\n name: 'ctm_uniswap_v4_quote',\n actionId: 'uniswap-v4.quote',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Fetch a Uniswap V4 Trade API quote (POST /v1/quote). Returns classic quote JSON including quote.input/output amounts and routing. Does NOT create a sign request — use ctm_uniswap_v4_create_swap and ctm_uniswap_v4_build_swap_multisign after quoting. Requires uniswapApiKey and swapper (MPC executor address) or keyGen + managementNodeUrl to resolve swapper.',\n prerequisites: ['Chain must be supported by Uniswap V4 (Universal Router map).'],\n followUp: ['ctm_uniswap_v4_create_swap', 'ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapTradeQuote' },\n inputSchema: {\n type: 'object',\n properties: paramProperties({\n type: { type: 'string', required: true, description: 'EXACT_INPUT or EXACT_OUTPUT' },\n amount: { type: 'string', required: true, description: 'Amount in token-in base units (wei string for ERC-20)' },\n tokenIn: { type: 'address', required: true, description: 'Input token; 0x0 for native ETH' },\n tokenOut: { type: 'address', required: true, description: 'Output token address' },\n chainId: { type: 'number', required: true, description: 'tokenInChainId / same-chain default' },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API x-api-key' },\n swapper: { type: 'address', required: false, description: 'MPC executor; omit if keyGen + managementNodeUrl provided' },\n slippage: { type: 'number', required: false, description: 'Slippage percent; omit for API auto slippage' },\n }),\n required: requiredKeys({\n type: { type: 'string', required: true, description: '' },\n amount: { type: 'string', required: true, description: '' },\n tokenIn: { type: 'address', required: true, description: '' },\n tokenOut: { type: 'address', required: true, description: '' },\n chainId: { type: 'number', required: true, description: '' },\n uniswapApiKey: { type: 'string', required: true, description: '' },\n }),\n },\n outputSchema: {\n type: 'object',\n description: 'Full Uniswap POST /quote JSON (includes nested quote object with input/output amounts).',\n },\n },\n {\n name: 'ctm_uniswap_v4_create_swap',\n actionId: 'uniswap-v4.create-swap',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Call Uniswap Trade API POST /v1/swap to build Universal Router calldata from a prior quote. Returns { swap: { to, data, value, gasLimit? }, requestId? }. Does NOT produce a multiSignRequest — call ctm_uniswap_v4_build_swap_multisign next.',\n prerequisites: ['ctm_uniswap_v4_quote output (fullQuoteFromPermit)'],\n followUp: ['ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapCreateSwap' },\n inputSchema: {\n type: 'object',\n properties: paramProperties({\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API key' },\n fullQuoteFromPermit: { type: 'object', required: true, description: 'Full quote JSON from ctm_uniswap_v4_quote' },\n swapTransactionDeadlineUnix: {\n type: 'number',\n required: false,\n description: 'On-chain deadline unix seconds; default ~30 min from now',\n },\n useServerProxy: {\n type: 'boolean',\n required: false,\n description: 'Set false in Node/agents; true only in browser via Next API route',\n },\n }),\n required: requiredKeys({\n uniswapApiKey: { type: 'string', required: true, description: '' },\n fullQuoteFromPermit: { type: 'object', required: true, description: '' },\n }),\n },\n outputSchema: {\n type: 'object',\n description: '{ swap: TransactionRequest, requestId?, gasFee? }',\n },\n },\n {\n name: 'ctm_uniswap_v4_build_swap_multisign',\n actionId: 'uniswap-v4.swap-exact-input',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest body for a Uniswap V4 swap. May batch 1–3 EVM txs: ERC-20 approve(s) to Permit2/router path + Universal Router swap (or 1 tx for native-in). Estimates gas, serializes unsigned txs, sets proposalTxParams. Output must be signed and POSTed to /multiSignRequest by the caller.',\n prerequisites: [\n 'ctm_uniswap_v4_create_swap output',\n 'keyGen with pubkeyhex',\n 'executorAddress matching MPC wallet',\n 'RPC URL and chainDetail from node chain config',\n ],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'buildEvmMultisignBodyUniswapV4SkipPermit2Batch' },\n inputSchema: {\n type: 'object',\n properties: paramProperties(\n {\n tokenIn: { type: 'address', required: true, description: 'Token in; 0x0 for native ETH' },\n swap: { type: 'object', required: true, description: 'swap field from create_swap response' },\n createSwapResponse: { type: 'object', required: true, description: 'Full create_swap response' },\n fullQuoteSnapshot: { type: 'object', required: true, description: 'Quote JSON used for the swap' },\n swapDeadlineUnix: { type: 'number', required: true, description: 'Same deadline passed to create_swap' },\n slippagePercent: { type: 'number', required: false, description: 'Extra approve headroom for EXACT_OUTPUT' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail', 'customGasChainDetails'],\n ),\n required: requiredKeys(\n {\n tokenIn: { type: 'address', required: true, description: '' },\n swap: { type: 'object', required: true, description: '' },\n createSwapResponse: { type: 'object', required: true, description: '' },\n fullQuoteSnapshot: { type: 'object', required: true, description: '' },\n swapDeadlineUnix: { type: 'number', required: true, description: '' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail'],\n ),\n },\n outputSchema: multisignOutputSchema,\n },\n {\n name: 'ctm_curve_dao_build_swap_multisign',\n actionId: 'curve-dao.swap',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest for a Curve Router NG swap via @curvefi/api populateSwap. Optionally batches ERC-20 approve txs when allowance is insufficient, then exchange. Requires JSON-RPC and Curve-supported chain.',\n prerequisites: ['keyGen', 'executorAddress', 'tokenIn/tokenOut/amountHuman/slippage', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'buildEvmMultisignBodyCurveDaoBatch' },\n inputSchema: {\n type: 'object',\n properties: paramProperties(\n {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 sold (native in uses WETH path in UI)' },\n tokenOut: { type: 'string', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable amount of tokenIn' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage 0–100 exclusive' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail', 'customGasChainDetails'],\n ),\n required: requiredKeys(\n {\n tokenIn: { type: 'address', required: true, description: '' },\n tokenOut: { type: 'string', required: true, description: '' },\n amountHuman: { type: 'string', required: true, description: '' },\n slippagePercent: { type: 'number', required: true, description: '' },\n },\n ['keyGen', 'purposeText', 'useCustomGas', 'chainId', 'rpcUrl', 'executorAddress', 'chainDetail'],\n ),\n },\n outputSchema: multisignOutputSchema,\n },\n]\n\nexport function getMcpToolDefinitions(): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS\n}\n\nexport function getMcpToolByName(name: string): McpToolDefinition | undefined {\n return MCP_TOOL_DEFINITIONS.find((t) => t.name === name)\n}\n\n/** Summary from protocol registry (shorter) plus full MCP tool list. */\nexport function getAgentCatalogForMcp() {\n return {\n tools: MCP_TOOL_DEFINITIONS,\n protocols: getProtocolModules(),\n commonParams: EVM_COMMON_PARAM_DOCS,\n multisignOutput: MULTISIGN_OUTPUT_DOC,\n workflow: {\n evmSwapTypical: [\n '1. Quote (protocol-specific API if needed)',\n '2. Build protocol calldata (e.g. create_swap)',\n '3. build_*_multisign → { bodyForSign, messageToSign }',\n '4. Sign messageToSign (MetaMask or Ed25519)',\n '5. POST /multiSignRequest with clientSig and signedMessage',\n ],\n },\n }\n}\n","import { getProtocolModules, getActionsByChainCategory, registerProtocolModule } from '../core/registry.js'\nimport { uniswapV4ProtocolModule } from '../protocols/evm/uniswap-v4/index.js'\nimport { curveDaoProtocolModule } from '../protocols/evm/curve-dao/index.js'\nimport { getAgentCatalogForMcp } from './mcpTools.js'\n\nexport {\n getMcpToolDefinitions,\n getMcpToolByName,\n getAgentCatalogForMcp,\n MCP_TOOL_DEFINITIONS,\n} from './mcpTools.js'\nexport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC } from './commonParamDocs.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\n\n/** Machine-readable catalog of protocol actions grouped by chain category. */\nexport function getAgentCatalog() {\n return {\n protocols: getProtocolModules(),\n byCategory: {\n evm: getActionsByChainCategory('evm'),\n solana: getActionsByChainCategory('solana'),\n near: getActionsByChainCategory('near'),\n },\n uniswapV4: uniswapV4ProtocolModule,\n curveDao: curveDaoProtocolModule,\n /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */\n mcp: getAgentCatalogForMcp(),\n }\n}\n\nexport { getProtocolModules, getActionsByChainCategory }\n","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"]}
|