@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/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/uniswap-v4/constants.ts","../../../../src/core/nodeRead.ts","../../../../src/protocols/evm/uniswap-v4/quote.ts","../../../../src/core/keygen.ts","../../../../src/chains/evm/txParams.ts","../../../../src/chains/evm/fees/chainFees.ts","../../../../src/chains/evm/fees/eip1559Align.ts","../../../../src/protocols/evm/uniswap-v4/swapMultisign.ts","../../../../src/protocols/evm/uniswap-v4/support.ts","../../../../src/protocols/evm/uniswap-v4/swap.ts","../../../../src/protocols/evm/uniswap-v4/index.ts"],"names":["getAddress","zeroAddress","formatUnits","parseUnits","lines","defineChain","createPublicClient","http","gasPriceGwei","parseGwei","res","text","parsed","decodeFunctionData","serializeTransaction","keccak256","encodeFunctionData","erc20Abi"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { getAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Canonical Uniswap token-allowance contract on most EVM chains. */\nexport const PERMIT2_ADDRESS: Address = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\n\nconst UNIVERSAL_ROUTER_SPENDER: Partial<Record<number, string>> = {\n 1: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n 5: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',\n 137: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n 80001: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 10: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n 420: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n 421613: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42220: '0xcb695bc5D3Aa22cAD1E6DF07801b061a05A0233A',\n 44787: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 56: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n 43114: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n 84531: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n 8453: '0x6fF5693b99212da76ad316178a184ab56d299b43',\n 81457: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n 7777777: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n 324: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n 480: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n 1301: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n 130: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n 10143: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n 84532: '0x492e6456d9528771018deb9e87ef7750ef184104',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 143: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n 4217: '0x1febb76be10aaf3a1402f04e8e835f2c382f7914',\n 196: '0x5507749f2c558bb3e162c6e90c314c092e7372ff',\n}\n\nexport function isUniswapV4ChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n if (chainId == null) return false\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n const a = UNIVERSAL_ROUTER_SPENDER[n]\n return typeof a === 'string' && a.startsWith('0x')\n}\n\nexport function getUniswapUniversalRouterSpenderOrThrow(chainId: number): Address {\n const raw = UNIVERSAL_ROUTER_SPENDER[chainId]\n if (!raw || !raw.startsWith('0x')) {\n throw new Error(\n `No Uniswap Universal Router (spender) is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or use a chain supported by the Uniswap SDK.`,\n )\n }\n return getAddress(raw)\n}\n\nexport const MAX_UINT160 = (1n << 160n) - 1n\nexport const MAX_UINT48 = (1n << 48n) - 1n\n\nexport const UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_TRADE_BASE_DEFAULT = 'https://trade-api.gateway.uniswap.org/v1'\nexport const UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT = '2.0'\nexport const UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES = 30\nexport const UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET = UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES * 60\n","/** 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 { 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 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","/**\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 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 {\n isUniswapV4ChainSupported,\n getUniswapUniversalRouterSpenderOrThrow,\n} from './constants.js'\n\nexport { isUniswapV4ChainSupported, getUniswapUniversalRouterSpenderOrThrow }\n\nexport type UniswapV4SessionPayload = {\n chainId: number\n rpcUrl: string\n chainSupported: boolean\n universalRouter?: string\n}\n\nexport function computeUniswapV4Session(args: {\n assetsChainId: string | number\n rpcUrl: string | undefined\n protocolEnabled: boolean\n}): UniswapV4SessionPayload {\n const chainIdNum =\n typeof args.assetsChainId === 'number'\n ? args.assetsChainId\n : parseInt(String(args.assetsChainId).trim(), 10)\n const rpcUrl = (args.rpcUrl ?? '').trim()\n const chainSupported =\n args.protocolEnabled &&\n Number.isFinite(chainIdNum) &&\n chainIdNum > 0 &&\n rpcUrl.length > 0 &&\n isUniswapV4ChainSupported(chainIdNum)\n\n let universalRouter: string | undefined\n if (chainSupported) {\n try {\n universalRouter = getUniswapUniversalRouterSpenderOrThrow(chainIdNum)\n } catch {\n universalRouter = undefined\n }\n }\n\n return {\n chainId: chainIdNum,\n rpcUrl,\n chainSupported,\n universalRouter,\n }\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"]}
|