@continuumdao/ctm-mpc-defi 0.2.1 → 0.2.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/dist/agent/catalog.cjs +96 -25
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +27 -1
- package/dist/agent/catalog.js +95 -26
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/curve-dao/SKILL.md +2 -1
- package/dist/chains/evm/index.cjs +54 -0
- package/dist/chains/evm/index.cjs.map +1 -1
- package/dist/chains/evm/index.d.ts +13 -1
- package/dist/chains/evm/index.js +52 -2
- package/dist/chains/evm/index.js.map +1 -1
- package/dist/core/index.cjs +64 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +20 -1
- package/dist/core/index.js +56 -1
- package/dist/core/index.js.map +1 -1
- package/dist/index.cjs +165 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +154 -16
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +766 -6
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.d.ts +417 -1
- package/dist/protocols/evm/aave-v4/index.js +741 -8
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +268 -21
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.d.ts +74 -9
- package/dist/protocols/evm/curve-dao/index.js +262 -23
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/ethena/index.cjs +104 -0
- package/dist/protocols/evm/ethena/index.cjs.map +1 -1
- package/dist/protocols/evm/ethena/index.d.ts +46 -1
- package/dist/protocols/evm/ethena/index.js +99 -1
- package/dist/protocols/evm/ethena/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +2334 -37
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.d.ts +464 -1
- package/dist/protocols/evm/euler-v2/index.js +2286 -39
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/lido/index.cjs +110 -0
- package/dist/protocols/evm/lido/index.cjs.map +1 -1
- package/dist/protocols/evm/lido/index.d.ts +33 -2
- package/dist/protocols/evm/lido/index.js +107 -2
- package/dist/protocols/evm/lido/index.js.map +1 -1
- package/dist/protocols/evm/maple/index.cjs +83 -0
- package/dist/protocols/evm/maple/index.cjs.map +1 -1
- package/dist/protocols/evm/maple/index.d.ts +22 -1
- package/dist/protocols/evm/maple/index.js +82 -1
- package/dist/protocols/evm/maple/index.js.map +1 -1
- package/dist/protocols/evm/sky/index.cjs +217 -0
- package/dist/protocols/evm/sky/index.cjs.map +1 -1
- package/dist/protocols/evm/sky/index.d.ts +56 -1
- package/dist/protocols/evm/sky/index.js +210 -2
- package/dist/protocols/evm/sky/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/registry.ts","../../src/chains/evm/chainIdParse.ts","../../src/protocols/evm/uniswap-v4/constants.ts","../../src/protocols/evm/uniswap-v4/index.ts","../../src/protocols/evm/curve-dao/support.ts","../../src/protocols/evm/curve-dao/swapDestinations.ts","../../src/protocols/evm/curve-dao/apiSession.ts","../../src/protocols/evm/curve-dao/index.ts","../../src/agent/commonParamDocs.ts","../../src/agent/zodToMcpJsonSchema.ts","../../src/agent/schemas/common.ts","../../src/agent/schemas/uniswapV4.ts","../../src/agent/schemas/curveDao.ts","../../src/agent/schemas/protocols.ts","../../src/agent/mcpProtocolTools.ts","../../src/agent/mcpTools.ts","../../src/protocols/evm/lido/mainnet.ts","../../src/protocols/evm/lido/index.ts","../../src/protocols/evm/ethena/constants.ts","../../src/protocols/evm/ethena/index.ts","../../src/protocols/evm/maple/constants.ts","../../src/protocols/evm/maple/index.ts","../../src/protocols/evm/sky/mainnet.ts","../../src/protocols/evm/sky/index.ts","../../src/protocols/evm/aave-v4/api.ts","../../src/protocols/evm/aave-v4/index.ts","../../src/protocols/evm/euler-v2/index.ts","../../src/agent/skills.ts","../../src/agent/support/advisors.ts","../../src/agent/mcpServerSchemas.ts","../../src/agent/catalog.ts"],"names":["z","getAddress","isAddress"],"mappings":"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","file":"catalog.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { getAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Canonical Uniswap token-allowance contract on most EVM chains. */\nexport const PERMIT2_ADDRESS: Address = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\n\nconst UNIVERSAL_ROUTER_SPENDER: Partial<Record<number, string>> = {\n 1: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n 5: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',\n 137: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n 80001: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 10: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n 420: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n 421613: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42220: '0xcb695bc5D3Aa22cAD1E6DF07801b061a05A0233A',\n 44787: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 56: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n 43114: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n 84531: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n 8453: '0x6fF5693b99212da76ad316178a184ab56d299b43',\n 81457: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n 7777777: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n 324: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n 480: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n 1301: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n 130: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n 10143: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n 84532: '0x492e6456d9528771018deb9e87ef7750ef184104',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 143: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n 4217: '0x1febb76be10aaf3a1402f04e8e835f2c382f7914',\n 196: '0x5507749f2c558bb3e162c6e90c314c092e7372ff',\n}\n\nexport function isUniswapV4ChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n if (chainId == null) return false\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n const a = UNIVERSAL_ROUTER_SPENDER[n]\n return typeof a === 'string' && a.startsWith('0x')\n}\n\nexport function getUniswapUniversalRouterSpenderOrThrow(chainId: number): Address {\n const raw = UNIVERSAL_ROUTER_SPENDER[chainId]\n if (!raw || !raw.startsWith('0x')) {\n throw new Error(\n `No Uniswap Universal Router (spender) is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or use a chain supported by the Uniswap SDK.`,\n )\n }\n return getAddress(raw)\n}\n\nexport const MAX_UINT160 = (1n << 160n) - 1n\nexport const MAX_UINT48 = (1n << 48n) - 1n\n\nexport const UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_TRADE_BASE_DEFAULT = 'https://trade-api.gateway.uniswap.org/v1'\nexport const UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT = '2.0'\nexport const UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES = 30\nexport const UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET = UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES * 60\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isUniswapV4ChainSupported } from './constants.js'\n\nexport * from './constants.js'\nexport * from './quote.js'\nexport * from './swapMultisign.js'\nexport * from './purpose.js'\nexport * from './support.js'\nexport * from './swap.js'\n\nexport {\n isUniswapV4SwapEvmSignRequest,\n resolveRouterSwapGasUnitsFromSignRequest,\n} from './swapMultisign.js'\n\nexport const UNISWAP_V4_PROTOCOL_ID = 'uniswap-v4'\n\nexport const uniswapV4ProtocolModule: ProtocolModule = {\n id: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isUniswapV4ChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'uniswap-v4.swap-exact-input',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap ERC-20 or native token via Uniswap V4 Universal Router (classic allowance path)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token (0x0 for native)' },\n tokenOut: { type: 'address', required: true, description: 'Output token address' },\n amount: { type: 'string', required: true, description: 'Human or wei amount per trade type' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage tolerance percent' },\n swapTransactionDeadlineUnix: {\n type: 'number',\n required: false,\n description: 'On-chain swap deadline (unix seconds)',\n },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API key' },\n },\n },\n {\n id: 'uniswap-v4.quote',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Fetch Uniswap Trade API quote',\n commonParams: ['keyGen'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token' },\n tokenOut: { type: 'address', required: true, description: 'Output token' },\n amount: { type: 'string', required: true, description: 'Amount for quote' },\n type: { type: 'EXACT_INPUT | EXACT_OUTPUT', required: true, description: 'Trade type' },\n },\n },\n ],\n}\n\nregisterProtocolModule(uniswapV4ProtocolModule)\n\nimport { uniswapTradeQuote } from './quote.js'\nimport { buildEvmMultisignBodyUniswapV4SkipPermit2Batch } from './swapMultisign.js'\nimport { swapExactInput as swapExactInputFn, quoteSwap, createSwap, swapFromQuote } from './swap.js'\n\nexport const uniswapV4 = {\n quoteSwap,\n createSwap,\n swapExactInput: swapExactInputFn,\n swapFromQuote,\n buildSwapMultisignBody: buildEvmMultisignBodyUniswapV4SkipPermit2Batch,\n quote: uniswapTradeQuote,\n isChainSupported: isUniswapV4ChainSupported,\n}\n","import { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nconst CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554,\n])\n\nexport function isCurveApiChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n return CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS.has(n)\n}\n\nexport { isCurveApiChainSupported as isCurveDaoChainSupported }\n","import { 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 { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isCurveApiChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './swapDestinations.js'\nexport * from './apiSession.js'\nexport * from './purpose.js'\nexport * from './executeHelpers.js'\nexport * from './multisign.js'\n\nexport const CURVE_DAO_PROTOCOL_ID = 'curve-dao'\n\nexport const curveDaoProtocolModule: ProtocolModule = {\n id: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isCurveApiChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'curve-dao.swap',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap via Curve Router NG (optional ERC-20 approve batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 token in (native uses WETH path in UI)' },\n tokenOut: { type: 'address', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage percent (0–100 exclusive)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(curveDaoProtocolModule)\n\nimport { buildEvmMultisignBodyCurveDaoBatch } from './multisign.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\n\nexport const curveDao = {\n buildSwapMultisignBody: buildEvmMultisignBodyCurveDaoBatch,\n isChainSupported: isCurveApiChainSupported,\n loadSession: loadFullCurveSessionForRpc,\n}\n","import type { ParamDoc } from '../core/types.js'\n\n/** Shared inputs documented once for all EVM multisign builders. */\nexport const EVM_COMMON_PARAM_DOCS: Record<string, ParamDoc> = {\n keyGen: {\n type: 'object',\n required: true,\n description:\n 'MPC key slice: { pubkeyhex: string (required), keylist: string[], ClientKeys?: Record<string,string> }. Used for pubKey/keyList on POST /multiSignRequest.',\n },\n purposeText: {\n type: 'string',\n required: true,\n description:\n 'Human-readable purpose for the sign request. Stored in bodyForSign.purpose (may be appended with an automatic batch suffix).',\n },\n useCustomGas: {\n type: 'boolean',\n required: true,\n description:\n 'When true, apply chain gas settings from chainDetail / customGasChainDetails instead of raw RPC estimates only.',\n },\n chainId: {\n type: 'number',\n required: true,\n description: 'EVM chain id (decimal). Becomes destinationChainID on the sign request.',\n },\n rpcUrl: {\n type: 'string',\n required: true,\n description: 'HTTPS JSON-RPC URL for gas estimation, nonce, and allowance reads.',\n },\n executorAddress: {\n type: 'address',\n required: true,\n description: 'MPC wallet address (from keyGen ethereumaddress) — tx sender for estimates and approvals.',\n },\n chainDetail: {\n type: 'object',\n required: true,\n description:\n 'Optional gas config: { legacy?, gasLimit?, gasMultiplier?, gasPrice?, baseFee?, priorityFee?, baseFeeMultiplier? }.',\n },\n customGasChainDetails: {\n type: 'object',\n required: false,\n description: 'Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true.',\n },\n}\n\nexport const MULTISIGN_OUTPUT_DOC = {\n description:\n 'Unsigned mpc-auth multiSignRequest payload. The caller must sign messageToSign (MetaMask personal_sign or Ed25519) and POST { ...bodyForSign, clientSig, signedMessage: messageToSign } to /multiSignRequest.',\n fields: {\n bodyForSign: {\n type: 'object',\n description:\n 'POST body fields without clientSig: keyList, pubKey, msgHash, msgRaw, destinationChainID, purpose, extraJSON, proposalTxParams (batch), messageHashes/messageRawBatch when N>1 txs.',\n },\n messageToSign: {\n type: 'string',\n description: 'JSON.stringify(bodyForSign) — exact string to sign before adding clientSig.',\n },\n },\n} as const\n\n/** mpc-auth NodeMgtKeySig envelope for management POST routes (Get Sig, shelve, keyGen, groups, …). */\nexport const MANAGEMENT_SIG_DOC = {\n description:\n 'Management POST bodies embed NodeMgtKeySig: { nonce, clientSig, nodeKey }. Sign JSON with clientSig cleared via messageToSignManagementBody; POST with withManagementClientSig(body, sig). Do not put signedMessage in the JSON body for standard management routes. Legacy Nonce/Sig/sig field names are not accepted.',\n exceptions: {\n configUpdateImplement:\n 'POST /configUpdateImplement: include nodeKey + plannedYaml + signedMessage (opaque configUpdateImplement|<sha256> line). Sign the opaque line bytes, not the JSON body.',\n postMSQTTKey:\n 'POST /postMSQTTKey: include nodeKey + caCertPem + clientSig. Sign caCertPem PEM bytes directly (use buildPostMqttKeyBody).',\n addManagementKey:\n 'POST /addManagementKey / removeManagementKey (EIP-191): may still use signedMessage equal to the canonical JSON string for dual-mode Ethereum signing.',\n agentLlmConfig:\n 'POST /agentLlmConfig / agentLlmApiKey: sign canonical JSON with action + clientSig cleared; POST body has nonce, clientSig, nodeKey, endpoint fields — no signedMessage field.',\n multiSignRequest:\n 'POST /multiSignRequest (client key, not management): POST { ...bodyForSign, clientSig, signedMessage: messageToSign }.',\n },\n fields: {\n nonce: {\n type: 'number',\n description: 'From GET /getPublicMgtKeyNonce (Ed25519) or GET /getNodeMgtKeyNonce (Ethereum NodeMgtKey).',\n },\n clientSig: {\n type: 'string',\n description: 'Management signature; empty string in the message to sign.',\n },\n nodeKey: {\n type: 'string',\n description: 'Required. 128-hex MPC node id from GET /getNodeKey (no 0x prefix).',\n },\n },\n helpers: {\n managementSigFields: 'Base envelope with clientSig cleared.',\n buildManagementPostBody: 'Spread managementSigFields then endpoint fields.',\n buildPostMqttKeyBody: 'POST /postMSQTTKey unsigned body (sign PEM directly).',\n buildPostPreferredKeyGenBody: 'POST /postPreferredKeyGen unsigned body.',\n buildConfigUpdateImplementPostBody: 'POST /configUpdateImplement with opaque signedMessage line.',\n buildSignRequestAgreeUnsignedBody: 'POST /signRequestAgree unsigned body with nodeKey.',\n messageToSignManagementBody: 'Canonical JSON string to sign.',\n withManagementClientSig: 'Attach signature to POST body.',\n fetchNodeKey: 'GET /getNodeKey via nodeFetchWithReadAuth.',\n fetchManagementNonce: 'GET nonce for Ed25519 or Ethereum management key.',\n fetchPreferredKeyGen: 'GET /getPreferredKeyGen for agent default KeyGen.',\n },\n} as const\n","import { zodToJsonSchema } from 'zod-to-json-schema'\nimport type { z } from 'zod'\nimport type { McpJsonSchema } from './mcpTypes.js'\n\n/**\n * Convert a Zod schema to MCP-compatible JSON Schema (`inputSchema` / `outputSchema`).\n * Zod is the source of truth; JSON Schema is derived for MCP server registration only.\n */\nexport function zodSchemaToMcpJsonSchema(schema: z.ZodType): McpJsonSchema {\n const raw = zodToJsonSchema(schema, {\n target: 'openApi3',\n $refStrategy: 'none',\n }) as Record<string, unknown>\n if (raw.type === 'object' || raw.type === 'array' || raw.type === 'string') {\n const { $schema: _s, ...rest } = raw\n return rest as McpJsonSchema\n }\n // zod-to-json-schema may wrap named schemas in definitions — unwrap first entry.\n const defs = raw.definitions as Record<string, Record<string, unknown>> | undefined\n if (defs) {\n const first = Object.values(defs)[0]\n if (first?.type) {\n const { $schema: _s, ...rest } = first\n return rest as McpJsonSchema\n }\n }\n return raw as McpJsonSchema\n}\n","import { z } from 'zod'\n\n/** EVM address (0x + 40 hex). Handlers may normalize via viem `getAddress`. */\nexport const evmAddressSchema = z\n .string()\n .min(1)\n .describe('EVM address (0x-prefixed, 40 hex nibbles)')\n\n/** MPC key slice for POST /multiSignRequest (pubKey, keyList). */\nexport const keyGenSchema = z\n .object({\n pubkeyhex: z.string().min(1).describe('MPC secp256k1 public key hex (required for multiSignRequest pubKey)'),\n keylist: z.array(z.string()).optional().describe('Key list on the sign request'),\n ClientKeys: z.record(z.string()).optional().describe('Optional client key map from keyGen'),\n })\n .describe(\n 'MPC key slice: { pubkeyhex, keylist?, ClientKeys? }. Used for pubKey/keyList on POST /multiSignRequest.',\n )\n\n/** Chain gas config row from GET /getChainDetails (subset). */\nexport const chainDetailSchema = z\n .object({\n legacy: z.boolean().optional(),\n gasLimit: z.number().optional(),\n gasMultiplier: z.number().optional(),\n gasPrice: z.number().optional(),\n baseFee: z.number().optional(),\n priorityFee: z.number().optional(),\n baseFeeMultiplier: z.number().optional(),\n })\n .passthrough()\n .describe(\n 'Optional gas config: { legacy?, gasLimit?, gasMultiplier?, gasPrice?, baseFee?, priorityFee?, baseFeeMultiplier? }.',\n )\n\n/** Shared inputs for all EVM multisign MCP tools. */\nexport const evmMultisignCommonInputSchema = z.object({\n keyGen: keyGenSchema,\n purposeText: z\n .string()\n .min(1)\n .describe(\n 'Human-readable purpose for the sign request. Stored in bodyForSign.purpose (may be appended with an automatic batch suffix).',\n ),\n useCustomGas: z\n .boolean()\n .describe(\n 'When true, apply chain gas settings from chainDetail / customGasChainDetails instead of raw RPC estimates only.',\n ),\n chainId: z.number().int().positive().describe('EVM chain id (decimal). Becomes destinationChainID on the sign request.'),\n rpcUrl: z.string().min(1).describe('HTTPS JSON-RPC URL for gas estimation, nonce, and allowance reads.'),\n executorAddress: evmAddressSchema.describe(\n 'MPC wallet address (from keyGen ethereumaddress) — tx sender for estimates and approvals.',\n ),\n chainDetail: chainDetailSchema,\n customGasChainDetails: z\n .record(z.unknown())\n .optional()\n .describe('Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true.'),\n})\n\n/** Standard output of all `build_*_multisign` MCP tools. */\nexport const multisignOutputSchema = z\n .object({\n bodyForSign: z\n .record(z.unknown())\n .describe(\n 'POST body fields without clientSig: keyList, pubKey, msgHash, msgRaw, destinationChainID, purpose, extraJSON, proposalTxParams (batch), messageHashes/messageRawBatch when N>1 txs.',\n ),\n messageToSign: z\n .string()\n .describe('JSON.stringify(bodyForSign) — exact string to sign before adding clientSig.'),\n })\n .describe(\n 'Unsigned mpc-auth multiSignRequest payload. Sign messageToSign and POST { ...bodyForSign, clientSig, signedMessage } to /multiSignRequest.',\n )\n\n/** Loose JSON object for protocol API responses passed between MCP tools. */\nexport const jsonObjectSchema = z.record(z.unknown())\n\nexport type EvmMultisignCommonInput = z.infer<typeof evmMultisignCommonInputSchema>\nexport type MultisignOutput = z.infer<typeof multisignOutputSchema>\nexport type KeyGenMcpInput = z.infer<typeof keyGenSchema>\nexport type ChainDetailMcpInput = z.infer<typeof chainDetailSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema, jsonObjectSchema } from './common.js'\n\nexport const uniswapQuoteTradeTypeSchema = z.enum(['EXACT_INPUT', 'EXACT_OUTPUT'])\n\n/** Input for MCP tool `ctm_uniswap_v4_quote` → handler `uniswapTradeQuote`. */\nexport const mcpUniswapV4QuoteInputSchema = z.object({\n type: uniswapQuoteTradeTypeSchema.describe('EXACT_INPUT or EXACT_OUTPUT'),\n amount: z.string().min(1).describe('Amount in token-in base units (wei string for ERC-20)'),\n tokenIn: z.string().min(1).describe('Input token; 0x0 for native ETH'),\n tokenOut: z.string().min(1).describe('Output token address'),\n chainId: z.union([z.number().int().positive(), z.string().min(1)]).describe('tokenInChainId / same-chain default'),\n uniswapApiKey: z.string().min(1).describe('Uniswap Trade API x-api-key'),\n swapper: evmAddressSchema.optional().describe('MPC executor; omit if keyGen + managementNodeUrl provided'),\n slippage: z.union([z.number(), z.string()]).optional().describe('Slippage percent; omit for API auto slippage'),\n keyGen: z.string().optional().describe('KeyGen id — resolves swapper via GET /getKeyGenResultById when swapper omitted'),\n managementNodeUrl: z\n .string()\n .min(1)\n .optional()\n .describe('MPC node base URL; required with keyGen when swapper is omitted'),\n tokenInChainId: z.union([z.number(), z.string()]).optional(),\n tokenOutChainId: z.union([z.number(), z.string()]).optional(),\n permit2Disabled: z.boolean().optional(),\n baseUrl: z.string().optional(),\n universalRouterVersion: z.string().optional(),\n})\n\n/** Output: full Uniswap POST /quote JSON (dynamic shape from Trade API). */\nexport const mcpUniswapV4QuoteOutputSchema = jsonObjectSchema.describe(\n 'Full Uniswap POST /quote JSON (includes nested quote object with input/output amounts).',\n)\n\n/** Input for MCP tool `ctm_uniswap_v4_create_swap` → handler `uniswapCreateSwap`. */\nexport const mcpUniswapV4CreateSwapInputSchema = z.object({\n uniswapApiKey: z.string().min(1).describe('Uniswap Trade API key'),\n fullQuoteFromPermit: jsonObjectSchema.describe('Full quote JSON from ctm_uniswap_v4_quote'),\n swapTransactionDeadlineUnix: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('On-chain deadline unix seconds; default ~30 min from now'),\n useServerProxy: z\n .boolean()\n .optional()\n .describe('Set false in Node/agents; true only in browser via Next API route'),\n baseUrl: z.string().optional(),\n universalRouterVersion: z.string().optional(),\n})\n\nexport const mcpUniswapV4CreateSwapOutputSchema = z\n .object({\n swap: jsonObjectSchema.describe('Universal Router tx: { to, data, value, gasLimit? }'),\n requestId: z.string().optional(),\n gasFee: z.string().optional(),\n })\n .passthrough()\n .describe('{ swap: TransactionRequest, requestId?, gasFee? }')\n\nconst swapTxRequestSchema = jsonObjectSchema.describe('swap field from create_swap response (to, data, value)')\n\n/** Input for MCP tool `ctm_uniswap_v4_build_swap_multisign`. */\nexport const mcpUniswapV4BuildSwapMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n tokenIn: evmAddressSchema.describe('Token in; 0x0 for native ETH'),\n swap: swapTxRequestSchema,\n createSwapResponse: z\n .object({\n swap: swapTxRequestSchema,\n requestId: z.string().optional(),\n gasFee: z.string().optional(),\n })\n .passthrough()\n .describe('Full create_swap response'),\n fullQuoteSnapshot: jsonObjectSchema.describe('Quote JSON used for the swap'),\n swapDeadlineUnix: z.number().describe('Same deadline passed to create_swap'),\n slippagePercent: z.number().optional().describe('Extra approve headroom for EXACT_OUTPUT'),\n})\n\nexport type McpUniswapV4QuoteInput = z.infer<typeof mcpUniswapV4QuoteInputSchema>\nexport type McpUniswapV4QuoteOutput = z.infer<typeof mcpUniswapV4QuoteOutputSchema>\nexport type McpUniswapV4CreateSwapInput = z.infer<typeof mcpUniswapV4CreateSwapInputSchema>\nexport type McpUniswapV4CreateSwapOutput = z.infer<typeof mcpUniswapV4CreateSwapOutputSchema>\nexport type McpUniswapV4BuildSwapMultisignInput = z.infer<typeof mcpUniswapV4BuildSwapMultisignInputSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema } from './common.js'\n\n/** Input for MCP tool `ctm_curve_dao_build_swap_multisign`. */\nexport const mcpCurveDaoBuildSwapMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n tokenIn: evmAddressSchema.describe('ERC-20 sold (native in uses WETH path in UI)'),\n tokenOut: z.string().min(1).describe('Output token or 0xeeee… native placeholder'),\n amountHuman: z.string().min(1).describe('Human-readable amount of tokenIn'),\n slippagePercent: z\n .number()\n .gt(0)\n .lt(100)\n .describe('Slippage 0–100 exclusive'),\n})\n\nexport type McpCurveDaoBuildSwapMultisignInput = z.infer<typeof mcpCurveDaoBuildSwapMultisignInputSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema, jsonObjectSchema, multisignOutputSchema } from './common.js'\n\n/** Extend common multisign inputs with protocol-specific fields. */\nexport function mcpMultisignInput(fields: z.ZodRawShape) {\n return evmMultisignCommonInputSchema.extend(fields)\n}\n\nexport { multisignOutputSchema as mcpMultisignOutputSchema }\n\n// —— Lido ——\nexport const mcpLidoSubmitInputSchema = mcpMultisignInput({\n valueWei: z.string().min(1).describe('ETH to stake (wei decimal string)'),\n referral: evmAddressSchema.optional(),\n})\n\nexport const mcpLidoRequestWithdrawalsInputSchema = mcpMultisignInput({\n stEthAmountsWei: z.array(z.string()).min(1).describe('stETH amounts per withdrawal request (wei strings)'),\n})\n\nexport const mcpLidoClaimWithdrawalInputSchema = mcpMultisignInput({\n requestId: z.union([z.string(), z.number()]).describe('Withdrawal queue request id'),\n})\n\nexport const mcpLidoWrapStEthInputSchema = mcpMultisignInput({\n stEthAmountWei: z.string().min(1),\n})\n\nexport const mcpLidoUnwrapWstEthInputSchema = mcpMultisignInput({\n wstEthAmountWei: z.string().min(1),\n})\n\n// —— Ethena ——\nexport const mcpEthenaStakeInputSchema = mcpMultisignInput({\n usdeAmountHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaRedeemInputSchema = mcpMultisignInput({\n susdeSharesHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaCooldownInputSchema = mcpMultisignInput({\n susdeSharesHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaClaimInputSchema = mcpMultisignInput({\n susdeVault: evmAddressSchema.optional(),\n})\n\n// —— Maple ——\nexport const mcpMapleDepositInputSchema = mcpMultisignInput({\n syrupRouter: evmAddressSchema,\n pool: evmAddressSchema,\n asset: evmAddressSchema,\n amountHuman: z.string().min(1),\n authorizeSig: jsonObjectSchema.optional(),\n})\n\nexport const mcpMapleRequestRedeemInputSchema = mcpMultisignInput({\n pool: evmAddressSchema,\n sharesHuman: z.string().min(1),\n receiver: evmAddressSchema,\n})\n\n// —— Sky Lockstake ——\nexport const mcpSkyLockstakeStakeInputSchema = mcpMultisignInput({\n skyAmountHuman: z.string().min(1),\n usdsDrawHuman: z.string().optional(),\n farmRef: z.string().optional(),\n})\n\nexport const mcpSkyLockstakeDrawInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeWipeInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeCloseInputSchema = mcpMultisignInput({\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeGetRewardInputSchema = mcpMultisignInput({\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkySusdsDepositInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n})\n\nexport const mcpSkySusdsRedeemInputSchema = mcpMultisignInput({\n sharesHuman: z.string().min(1),\n})\n\n// —— Aave v4 ——\nexport const mcpAaveV4DepositInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4WithdrawInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4BorrowInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4RepayInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\n// —— Euler v2 ——\nexport const mcpEulerV2IsolatedLendInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n assetAmountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2IsolatedBorrowInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n borrowAsset: evmAddressSchema,\n collateralAmountHuman: z.string().min(1),\n loopBorrowWeis: z.array(z.string()).min(1),\n})\n\nexport const mcpEulerV2VaultWithdrawInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n sharesHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2BorrowRepayInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2CollateralDepositInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2CollateralWithdrawInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport type McpLidoSubmitInput = z.infer<typeof mcpLidoSubmitInputSchema>\nexport type McpEthenaStakeInput = z.infer<typeof mcpEthenaStakeInputSchema>\nexport type McpMapleDepositInput = z.infer<typeof mcpMapleDepositInputSchema>\nexport type McpSkyLockstakeStakeInput = z.infer<typeof mcpSkyLockstakeStakeInputSchema>\nexport type McpAaveV4DepositInput = z.infer<typeof mcpAaveV4DepositInputSchema>\nexport type McpEulerV2IsolatedLendInput = z.infer<typeof mcpEulerV2IsolatedLendInputSchema>\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nimport type { McpToolDefinition, McpToolHandler } from './mcpTypes.js'\nimport {\n mcpAaveV4BorrowInputSchema,\n mcpAaveV4DepositInputSchema,\n mcpAaveV4RepayInputSchema,\n mcpAaveV4WithdrawInputSchema,\n mcpEthenaClaimInputSchema,\n mcpEthenaCooldownInputSchema,\n mcpEthenaRedeemInputSchema,\n mcpEthenaStakeInputSchema,\n mcpEulerV2BorrowRepayInputSchema,\n mcpEulerV2CollateralDepositInputSchema,\n mcpEulerV2CollateralWithdrawInputSchema,\n mcpEulerV2IsolatedBorrowInputSchema,\n mcpEulerV2IsolatedLendInputSchema,\n mcpEulerV2VaultWithdrawInputSchema,\n mcpLidoClaimWithdrawalInputSchema,\n mcpLidoRequestWithdrawalsInputSchema,\n mcpLidoSubmitInputSchema,\n mcpLidoUnwrapWstEthInputSchema,\n mcpLidoWrapStEthInputSchema,\n mcpMapleDepositInputSchema,\n mcpMapleRequestRedeemInputSchema,\n mcpMultisignOutputSchema,\n mcpSkyLockstakeCloseInputSchema,\n mcpSkyLockstakeDrawInputSchema,\n mcpSkyLockstakeGetRewardInputSchema,\n mcpSkyLockstakeStakeInputSchema,\n mcpSkyLockstakeWipeInputSchema,\n mcpSkySusdsDepositInputSchema,\n mcpSkySusdsRedeemInputSchema,\n} from './schemas/protocols.js'\n\nfunction defineProtocolMcpTool<TInput>(def: {\n name: string\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n description: string\n prerequisites: string[]\n followUp: string[]\n inputZod: z.ZodType<TInput>\n handler: McpToolHandler\n}): McpToolDefinition<TInput, z.infer<typeof mcpMultisignOutputSchema>> {\n return {\n ...def,\n outputZod: mcpMultisignOutputSchema,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(mcpMultisignOutputSchema),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => mcpMultisignOutputSchema.parse(data),\n }\n}\n\n/** MCP tools for Lido, Ethena, Maple, Sky, Aave v4, and Euler v2 multisign builders. */\nexport const MCP_PROTOCOL_TOOL_DEFINITIONS = [\n defineProtocolMcpTool({\n name: 'ctm_lido_build_submit_multisign',\n actionId: 'lido.submit',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build mpc-auth multiSignRequest for Lido ETH stake (submit).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoSubmit' },\n inputZod: mcpLidoSubmitInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_request_withdrawals_multisign',\n actionId: 'lido.request-withdrawals',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build batch for Lido withdrawal queue (approve + requestWithdrawals).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoRequestWithdrawals' },\n inputZod: mcpLidoRequestWithdrawalsInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_claim_withdrawal_multisign',\n actionId: 'lido.claim-withdrawal',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build tx for Lido claimWithdrawal.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoClaimWithdrawal' },\n inputZod: mcpLidoClaimWithdrawalInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_wrap_steth_multisign',\n actionId: 'lido.wrap-steth',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build batch for wstETH wrap.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoWrapStEth' },\n inputZod: mcpLidoWrapStEthInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_unwrap_wsteth_multisign',\n actionId: 'lido.unwrap-wsteth',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build tx for wstETH unwrap.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoUnwrapWstEth' },\n inputZod: mcpLidoUnwrapWstEthInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_stake_multisign',\n actionId: 'ethena.stake-usde',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build batch: USDe approve + sUSDe deposit.',\n prerequisites: ['keyGen', 'executorAddress', 'Ethereum mainnet RPC'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaUsdeStakeToSusde' },\n inputZod: mcpEthenaStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_redeem_multisign',\n actionId: 'ethena.redeem-susde',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build sUSDe redeem when cooldown is off.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaSusdeRedeemToUsde' },\n inputZod: mcpEthenaRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_cooldown_multisign',\n actionId: 'ethena.cooldown-shares',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build sUSDe cooldownShares batch step.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaSusdeCooldownShares' },\n inputZod: mcpEthenaCooldownInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_claim_multisign',\n actionId: 'ethena.claim-unstake',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build unstake claim after cooldown.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaUnstakeClaim' },\n inputZod: mcpEthenaClaimInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_maple_build_deposit_multisign',\n actionId: 'maple-syrup.deposit',\n protocolId: 'maple-syrup',\n chainCategory: 'evm',\n description: 'Build Maple Syrup router deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'router + pool addresses'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/maple', exportName: 'buildEvmMultisignBodyMapleSyrupDeposit' },\n inputZod: mcpMapleDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_maple_build_request_redeem_multisign',\n actionId: 'maple-syrup.request-redeem',\n protocolId: 'maple-syrup',\n chainCategory: 'evm',\n description: 'Build Maple PoolV2 requestRedeem batch.',\n prerequisites: ['keyGen', 'executorAddress', 'pool address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/maple', exportName: 'buildEvmMultisignBodyMaplePoolRequestRedeem' },\n inputZod: mcpMapleRequestRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_stake_multisign',\n actionId: 'sky.lockstake-stake',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Sky Lockstake open/stake batch.',\n prerequisites: ['keyGen', 'executorAddress', 'Ethereum mainnet RPC'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeStakePositionBatch' },\n inputZod: mcpSkyLockstakeStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_draw_multisign',\n actionId: 'sky.lockstake-draw',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake draw (borrow USDS).',\n prerequisites: ['keyGen', 'executorAddress', 'open urn'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeDrawBatch' },\n inputZod: mcpSkyLockstakeDrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_wipe_multisign',\n actionId: 'sky.lockstake-wipe',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake repay/wipe batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeWipeBatch' },\n inputZod: mcpSkyLockstakeWipeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_close_multisign',\n actionId: 'sky.lockstake-close',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake close position batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeCloseBatch' },\n inputZod: mcpSkyLockstakeCloseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_get_reward_multisign',\n actionId: 'sky.lockstake-get-reward',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake getReward batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeGetRewardBatch' },\n inputZod: mcpSkyLockstakeGetRewardInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_susds_deposit_multisign',\n actionId: 'sky.susds-deposit',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build USDS → sUSDS ERC-4626 deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkySusdsDepositFromUsdsBatch' },\n inputZod: mcpSkySusdsDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_susds_redeem_multisign',\n actionId: 'sky.susds-redeem',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build sUSDS redeem to USDS batch.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkySusdsRedeemToUsdsBatch' },\n inputZod: mcpSkySusdsRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_deposit_multisign',\n actionId: 'aave-v4.deposit',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke supply/deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4DepositBatch' },\n inputZod: mcpAaveV4DepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_withdraw_multisign',\n actionId: 'aave-v4.withdraw',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke withdraw batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeWithdraw' },\n inputZod: mcpAaveV4WithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_borrow_multisign',\n actionId: 'aave-v4.borrow',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke borrow batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeBorrow' },\n inputZod: mcpAaveV4BorrowInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_repay_multisign',\n actionId: 'aave-v4.repay',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke repay batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeRepay' },\n inputZod: mcpAaveV4RepayInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_isolated_lend_multisign',\n actionId: 'euler-v2.isolated-lend',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 vault deposit/lend batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch' },\n inputZod: mcpEulerV2IsolatedLendInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_isolated_borrow_multisign',\n actionId: 'euler-v2.isolated-borrow',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 isolated borrow loop batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2IsolatedBorrowBatch' },\n inputZod: mcpEulerV2IsolatedBorrowInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_vault_withdraw_multisign',\n actionId: 'euler-v2.vault-withdraw',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 vault withdraw/redeem batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2VaultWithdraw' },\n inputZod: mcpEulerV2VaultWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_borrow_repay_multisign',\n actionId: 'euler-v2.borrow-repay',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow repay batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowRepayBatch' },\n inputZod: mcpEulerV2BorrowRepayInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_collateral_deposit_multisign',\n actionId: 'euler-v2.collateral-deposit',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow collateral deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral asset'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch' },\n inputZod: mcpEulerV2CollateralDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_collateral_withdraw_multisign',\n actionId: 'euler-v2.collateral-withdraw',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow collateral withdraw batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral asset'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch' },\n inputZod: mcpEulerV2CollateralWithdrawInputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\nimport { getProtocolModules } from '../core/registry.js'\nimport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nimport type { McpToolDefinition, McpToolHandler } from './mcpTypes.js'\nimport {\n mcpCurveDaoBuildSwapMultisignInputSchema,\n mcpUniswapV4BuildSwapMultisignInputSchema,\n mcpUniswapV4CreateSwapInputSchema,\n mcpUniswapV4CreateSwapOutputSchema,\n mcpUniswapV4QuoteInputSchema,\n mcpUniswapV4QuoteOutputSchema,\n multisignOutputSchema,\n} from './schemas/index.js'\nimport { MCP_PROTOCOL_TOOL_DEFINITIONS } from './mcpProtocolTools.js'\n\nexport type { McpJsonSchema, McpSchemaProperty, McpToolHandler, McpToolDefinition } from './mcpTypes.js'\n\nfunction defineMcpTool<TInput, TOutput>(def: {\n name: string\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n description: string\n prerequisites: string[]\n followUp: string[]\n inputZod: z.ZodType<TInput>\n outputZod: z.ZodType<TOutput>\n handler: McpToolHandler\n}): McpToolDefinition<TInput, TOutput> {\n return {\n ...def,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(def.outputZod),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => def.outputZod.parse(data),\n }\n}\n\n/** Curated MCP tools — Uniswap/Curve core + all protocol multisign builders. */\nconst CORE_MCP_TOOL_DEFINITIONS = [\n defineMcpTool({\n name: 'ctm_uniswap_v4_quote',\n actionId: 'uniswap-v4.quote',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Fetch a Uniswap V4 Trade API quote (POST /v1/quote). Returns classic quote JSON including quote.input/output amounts and routing. Does NOT create a sign request — use ctm_uniswap_v4_create_swap and ctm_uniswap_v4_build_swap_multisign after quoting. Requires uniswapApiKey and swapper (MPC executor address) or keyGen + managementNodeUrl to resolve swapper.',\n prerequisites: ['Chain must be supported by Uniswap V4 (Universal Router map).'],\n followUp: ['ctm_uniswap_v4_create_swap', 'ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapTradeQuote' },\n inputZod: mcpUniswapV4QuoteInputSchema,\n outputZod: mcpUniswapV4QuoteOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_create_swap',\n actionId: 'uniswap-v4.create-swap',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Call Uniswap Trade API POST /v1/swap to build Universal Router calldata from a prior quote. Returns { swap: { to, data, value, gasLimit? }, requestId? }. Does NOT produce a multiSignRequest — call ctm_uniswap_v4_build_swap_multisign next.',\n prerequisites: ['ctm_uniswap_v4_quote output (fullQuoteFromPermit)'],\n followUp: ['ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapCreateSwap' },\n inputZod: mcpUniswapV4CreateSwapInputSchema,\n outputZod: mcpUniswapV4CreateSwapOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_build_swap_multisign',\n actionId: 'uniswap-v4.swap-exact-input',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest body for a Uniswap V4 swap. May batch 1–3 EVM txs: ERC-20 approve(s) to Permit2/router path + Universal Router swap (or 1 tx for native-in). Estimates gas, serializes unsigned txs, sets proposalTxParams. Output must be signed and POSTed to /multiSignRequest by the caller.',\n prerequisites: [\n 'ctm_uniswap_v4_create_swap output',\n 'keyGen with pubkeyhex',\n 'executorAddress matching MPC wallet',\n 'RPC URL and chainDetail from node chain config',\n ],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig and signedMessage'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'buildEvmMultisignBodyUniswapV4SkipPermit2Batch' },\n inputZod: mcpUniswapV4BuildSwapMultisignInputSchema,\n outputZod: multisignOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_curve_dao_build_swap_multisign',\n actionId: 'curve-dao.swap',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest for a Curve Router NG swap via @curvefi/api populateSwap. Optionally batches ERC-20 approve txs when allowance is insufficient, then exchange. Requires JSON-RPC and Curve-supported chain.',\n prerequisites: ['keyGen', 'executorAddress', 'tokenIn/tokenOut/amountHuman/slippage', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig and signedMessage'],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'buildEvmMultisignBodyCurveDaoBatch' },\n inputZod: mcpCurveDaoBuildSwapMultisignInputSchema,\n outputZod: multisignOutputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n\nexport const MCP_TOOL_DEFINITIONS: readonly McpToolDefinition[] = [\n ...CORE_MCP_TOOL_DEFINITIONS,\n ...MCP_PROTOCOL_TOOL_DEFINITIONS,\n]\n\nfunction buildToolSchemaMap(kind: 'input' | 'output'): Record<string, z.ZodType> {\n const out: Record<string, z.ZodType> = {}\n for (const tool of MCP_TOOL_DEFINITIONS) {\n out[tool.name] = kind === 'input' ? tool.inputZod : tool.outputZod\n }\n return out\n}\n\n/** Map tool name → input Zod schema (for typed dispatch in MCP servers). */\nexport const MCP_TOOL_INPUT_SCHEMAS = buildToolSchemaMap('input')\n\n/** Map tool name → output Zod schema. */\nexport const MCP_TOOL_OUTPUT_SCHEMAS = buildToolSchemaMap('output')\n\n/** Union of registered MCP tool names. */\nexport type McpToolName = (typeof MCP_TOOL_DEFINITIONS)[number]['name']\n\nexport type McpToolInputMap = {\n [K in McpToolName]: z.infer<(typeof MCP_TOOL_INPUT_SCHEMAS)[K]>\n}\n\nexport type McpToolOutputMap = {\n [K in McpToolName]: z.infer<(typeof MCP_TOOL_OUTPUT_SCHEMAS)[K]>\n}\n\nexport function getMcpToolDefinitions(): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS\n}\n\nexport function getMcpToolByName(name: string): McpToolDefinition | undefined {\n return MCP_TOOL_DEFINITIONS.find((t) => t.name === name)\n}\n\nexport function getMcpToolInputSchema(name: McpToolName): z.ZodType {\n const schema = MCP_TOOL_INPUT_SCHEMAS[name]\n if (!schema) throw new Error(`Unknown MCP tool: ${name}`)\n return schema\n}\n\nexport function getMcpToolOutputSchema(name: McpToolName): z.ZodType {\n const schema = MCP_TOOL_OUTPUT_SCHEMAS[name]\n if (!schema) throw new Error(`Unknown MCP tool: ${name}`)\n return schema\n}\n\n/** Parse and validate MCP tool arguments with the registered Zod schema. */\nexport function parseMcpToolInput(name: McpToolName, data: unknown): unknown {\n return getMcpToolInputSchema(name).parse(data)\n}\n\n/** Parse and validate MCP tool handler output. */\nexport function parseMcpToolOutput(name: McpToolName, data: unknown): unknown {\n return getMcpToolOutputSchema(name).parse(data)\n}\n\n/** Summary from protocol registry (shorter) plus full MCP tool list. */\nexport function getAgentCatalogForMcp() {\n return {\n tools: MCP_TOOL_DEFINITIONS,\n protocols: getProtocolModules(),\n commonParams: EVM_COMMON_PARAM_DOCS,\n multisignOutput: MULTISIGN_OUTPUT_DOC,\n managementSig: MANAGEMENT_SIG_DOC,\n /** Zod schemas for MCP tool I/O — source of truth for continuum-mcp-server validation. */\n inputSchemas: MCP_TOOL_INPUT_SCHEMAS,\n outputSchemas: MCP_TOOL_OUTPUT_SCHEMAS,\n workflow: {\n evmSwapTypical: [\n '1. Quote (protocol-specific API if needed)',\n '2. Build protocol calldata (e.g. create_swap)',\n '3. build_*_multisign → { bodyForSign, messageToSign }',\n '4. Sign messageToSign (MetaMask or Ed25519)',\n '5. POST /multiSignRequest with clientSig and signedMessage',\n ],\n managementPostTypical: [\n '1. GET /getNodeKey → nodeKey (128 hex)',\n '2. GET /getPublicMgtKeyNonce or /getNodeMgtKeyNonce → nonce',\n '3. buildManagementPostBody(nonce, nodeKey, { …endpoint fields })',\n '4. messageToSignManagementBody(body) → sign → withManagementClientSig(body, sig)',\n '5. POST management route with signed body (no signedMessage field except configUpdateImplement opaque line)',\n ],\n agentMultisignTypical: [\n '1. load_defi_protocol for the target protocol',\n '2. get_defi_protocol_supported_chains / get_token_registry to pick chainId and tokens',\n '3. MCP build_* tool with keyGenId + chainId → { requestId }',\n '4. Base MCP: wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result',\n ],\n },\n }\n}\n","import { getAddress, zeroAddress, type Address } from 'viem'\n\n/** Lido staking / stERC-20 (“stETH”) on Ethereum mainnet — same proxy for `submit` + ERC‑20 balances. */\nexport const LIDO_STETH_CONTRACT_MAINNET = getAddress(\n '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n)\n\n/** Lido Wrapped stETH (ERC-20): `wrap` / `unwrap`. */\nexport const LIDO_WSTETH_CONTRACT_MAINNET = getAddress(\n '0x7f39C581F595B853cBbF37C12FfeeA971C5a5bEa',\n)\n\n/** EIP-7623-era Withdrawal Queue (NFT-backed requests). */\nexport const LIDO_WITHDRAWAL_QUEUE_MAINNET = getAddress('0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1')\n\nexport const LIDO_ETHEREUM_MAINNET_CHAIN_ID = 1\n\n/** Accepted referral pad for `submit`; zero is valid. */\nexport const LIDO_SUBMIT_REFERRAL_MAINNET = zeroAddress satisfies Address\n\nexport function isEthereumMainnetChainId(chainIdStr: string | undefined | null): boolean {\n return String(chainIdStr ?? '').trim() === String(LIDO_ETHEREUM_MAINNET_CHAIN_ID)\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { LIDO_ETHEREUM_MAINNET_CHAIN_ID } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './multisign.js'\n\nexport const LIDO_PROTOCOL_ID = 'lido'\n\nexport const lidoProtocolModule: ProtocolModule = {\n id: LIDO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return Number(ctx.chainId) === LIDO_ETHEREUM_MAINNET_CHAIN_ID\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'lido.submit', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake ETH via Lido submit()', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { valueWei: { type: 'string', required: true, description: 'ETH to stake (wei string)' } } },\n { id: 'lido.request-withdrawals', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Queue stETH withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.claim-withdrawal', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim finalized withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.wrap-steth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Wrap stETH to wstETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.unwrap-wsteth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Unwrap wstETH to stETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(lidoProtocolModule)\n","/**\n * Ethena USDe (synthetic USD) — published contract addresses and EVM chain coverage.\n * @see https://docs.ethena.fi/solution-design/key-addresses\n */\nimport { getAddress } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nexport const ETHENA_LABS_GITHUB = 'https://github.com/ethena-labs'\nexport const ETHENA_KEY_ADDRESSES_DOC = 'https://docs.ethena.fi/solution-design/key-addresses'\n\nexport const USDE_ETHEREUM_MAINNET = '0x4c9edd5852cd905f086c759e8383e09bff1e68b3' as const\n/** sUSDe (StakedUSDe / ERC-4626 vault share) on Ethereum mainnet. @see Ethena key addresses */\nexport const SUSDE_ETHEREUM_MAINNET = '0x9d39a5de30e57443bff2a8307a4256c8797a3497' as const\n/** “Most L2s” in Ethena’s key-addresses table (same bytecode address on many networks). */\nexport const USDE_MOST_L2S = '0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34' as const\nexport const USDE_ZKSYNC_ERA = '0x39Fe7a0DACcE31Bd90418e3e659fb0b5f0B3Db0d' as const\n\nconst L2_SAME_ADDRESS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 42161, // Arbitrum One\n 10, // Optimism\n 8453, // Base\n 56, // BNB Chain\n 59144, // Linea\n 5000, // Mantle\n 81457, // Blast\n 169, // Manta Pacific\n 534352, // Scroll\n 252, // Fraxtal\n 34443, // Mode\n 196, // X Layer\n 1088, // Metis\n 80084, // Berachain\n 2222, // Kava\n 2818, // Morph\n 1923, // Swell\n 48900, // Zircuit\n])\n\n/** Human-readable default label when the node’s chain list has no name for that id. */\nconst FALLBACK_NAME_BY_ID: Readonly<Record<number, string>> = {\n 1: 'Ethereum',\n 42161: 'Arbitrum One',\n 10: 'Optimism',\n 8453: 'Base',\n 56: 'BNB Chain',\n 59144: 'Linea',\n 5000: 'Mantle',\n 81457: 'Blast',\n 169: 'Manta Pacific',\n 534352: 'Scroll',\n 252: 'Fraxtal',\n 34443: 'Mode',\n 196: 'X Layer',\n 1088: 'Metis',\n 80084: 'Berachain',\n 2222: 'Kava',\n 2818: 'Morph',\n 1923: 'Swell',\n 48900: 'Zircuit',\n 324: 'ZKSync Era',\n}\n\n/**\n * USDe address on a chain, or `null` if we do not model USDe for that EVM id (e.g. testnets / unlisted L2s).\n */\nexport function usdeTokenAddressOnEvmChain(chainId: number): `0x${string}` | null {\n if (chainId === 1) return USDE_ETHEREUM_MAINNET\n if (chainId === 324) return USDE_ZKSYNC_ERA\n if (L2_SAME_ADDRESS_CHAIN_IDS.has(chainId)) return USDE_MOST_L2S\n return null\n}\n\nexport function isEthenaUsdeOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = usdeTokenAddressOnEvmChain(n)\n if (!expected) return false\n try {\n return getAddress(contractAddress) === getAddress(expected)\n } catch {\n return false\n }\n}\n\nexport type EthenaUsdeEvmNetworkRow = {\n chainId: number\n /** Static fallback; UI may prefer a name from the node’s chain list. */\n label: string\n usde: `0x${string}`\n}\n\n/**\n * EVM mainnets with a known USDe deployment for the “networks” table in the Ethena dialog.\n * ZKSync uses a different address; all other listed L2s here share `USDE_MOST_L2S`.\n */\nexport function listEthenaUsdeEvmNetworkRows(): EthenaUsdeEvmNetworkRow[] {\n const rows: EthenaUsdeEvmNetworkRow[] = [\n { chainId: 1, label: FALLBACK_NAME_BY_ID[1]!, usde: USDE_ETHEREUM_MAINNET },\n ]\n const l2 = [...L2_SAME_ADDRESS_CHAIN_IDS].sort((a, b) => a - b)\n for (const id of l2) {\n rows.push({\n chainId: id,\n label: FALLBACK_NAME_BY_ID[id] ?? `Chain ${id}`,\n usde: USDE_MOST_L2S,\n })\n }\n rows.push({ chainId: 324, label: FALLBACK_NAME_BY_ID[324]!, usde: USDE_ZKSYNC_ERA })\n return rows.sort((a, b) => {\n if (a.chainId === 1) return -1\n if (b.chainId === 1) return 1\n return a.chainId - b.chainId\n })\n}\n\nexport function isEvmChainInEthenaUsdeList(chainId: number): boolean {\n return usdeTokenAddressOnEvmChain(chainId) != null\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isEvmChainInEthenaUsdeList } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\n\nexport const ETHENA_PROTOCOL_ID = 'ethena'\n\nexport const ethenaProtocolModule: ProtocolModule = {\n id: ETHENA_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isEvmChainInEthenaUsdeList(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'ethena.stake-usde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake USDe → sUSDe', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { amountHuman: { type: 'string', required: true, description: 'USDe amount' } } },\n { id: 'ethena.redeem-susde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem sUSDe → USDe (no cooldown)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.cooldown-shares', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Start sUSDe cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.claim-unstake', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim after cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(ethenaProtocolModule)\n","/** Public Maple Syrup (PoolV2 + SyrupRouter) integration constants. */\n\n/** Attributed deposits per Maple partner guidance (`bytes32` string label). */\nexport const MAPLE_SYRUP_DEPOSIT_DATA_ASCII = '0:continuumdao'\n\nexport const MAPLE_INTEGRATION_DOCS_URL =\n 'https://docs.maple.finance/integrate/ethereum-mainnet/frontend-integration'\n\nexport function mapleGraphqlEndpointForChain(chainId: number): string | null {\n if (chainId === 1) return 'https://api.maple.finance/v2/graphql'\n if (chainId === 11155111) return 'https://sepolia.api.maple.finance/v2/graphql'\n return null\n}\n\nexport function isMapleSyrupSupportedChain(chainId: number): boolean {\n return chainId === 1 || chainId === 11155111\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isMapleSyrupSupportedChain } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\n\nexport const MAPLE_PROTOCOL_ID = 'maple-syrup'\n\nexport const mapleProtocolModule: ProtocolModule = {\n id: MAPLE_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isMapleSyrupSupportedChain(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'maple-syrup.deposit', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Maple Syrup pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'maple-syrup.request-redeem', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Request redeem from pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(mapleProtocolModule)\n","/**\n * Sky LockStake on Ethereum mainnet.\n * @see https://developers.skyeco.com/protocol/rewards/staking-engine/\n * @see https://developers.skyeco.com/guides/sky/token-governance-upgrade/key-info/ (contract list)\n */\n/** Sky (SKY token) on Ethereum mainnet. */\nexport const SKY_ETHEREUM_MAINNET = '0x56072C95FAA701256059aa122697B133aDEd9279'\nexport const SKY_ETHEREUM_MAINNET_CHAIN_ID = 1\nexport const USDS_ETHEREUM_MAINNET = '0xdC035D45d973E3EC169d2276DDab16f1e407384F'\n\n/** sUSDS ERC-4626 vault (share token); deposit USDS → mint shares, redeem shares → USDS. @see https://developers.skyeco.com/protocol/tokens/susds/ */\nexport const SUSDS_VAULT_ERC4626_MAINNET = '0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD'\n\n/**\n * Staking Engine (LockStake) — **Chief V3 / SKY** (active; `LSEV2-SKY-A` ilk). This is the contract users should call.\n * Do not use Seal Engine V1 (`0x2b16C07D…`, MKR / Chief V2 legacy); it has little traffic and is not the current SKY engine.\n * Dual entrypoints: legacy `lock`/`free` (MKR path) vs **`lockSky`/`freeSky`** for SKY collateral via `mkrSky`.\n */\nexport const SKY_LOCKSTAKE_ENGINE_MAINNET = '0xCe01C90dE7FD1bcFa39e237FE6D8D9F569e8A6a3'\n\n/**\n * Wrapped SKY used inside the urn after `lockSky`; StakingRewards farms must list this ERC-20 as `stakingToken()`.\n * @see Symbol `lsSKY`.\n */\nexport const SKY_LS_SKY_ERC20_MAINNET = '0xf9A9cfD3229E985B91F99Bc866d42938044FFa1C'\n\n/**\n * Default staking rewards farm on {@link SKY_LOCKSTAKE_ENGINE_MAINNET} — must be ACTIVE and `stakingToken() === lsSKY`.\n * (Older Seal-engine farm addresses are not whitelisted on the current engine.)\n */\nexport const SKY_LOCKSTAKE_DEFAULT_FARM_MAINNET = '0xB44C2Fb4181D7Cb06bdFf34A46FdFe4a259B40Fc'\nexport const SKY_LOCKSTAKE_DEFAULT_FARM_REF = 1\n\n/**\n * Rough UI collateral factor for “remaining borrow (USD)” estimate in the LockStake dialog only.\n * Not protocol liquidation collateralization; see `SkyLockstakeDialog` disclosures.\n */\nexport const SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR = 0.65\n\nexport const SKY_TOKEN_DECIMALS = 18\nexport const USDS_DECIMALS = 18\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { SKY_ETHEREUM_MAINNET_CHAIN_ID } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './lockstakeMultisign.js'\nexport * from './susdsMultisign.js'\n\nexport const SKY_PROTOCOL_ID = 'sky'\n\nexport const skyProtocolModule: ProtocolModule = {\n id: SKY_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return Number(ctx.chainId) === SKY_ETHEREUM_MAINNET_CHAIN_ID\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'sky.lockstake-stake', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Open Lockstake position', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-draw', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow USDS from Lockstake', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-wipe', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Lockstake debt', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-close', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Close Lockstake position', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.susds-deposit', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit USDS into sUSDS vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.susds-redeem', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem sUSDS to USDS', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(skyProtocolModule)\n","import { getAddress, isAddress } from 'viem'\n\nexport const AAVE_V4_GRAPHQL_URL = 'https://api.v4.aave.com/graphql'\n\ntype GqlError = { message?: string }\n\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function aaveV4Gql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const r = await fetch(AAVE_V4_GRAPHQL_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ query, variables: variables ?? {} }),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Aave V4 API HTTP ${r.status}: ${t.slice(0, 200)}` : `Aave V4 API HTTP ${r.status}`)\n }\n const j = (await r.json()) as GqlData<T> & { errors?: GqlError[] }\n if (j.errors?.length) {\n const msg = j.errors.map((e) => e.message ?? 'Unknown').join('; ')\n throw new Error(msg)\n }\n if (j.data == null) {\n throw new Error('Aave V4 API: empty response')\n }\n return j.data\n}\n\ntype ChainRowV4 = { chainId: number; name?: string | null; nativeWrappedToken?: string | null }\n\nexport async function fetchAaveV4Chains(): Promise<readonly ChainRowV4[]> {\n const d = await aaveV4Gql<{ chains: ChainRowV4[] }>(`\n query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }\n `, { c: { query: { filter: 'ALL' } } })\n return d.chains ?? []\n}\n\n/**\n * Aave v4: supported EVM chain IDs (from {@link fetchAaveV4Chains}).\n */\nexport async function loadAaveV4SupportedChainIdsFromV4Api(): Promise<ReadonlySet<number>> {\n const rows = await fetchAaveV4Chains()\n const s = new Set<number>()\n for (const c of rows) s.add(c.chainId)\n return s\n}\n\nconst RESERVES_ADDRESS_FRAGMENT = `\n asset { underlying { address } }\n`\n\nexport type V4ReservesListRow = {\n id: string\n onChainId?: string | null\n spoke?: {\n address: string\n name?: string | null\n liquidationConfig?: { targetHealthFactor: string; healthFactorForMaxBonus: string } | null\n } | null\n summary: {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n }\n userState: {\n balance: { amount: { value: string; decimals: number } } | null\n borrowable?: { amount: { value: string; decimals: number } } | null\n } | null\n}\n\nexport function aggregateV4SupplyDisplay(\n symbolForDisplay: string,\n rows: readonly V4ReservesListRow[],\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n const sym = (symbolForDisplay ?? '').trim()\n const withSuffix = (n: string) => (n === '—' ? '—' : sym ? `${n} ${sym}` : n)\n\n if (!rows.length) {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n\n const apy = formatV4SupplyApy(rows)\n\n const sumKey = (key: 'supplied' | 'borrowed') =>\n sumNumberValues(\n rows.map((r) => {\n const v = key === 'supplied' ? r.summary?.supplied?.amount : r.summary?.borrowed?.amount\n return (v?.value ?? '').trim()\n }),\n )\n\n const totalSupN = sumKey('supplied')\n const totalBorN = sumKey('borrowed')\n const totalDeposits =\n totalSupN == null ? '—' : withSuffix(formatAaveV4TokenAmount(totalSupN))\n\n const availableLiquidity = (() => {\n if (totalSupN == null || totalBorN == null) return '—'\n const a = totalSupN - totalBorN\n if (!Number.isFinite(a)) return '—'\n return withSuffix(formatAaveV4TokenAmount(a < 0 ? 0 : a))\n })()\n\n const userN = userSupplyBalanceNumber(rows)\n const depositedAmount = userN == null ? '—' : withSuffix(formatAaveV4TokenAmount(userN))\n\n return { depositedAmount, apy, totalDeposits, availableLiquidity }\n}\n\nfunction sumNumberValues(values: ReadonlyArray<string>): number | null {\n if (!values.length) return null\n let s = 0\n for (const v of values) {\n const n = parseFloat(v)\n if (Number.isFinite(n)) s += n\n }\n return s\n}\n\n/**\n * Formats a token notional for display: uses k (≥1k) and M (≥1M) with a few decimal places, otherwise limited decimals.\n * Safe to reuse outside the Aave V4 dialog (e.g. tables, tooltips).\n */\nexport function formatAaveV4TokenAmount(n: number): string {\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n const sign = n < 0 ? '-' : ''\n const a = Math.abs(n)\n const strip = (s: string) => s.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n\n if (a >= 1_000_000) {\n return sign + strip((a / 1_000_000).toFixed(2)) + 'M'\n }\n if (a >= 1000) {\n const k = a / 1000\n const d = k >= 100 ? 1 : 2\n return sign + strip(k.toFixed(d)) + 'k'\n }\n if (a >= 1) {\n return sign + strip(a.toFixed(2))\n }\n if (a >= 0.0001) {\n return sign + strip(a.toFixed(4))\n }\n return sign + a.toExponential(2)\n}\n\n/**\n * Human-readable notional for Aave v4 API decimal strings (reserve amounts, user debt, etc.).\n * Use this for all “display from GraphQL `value`” paths so formatting stays consistent.\n */\nexport function formatAaveV4AmountHumanFromApiString(raw: string | null | undefined): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = parseFloat(s)\n if (!Number.isFinite(n)) return '—'\n return formatAaveV4TokenAmount(n)\n}\n\n/**\n * Unnamed reserve liquidity: supplied − borrowed (both API decimal strings, same unit).\n */\nexport function formatAaveV4ReserveLiquidityFromSummary(args: {\n suppliedValue: string | null | undefined\n borrowedValue: string | null | undefined\n}): string {\n const a = parseFloat(String(args.suppliedValue ?? '').trim())\n const b = parseFloat(String(args.borrowedValue ?? '').trim())\n if (!Number.isFinite(a) || !Number.isFinite(b)) return '—'\n return formatAaveV4TokenAmount(Math.max(0, a - b))\n}\n\nfunction userSupplyBalanceNumber(rows: readonly V4ReservesListRow[]): number | null {\n const vals = rows\n .map((r) => (r.userState?.balance?.amount?.value ?? '').trim())\n .filter((v) => v.length > 0)\n if (!vals.length) return null\n const u = new Set(vals)\n if (u.size === 1) {\n const n = parseFloat(vals[0]!)\n return Number.isFinite(n) ? n : null\n }\n const sum = vals.reduce((acc, b) => acc + (parseFloat(b) || 0), 0)\n return Number.isFinite(sum) ? sum : null\n}\n\nfunction formatV4SupplyApy(rows: readonly V4ReservesListRow[]): string {\n if (!rows.length) return '—'\n const weighted: { w: number; apy: number }[] = []\n for (const r of rows) {\n const sup = parseFloat((r.summary?.supplied?.amount?.value ?? '').trim())\n const norm = (r.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(norm)\n if (Number.isFinite(n) && Number.isFinite(sup) && sup > 0) {\n weighted.push({ w: sup, apy: n })\n }\n }\n if (weighted.length) {\n const tw = weighted.reduce((a, x) => a + x.w, 0)\n if (tw > 0) {\n const x = weighted.reduce((a, x) => a + x.w * x.apy, 0) / tw\n if (x >= 0.01) return `${x.toFixed(2)}%`\n if (x > 0) return `${x.toFixed(4)}%`\n return '0%'\n }\n }\n const any = (rows[0]?.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(any)\n if (!Number.isFinite(n)) return '—'\n if (n >= 0.01) return `${n.toFixed(2)}%`\n if (n > 0) return `${n.toFixed(4)}%`\n return '0%'\n}\n\nexport async function fetchAaveV4NativeWrappedToken(chainId: number): Promise<string | null> {\n const all = await fetchAaveV4Chains()\n const c = all.find((x) => x.chainId === chainId)\n const t = (c?.nativeWrappedToken ?? '').trim()\n if (t && isAddress(t)) return getAddress(t)\n return null\n}\n\n/**\n * All underlying token addresses (lowercased checksummed form for lookup: store lowercase) listed as reserves on the chain.\n */\nexport async function fetchAaveV4SupportedUnderlyingAddressSet(chainId: number): Promise<ReadonlySet<string>> {\n const d = await aaveV4Gql<{\n reserves: ReadonlyArray<{ asset: { underlying: { address: string } } }>\n }>(\n `\n query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }\n `,\n {\n r: {\n query: { chainIds: [chainId] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n const s = new Set<string>()\n for (const r of d.reserves ?? []) {\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (a && isAddress(a)) s.add(a.toLowerCase())\n }\n return s\n}\n\nfunction erc20Input(address: `0x${string}`, chainId: number) {\n return { address, chainId }\n}\n\nexport async function fetchAaveV4ReservesForUnderlying(args: {\n chainId: number\n underlying: `0x${string}`\n user?: `0x${string}` | null\n}): Promise<readonly V4ReservesListRow[]> {\n const d = await aaveV4Gql<{ reserves: V4ReservesListRow[] }>(\n `\n query S($r: ReservesRequest!) {\n reserves(request: $r) {\n id\n onChainId\n spoke { address name liquidationConfig { targetHealthFactor healthFactorForMaxBonus } }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n }\n userState {\n balance { amount { value decimals } }\n borrowable { amount { value decimals } }\n }\n }\n }\n `,\n {\n r: {\n query: { tokens: [erc20Input(args.underlying, args.chainId)] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n ...(args.user ? { user: args.user } : {}),\n },\n },\n )\n return d.reserves ?? []\n}\n\n/**\n * Reserve row for a hub asset on the same Aave v4 **Spoke** as the user’s collateral (same as {@link useAaveV4DepositCollateralInfo}’s `collateralForAsset`).\n * Needed so borrow/repay multi-sign uses the same spoke as the user’s position.\n */\nexport function pickAaveV4ReserveRowForSpoke(\n rows: readonly V4ReservesListRow[],\n spokeAddress: `0x${string}`,\n): V4ReservesListRow | null {\n const want = getAddress(spokeAddress).toLowerCase()\n for (const r of rows) {\n const a = (r.spoke?.address ?? '').trim()\n if (!a) continue\n try {\n if (getAddress(a as `0x${string}`).toLowerCase() === want) return r\n } catch {\n continue\n }\n }\n return null\n}\n\nexport function aaveV4KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype AaveV4ChainTokenCache = {\n supportedUnderlying: ReadonlySet<string>\n nativeWrapped: string | null\n}\n\nconst aaveV4ChainTokenCache = new Map<number, Promise<AaveV4ChainTokenCache>>()\n\n/**\n * Fetches and caches (per process) the list of Aave v4 underlying addresses on a chain and the wrapped native token.\n */\nexport function ensureAaveV4ChainTokenCache(chainId: number): Promise<AaveV4ChainTokenCache> {\n const hit = aaveV4ChainTokenCache.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const [nativeWrapped, supportedUnderlying] = await Promise.all([\n fetchAaveV4NativeWrappedToken(chainId),\n fetchAaveV4SupportedUnderlyingAddressSet(chainId),\n ])\n return { supportedUnderlying, nativeWrapped }\n })()\n aaveV4ChainTokenCache.set(chainId, p)\n return p\n}\n\n// —— Hubs, collateral, borrowable (per UI “market” / Aave v4 pool) ——————————————\n\n/** UI market segment; maps to Aave v4 `Hub` by name (e.g. Plus ≈ “Main”, Core, Prime ≈ “Bluechip”). */\nexport type AaveV4UiMarketId = 'main' | 'core' | 'bluechip'\n\nexport type AaveV4Hub = {\n name: string\n address: `0x${string}`\n chain: { chainId: number; name?: string | null }\n}\n\n/** `summary` is included for hub `reserves` (market borrow/supply TVL, APYs). */\nexport type AaveV4HubReserveSummary = {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n borrowApy: { normalized: string; value: string }\n}\n\nexport type AaveV4HubReserve = {\n canBorrow: boolean\n canUseAsCollateral: boolean\n canSupply: boolean\n /** Spoke contract to call for `supply` on this reserve. */\n spoke: { address: string } | null\n settings: {\n borrowable: boolean\n collateral: boolean\n collateralFactor: { normalized: string; value: string }\n collateralRisk: { normalized: string; value: string }\n }\n asset: {\n underlying: {\n address: string\n info: { name: string; symbol: string; icon: string | null } | null\n }\n }\n /** Present when using the extended hub reserves query (borrow tab, market TVL). */\n summary?: AaveV4HubReserveSummary | null\n}\n\nconst aaveV4HubsByChain = new Map<number, Promise<readonly AaveV4Hub[]>>()\nconst aaveV4HubReserves = new Map<string, Promise<readonly AaveV4HubReserve[]>>()\n\nfunction hubReservesKey(chainId: number, hub: `0x${string}`) {\n return `v3spoke+summary:${chainId}:${hub.toLowerCase()}`\n}\n\nexport async function fetchAaveV4HubsForChain(chainId: number): Promise<readonly AaveV4Hub[]> {\n const hit = aaveV4HubsByChain.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ hubs: AaveV4Hub[] }>(\n `query F($h: HubsRequest!) { hubs(request: $h) { name address chain { chainId name } } }`,\n { h: { query: { chainIds: [chainId] } } },\n )\n const out = (d.hubs ?? []).map((h) => ({\n name: h.name,\n address: getAddress((h.address ?? '').trim() as `0x${string}`) as `0x${string}`,\n chain: h.chain,\n }))\n return out\n })()\n aaveV4HubsByChain.set(chainId, p)\n return p\n}\n\n/**\n * Resolves which Aave v4 hub (Core / Plus / Prime, etc.) a UI “market” refers to.\n * Main → Plus, Core → Core, Bluechip → Prime.\n */\nexport function resolveAaveV4HubForUiMarket(\n hubs: readonly AaveV4Hub[],\n market: AaveV4UiMarketId,\n chainId: number,\n): AaveV4Hub | null {\n const on = hubs.filter((h) => h.chain.chainId === chainId)\n if (!on.length) return null\n const find = (names: string[]) => {\n const set = new Set(names.map((n) => n.toLowerCase()))\n return on.find((h) => set.has((h.name ?? '').trim().toLowerCase())) ?? null\n }\n if (market === 'core') return find(['core'])\n if (market === 'bluechip') return find(['prime', 'bluechip', 'institutional'])\n // main: prefer Plus; fall back to common names, then first hub\n return find(['plus', 'main', 'default']) ?? on[0] ?? null\n}\n\n/**\n * Inverse of {@link resolveAaveV4HubForUiMarket} label mapping, for switching UI market when a hub is chosen by\n * “first hub on chain that lists this underlying”.\n */\nexport function aaveV4UiMarketIdForHubName(hubName: string): AaveV4UiMarketId {\n const n = (hubName ?? '').trim().toLowerCase()\n if (n === 'core') return 'core'\n if (n === 'plus' || n === 'main' || n === 'default') return 'main'\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 'bluechip'\n return 'main'\n}\n\n/**\n * When more than one hub lists the same underlying, the ideal hub is the one that matches the user’s *actual*\n * position (supply/debt on that hub’s Spoke). We don’t have that signal here, so we use a **deterministic** order after\n * {@link aaveV4UiMarketIdForHubName}: Core → Main/Plus → Bluechip/Prime (then name) so the choice is not tied to\n * GraphQL list order. Callers with wallet/user data can later prefer a hub whose Spoke appears in\n * `fetchAaveV4ReservesForUnderlying` with non-zero `userState`.\n */\nfunction aaveV4HubAutoPickTiebreakOrder(a: AaveV4Hub, b: AaveV4Hub): number {\n const rank = (name: string) => {\n const n = (name ?? '').trim().toLowerCase()\n if (n === 'core') return 0\n if (n === 'plus' || n === 'main' || n === 'default') return 1\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 2\n return 3\n }\n const ra = rank(a.name)\n const rb = rank(b.name)\n if (ra !== rb) return ra - rb\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\ntype AaveV4HubCollateralCandidate = {\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n}\n\n/**\n * Sort key for “which borrow is cheaper” on a **debt** reserve row. Lower is better; missing data sorts last.\n */\nfunction aaveV4HubReserveBorrowApyForSort(r: AaveV4HubReserve | null | undefined): number {\n if (!r) return Number.POSITIVE_INFINITY\n const norm = parseFloat((r.summary?.borrowApy?.normalized ?? '').trim())\n if (Number.isFinite(norm) && norm >= 0) return norm\n const v = parseFloat((r.summary?.borrowApy?.value ?? '').trim())\n if (Number.isFinite(v) && v >= 0) {\n if (v > 0 && v <= 1) return v * 100\n return v\n }\n return Number.POSITIVE_INFINITY\n}\n\n/**\n * `summary.suppliable` on a reserve is pool liquidity for borrowing that asset (human-notional, same units as\n * {@link formatAaveV4AmountHumanFromApiString}).\n */\nfunction aaveV4SuppliableHumanFromHubReserve(r: AaveV4HubReserve | null | undefined): number | null {\n if (!r) return null\n const n = parseFloat((r.summary?.suppliable?.amount?.value ?? '').trim())\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\n/**\n * The selected UI market maps to a single hub, but a token may only be listed in another hub (e.g. WETH in Core, not\n * Plus on Ethereum). Returns a hub on this chain where this underlying appears in hub reserves, so Spoke and\n * collateral can be resolved.\n *\n * **When no debt hint:** `preferHub` is tried first, then other hubs in {@link aaveV4HubAutoPickTiebreakOrder} order.\n *\n * **When `debtUnderlying` is set (user chose a debt asset on the borrow flow):** among hubs that list **both** the\n * **collateral** and that **debt** as borrowable, the hub with the **lowest debt borrow APY** is chosen. If\n * `debtBorrowAmountHumanForLiquidity` is a positive number string, we **prefer** hubs where `suppliable` on the debt\n * reserve is at least that amount; if none satisfy that, the lowest-APY hub among all debt-backed candidates is\n * used anyway.\n */\nexport async function findAaveV4HubReserveForChainUnderlying(args: {\n chainId: number\n hubs: readonly AaveV4Hub[]\n underlying: `0x${string}`\n /** Tried first; if the asset is not listed here, other hubs on the same chain are scanned. */\n preferHub: AaveV4Hub\n /** If set, disambiguate using this debt asset’s `borrowAPY` (and optional liquidity) per hub. */\n debtUnderlying?: `0x${string}` | null\n /**\n * When set, used with `debtUnderlying` to prefer hubs with enough `suppliable` on the debt line for a borrow\n * of that size (human amount; commas may be included).\n */\n debtBorrowAmountHumanForLiquidity?: string | null\n}): Promise<{\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n} | null> {\n const onChain = args.hubs.filter((h) => h.chain.chainId === args.chainId)\n if (!onChain.length) return null\n const prefer = getAddress(args.preferHub.address) as `0x${string}`\n const order = (() => {\n const rest = onChain\n .filter((h) => getAddress(h.address) !== prefer)\n .sort(aaveV4HubAutoPickTiebreakOrder)\n const first = onChain.find((h) => getAddress(h.address) === prefer)\n return first ? [first, ...rest] : rest\n })()\n\n const candidates: AaveV4HubCollateralCandidate[] = []\n for (const h of order) {\n const rows = await fetchAaveV4HubReserves({ chainId: args.chainId, hubAddress: h.address as `0x${string}` })\n const c = findHubReserveForUnderlying(rows, args.underlying)\n if (c) candidates.push({ hub: h, hubReserves: rows, reserve: c })\n }\n if (!candidates.length) return null\n\n const noDebt = (): AaveV4HubCollateralCandidate => candidates[0]!\n\n const rawDebt = (args.debtUnderlying ?? '').trim()\n if (!rawDebt || !isAddress(rawDebt)) {\n return noDebt()\n }\n const debtU = getAddress(rawDebt) as `0x${string}`\n\n const withDebt = candidates\n .map((c) => {\n const dr = findHubReserveForUnderlying(c.hubReserves, debtU)\n return { ...c, debtReserve: dr }\n })\n .filter(\n (x): x is AaveV4HubCollateralCandidate & { debtReserve: AaveV4HubReserve } =>\n x.debtReserve != null &&\n x.debtReserve.canBorrow === true &&\n x.debtReserve.settings?.borrowable === true,\n )\n if (!withDebt.length) {\n return noDebt()\n }\n\n const amountRaw = (args.debtBorrowAmountHumanForLiquidity ?? '')\n .trim()\n .replace(/,/g, '')\n const wantN = amountRaw && parseFloat(amountRaw) > 0 ? parseFloat(amountRaw) : null\n\n const sortKey = (a: (typeof withDebt)[0], b: (typeof withDebt)[0]): number => {\n const d = aaveV4HubReserveBorrowApyForSort(a.debtReserve) - aaveV4HubReserveBorrowApyForSort(b.debtReserve)\n if (d !== 0) return d\n const pa = getAddress(a.hub.address) === prefer ? 0 : 1\n const pb = getAddress(b.hub.address) === prefer ? 0 : 1\n if (pa !== pb) return pa - pb\n return aaveV4HubAutoPickTiebreakOrder(a.hub, b.hub)\n }\n\n if (wantN == null) {\n withDebt.sort(sortKey)\n const x = withDebt[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n }\n\n const sufficient = withDebt.filter((c) => {\n const s = aaveV4SuppliableHumanFromHubReserve(c.debtReserve)\n return s != null && s + 1e-9 >= wantN\n })\n const pool = sufficient.length ? sufficient : withDebt\n pool.sort(sortKey)\n const x = pool[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n}\n\nexport async function fetchAaveV4HubReserves(args: { chainId: number; hubAddress: `0x${string}` }): Promise<readonly AaveV4HubReserve[]> {\n const h = getAddress(args.hubAddress) as `0x${string}`\n const k = hubReservesKey(args.chainId, h)\n const hit = aaveV4HubReserves.get(k)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ reserves: AaveV4HubReserve[] }>(\n `query R($r: ReservesRequest!) {\n reserves(request: $r) {\n canBorrow\n canSupply\n canUseAsCollateral\n spoke { address }\n settings {\n borrowable\n collateral\n collateralFactor { normalized value }\n collateralRisk { normalized value }\n }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n borrowApy { normalized value }\n }\n asset { underlying { address info { name symbol icon } } }\n }\n }`,\n {\n r: {\n query: { hub: { address: h, chainId: args.chainId } },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n return d.reserves ?? []\n })()\n aaveV4HubReserves.set(k, p)\n return p\n}\n\n/**\n * LTV you can borrow against a unit of this asset, e.g. \"90%\".\n */\nexport function formatAaveV4PercentDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = (normalized ?? '').trim()\n if (n) {\n const f = parseFloat(n)\n if (!Number.isFinite(f)) return '—'\n if (f === 0) return '—'\n if (f % 1 === 0) return `${f.toFixed(0)}%`\n return `${f >= 10 ? f.toFixed(0) : f >= 1 ? f.toFixed(1).replace(/\\.0$/, '') : f.toFixed(2).replace(/\\.?0+$/, '')}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${Math.round(v * 100)}%`\n }\n return '—'\n}\n\n/**\n * Collateral / protocol risk on the same 0–100 style scale as the API, or a plain label if zero/empty.\n */\nexport function formatAaveV4RiskDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = parseFloat((normalized ?? '').trim())\n if (Number.isFinite(n) && n > 0) {\n return n >= 0.01 ? `${n.toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%` : `${n.toFixed(4)}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${(v * 100).toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%`\n }\n return 'Low'\n}\n\nexport function findHubReserveForUnderlying(\n list: readonly AaveV4HubReserve[],\n underlying: `0x${string}`,\n): AaveV4HubReserve | null {\n const t = getAddress(underlying).toLowerCase()\n return list.find((r) => (r.asset?.underlying?.address ?? '').toLowerCase() === t) ?? null\n}\n\nexport type AaveV4BorrowableDisplay = {\n address: string\n symbol: string\n name: string\n icon: string | null\n}\n\n/**\n * De-duplicated borrowable debt assets in a hub (what users can borrow there).\n */\nexport function borrowableAssetsFromHubReserves(rows: readonly AaveV4HubReserve[]): AaveV4BorrowableDisplay[] {\n const seen = new Set<string>()\n const out: AaveV4BorrowableDisplay[] = []\n for (const r of rows) {\n if (!r.canBorrow || !r.settings?.borrowable) continue\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (!a || !isAddress(a)) continue\n const lo = a.toLowerCase()\n if (seen.has(lo)) continue\n seen.add(lo)\n const info = r.asset?.underlying?.info\n out.push({\n address: getAddress(a as `0x${string}`),\n symbol: (info?.symbol ?? '—').trim() || '—',\n name: (info?.name ?? '').trim() || '—',\n icon: (info?.icon ?? '').trim() || null,\n })\n }\n out.sort((p, q) => p.symbol.localeCompare(q.symbol, undefined, { sensitivity: 'base' }))\n return out\n}\n\nconst USER_BORROWS_HUB = `\n query AaveV4UserBorrowsHub($r: UserBorrowsRequest!) {\n userBorrows(request: $r) {\n debt { amount { value } }\n reserve {\n asset { underlying { address } }\n }\n }\n }\n`\n\n/**\n * Current variable-debt balance per underlying token for this user in the given hub (one entry per asset).\n * Values are API decimal strings; format with {@link formatAaveV4AmountHumanFromApiString}.\n */\nexport async function fetchAaveV4UserBorrowsDebtByUnderlyingForHub(args: {\n user: `0x${string}`\n chainId: number\n hubAddress: `0x${string}`\n}): Promise<ReadonlyMap<string, string>> {\n const u = getAddress(args.user)\n const h = getAddress(args.hubAddress) as `0x${string}`\n const d = await aaveV4Gql<{\n userBorrows: {\n debt: { amount: { value: string } } | null\n reserve: { asset: { underlying: { address: string } } } | null\n }[]\n }>(USER_BORROWS_HUB, {\n r: {\n query: {\n userHub: {\n user: u,\n hub: { input: { address: h, chainId: args.chainId } },\n },\n },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n const m = new Map<string, string>()\n for (const row of d.userBorrows ?? []) {\n const addr = (row?.reserve?.asset?.underlying?.address ?? '').trim()\n if (!addr) continue\n const lo = getAddress(addr as `0x${string}`).toLowerCase()\n const v = (row?.debt?.amount?.value ?? '').trim()\n if (!v) continue\n const n = parseFloat(v)\n if (!Number.isFinite(n) || n === 0) continue\n const prev = m.get(lo)\n if (prev) {\n const p = parseFloat(prev)\n m.set(lo, String((Number.isFinite(p) ? p : 0) + n))\n } else {\n m.set(lo, v)\n }\n }\n return m\n}\n\nexport type AaveV4BorrowTableRow = {\n address: string\n symbol: string\n name: string\n icon: string | null\n yourBorrowedDisplay: string\n baseBorrowApyDisplay: string\n totalBorrowsDisplay: string\n liquidityDisplay: string\n}\n\n/**\n * One row per borrowable asset in the hub, using shared human-readable formatters.\n */\nexport function buildAaveV4BorrowTableRowsFromHub(\n borrowable: readonly AaveV4BorrowableDisplay[],\n hubReserves: readonly AaveV4HubReserve[] | null,\n /** `undefined` = not loaded or no wallet (show em dash for “your” column). */\n debtByUnderlying: ReadonlyMap<string, string> | undefined,\n): AaveV4BorrowTableRow[] {\n if (!hubReserves?.length) {\n return borrowable.map((b) => ({\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: debtByUnderlying === undefined ? '—' : `0${b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''}`,\n baseBorrowApyDisplay: '—',\n totalBorrowsDisplay: '—',\n liquidityDisplay: '—',\n }))\n }\n return borrowable.map((b) => {\n const lo = b.address.toLowerCase()\n const r = hubReserves.find((x) => (x.asset?.underlying?.address ?? '').toLowerCase() === lo) ?? null\n const s = r?.summary\n const debtRaw = debtByUnderlying?.get(lo) ?? null\n const symSuffix = b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''\n return {\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: (() => {\n if (debtByUnderlying === undefined) return '—'\n if (debtRaw == null || !String(debtRaw).trim()) return `0${symSuffix}`\n const n = parseFloat(String(debtRaw).trim())\n if (!Number.isFinite(n) || n === 0) return `0${symSuffix}`\n return `${formatAaveV4AmountHumanFromApiString(debtRaw)}${symSuffix}`\n })(),\n baseBorrowApyDisplay: formatAaveV4PercentDisplay(\n s?.borrowApy?.normalized,\n s?.borrowApy?.value,\n ),\n totalBorrowsDisplay: s\n ? `${formatAaveV4AmountHumanFromApiString(s.borrowed?.amount?.value)}${symSuffix}`\n : '—',\n liquidityDisplay: s\n ? `${formatAaveV4ReserveLiquidityFromSummary({\n suppliedValue: s.supplied?.amount?.value,\n borrowedValue: s.borrowed?.amount?.value,\n })}${symSuffix}`\n : '—',\n }\n })\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './api.js'\nexport * from './spokeOnChain.js'\nexport * from './multisign.js'\n\nexport const AAVE_V4_PROTOCOL_ID = 'aave-v4'\n\nexport const aaveV4ProtocolModule: ProtocolModule = {\n id: AAVE_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'aave-v4.deposit', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Supply to Aave v4 Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.withdraw', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.borrow', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.repay', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Spoke debt', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(aaveV4ProtocolModule)\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './sameAssetBorrowLoop.js'\nexport * from './borrowCollateralMaxWithdrawWei.js'\nexport * from './vaultWithdrawMultisign.js'\nexport * from './isolatedLendMultisign.js'\nexport * from './isolatedBorrowMultisign.js'\nexport * from './borrowRepayMultisign.js'\nexport * from './borrowCollateralDepositMultisign.js'\nexport * from './borrowCollateralWithdrawMultisign.js'\n\nexport const EULER_V2_PROTOCOL_ID = 'euler-v2'\n\nexport const eulerV2ProtocolModule: ProtocolModule = {\n id: EULER_V2_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'euler-v2.isolated-lend', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.isolated-borrow', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.vault-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.borrow-repay', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Euler borrow', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-deposit', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(eulerV2ProtocolModule)\n","import { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { McpToolDefinition } from './mcpTypes.js'\nimport { MCP_TOOL_DEFINITIONS } from './mcpTools.js'\nimport { getProtocolModules } from '../core/registry.js'\n\nconst skillsDir = join(dirname(fileURLToPath(import.meta.url)), 'skills')\n\nconst SKILL_PROTOCOL_IDS = [\n 'aave-v4',\n 'lido',\n 'uniswap-v4',\n 'curve-dao',\n 'ethena',\n 'euler-v2',\n 'maple-syrup',\n 'sky',\n] as const\n\nexport function getToolsForProtocol(protocolId: string): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS.filter((t) => t.protocolId === protocolId)\n}\n\nexport function getProtocolSkill(protocolId: string): string | undefined {\n if (!SKILL_PROTOCOL_IDS.includes(protocolId as (typeof SKILL_PROTOCOL_IDS)[number])) {\n return undefined\n }\n try {\n return readFileSync(join(skillsDir, protocolId, 'SKILL.md'), 'utf8')\n } catch {\n return undefined\n }\n}\n\nexport function listProtocolsWithSkills(): string[] {\n return [...SKILL_PROTOCOL_IDS]\n}\n\n/** Protocol metadata for MCP discovery (chains from advisor; actions from registry). */\nexport function getProtocolDiscoverySummary(protocolId: string) {\n const mod = getProtocolModules().find((p) => p.id === protocolId)\n if (!mod) return undefined\n return {\n protocolId: mod.id,\n chainCategory: mod.chainCategory,\n actions: mod.actions.map((a) => ({ id: a.id, description: a.description })),\n tools: getToolsForProtocol(protocolId).map((t) => ({\n name: t.name,\n actionId: t.actionId,\n description: t.description,\n prerequisites: t.prerequisites,\n followUp: t.followUp,\n })),\n }\n}\n","import { getAddress } from 'viem'\nimport { loadAaveV4SupportedChainIdsFromV4Api, ensureAaveV4ChainTokenCache } from '../../protocols/evm/aave-v4/api.js'\nimport { isCurveApiChainSupported } from '../../protocols/evm/curve-dao/support.js'\nimport { loadFullCurveSessionForRpc } from '../../protocols/evm/curve-dao/apiSession.js'\nimport {\n isEvmChainInEthenaUsdeList,\n listEthenaUsdeEvmNetworkRows,\n SUSDE_ETHEREUM_MAINNET,\n USDE_ETHEREUM_MAINNET,\n} from '../../protocols/evm/ethena/constants.js'\nimport { LIDO_ETHEREUM_MAINNET_CHAIN_ID } from '../../protocols/evm/lido/mainnet.js'\nimport { isUniswapV4ChainSupported } from '../../protocols/evm/uniswap-v4/constants.js'\nimport { MAPLE_PROTOCOL_ID } from '../../protocols/evm/maple/index.js'\nimport { SKY_PROTOCOL_ID } from '../../protocols/evm/sky/index.js'\nimport type { ProtocolSupportAdvisor, SupportedTokenRow, TokenFilterKind } from './types.js'\n\nconst EULER_V2_SUBGRAPH_CHAIN_IDS = [\n 1, 8453, 42161, 10, 137, 56, 43114, 100, 59144, 146, 1923, 130,\n] as const\n\nfunction advisor(\n protocolId: string,\n tokenFilter: TokenFilterKind,\n impl: Omit<ProtocolSupportAdvisor, 'protocolId' | 'tokenFilter'>,\n): ProtocolSupportAdvisor {\n return { protocolId, tokenFilter, ...impl }\n}\n\nexport const PROTOCOL_SUPPORT_ADVISORS: Record<string, ProtocolSupportAdvisor> = {\n 'aave-v4': advisor('aave-v4', 'api_underlyings', {\n async supportedChainIds() {\n const set = await loadAaveV4SupportedChainIdsFromV4Api()\n return [...set].sort((a, b) => a - b)\n },\n async supportedTokens(chainId) {\n const cache = await ensureAaveV4ChainTokenCache(chainId)\n const tokens: SupportedTokenRow[] = [...cache.supportedUnderlying].map((address) => ({\n address,\n roles: ['underlying'],\n }))\n if (cache.nativeWrapped) {\n tokens.unshift({\n address: cache.nativeWrapped,\n symbol: 'WETH',\n roles: ['native_wrapped'],\n })\n }\n return {\n tokens,\n nativeWrapped: cache.nativeWrapped ?? undefined,\n notes: 'Native ETH deposits use wrapped native token address from Aave v4 API.',\n }\n },\n async isTokenSupported(chainId, address) {\n const cache = await ensureAaveV4ChainTokenCache(chainId)\n let normalized: string\n try {\n normalized = getAddress(address).toLowerCase()\n } catch {\n return false\n }\n if (cache.nativeWrapped && getAddress(cache.nativeWrapped).toLowerCase() === normalized) {\n return true\n }\n return cache.supportedUnderlying.has(normalized)\n },\n }),\n\n 'uniswap-v4': advisor('uniswap-v4', 'any_erc20_on_chain', {\n async supportedChainIds() {\n const ids: number[] = []\n for (const id of [\n 1, 5, 11155111, 137, 80001, 10, 420, 42161, 421613, 42220, 44787, 56, 43114, 84531, 8453,\n 81457, 7777777, 324, 480, 1301, 130, 10143, 84532, 1868, 143, 59144, 4217, 196,\n ]) {\n if (isUniswapV4ChainSupported(id)) ids.push(id)\n }\n return ids\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes:\n 'Any ERC-20 or native token on a supported chain may be used. Resolve addresses via get_token_registry; tokenOut may be any address.',\n }\n },\n }),\n\n 'curve-dao': advisor('curve-dao', 'pool_graph', {\n async supportedChainIds() {\n return [1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554]\n },\n async supportedTokens(chainId, ctx) {\n if (!isCurveApiChainSupported(chainId)) {\n return { tokens: [], notes: 'Chain not supported by Curve SDK network constants.' }\n }\n const rpcUrl = ctx?.rpcUrl?.trim()\n if (!rpcUrl) {\n return {\n tokens: [],\n notes: 'Provide rpcUrl (from get_chain_registry) to load Curve pool graph token list.',\n }\n }\n const session = await loadFullCurveSessionForRpc(rpcUrl)\n if (!session?.swappableNodeKeys?.size) {\n return { tokens: [], notes: 'Curve session returned no swappable tokens for this RPC.' }\n }\n return {\n tokens: [...session.swappableNodeKeys].map((key) => {\n const address = key.startsWith('0x') ? key : key.split(':')[0] ?? key\n return { address, roles: ['swappable'] as string[] }\n }),\n }\n },\n }),\n\n lido: advisor('lido', 'mainnet_only', {\n async supportedChainIds() {\n return [LIDO_ETHEREUM_MAINNET_CHAIN_ID]\n },\n async supportedTokens() {\n return {\n tokens: [\n { address: '0x0000000000000000000000000000000000000000', symbol: 'ETH', roles: ['native', 'stake'] },\n { address: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', symbol: 'stETH', roles: ['erc20'] },\n { address: '0x7f39C581F595B853cBbF37C12FfeeA971C5a5bEa', symbol: 'wstETH', roles: ['erc20'] },\n ],\n notes: 'Lido staking and withdrawals are Ethereum mainnet only.',\n }\n },\n }),\n\n ethena: advisor('ethena', 'minting_contract', {\n async supportedChainIds() {\n return listEthenaUsdeEvmNetworkRows().map((r) => r.chainId)\n },\n async supportedTokens(chainId) {\n if (chainId === 1) {\n return {\n tokens: [\n { address: USDE_ETHEREUM_MAINNET, symbol: 'USDe', roles: ['stake'] },\n { address: SUSDE_ETHEREUM_MAINNET, symbol: 'sUSDe', roles: ['vault'] },\n ],\n notes: 'Ethena stake/redeem UI actions are mainnet-only; USDe exists on other chains for transfers.',\n }\n }\n if (isEvmChainInEthenaUsdeList(chainId)) {\n const row = listEthenaUsdeEvmNetworkRows().find((r) => r.chainId === chainId)\n return {\n tokens: row ? [{ address: row.usde, symbol: 'USDe', roles: ['erc20'] }] : [],\n notes: 'USDe on L2; staking MCP tools target mainnet only.',\n }\n }\n return { tokens: [] }\n },\n }),\n\n 'euler-v2': advisor('euler-v2', 'subgraph_vaults', {\n async supportedChainIds() {\n return [...EULER_V2_SUBGRAPH_CHAIN_IDS]\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes:\n 'Euler vault/collateral assets vary by chain. Pass vault and asset addresses from Euler app or subgraph.',\n }\n },\n }),\n\n [MAPLE_PROTOCOL_ID]: advisor(MAPLE_PROTOCOL_ID, 'fixed_addresses', {\n async supportedChainIds() {\n return [1, 11155111]\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes: 'Maple Syrup pools are discovered via GraphQL; pass syrupRouter, pool, and asset from Maple UI.',\n }\n },\n }),\n\n [SKY_PROTOCOL_ID]: advisor(SKY_PROTOCOL_ID, 'fixed_addresses', {\n async supportedChainIds() {\n return [1]\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes: 'Sky Lockstake and sUSDS use fixed mainnet contract addresses in protocol builders.',\n }\n },\n }),\n}\n\nexport function getProtocolSupportAdvisor(protocolId: string): ProtocolSupportAdvisor | undefined {\n return PROTOCOL_SUPPORT_ADVISORS[protocolId]\n}\n\nexport function listProtocolSupportAdvisorIds(): string[] {\n return Object.keys(PROTOCOL_SUPPORT_ADVISORS)\n}\n","import { z } from 'zod'\n\n/** Shared MCP-server inputs enriched from continuum-node-sdk (keyGenId + chain registry). */\nexport const mcpServerCommonInputSchema = z.object({\n keyGenId: z.string().min(1).describe('KeyGen id from fetch_key_gen_result / node preferred KeyGen'),\n chainId: z.number().int().positive().describe('EVM chain id; RPC and gas config resolved from chain registry'),\n purposeText: z.string().min(1).describe('Human-readable purpose for the sign request'),\n useCustomGas: z.boolean().optional().describe('Apply chain gas settings from registry when true'),\n})\n\nexport function mcpServerMultisignInput(fields: z.ZodRawShape) {\n return mcpServerCommonInputSchema.extend(fields)\n}\n\nexport const mcpServerSubmitOutputSchema = z\n .object({\n requestId: z.string().min(1),\n })\n .describe('mpc-auth multiSignRequest id; continue with trigger_sign_result / broadcast_sign_result')\n\n/** Tools that only build calldata / quotes — no submit. */\nexport const MCP_NON_SUBMIT_TOOL_NAMES = new Set([\n 'ctm_uniswap_v4_quote',\n 'ctm_uniswap_v4_create_swap',\n])\n\nexport type McpServerCommonInput = z.infer<typeof mcpServerCommonInputSchema>\n","import { getProtocolModules, getActionsByChainCategory, registerProtocolModule } from '../core/registry.js'\nimport { uniswapV4ProtocolModule } from '../protocols/evm/uniswap-v4/index.js'\nimport { curveDaoProtocolModule } from '../protocols/evm/curve-dao/index.js'\nimport { getAgentCatalogForMcp } from './mcpTools.js'\nimport { lidoProtocolModule } from '../protocols/evm/lido/index.js'\nimport { ethenaProtocolModule } from '../protocols/evm/ethena/index.js'\nimport { mapleProtocolModule } from '../protocols/evm/maple/index.js'\nimport { skyProtocolModule } from '../protocols/evm/sky/index.js'\nimport { aaveV4ProtocolModule } from '../protocols/evm/aave-v4/index.js'\nimport { eulerV2ProtocolModule } from '../protocols/evm/euler-v2/index.js'\n\nexport {\n getMcpToolDefinitions,\n getMcpToolByName,\n getAgentCatalogForMcp,\n getMcpToolInputSchema,\n getMcpToolOutputSchema,\n parseMcpToolInput,\n parseMcpToolOutput,\n MCP_TOOL_DEFINITIONS,\n MCP_TOOL_INPUT_SCHEMAS,\n MCP_TOOL_OUTPUT_SCHEMAS,\n} from './mcpTools.js'\nexport {\n getProtocolSkill,\n getToolsForProtocol,\n getProtocolDiscoverySummary,\n listProtocolsWithSkills,\n} from './skills.js'\nexport {\n getProtocolSupportAdvisor,\n listProtocolSupportAdvisorIds,\n PROTOCOL_SUPPORT_ADVISORS,\n} from './support/index.js'\nexport type { ProtocolSupportAdvisor, SupportedTokenRow, TokenFilterKind } from './support/index.js'\nexport {\n mcpServerCommonInputSchema,\n mcpServerMultisignInput,\n mcpServerSubmitOutputSchema,\n MCP_NON_SUBMIT_TOOL_NAMES,\n} from './mcpServerSchemas.js'\nexport type {\n McpToolDefinition,\n McpToolHandler,\n McpJsonSchema,\n McpSchemaProperty,\n McpToolName,\n McpToolInputMap,\n McpToolOutputMap,\n} from './mcpTools.js'\nexport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\nexport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nexport * from './schemas/index.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\nregisterProtocolModule(lidoProtocolModule)\nregisterProtocolModule(ethenaProtocolModule)\nregisterProtocolModule(mapleProtocolModule)\nregisterProtocolModule(skyProtocolModule)\nregisterProtocolModule(aaveV4ProtocolModule)\nregisterProtocolModule(eulerV2ProtocolModule)\n\n/** Machine-readable catalog of protocol actions grouped by chain category. */\nexport function getAgentCatalog() {\n return {\n protocols: getProtocolModules(),\n byCategory: {\n evm: getActionsByChainCategory('evm'),\n solana: getActionsByChainCategory('solana'),\n near: getActionsByChainCategory('near'),\n },\n uniswapV4: uniswapV4ProtocolModule,\n curveDao: curveDaoProtocolModule,\n lido: lidoProtocolModule,\n ethena: ethenaProtocolModule,\n maple: mapleProtocolModule,\n sky: skyProtocolModule,\n aaveV4: aaveV4ProtocolModule,\n eulerV2: eulerV2ProtocolModule,\n /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */\n mcp: getAgentCatalogForMcp(),\n }\n}\n\nexport { getProtocolModules, getActionsByChainCategory }\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/registry.ts","../../src/chains/evm/chainIdParse.ts","../../src/protocols/evm/uniswap-v4/constants.ts","../../src/protocols/evm/uniswap-v4/index.ts","../../src/protocols/evm/curve-dao/support.ts","../../src/protocols/evm/curve-dao/swapDestinations.ts","../../src/protocols/evm/curve-dao/apiSession.ts","../../src/protocols/evm/curve-dao/index.ts","../../src/agent/commonParamDocs.ts","../../src/agent/zodToMcpJsonSchema.ts","../../src/agent/schemas/common.ts","../../src/agent/schemas/uniswapV4.ts","../../src/agent/schemas/curveDao.ts","../../src/agent/schemas/protocols.ts","../../src/agent/mcpProtocolTools.ts","../../src/agent/mcpTools.ts","../../src/protocols/evm/lido/mainnet.ts","../../src/protocols/evm/lido/index.ts","../../src/protocols/evm/ethena/constants.ts","../../src/protocols/evm/ethena/index.ts","../../src/protocols/evm/maple/constants.ts","../../src/core/defiProxy.ts","../../src/protocols/evm/maple/index.ts","../../src/protocols/evm/sky/mainnet.ts","../../src/protocols/evm/sky/index.ts","../../src/protocols/evm/aave-v4/api.ts","../../src/protocols/evm/aave-v4/index.ts","../../src/protocols/evm/euler-v2/index.ts","../../src/agent/skills.ts","../../src/agent/support/advisors.ts","../../src/agent/mcpServerSchemas.ts","../../src/agent/catalog.ts"],"names":["session","z","getAddress","isAddress"],"mappings":"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","file":"catalog.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { getAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Canonical Uniswap token-allowance contract on most EVM chains. */\nexport const PERMIT2_ADDRESS: Address = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\n\nconst UNIVERSAL_ROUTER_SPENDER: Partial<Record<number, string>> = {\n 1: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n 5: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',\n 137: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n 80001: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 10: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n 420: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n 421613: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42220: '0xcb695bc5D3Aa22cAD1E6DF07801b061a05A0233A',\n 44787: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 56: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n 43114: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n 84531: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n 8453: '0x6fF5693b99212da76ad316178a184ab56d299b43',\n 81457: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n 7777777: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n 324: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n 480: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n 1301: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n 130: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n 10143: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n 84532: '0x492e6456d9528771018deb9e87ef7750ef184104',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 143: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n 4217: '0x1febb76be10aaf3a1402f04e8e835f2c382f7914',\n 196: '0x5507749f2c558bb3e162c6e90c314c092e7372ff',\n}\n\nexport function isUniswapV4ChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n if (chainId == null) return false\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n const a = UNIVERSAL_ROUTER_SPENDER[n]\n return typeof a === 'string' && a.startsWith('0x')\n}\n\nexport function getUniswapUniversalRouterSpenderOrThrow(chainId: number): Address {\n const raw = UNIVERSAL_ROUTER_SPENDER[chainId]\n if (!raw || !raw.startsWith('0x')) {\n throw new Error(\n `No Uniswap Universal Router (spender) is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or use a chain supported by the Uniswap SDK.`,\n )\n }\n return getAddress(raw)\n}\n\nexport const MAX_UINT160 = (1n << 160n) - 1n\nexport const MAX_UINT48 = (1n << 48n) - 1n\n\nexport const UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_TRADE_BASE_DEFAULT = 'https://trade-api.gateway.uniswap.org/v1'\nexport const UNISWAP_UNIVERSAL_ROUTER_VERSION_DEFAULT = '2.0'\nexport const UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES = 30\nexport const UNISWAP_SWAP_DEFAULT_DEADLINE_SEC_OFFSET = UNISWAP_SWAP_DEFAULT_EXPIRY_MINUTES * 60\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isUniswapV4ChainSupported } from './constants.js'\n\nexport * from './constants.js'\nexport * from './quote.js'\nexport * from './swapMultisign.js'\nexport * from './purpose.js'\nexport * from './support.js'\nexport * from './swap.js'\n\nexport {\n isUniswapV4SwapEvmSignRequest,\n resolveRouterSwapGasUnitsFromSignRequest,\n} from './swapMultisign.js'\n\nexport const UNISWAP_V4_PROTOCOL_ID = 'uniswap-v4'\n\nexport const uniswapV4ProtocolModule: ProtocolModule = {\n id: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isUniswapV4ChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'uniswap-v4.swap-exact-input',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap ERC-20 or native token via Uniswap V4 Universal Router (classic allowance path)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token (0x0 for native)' },\n tokenOut: { type: 'address', required: true, description: 'Output token address' },\n amount: { type: 'string', required: true, description: 'Human or wei amount per trade type' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage tolerance percent' },\n swapTransactionDeadlineUnix: {\n type: 'number',\n required: false,\n description: 'On-chain swap deadline (unix seconds)',\n },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap Trade API key' },\n },\n },\n {\n id: 'uniswap-v4.quote',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Fetch Uniswap Trade API quote',\n commonParams: ['keyGen'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'Input token' },\n tokenOut: { type: 'address', required: true, description: 'Output token' },\n amount: { type: 'string', required: true, description: 'Amount for quote' },\n type: { type: 'EXACT_INPUT | EXACT_OUTPUT', required: true, description: 'Trade type' },\n },\n },\n ],\n}\n\nregisterProtocolModule(uniswapV4ProtocolModule)\n\nimport { uniswapTradeQuote } from './quote.js'\nimport { buildEvmMultisignBodyUniswapV4SkipPermit2Batch } from './swapMultisign.js'\nimport { swapExactInput as swapExactInputFn, quoteSwap, createSwap, swapFromQuote } from './swap.js'\n\nexport const uniswapV4 = {\n quoteSwap,\n createSwap,\n swapExactInput: swapExactInputFn,\n swapFromQuote,\n buildSwapMultisignBody: buildEvmMultisignBodyUniswapV4SkipPermit2Batch,\n quote: uniswapTradeQuote,\n isChainSupported: isUniswapV4ChainSupported,\n}\n","import { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nconst CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554,\n])\n\nexport function isCurveApiChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n return CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS.has(n)\n}\n\nexport { isCurveApiChainSupported as isCurveDaoChainSupported }\n","import { getAddress, isAddress } from 'viem'\nimport { normalizeHumanDecimalAmount } from '../../../chains/evm/normalizeAmount.js'\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 return normalizeHumanDecimalAmount(raw, 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\nconst CURVE_SESSION_CACHE_TTL_MS = 5 * 60 * 1000\nconst curveSessionCache = new Map<string, { session: CurveFullSession; expiresAt: number }>()\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 const tasks: Promise<unknown>[] = []\n for (const key of [\n 'factory',\n 'crvUSDFactory',\n 'EYWAFactory',\n 'cryptoFactory',\n 'twocryptoFactory',\n 'tricryptoFactory',\n 'stableNgFactory',\n ] as const) {\n const f = curve[key]\n if (f?.fetchPools) {\n tasks.push(run(f.fetchPools()))\n }\n }\n await Promise.all(tasks)\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> {\n const url = (rpcUrl ?? '').trim()\n if (!url) {\n throw new Error('rpcUrl is required.')\n }\n const cached = curveSessionCache.get(url)\n if (cached && cached.expiresAt > Date.now()) {\n return cached.session\n }\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 const session: CurveFullSession = {\n curve,\n adj: new Map(),\n swappableNodeKeys: new Set<string>(),\n wrappedNative: wrapped,\n }\n curveSessionCache.set(url, { session, expiresAt: Date.now() + CURVE_SESSION_CACHE_TTL_MS })\n return session\n }\n await fetchAllCurvePools(curve)\n const adj = buildCurveLiquidityGraphFromApi(curve)\n addNativeWethBridge(adj, wrapped)\n const session: CurveFullSession = {\n curve,\n adj,\n swappableNodeKeys: swappableCurveGraphNodeKeys(adj),\n wrappedNative: wrapped,\n }\n curveSessionCache.set(url, { session, expiresAt: Date.now() + CURVE_SESSION_CACHE_TTL_MS })\n return session\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n throw new Error(`Curve session init failed for RPC: ${msg}`)\n }\n}\n\nexport type CurveSessionSnapshot = {\n wrappedNative: string | undefined\n swappableNodeKeys: string[]\n routerReady: boolean\n adj: Record<string, string[]>\n}\n\n/** JSON-safe Curve session for browser clients (via Next.js API route). */\nexport async function loadCurveSessionSnapshotForRpc(\n rpcUrl: string,\n): Promise<CurveSessionSnapshot> {\n const session = await loadFullCurveSessionForRpc(rpcUrl)\n const adj: Record<string, string[]> = {}\n for (const [key, neighbors] of session.adj) {\n adj[key] = [...neighbors]\n }\n return {\n wrappedNative: session.wrappedNative,\n swappableNodeKeys: [...session.swappableNodeKeys],\n routerReady: Boolean(session.curve?.hasRouter?.() && session.curve.hasRouter()),\n adj,\n }\n}\n\nexport type CurveCoinDataRow = {\n address: string\n name?: string\n symbol?: string\n decimals?: number | null\n}\n\n/** On-chain token metadata via `@curvefi/api` `getCoinsData` (server-side). */\nexport async function fetchCurveCoinsDataForRpc(\n rpcUrl: string,\n addresses: string[],\n): Promise<CurveCoinDataRow[]> {\n const session = await loadFullCurveSessionForRpc(rpcUrl)\n if (!session.curve?.getCoinsData) {\n throw new Error('Curve getCoinsData is not available for this RPC session.')\n }\n const coins = await session.curve.getCoinsData(addresses)\n return addresses.map((addr, i) => {\n const c = coins[i] as { name?: string; symbol?: string; decimals?: number } | undefined\n const dec = c?.decimals\n const decimals =\n typeof dec === 'number' && Number.isInteger(dec) && dec >= 0 && dec <= 18 ? dec : null\n return {\n address: addr,\n name: (c?.name && String(c.name).trim()) || '—',\n symbol: (c?.symbol && String(c.symbol).trim()) || addr.slice(0, 6),\n decimals,\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'\nexport * from './quote.js'\nexport * from './quoteDisplay.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.quote',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Quote swap via Curve Router NG (getBestRouteAndOutput)',\n commonParams: [],\n params: {\n chainId: { type: 'number', required: true, description: 'EVM chain id' },\n tokenIn: { type: 'address', required: true, description: 'Token in or native placeholder' },\n tokenOut: { type: 'address', required: true, description: 'Token out or native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n },\n },\n {\n id: 'curve-dao.swap',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap via Curve Router NG (optional ERC-20 approve batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 token in (native uses WETH path in UI)' },\n tokenOut: { type: 'address', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage percent (0–100 exclusive)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(curveDaoProtocolModule)\n\nimport { buildEvmMultisignBodyCurveDaoBatch } from './multisign.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\n\nexport const curveDao = {\n buildSwapMultisignBody: buildEvmMultisignBodyCurveDaoBatch,\n isChainSupported: isCurveApiChainSupported,\n loadSession: loadFullCurveSessionForRpc,\n}\n","import type { ParamDoc } from '../core/types.js'\n\n/** Shared inputs documented once for all EVM multisign builders. */\nexport const EVM_COMMON_PARAM_DOCS: Record<string, ParamDoc> = {\n keyGen: {\n type: 'object',\n required: true,\n description:\n 'MPC key slice: { pubkeyhex: string (required), keylist: string[], ClientKeys?: Record<string,string> }. Used for pubKey/keyList on POST /multiSignRequest.',\n },\n purposeText: {\n type: 'string',\n required: true,\n description:\n 'Human-readable purpose for the sign request. Stored in bodyForSign.purpose (may be appended with an automatic batch suffix).',\n },\n useCustomGas: {\n type: 'boolean',\n required: true,\n description:\n 'When true, apply chain gas settings from chainDetail / customGasChainDetails instead of raw RPC estimates only.',\n },\n chainId: {\n type: 'number',\n required: true,\n description: 'EVM chain id (decimal). Becomes destinationChainID on the sign request.',\n },\n rpcUrl: {\n type: 'string',\n required: true,\n description: 'HTTPS JSON-RPC URL for gas estimation, nonce, and allowance reads.',\n },\n executorAddress: {\n type: 'address',\n required: true,\n description: 'MPC wallet address (from keyGen ethereumaddress) — tx sender for estimates and approvals.',\n },\n chainDetail: {\n type: 'object',\n required: true,\n description:\n 'Optional gas config: { legacy?, gasLimit?, gasMultiplier?, gasPrice?, baseFee?, priorityFee?, baseFeeMultiplier? }.',\n },\n customGasChainDetails: {\n type: 'object',\n required: false,\n description: 'Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true.',\n },\n}\n\nexport const MULTISIGN_OUTPUT_DOC = {\n description:\n 'Unsigned mpc-auth multiSignRequest payload. The caller must sign messageToSign (MetaMask personal_sign or Ed25519) and POST { ...bodyForSign, clientSig, signedMessage: messageToSign } to /multiSignRequest.',\n fields: {\n bodyForSign: {\n type: 'object',\n description:\n 'POST body fields without clientSig: keyList, pubKey, msgHash, msgRaw, destinationChainID, purpose, extraJSON, proposalTxParams (batch), messageHashes/messageRawBatch when N>1 txs.',\n },\n messageToSign: {\n type: 'string',\n description: 'JSON.stringify(bodyForSign) — exact string to sign before adding clientSig.',\n },\n },\n} as const\n\n/** mpc-auth NodeMgtKeySig envelope for management POST routes (Get Sig, shelve, keyGen, groups, …). */\nexport const MANAGEMENT_SIG_DOC = {\n description:\n 'Management POST bodies embed NodeMgtKeySig: { nonce, clientSig, nodeKey }. Sign JSON with clientSig cleared via messageToSignManagementBody; POST with withManagementClientSig(body, sig). Do not put signedMessage in the JSON body for standard management routes. Legacy Nonce/Sig/sig field names are not accepted.',\n exceptions: {\n configUpdateImplement:\n 'POST /configUpdateImplement: include nodeKey + plannedYaml + signedMessage (opaque configUpdateImplement|<sha256> line). Sign the opaque line bytes, not the JSON body.',\n postMSQTTKey:\n 'POST /postMSQTTKey: include nodeKey + caCertPem + clientSig. Sign caCertPem PEM bytes directly (use buildPostMqttKeyBody).',\n addManagementKey:\n 'POST /addManagementKey / removeManagementKey (EIP-191): may still use signedMessage equal to the canonical JSON string for dual-mode Ethereum signing.',\n agentLlmConfig:\n 'POST /agentLlmConfig / agentLlmApiKey: sign canonical JSON with action + clientSig cleared; POST body has nonce, clientSig, nodeKey, endpoint fields — no signedMessage field.',\n multiSignRequest:\n 'POST /multiSignRequest (client key, not management): POST { ...bodyForSign, clientSig, signedMessage: messageToSign }.',\n },\n fields: {\n nonce: {\n type: 'number',\n description: 'From GET /getPublicMgtKeyNonce (Ed25519) or GET /getNodeMgtKeyNonce (Ethereum NodeMgtKey).',\n },\n clientSig: {\n type: 'string',\n description: 'Management signature; empty string in the message to sign.',\n },\n nodeKey: {\n type: 'string',\n description: 'Required. 128-hex MPC node id from GET /getNodeKey (no 0x prefix).',\n },\n },\n helpers: {\n managementSigFields: 'Base envelope with clientSig cleared.',\n buildManagementPostBody: 'Spread managementSigFields then endpoint fields.',\n buildPostMqttKeyBody: 'POST /postMSQTTKey unsigned body (sign PEM directly).',\n buildPostPreferredKeyGenBody: 'POST /postPreferredKeyGen unsigned body.',\n buildConfigUpdateImplementPostBody: 'POST /configUpdateImplement with opaque signedMessage line.',\n buildSignRequestAgreeUnsignedBody: 'POST /signRequestAgree unsigned body with nodeKey.',\n messageToSignManagementBody: 'Canonical JSON string to sign.',\n withManagementClientSig: 'Attach signature to POST body.',\n fetchNodeKey: 'GET /getNodeKey via nodeFetchWithReadAuth.',\n fetchManagementNonce: 'GET nonce for Ed25519 or Ethereum management key.',\n fetchPreferredKeyGen: 'GET /getPreferredKeyGen for agent default KeyGen.',\n },\n} as const\n","import { zodToJsonSchema } from 'zod-to-json-schema'\nimport type { z } from 'zod'\nimport type { McpJsonSchema } from './mcpTypes.js'\n\n/**\n * Convert a Zod schema to MCP-compatible JSON Schema (`inputSchema` / `outputSchema`).\n * Zod is the source of truth; JSON Schema is derived for MCP server registration only.\n */\nexport function zodSchemaToMcpJsonSchema(schema: z.ZodType): McpJsonSchema {\n const raw = zodToJsonSchema(schema, {\n target: 'openApi3',\n $refStrategy: 'none',\n }) as Record<string, unknown>\n if (raw.type === 'object' || raw.type === 'array' || raw.type === 'string') {\n const { $schema: _s, ...rest } = raw\n return rest as McpJsonSchema\n }\n // zod-to-json-schema may wrap named schemas in definitions — unwrap first entry.\n const defs = raw.definitions as Record<string, Record<string, unknown>> | undefined\n if (defs) {\n const first = Object.values(defs)[0]\n if (first?.type) {\n const { $schema: _s, ...rest } = first\n return rest as McpJsonSchema\n }\n }\n return raw as McpJsonSchema\n}\n","import { z } from 'zod'\n\n/** EVM address (0x + 40 hex). Handlers may normalize via viem `getAddress`. */\nexport const evmAddressSchema = z\n .string()\n .min(1)\n .describe('EVM address (0x-prefixed, 40 hex nibbles)')\n\n/** MPC key slice for POST /multiSignRequest (pubKey, keyList). */\nexport const keyGenSchema = z\n .object({\n pubkeyhex: z.string().min(1).describe('MPC secp256k1 public key hex (required for multiSignRequest pubKey)'),\n keylist: z.array(z.string()).optional().describe('Key list on the sign request'),\n ClientKeys: z.record(z.string()).optional().describe('Optional client key map from keyGen'),\n })\n .describe(\n 'MPC key slice: { pubkeyhex, keylist?, ClientKeys? }. Used for pubKey/keyList on POST /multiSignRequest.',\n )\n\n/** Chain gas config row from GET /getChainDetails (subset). */\nexport const chainDetailSchema = z\n .object({\n legacy: z.boolean().optional(),\n gasLimit: z.number().optional(),\n gasMultiplier: z.number().optional(),\n gasPrice: z.number().optional(),\n baseFee: z.number().optional(),\n priorityFee: z.number().optional(),\n baseFeeMultiplier: z.number().optional(),\n })\n .passthrough()\n .describe(\n 'Optional gas config: { legacy?, gasLimit?, gasMultiplier?, gasPrice?, baseFee?, priorityFee?, baseFeeMultiplier? }.',\n )\n\n/** Shared inputs for all EVM multisign MCP tools. */\nexport const evmMultisignCommonInputSchema = z.object({\n keyGen: keyGenSchema,\n purposeText: z\n .string()\n .min(1)\n .describe(\n 'Human-readable purpose for the sign request. Stored in bodyForSign.purpose (may be appended with an automatic batch suffix).',\n ),\n useCustomGas: z\n .boolean()\n .describe(\n 'When true, apply chain gas settings from chainDetail / customGasChainDetails instead of raw RPC estimates only.',\n ),\n chainId: z.number().int().positive().describe('EVM chain id (decimal). Becomes destinationChainID on the sign request.'),\n rpcUrl: z.string().min(1).describe('HTTPS JSON-RPC URL for gas estimation, nonce, and allowance reads.'),\n executorAddress: evmAddressSchema.describe(\n 'MPC wallet address (from keyGen ethereumaddress) — tx sender for estimates and approvals.',\n ),\n chainDetail: chainDetailSchema,\n customGasChainDetails: z\n .record(z.unknown())\n .optional()\n .describe('Snapshot written to extraJSON.customGasChainDetails when useCustomGas is true.'),\n})\n\n/** Standard output of all `build_*_multisign` MCP tools. */\nexport const multisignOutputSchema = z\n .object({\n bodyForSign: z\n .record(z.unknown())\n .describe(\n 'POST body fields without clientSig: keyList, pubKey, msgHash, msgRaw, destinationChainID, purpose, extraJSON, proposalTxParams (batch), messageHashes/messageRawBatch when N>1 txs.',\n ),\n messageToSign: z\n .string()\n .describe('JSON.stringify(bodyForSign) — exact string to sign before adding clientSig.'),\n })\n .describe(\n 'Unsigned mpc-auth multiSignRequest payload. Sign messageToSign and POST { ...bodyForSign, clientSig, signedMessage } to /multiSignRequest.',\n )\n\n/** Loose JSON object for protocol API responses passed between MCP tools. */\nexport const jsonObjectSchema = z.record(z.unknown())\n\nexport type EvmMultisignCommonInput = z.infer<typeof evmMultisignCommonInputSchema>\nexport type MultisignOutput = z.infer<typeof multisignOutputSchema>\nexport type KeyGenMcpInput = z.infer<typeof keyGenSchema>\nexport type ChainDetailMcpInput = z.infer<typeof chainDetailSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema, jsonObjectSchema } from './common.js'\n\nexport const uniswapQuoteTradeTypeSchema = z.enum(['EXACT_INPUT', 'EXACT_OUTPUT'])\n\n/** Input for MCP tool `ctm_uniswap_v4_quote` → handler `uniswapTradeQuote`. */\nexport const mcpUniswapV4QuoteInputSchema = z.object({\n type: uniswapQuoteTradeTypeSchema.describe('EXACT_INPUT or EXACT_OUTPUT'),\n amount: z.string().min(1).describe('Amount in token-in base units (wei string for ERC-20)'),\n tokenIn: z.string().min(1).describe('Input token; 0x0 for native ETH'),\n tokenOut: z.string().min(1).describe('Output token address'),\n chainId: z.union([z.number().int().positive(), z.string().min(1)]).describe('tokenInChainId / same-chain default'),\n uniswapApiKey: z.string().min(1).describe('Uniswap Trade API x-api-key'),\n swapper: evmAddressSchema.optional().describe('MPC executor; omit if keyGen + managementNodeUrl provided'),\n slippage: z.union([z.number(), z.string()]).optional().describe('Slippage percent; omit for API auto slippage'),\n keyGen: z.string().optional().describe('KeyGen id — resolves swapper via GET /getKeyGenResultById when swapper omitted'),\n managementNodeUrl: z\n .string()\n .min(1)\n .optional()\n .describe('MPC node base URL; required with keyGen when swapper is omitted'),\n tokenInChainId: z.union([z.number(), z.string()]).optional(),\n tokenOutChainId: z.union([z.number(), z.string()]).optional(),\n permit2Disabled: z.boolean().optional(),\n baseUrl: z.string().optional(),\n universalRouterVersion: z.string().optional(),\n})\n\n/** Output: full Uniswap POST /quote JSON (dynamic shape from Trade API). */\nexport const mcpUniswapV4QuoteOutputSchema = jsonObjectSchema.describe(\n 'Full Uniswap POST /quote JSON (includes nested quote object with input/output amounts).',\n)\n\n/** Input for MCP tool `ctm_uniswap_v4_create_swap` → handler `uniswapCreateSwap`. */\nexport const mcpUniswapV4CreateSwapInputSchema = z.object({\n uniswapApiKey: z.string().min(1).describe('Uniswap Trade API key'),\n fullQuoteFromPermit: jsonObjectSchema.describe('Full quote JSON from ctm_uniswap_v4_quote'),\n swapTransactionDeadlineUnix: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('On-chain deadline unix seconds; default ~30 min from now'),\n useServerProxy: z\n .boolean()\n .optional()\n .describe('Set false in Node/agents; true only in browser via Next API route'),\n baseUrl: z.string().optional(),\n universalRouterVersion: z.string().optional(),\n})\n\nexport const mcpUniswapV4CreateSwapOutputSchema = z\n .object({\n swap: jsonObjectSchema.describe('Universal Router tx: { to, data, value, gasLimit? }'),\n requestId: z.string().optional(),\n gasFee: z.string().optional(),\n })\n .passthrough()\n .describe('{ swap: TransactionRequest, requestId?, gasFee? }')\n\nconst swapTxRequestSchema = jsonObjectSchema.describe('swap field from create_swap response (to, data, value)')\n\n/** Input for MCP tool `ctm_uniswap_v4_build_swap_multisign`. */\nexport const mcpUniswapV4BuildSwapMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n tokenIn: evmAddressSchema.describe('Token in; 0x0 for native ETH'),\n swap: swapTxRequestSchema,\n createSwapResponse: z\n .object({\n swap: swapTxRequestSchema,\n requestId: z.string().optional(),\n gasFee: z.string().optional(),\n })\n .passthrough()\n .describe('Full create_swap response'),\n fullQuoteSnapshot: jsonObjectSchema.describe('Quote JSON used for the swap'),\n swapDeadlineUnix: z.number().describe('Same deadline passed to create_swap'),\n slippagePercent: z.number().optional().describe('Extra approve headroom for EXACT_OUTPUT'),\n})\n\nexport type McpUniswapV4QuoteInput = z.infer<typeof mcpUniswapV4QuoteInputSchema>\nexport type McpUniswapV4QuoteOutput = z.infer<typeof mcpUniswapV4QuoteOutputSchema>\nexport type McpUniswapV4CreateSwapInput = z.infer<typeof mcpUniswapV4CreateSwapInputSchema>\nexport type McpUniswapV4CreateSwapOutput = z.infer<typeof mcpUniswapV4CreateSwapOutputSchema>\nexport type McpUniswapV4BuildSwapMultisignInput = z.infer<typeof mcpUniswapV4BuildSwapMultisignInputSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema, jsonObjectSchema } from './common.js'\n\n/** Input for MCP tool `ctm_curve_dao_quote` → handler `curveDaoQuote`. */\nexport const mcpCurveDaoQuoteInputSchema = z.object({\n chainId: z.number().int().positive().describe('EVM chain id (rpcUrl resolved from get_chain_registry rpcGateway)'),\n rpcUrl: z\n .string()\n .min(1)\n .optional()\n .describe('JSON-RPC URL; continuum-mcp-server injects from chain registry — do not pass a public RPC URL'),\n tokenIn: z\n .string()\n .min(1)\n .describe('Input token address, or 0xeeee… / 0x0 / eth for native'),\n tokenOut: z.string().min(1).describe('Output token address or 0xeeee… native placeholder'),\n amountHuman: z.string().min(1).describe('Human-readable amount of tokenIn'),\n tokenInDecimals: z\n .number()\n .int()\n .min(0)\n .max(18)\n .optional()\n .describe('Token-in decimals; omit to read on-chain (native uses 18)'),\n})\n\nexport const mcpCurveDaoQuoteOutputSchema = jsonObjectSchema.describe(\n 'Curve router quote: { inputAmount, output, route, priceImpactPercent?, tokenInRouterId, tokenOutRouterId }',\n)\n\n/** Input for MCP tool `ctm_curve_dao_build_swap_multisign`. */\nexport const mcpCurveDaoBuildSwapMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n tokenIn: evmAddressSchema.describe('ERC-20 sold (native in uses WETH path in UI)'),\n tokenOut: z.string().min(1).describe('Output token or 0xeeee… native placeholder'),\n amountHuman: z.string().min(1).describe('Human-readable amount of tokenIn'),\n slippagePercent: z\n .number()\n .gt(0)\n .lt(100)\n .describe('Slippage 0–100 exclusive'),\n})\n\nexport type McpCurveDaoQuoteInput = z.infer<typeof mcpCurveDaoQuoteInputSchema>\nexport type McpCurveDaoQuoteOutput = z.infer<typeof mcpCurveDaoQuoteOutputSchema>\nexport type McpCurveDaoBuildSwapMultisignInput = z.infer<typeof mcpCurveDaoBuildSwapMultisignInputSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema, jsonObjectSchema, multisignOutputSchema } from './common.js'\n\n/** Extend common multisign inputs with protocol-specific fields. */\nexport function mcpMultisignInput(fields: z.ZodRawShape) {\n return evmMultisignCommonInputSchema.extend(fields)\n}\n\nexport { multisignOutputSchema as mcpMultisignOutputSchema }\n\n// —— Lido ——\nexport const mcpLidoSubmitInputSchema = mcpMultisignInput({\n valueWei: z.string().min(1).describe('ETH to stake (wei decimal string)'),\n referral: evmAddressSchema.optional(),\n})\n\nexport const mcpLidoRequestWithdrawalsInputSchema = mcpMultisignInput({\n stEthAmountsWei: z.array(z.string()).min(1).describe('stETH amounts per withdrawal request (wei strings)'),\n})\n\nexport const mcpLidoClaimWithdrawalInputSchema = mcpMultisignInput({\n requestId: z.union([z.string(), z.number()]).describe('Withdrawal queue request id'),\n})\n\nexport const mcpLidoWrapStEthInputSchema = mcpMultisignInput({\n stEthAmountWei: z.string().min(1),\n})\n\nexport const mcpLidoUnwrapWstEthInputSchema = mcpMultisignInput({\n wstEthAmountWei: z.string().min(1),\n})\n\n// —— Ethena ——\nexport const mcpEthenaStakeInputSchema = mcpMultisignInput({\n usdeAmountHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaRedeemInputSchema = mcpMultisignInput({\n susdeSharesHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaCooldownInputSchema = mcpMultisignInput({\n susdeSharesHuman: z.string().min(1),\n susdeVault: evmAddressSchema.optional(),\n})\n\nexport const mcpEthenaClaimInputSchema = mcpMultisignInput({\n susdeVault: evmAddressSchema.optional(),\n})\n\n// —— Maple ——\nexport const mcpMapleDepositInputSchema = mcpMultisignInput({\n syrupRouter: evmAddressSchema,\n pool: evmAddressSchema,\n asset: evmAddressSchema,\n amountHuman: z.string().min(1),\n authorizeSig: jsonObjectSchema.optional(),\n})\n\nexport const mcpMapleRequestRedeemInputSchema = mcpMultisignInput({\n pool: evmAddressSchema,\n sharesHuman: z.string().min(1),\n receiver: evmAddressSchema,\n})\n\n// —— Sky Lockstake ——\nexport const mcpSkyLockstakeStakeInputSchema = mcpMultisignInput({\n skyAmountHuman: z.string().min(1),\n usdsDrawHuman: z.string().optional(),\n farmRef: z.string().optional(),\n})\n\nexport const mcpSkyLockstakeDrawInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeWipeInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeCloseInputSchema = mcpMultisignInput({\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkyLockstakeGetRewardInputSchema = mcpMultisignInput({\n urnIndex: z.number().int().nonnegative(),\n})\n\nexport const mcpSkySusdsDepositInputSchema = mcpMultisignInput({\n usdsAmountHuman: z.string().min(1),\n})\n\nexport const mcpSkySusdsRedeemInputSchema = mcpMultisignInput({\n sharesHuman: z.string().min(1),\n})\n\n// —— Aave v4 ——\nexport const mcpAaveV4DepositInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4WithdrawInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4BorrowInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\nexport const mcpAaveV4RepayInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema,\n underlying: evmAddressSchema,\n amountHuman: z.string().min(1),\n marketId: z.string().min(1),\n})\n\n// —— Euler v2 ——\nexport const mcpEulerV2IsolatedLendInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n assetAmountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2IsolatedBorrowInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n borrowAsset: evmAddressSchema,\n collateralAmountHuman: z.string().min(1),\n loopBorrowWeis: z.array(z.string()).min(1),\n})\n\nexport const mcpEulerV2VaultWithdrawInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n sharesHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2BorrowRepayInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2CollateralDepositInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpEulerV2CollateralWithdrawInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n collateralAsset: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport type McpLidoSubmitInput = z.infer<typeof mcpLidoSubmitInputSchema>\nexport type McpEthenaStakeInput = z.infer<typeof mcpEthenaStakeInputSchema>\nexport type McpMapleDepositInput = z.infer<typeof mcpMapleDepositInputSchema>\nexport type McpSkyLockstakeStakeInput = z.infer<typeof mcpSkyLockstakeStakeInputSchema>\nexport type McpAaveV4DepositInput = z.infer<typeof mcpAaveV4DepositInputSchema>\nexport type McpEulerV2IsolatedLendInput = z.infer<typeof mcpEulerV2IsolatedLendInputSchema>\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nimport type { McpToolDefinition, McpToolHandler } from './mcpTypes.js'\nimport {\n mcpAaveV4BorrowInputSchema,\n mcpAaveV4DepositInputSchema,\n mcpAaveV4RepayInputSchema,\n mcpAaveV4WithdrawInputSchema,\n mcpEthenaClaimInputSchema,\n mcpEthenaCooldownInputSchema,\n mcpEthenaRedeemInputSchema,\n mcpEthenaStakeInputSchema,\n mcpEulerV2BorrowRepayInputSchema,\n mcpEulerV2CollateralDepositInputSchema,\n mcpEulerV2CollateralWithdrawInputSchema,\n mcpEulerV2IsolatedBorrowInputSchema,\n mcpEulerV2IsolatedLendInputSchema,\n mcpEulerV2VaultWithdrawInputSchema,\n mcpLidoClaimWithdrawalInputSchema,\n mcpLidoRequestWithdrawalsInputSchema,\n mcpLidoSubmitInputSchema,\n mcpLidoUnwrapWstEthInputSchema,\n mcpLidoWrapStEthInputSchema,\n mcpMapleDepositInputSchema,\n mcpMapleRequestRedeemInputSchema,\n mcpMultisignOutputSchema,\n mcpSkyLockstakeCloseInputSchema,\n mcpSkyLockstakeDrawInputSchema,\n mcpSkyLockstakeGetRewardInputSchema,\n mcpSkyLockstakeStakeInputSchema,\n mcpSkyLockstakeWipeInputSchema,\n mcpSkySusdsDepositInputSchema,\n mcpSkySusdsRedeemInputSchema,\n} from './schemas/protocols.js'\n\nfunction defineProtocolMcpTool<TInput>(def: {\n name: string\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n description: string\n prerequisites: string[]\n followUp: string[]\n inputZod: z.ZodType<TInput>\n handler: McpToolHandler\n}): McpToolDefinition<TInput, z.infer<typeof mcpMultisignOutputSchema>> {\n return {\n ...def,\n outputZod: mcpMultisignOutputSchema,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(mcpMultisignOutputSchema),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => mcpMultisignOutputSchema.parse(data),\n }\n}\n\n/** MCP tools for Lido, Ethena, Maple, Sky, Aave v4, and Euler v2 multisign builders. */\nexport const MCP_PROTOCOL_TOOL_DEFINITIONS = [\n defineProtocolMcpTool({\n name: 'ctm_lido_build_submit_multisign',\n actionId: 'lido.submit',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build mpc-auth multiSignRequest for Lido ETH stake (submit).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoSubmit' },\n inputZod: mcpLidoSubmitInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_request_withdrawals_multisign',\n actionId: 'lido.request-withdrawals',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build batch for Lido withdrawal queue (approve + requestWithdrawals).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoRequestWithdrawals' },\n inputZod: mcpLidoRequestWithdrawalsInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_claim_withdrawal_multisign',\n actionId: 'lido.claim-withdrawal',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build tx for Lido claimWithdrawal.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoClaimWithdrawal' },\n inputZod: mcpLidoClaimWithdrawalInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_wrap_steth_multisign',\n actionId: 'lido.wrap-steth',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build batch for wstETH wrap.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoWrapStEth' },\n inputZod: mcpLidoWrapStEthInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_lido_build_unwrap_wsteth_multisign',\n actionId: 'lido.unwrap-wsteth',\n protocolId: 'lido',\n chainCategory: 'evm',\n description: 'Build tx for wstETH unwrap.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/lido', exportName: 'buildEvmMultisignBodyLidoUnwrapWstEth' },\n inputZod: mcpLidoUnwrapWstEthInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_stake_multisign',\n actionId: 'ethena.stake-usde',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build batch: USDe approve + sUSDe deposit.',\n prerequisites: ['keyGen', 'executorAddress', 'Ethereum mainnet RPC'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaUsdeStakeToSusde' },\n inputZod: mcpEthenaStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_redeem_multisign',\n actionId: 'ethena.redeem-susde',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build sUSDe redeem when cooldown is off.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaSusdeRedeemToUsde' },\n inputZod: mcpEthenaRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_cooldown_multisign',\n actionId: 'ethena.cooldown-shares',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build sUSDe cooldownShares batch step.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaSusdeCooldownShares' },\n inputZod: mcpEthenaCooldownInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_ethena_build_claim_multisign',\n actionId: 'ethena.claim-unstake',\n protocolId: 'ethena',\n chainCategory: 'evm',\n description: 'Build unstake claim after cooldown.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/ethena', exportName: 'buildEvmMultisignBodyEthenaUnstakeClaim' },\n inputZod: mcpEthenaClaimInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_maple_build_deposit_multisign',\n actionId: 'maple-syrup.deposit',\n protocolId: 'maple-syrup',\n chainCategory: 'evm',\n description: 'Build Maple Syrup router deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'router + pool addresses'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/maple', exportName: 'buildEvmMultisignBodyMapleSyrupDeposit' },\n inputZod: mcpMapleDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_maple_build_request_redeem_multisign',\n actionId: 'maple-syrup.request-redeem',\n protocolId: 'maple-syrup',\n chainCategory: 'evm',\n description: 'Build Maple PoolV2 requestRedeem batch.',\n prerequisites: ['keyGen', 'executorAddress', 'pool address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/maple', exportName: 'buildEvmMultisignBodyMaplePoolRequestRedeem' },\n inputZod: mcpMapleRequestRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_stake_multisign',\n actionId: 'sky.lockstake-stake',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Sky Lockstake open/stake batch.',\n prerequisites: ['keyGen', 'executorAddress', 'Ethereum mainnet RPC'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeStakePositionBatch' },\n inputZod: mcpSkyLockstakeStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_draw_multisign',\n actionId: 'sky.lockstake-draw',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake draw (borrow USDS).',\n prerequisites: ['keyGen', 'executorAddress', 'open urn'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeDrawBatch' },\n inputZod: mcpSkyLockstakeDrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_wipe_multisign',\n actionId: 'sky.lockstake-wipe',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake repay/wipe batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeWipeBatch' },\n inputZod: mcpSkyLockstakeWipeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_close_multisign',\n actionId: 'sky.lockstake-close',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake close position batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeCloseBatch' },\n inputZod: mcpSkyLockstakeCloseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_lockstake_get_reward_multisign',\n actionId: 'sky.lockstake-get-reward',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build Lockstake getReward batch.',\n prerequisites: ['keyGen', 'executorAddress', 'urn index'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkyLockstakeGetRewardBatch' },\n inputZod: mcpSkyLockstakeGetRewardInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_susds_deposit_multisign',\n actionId: 'sky.susds-deposit',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build USDS → sUSDS ERC-4626 deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkySusdsDepositFromUsdsBatch' },\n inputZod: mcpSkySusdsDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_sky_build_susds_redeem_multisign',\n actionId: 'sky.susds-redeem',\n protocolId: 'sky',\n chainCategory: 'evm',\n description: 'Build sUSDS redeem to USDS batch.',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/sky', exportName: 'buildSkySusdsRedeemToUsdsBatch' },\n inputZod: mcpSkySusdsRedeemInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_deposit_multisign',\n actionId: 'aave-v4.deposit',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke supply/deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4DepositBatch' },\n inputZod: mcpAaveV4DepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_withdraw_multisign',\n actionId: 'aave-v4.withdraw',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke withdraw batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeWithdraw' },\n inputZod: mcpAaveV4WithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_borrow_multisign',\n actionId: 'aave-v4.borrow',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke borrow batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeBorrow' },\n inputZod: mcpAaveV4BorrowInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_aave_v4_build_repay_multisign',\n actionId: 'aave-v4.repay',\n protocolId: 'aave-v4',\n chainCategory: 'evm',\n description: 'Build Aave v4 Spoke repay batch.',\n prerequisites: ['keyGen', 'executorAddress', 'spoke + underlying'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/aave-v4', exportName: 'buildEvmMultisignBodyAaveV4SpokeRepay' },\n inputZod: mcpAaveV4RepayInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_isolated_lend_multisign',\n actionId: 'euler-v2.isolated-lend',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 vault deposit/lend batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch' },\n inputZod: mcpEulerV2IsolatedLendInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_isolated_borrow_multisign',\n actionId: 'euler-v2.isolated-borrow',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 isolated borrow loop batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2IsolatedBorrowBatch' },\n inputZod: mcpEulerV2IsolatedBorrowInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_vault_withdraw_multisign',\n actionId: 'euler-v2.vault-withdraw',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 vault withdraw/redeem batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2VaultWithdraw' },\n inputZod: mcpEulerV2VaultWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_borrow_repay_multisign',\n actionId: 'euler-v2.borrow-repay',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow repay batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault address'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowRepayBatch' },\n inputZod: mcpEulerV2BorrowRepayInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_collateral_deposit_multisign',\n actionId: 'euler-v2.collateral-deposit',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow collateral deposit batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral asset'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch' },\n inputZod: mcpEulerV2CollateralDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_euler_v2_build_collateral_withdraw_multisign',\n actionId: 'euler-v2.collateral-withdraw',\n protocolId: 'euler-v2',\n chainCategory: 'evm',\n description: 'Build Euler v2 borrow collateral withdraw batch.',\n prerequisites: ['keyGen', 'executorAddress', 'vault + collateral asset'],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest'],\n handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch' },\n inputZod: mcpEulerV2CollateralWithdrawInputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\nimport { getProtocolModules } from '../core/registry.js'\nimport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nimport type { McpToolDefinition, McpToolHandler } from './mcpTypes.js'\nimport {\n mcpCurveDaoBuildSwapMultisignInputSchema,\n mcpCurveDaoQuoteInputSchema,\n mcpCurveDaoQuoteOutputSchema,\n mcpUniswapV4BuildSwapMultisignInputSchema,\n mcpUniswapV4CreateSwapInputSchema,\n mcpUniswapV4CreateSwapOutputSchema,\n mcpUniswapV4QuoteInputSchema,\n mcpUniswapV4QuoteOutputSchema,\n multisignOutputSchema,\n} from './schemas/index.js'\nimport { MCP_PROTOCOL_TOOL_DEFINITIONS } from './mcpProtocolTools.js'\n\nexport type { McpJsonSchema, McpSchemaProperty, McpToolHandler, McpToolDefinition } from './mcpTypes.js'\n\nfunction defineMcpTool<TInput, TOutput>(def: {\n name: string\n actionId: string\n protocolId: string\n chainCategory: ChainCategory\n description: string\n prerequisites: string[]\n followUp: string[]\n inputZod: z.ZodType<TInput>\n outputZod: z.ZodType<TOutput>\n handler: McpToolHandler\n}): McpToolDefinition<TInput, TOutput> {\n return {\n ...def,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(def.outputZod),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => def.outputZod.parse(data),\n }\n}\n\n/** Curated MCP tools — Uniswap/Curve core + all protocol multisign builders. */\nconst CORE_MCP_TOOL_DEFINITIONS = [\n defineMcpTool({\n name: 'ctm_uniswap_v4_quote',\n actionId: 'uniswap-v4.quote',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Fetch a Uniswap V4 Trade API quote (POST /v1/quote). Returns classic quote JSON including quote.input/output amounts and routing. Does NOT create a sign request — use ctm_uniswap_v4_create_swap and ctm_uniswap_v4_build_swap_multisign after quoting. Requires uniswapApiKey and swapper (MPC executor address) or keyGen + managementNodeUrl to resolve swapper.',\n prerequisites: ['Chain must be supported by Uniswap V4 (Universal Router map).'],\n followUp: ['ctm_uniswap_v4_create_swap', 'ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapTradeQuote' },\n inputZod: mcpUniswapV4QuoteInputSchema,\n outputZod: mcpUniswapV4QuoteOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_create_swap',\n actionId: 'uniswap-v4.create-swap',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Call Uniswap Trade API POST /v1/swap to build Universal Router calldata from a prior quote. Returns { swap: { to, data, value, gasLimit? }, requestId? }. Does NOT produce a multiSignRequest — call ctm_uniswap_v4_build_swap_multisign next.',\n prerequisites: ['ctm_uniswap_v4_quote output (fullQuoteFromPermit)'],\n followUp: ['ctm_uniswap_v4_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapCreateSwap' },\n inputZod: mcpUniswapV4CreateSwapInputSchema,\n outputZod: mcpUniswapV4CreateSwapOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_build_swap_multisign',\n actionId: 'uniswap-v4.swap-exact-input',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest body for a Uniswap V4 swap. May batch 1–3 EVM txs: ERC-20 approve(s) to Permit2/router path + Universal Router swap (or 1 tx for native-in). Estimates gas, serializes unsigned txs, sets proposalTxParams. Output must be signed and POSTed to /multiSignRequest by the caller.',\n prerequisites: [\n 'ctm_uniswap_v4_create_swap output',\n 'keyGen with pubkeyhex',\n 'executorAddress matching MPC wallet',\n 'RPC URL and chainDetail from node chain config',\n ],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig and signedMessage'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'buildEvmMultisignBodyUniswapV4SkipPermit2Batch' },\n inputZod: mcpUniswapV4BuildSwapMultisignInputSchema,\n outputZod: multisignOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_curve_dao_quote',\n actionId: 'curve-dao.quote',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n 'Fetch a Curve Router NG quote via @curvefi/api getBestRouteAndOutput. Returns output amount, route, and optional priceImpactPercent. Does NOT create a sign request — call ctm_curve_dao_build_swap_multisign after quoting. Pass chainId only; rpcUrl is resolved from get_chain_registry rpcGateway.',\n prerequisites: [\n 'Chain must be supported by Curve (@curvefi/api network constants).',\n 'Configure rpcGateway for chainId in get_chain_registry.',\n ],\n followUp: ['ctm_curve_dao_build_swap_multisign'],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'curveDaoQuote' },\n inputZod: mcpCurveDaoQuoteInputSchema,\n outputZod: mcpCurveDaoQuoteOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_curve_dao_build_swap_multisign',\n actionId: 'curve-dao.swap',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n 'Build mpc-auth multiSignRequest for a Curve Router NG swap via @curvefi/api populateSwap. Optionally batches ERC-20 approve txs when allowance is insufficient, then exchange. Requires JSON-RPC and Curve-supported chain.',\n prerequisites: [\n 'ctm_curve_dao_quote (recommended) or known-good route',\n 'keyGenId + chainId + purposeText',\n 'tokenIn/tokenOut/amountHuman/slippagePercent',\n ],\n followUp: ['Sign messageToSign', 'POST /multiSignRequest with clientSig and signedMessage'],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'buildEvmMultisignBodyCurveDaoBatch' },\n inputZod: mcpCurveDaoBuildSwapMultisignInputSchema,\n outputZod: multisignOutputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n\nexport const MCP_TOOL_DEFINITIONS: readonly McpToolDefinition[] = [\n ...CORE_MCP_TOOL_DEFINITIONS,\n ...MCP_PROTOCOL_TOOL_DEFINITIONS,\n]\n\nfunction buildToolSchemaMap(kind: 'input' | 'output'): Record<string, z.ZodType> {\n const out: Record<string, z.ZodType> = {}\n for (const tool of MCP_TOOL_DEFINITIONS) {\n out[tool.name] = kind === 'input' ? tool.inputZod : tool.outputZod\n }\n return out\n}\n\n/** Map tool name → input Zod schema (for typed dispatch in MCP servers). */\nexport const MCP_TOOL_INPUT_SCHEMAS = buildToolSchemaMap('input')\n\n/** Map tool name → output Zod schema. */\nexport const MCP_TOOL_OUTPUT_SCHEMAS = buildToolSchemaMap('output')\n\n/** Union of registered MCP tool names. */\nexport type McpToolName = (typeof MCP_TOOL_DEFINITIONS)[number]['name']\n\nexport type McpToolInputMap = {\n [K in McpToolName]: z.infer<(typeof MCP_TOOL_INPUT_SCHEMAS)[K]>\n}\n\nexport type McpToolOutputMap = {\n [K in McpToolName]: z.infer<(typeof MCP_TOOL_OUTPUT_SCHEMAS)[K]>\n}\n\nexport function getMcpToolDefinitions(): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS\n}\n\nexport function getMcpToolByName(name: string): McpToolDefinition | undefined {\n return MCP_TOOL_DEFINITIONS.find((t) => t.name === name)\n}\n\nexport function getMcpToolInputSchema(name: McpToolName): z.ZodType {\n const schema = MCP_TOOL_INPUT_SCHEMAS[name]\n if (!schema) throw new Error(`Unknown MCP tool: ${name}`)\n return schema\n}\n\nexport function getMcpToolOutputSchema(name: McpToolName): z.ZodType {\n const schema = MCP_TOOL_OUTPUT_SCHEMAS[name]\n if (!schema) throw new Error(`Unknown MCP tool: ${name}`)\n return schema\n}\n\n/** Parse and validate MCP tool arguments with the registered Zod schema. */\nexport function parseMcpToolInput(name: McpToolName, data: unknown): unknown {\n return getMcpToolInputSchema(name).parse(data)\n}\n\n/** Parse and validate MCP tool handler output. */\nexport function parseMcpToolOutput(name: McpToolName, data: unknown): unknown {\n return getMcpToolOutputSchema(name).parse(data)\n}\n\n/** Summary from protocol registry (shorter) plus full MCP tool list. */\nexport function getAgentCatalogForMcp() {\n return {\n tools: MCP_TOOL_DEFINITIONS,\n protocols: getProtocolModules(),\n commonParams: EVM_COMMON_PARAM_DOCS,\n multisignOutput: MULTISIGN_OUTPUT_DOC,\n managementSig: MANAGEMENT_SIG_DOC,\n /** Zod schemas for MCP tool I/O — source of truth for continuum-mcp-server validation. */\n inputSchemas: MCP_TOOL_INPUT_SCHEMAS,\n outputSchemas: MCP_TOOL_OUTPUT_SCHEMAS,\n workflow: {\n evmSwapTypical: [\n '1. Quote (protocol-specific API if needed)',\n '2. Build protocol calldata (e.g. create_swap)',\n '3. build_*_multisign → { bodyForSign, messageToSign }',\n '4. Sign messageToSign (MetaMask or Ed25519)',\n '5. POST /multiSignRequest with clientSig and signedMessage',\n ],\n managementPostTypical: [\n '1. GET /getNodeKey → nodeKey (128 hex)',\n '2. GET /getPublicMgtKeyNonce or /getNodeMgtKeyNonce → nonce',\n '3. buildManagementPostBody(nonce, nodeKey, { …endpoint fields })',\n '4. messageToSignManagementBody(body) → sign → withManagementClientSig(body, sig)',\n '5. POST management route with signed body (no signedMessage field except configUpdateImplement opaque line)',\n ],\n agentMultisignTypical: [\n '1. load_defi_protocol for the target protocol',\n '2. get_defi_protocol_supported_chains / get_token_registry to pick chainId and tokens',\n '3. MCP build_* tool with keyGenId + chainId → { requestId }',\n '4. Base MCP: wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result',\n ],\n },\n }\n}\n","import { getAddress, zeroAddress, type Address } from 'viem'\n\n/** Lido staking / stERC-20 (“stETH”) on Ethereum mainnet — same proxy for `submit` + ERC‑20 balances. */\nexport const LIDO_STETH_CONTRACT_MAINNET = getAddress(\n '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n)\n\n/** Lido Wrapped stETH (ERC-20): `wrap` / `unwrap`. */\nexport const LIDO_WSTETH_CONTRACT_MAINNET = getAddress(\n '0x7f39C581F595B853cBbF37C12FfeeA971C5a5bEa',\n)\n\n/** EIP-7623-era Withdrawal Queue (NFT-backed requests). */\nexport const LIDO_WITHDRAWAL_QUEUE_MAINNET = getAddress('0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1')\n\nexport const LIDO_ETHEREUM_MAINNET_CHAIN_ID = 1\n\n/** Accepted referral pad for `submit`; zero is valid. */\nexport const LIDO_SUBMIT_REFERRAL_MAINNET = zeroAddress satisfies Address\n\nexport function isEthereumMainnetChainId(chainIdStr: string | undefined | null): boolean {\n return String(chainIdStr ?? '').trim() === String(LIDO_ETHEREUM_MAINNET_CHAIN_ID)\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { LIDO_ETHEREUM_MAINNET_CHAIN_ID } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './multisign.js'\nexport * from './aprApi.js'\nexport * from './withdrawalTimeApi.js'\nexport * from './withdrawalReceiptParse.js'\n\nexport const LIDO_PROTOCOL_ID = 'lido'\n\nexport const lidoProtocolModule: ProtocolModule = {\n id: LIDO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return Number(ctx.chainId) === LIDO_ETHEREUM_MAINNET_CHAIN_ID\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'lido.submit', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake ETH via Lido submit()', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { valueWei: { type: 'string', required: true, description: 'ETH to stake (wei string)' } } },\n { id: 'lido.request-withdrawals', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Queue stETH withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.claim-withdrawal', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim finalized withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.wrap-steth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Wrap stETH to wstETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.unwrap-wsteth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Unwrap wstETH to stETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(lidoProtocolModule)\n","/**\n * Ethena USDe (synthetic USD) — published contract addresses and EVM chain coverage.\n * @see https://docs.ethena.fi/solution-design/key-addresses\n */\nimport { getAddress } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nexport const ETHENA_LABS_GITHUB = 'https://github.com/ethena-labs'\nexport const ETHENA_KEY_ADDRESSES_DOC = 'https://docs.ethena.fi/solution-design/key-addresses'\n\nexport const USDE_ETHEREUM_MAINNET = '0x4c9edd5852cd905f086c759e8383e09bff1e68b3' as const\n/** sUSDe (StakedUSDe / ERC-4626 vault share) on Ethereum mainnet. @see Ethena key addresses */\nexport const SUSDE_ETHEREUM_MAINNET = '0x9d39a5de30e57443bff2a8307a4256c8797a3497' as const\n/** “Most L2s” in Ethena’s key-addresses table (same bytecode address on many networks). */\nexport const USDE_MOST_L2S = '0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34' as const\nexport const USDE_ZKSYNC_ERA = '0x39Fe7a0DACcE31Bd90418e3e659fb0b5f0B3Db0d' as const\n\nconst L2_SAME_ADDRESS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 42161, // Arbitrum One\n 10, // Optimism\n 8453, // Base\n 56, // BNB Chain\n 59144, // Linea\n 5000, // Mantle\n 81457, // Blast\n 169, // Manta Pacific\n 534352, // Scroll\n 252, // Fraxtal\n 34443, // Mode\n 196, // X Layer\n 1088, // Metis\n 80084, // Berachain\n 2222, // Kava\n 2818, // Morph\n 1923, // Swell\n 48900, // Zircuit\n])\n\n/** Human-readable default label when the node’s chain list has no name for that id. */\nconst FALLBACK_NAME_BY_ID: Readonly<Record<number, string>> = {\n 1: 'Ethereum',\n 42161: 'Arbitrum One',\n 10: 'Optimism',\n 8453: 'Base',\n 56: 'BNB Chain',\n 59144: 'Linea',\n 5000: 'Mantle',\n 81457: 'Blast',\n 169: 'Manta Pacific',\n 534352: 'Scroll',\n 252: 'Fraxtal',\n 34443: 'Mode',\n 196: 'X Layer',\n 1088: 'Metis',\n 80084: 'Berachain',\n 2222: 'Kava',\n 2818: 'Morph',\n 1923: 'Swell',\n 48900: 'Zircuit',\n 324: 'ZKSync Era',\n}\n\n/**\n * USDe address on a chain, or `null` if we do not model USDe for that EVM id (e.g. testnets / unlisted L2s).\n */\nexport function usdeTokenAddressOnEvmChain(chainId: number): `0x${string}` | null {\n if (chainId === 1) return USDE_ETHEREUM_MAINNET\n if (chainId === 324) return USDE_ZKSYNC_ERA\n if (L2_SAME_ADDRESS_CHAIN_IDS.has(chainId)) return USDE_MOST_L2S\n return null\n}\n\nexport function isEthenaUsdeOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = usdeTokenAddressOnEvmChain(n)\n if (!expected) return false\n try {\n return getAddress(contractAddress) === getAddress(expected)\n } catch {\n return false\n }\n}\n\nexport type EthenaUsdeEvmNetworkRow = {\n chainId: number\n /** Static fallback; UI may prefer a name from the node’s chain list. */\n label: string\n usde: `0x${string}`\n}\n\n/**\n * EVM mainnets with a known USDe deployment for the “networks” table in the Ethena dialog.\n * ZKSync uses a different address; all other listed L2s here share `USDE_MOST_L2S`.\n */\nexport function listEthenaUsdeEvmNetworkRows(): EthenaUsdeEvmNetworkRow[] {\n const rows: EthenaUsdeEvmNetworkRow[] = [\n { chainId: 1, label: FALLBACK_NAME_BY_ID[1]!, usde: USDE_ETHEREUM_MAINNET },\n ]\n const l2 = [...L2_SAME_ADDRESS_CHAIN_IDS].sort((a, b) => a - b)\n for (const id of l2) {\n rows.push({\n chainId: id,\n label: FALLBACK_NAME_BY_ID[id] ?? `Chain ${id}`,\n usde: USDE_MOST_L2S,\n })\n }\n rows.push({ chainId: 324, label: FALLBACK_NAME_BY_ID[324]!, usde: USDE_ZKSYNC_ERA })\n return rows.sort((a, b) => {\n if (a.chainId === 1) return -1\n if (b.chainId === 1) return 1\n return a.chainId - b.chainId\n })\n}\n\nexport function isEvmChainInEthenaUsdeList(chainId: number): boolean {\n return usdeTokenAddressOnEvmChain(chainId) != null\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isEvmChainInEthenaUsdeList } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\nexport * from './mintingRead.js'\nexport * from './stakedUsdeRead.js'\n\nexport const ETHENA_PROTOCOL_ID = 'ethena'\n\nexport const ethenaProtocolModule: ProtocolModule = {\n id: ETHENA_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isEvmChainInEthenaUsdeList(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'ethena.stake-usde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake USDe → sUSDe', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { amountHuman: { type: 'string', required: true, description: 'USDe amount' } } },\n { id: 'ethena.redeem-susde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem sUSDe → USDe (no cooldown)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.cooldown-shares', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Start sUSDe cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.claim-unstake', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim after cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(ethenaProtocolModule)\n","/** Public Maple Syrup (PoolV2 + SyrupRouter) integration constants. */\n\n/** Attributed deposits per Maple partner guidance (`bytes32` string label). */\nexport const MAPLE_SYRUP_DEPOSIT_DATA_ASCII = '0:continuumdao'\n\nexport const MAPLE_INTEGRATION_DOCS_URL =\n 'https://docs.maple.finance/integrate/ethereum-mainnet/frontend-integration'\n\nexport function mapleGraphqlEndpointForChain(chainId: number): string | null {\n if (chainId === 1) return 'https://api.maple.finance/v2/graphql'\n if (chainId === 11155111) return 'https://sepolia.api.maple.finance/v2/graphql'\n return null\n}\n\nexport function isMapleSyrupSupportedChain(chainId: number): boolean {\n return chainId === 1 || chainId === 11155111\n}\n","/**\n * Optional browser → Next.js API proxy paths for DeFi upstream calls.\n * Set once from continuumdao-node-app client bootstrap.\n */\n\nlet aaveGraphqlProxyUrl: string | undefined\nlet eulerGraphqlProxyUrl: string | undefined\nlet mapleGraphqlProxyUrl: string | undefined\nlet coingeckoProxyUrl: string | undefined\n\nexport function setAaveGraphqlProxyUrl(url: string | undefined): void {\n aaveGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getAaveGraphqlProxyUrl(): string | undefined {\n return aaveGraphqlProxyUrl\n}\n\nexport function setEulerGraphqlProxyUrl(url: string | undefined): void {\n eulerGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getEulerGraphqlProxyUrl(): string | undefined {\n return eulerGraphqlProxyUrl\n}\n\nexport function setMapleGraphqlProxyUrl(url: string | undefined): void {\n mapleGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMapleGraphqlProxyUrl(): string | undefined {\n return mapleGraphqlProxyUrl\n}\n\nexport function setCoingeckoProxyUrl(url: string | undefined): void {\n coingeckoProxyUrl = url?.trim() || undefined\n}\n\nexport function getCoingeckoProxyUrl(): string | undefined {\n return coingeckoProxyUrl\n}\n\nexport async function postJsonViaOptionalProxy<T>(args: {\n directUrl: string\n body: unknown\n proxyUrl?: string\n proxyEnvelope?: unknown\n}): Promise<T> {\n const proxy = args.proxyUrl?.trim()\n if (proxy) {\n const r = await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.proxyEnvelope ?? args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Proxy HTTP ${r.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r.status}`)\n }\n return (await r.json()) as T\n }\n const r = await fetch(args.directUrl, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isMapleSyrupSupportedChain } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\nexport * from './graphql.js'\n\nexport const MAPLE_PROTOCOL_ID = 'maple-syrup'\n\nexport const mapleProtocolModule: ProtocolModule = {\n id: MAPLE_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isMapleSyrupSupportedChain(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'maple-syrup.deposit', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Maple Syrup pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'maple-syrup.request-redeem', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Request redeem from pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(mapleProtocolModule)\n","/**\n * Sky LockStake on Ethereum mainnet.\n * @see https://developers.skyeco.com/protocol/rewards/staking-engine/\n * @see https://developers.skyeco.com/guides/sky/token-governance-upgrade/key-info/ (contract list)\n */\n/** Sky (SKY token) on Ethereum mainnet. */\nexport const SKY_ETHEREUM_MAINNET = '0x56072C95FAA701256059aa122697B133aDEd9279'\nexport const SKY_ETHEREUM_MAINNET_CHAIN_ID = 1\nexport const USDS_ETHEREUM_MAINNET = '0xdC035D45d973E3EC169d2276DDab16f1e407384F'\n\n/** sUSDS ERC-4626 vault (share token); deposit USDS → mint shares, redeem shares → USDS. @see https://developers.skyeco.com/protocol/tokens/susds/ */\nexport const SUSDS_VAULT_ERC4626_MAINNET = '0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD'\n\n/**\n * Staking Engine (LockStake) — **Chief V3 / SKY** (active; `LSEV2-SKY-A` ilk). This is the contract users should call.\n * Do not use Seal Engine V1 (`0x2b16C07D…`, MKR / Chief V2 legacy); it has little traffic and is not the current SKY engine.\n * Dual entrypoints: legacy `lock`/`free` (MKR path) vs **`lockSky`/`freeSky`** for SKY collateral via `mkrSky`.\n */\nexport const SKY_LOCKSTAKE_ENGINE_MAINNET = '0xCe01C90dE7FD1bcFa39e237FE6D8D9F569e8A6a3'\n\n/**\n * Wrapped SKY used inside the urn after `lockSky`; StakingRewards farms must list this ERC-20 as `stakingToken()`.\n * @see Symbol `lsSKY`.\n */\nexport const SKY_LS_SKY_ERC20_MAINNET = '0xf9A9cfD3229E985B91F99Bc866d42938044FFa1C'\n\n/**\n * Default staking rewards farm on {@link SKY_LOCKSTAKE_ENGINE_MAINNET} — must be ACTIVE and `stakingToken() === lsSKY`.\n * (Older Seal-engine farm addresses are not whitelisted on the current engine.)\n */\nexport const SKY_LOCKSTAKE_DEFAULT_FARM_MAINNET = '0xB44C2Fb4181D7Cb06bdFf34A46FdFe4a259B40Fc'\nexport const SKY_LOCKSTAKE_DEFAULT_FARM_REF = 1\n\n/**\n * Rough UI collateral factor for “remaining borrow (USD)” estimate in the LockStake dialog only.\n * Not protocol liquidation collateralization; see `SkyLockstakeDialog` disclosures.\n */\nexport const SKY_LOCKSTAKE_UI_COLLATERAL_FACTOR = 0.65\n\nexport const SKY_TOKEN_DECIMALS = 18\nexport const USDS_DECIMALS = 18\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { SKY_ETHEREUM_MAINNET_CHAIN_ID } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './lockstakeMultisign.js'\nexport * from './susdsMultisign.js'\nexport * from './lockstakeRead.js'\nexport * from './susdsRead.js'\nexport * from './usdPrice.js'\nexport * from './loadLockstakeSupportedChainIds.js'\n\nexport const SKY_PROTOCOL_ID = 'sky'\n\nexport const skyProtocolModule: ProtocolModule = {\n id: SKY_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return Number(ctx.chainId) === SKY_ETHEREUM_MAINNET_CHAIN_ID\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'sky.lockstake-stake', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Open Lockstake position', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-draw', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow USDS from Lockstake', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-wipe', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Lockstake debt', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.lockstake-close', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Close Lockstake position', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.susds-deposit', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit USDS into sUSDS vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'sky.susds-redeem', protocolId: SKY_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem sUSDS to USDS', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(skyProtocolModule)\n","import { getAddress, isAddress } from 'viem'\nimport { getAaveGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\n\nexport const AAVE_V4_GRAPHQL_URL = 'https://api.v4.aave.com/graphql'\n\ntype GqlError = { message?: string }\n\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function aaveV4Gql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const j = await postJsonViaOptionalProxy<GqlData<T> & { errors?: GqlError[] }>({\n directUrl: AAVE_V4_GRAPHQL_URL,\n body,\n proxyUrl: getAaveGraphqlProxyUrl(),\n proxyEnvelope: body,\n })\n if (j.errors?.length) {\n const msg = j.errors.map((e) => e.message ?? 'Unknown').join('; ')\n throw new Error(msg)\n }\n if (j.data == null) {\n throw new Error('Aave V4 API: empty response')\n }\n return j.data\n}\n\ntype ChainRowV4 = { chainId: number; name?: string | null; nativeWrappedToken?: string | null }\n\nexport async function fetchAaveV4Chains(): Promise<readonly ChainRowV4[]> {\n const d = await aaveV4Gql<{ chains: ChainRowV4[] }>(`\n query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }\n `, { c: { query: { filter: 'ALL' } } })\n return d.chains ?? []\n}\n\n/**\n * Aave v4: supported EVM chain IDs (from {@link fetchAaveV4Chains}).\n */\nexport async function loadAaveV4SupportedChainIdsFromV4Api(): Promise<ReadonlySet<number>> {\n const rows = await fetchAaveV4Chains()\n const s = new Set<number>()\n for (const c of rows) s.add(c.chainId)\n return s\n}\n\nconst RESERVES_ADDRESS_FRAGMENT = `\n asset { underlying { address } }\n`\n\nexport type V4ReservesListRow = {\n id: string\n onChainId?: string | null\n spoke?: {\n address: string\n name?: string | null\n liquidationConfig?: { targetHealthFactor: string; healthFactorForMaxBonus: string } | null\n } | null\n summary: {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n }\n userState: {\n balance: { amount: { value: string; decimals: number } } | null\n borrowable?: { amount: { value: string; decimals: number } } | null\n } | null\n}\n\nexport function aggregateV4SupplyDisplay(\n symbolForDisplay: string,\n rows: readonly V4ReservesListRow[],\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n const sym = (symbolForDisplay ?? '').trim()\n const withSuffix = (n: string) => (n === '—' ? '—' : sym ? `${n} ${sym}` : n)\n\n if (!rows.length) {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n\n const apy = formatV4SupplyApy(rows)\n\n const sumKey = (key: 'supplied' | 'borrowed') =>\n sumNumberValues(\n rows.map((r) => {\n const v = key === 'supplied' ? r.summary?.supplied?.amount : r.summary?.borrowed?.amount\n return (v?.value ?? '').trim()\n }),\n )\n\n const totalSupN = sumKey('supplied')\n const totalBorN = sumKey('borrowed')\n const totalDeposits =\n totalSupN == null ? '—' : withSuffix(formatAaveV4TokenAmount(totalSupN))\n\n const availableLiquidity = (() => {\n if (totalSupN == null || totalBorN == null) return '—'\n const a = totalSupN - totalBorN\n if (!Number.isFinite(a)) return '—'\n return withSuffix(formatAaveV4TokenAmount(a < 0 ? 0 : a))\n })()\n\n const userN = userSupplyBalanceNumber(rows)\n const depositedAmount = userN == null ? '—' : withSuffix(formatAaveV4TokenAmount(userN))\n\n return { depositedAmount, apy, totalDeposits, availableLiquidity }\n}\n\nfunction sumNumberValues(values: ReadonlyArray<string>): number | null {\n if (!values.length) return null\n let s = 0\n for (const v of values) {\n const n = parseFloat(v)\n if (Number.isFinite(n)) s += n\n }\n return s\n}\n\n/**\n * Formats a token notional for display: uses k (≥1k) and M (≥1M) with a few decimal places, otherwise limited decimals.\n * Safe to reuse outside the Aave V4 dialog (e.g. tables, tooltips).\n */\nexport function formatAaveV4TokenAmount(n: number): string {\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n const sign = n < 0 ? '-' : ''\n const a = Math.abs(n)\n const strip = (s: string) => s.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n\n if (a >= 1_000_000) {\n return sign + strip((a / 1_000_000).toFixed(2)) + 'M'\n }\n if (a >= 1000) {\n const k = a / 1000\n const d = k >= 100 ? 1 : 2\n return sign + strip(k.toFixed(d)) + 'k'\n }\n if (a >= 1) {\n return sign + strip(a.toFixed(2))\n }\n if (a >= 0.0001) {\n return sign + strip(a.toFixed(4))\n }\n return sign + a.toExponential(2)\n}\n\n/**\n * Human-readable notional for Aave v4 API decimal strings (reserve amounts, user debt, etc.).\n * Use this for all “display from GraphQL `value`” paths so formatting stays consistent.\n */\nexport function formatAaveV4AmountHumanFromApiString(raw: string | null | undefined): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = parseFloat(s)\n if (!Number.isFinite(n)) return '—'\n return formatAaveV4TokenAmount(n)\n}\n\n/**\n * Unnamed reserve liquidity: supplied − borrowed (both API decimal strings, same unit).\n */\nexport function formatAaveV4ReserveLiquidityFromSummary(args: {\n suppliedValue: string | null | undefined\n borrowedValue: string | null | undefined\n}): string {\n const a = parseFloat(String(args.suppliedValue ?? '').trim())\n const b = parseFloat(String(args.borrowedValue ?? '').trim())\n if (!Number.isFinite(a) || !Number.isFinite(b)) return '—'\n return formatAaveV4TokenAmount(Math.max(0, a - b))\n}\n\nfunction userSupplyBalanceNumber(rows: readonly V4ReservesListRow[]): number | null {\n const vals = rows\n .map((r) => (r.userState?.balance?.amount?.value ?? '').trim())\n .filter((v) => v.length > 0)\n if (!vals.length) return null\n const u = new Set(vals)\n if (u.size === 1) {\n const n = parseFloat(vals[0]!)\n return Number.isFinite(n) ? n : null\n }\n const sum = vals.reduce((acc, b) => acc + (parseFloat(b) || 0), 0)\n return Number.isFinite(sum) ? sum : null\n}\n\nfunction formatV4SupplyApy(rows: readonly V4ReservesListRow[]): string {\n if (!rows.length) return '—'\n const weighted: { w: number; apy: number }[] = []\n for (const r of rows) {\n const sup = parseFloat((r.summary?.supplied?.amount?.value ?? '').trim())\n const norm = (r.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(norm)\n if (Number.isFinite(n) && Number.isFinite(sup) && sup > 0) {\n weighted.push({ w: sup, apy: n })\n }\n }\n if (weighted.length) {\n const tw = weighted.reduce((a, x) => a + x.w, 0)\n if (tw > 0) {\n const x = weighted.reduce((a, x) => a + x.w * x.apy, 0) / tw\n if (x >= 0.01) return `${x.toFixed(2)}%`\n if (x > 0) return `${x.toFixed(4)}%`\n return '0%'\n }\n }\n const any = (rows[0]?.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(any)\n if (!Number.isFinite(n)) return '—'\n if (n >= 0.01) return `${n.toFixed(2)}%`\n if (n > 0) return `${n.toFixed(4)}%`\n return '0%'\n}\n\nexport async function fetchAaveV4NativeWrappedToken(chainId: number): Promise<string | null> {\n const all = await fetchAaveV4Chains()\n const c = all.find((x) => x.chainId === chainId)\n const t = (c?.nativeWrappedToken ?? '').trim()\n if (t && isAddress(t)) return getAddress(t)\n return null\n}\n\n/**\n * All underlying token addresses (lowercased checksummed form for lookup: store lowercase) listed as reserves on the chain.\n */\nexport async function fetchAaveV4SupportedUnderlyingAddressSet(chainId: number): Promise<ReadonlySet<string>> {\n const d = await aaveV4Gql<{\n reserves: ReadonlyArray<{ asset: { underlying: { address: string } } }>\n }>(\n `\n query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }\n `,\n {\n r: {\n query: { chainIds: [chainId] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n const s = new Set<string>()\n for (const r of d.reserves ?? []) {\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (a && isAddress(a)) s.add(a.toLowerCase())\n }\n return s\n}\n\nfunction erc20Input(address: `0x${string}`, chainId: number) {\n return { address, chainId }\n}\n\nexport async function fetchAaveV4ReservesForUnderlying(args: {\n chainId: number\n underlying: `0x${string}`\n user?: `0x${string}` | null\n}): Promise<readonly V4ReservesListRow[]> {\n const d = await aaveV4Gql<{ reserves: V4ReservesListRow[] }>(\n `\n query S($r: ReservesRequest!) {\n reserves(request: $r) {\n id\n onChainId\n spoke { address name liquidationConfig { targetHealthFactor healthFactorForMaxBonus } }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n }\n userState {\n balance { amount { value decimals } }\n borrowable { amount { value decimals } }\n }\n }\n }\n `,\n {\n r: {\n query: { tokens: [erc20Input(args.underlying, args.chainId)] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n ...(args.user ? { user: args.user } : {}),\n },\n },\n )\n return d.reserves ?? []\n}\n\n/**\n * Reserve row for a hub asset on the same Aave v4 **Spoke** as the user’s collateral (same as {@link useAaveV4DepositCollateralInfo}’s `collateralForAsset`).\n * Needed so borrow/repay multi-sign uses the same spoke as the user’s position.\n */\nexport function pickAaveV4ReserveRowForSpoke(\n rows: readonly V4ReservesListRow[],\n spokeAddress: `0x${string}`,\n): V4ReservesListRow | null {\n const want = getAddress(spokeAddress).toLowerCase()\n for (const r of rows) {\n const a = (r.spoke?.address ?? '').trim()\n if (!a) continue\n try {\n if (getAddress(a as `0x${string}`).toLowerCase() === want) return r\n } catch {\n continue\n }\n }\n return null\n}\n\nexport function aaveV4KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype AaveV4ChainTokenCache = {\n supportedUnderlying: ReadonlySet<string>\n nativeWrapped: string | null\n}\n\nconst aaveV4ChainTokenCache = new Map<number, Promise<AaveV4ChainTokenCache>>()\n\n/**\n * Fetches and caches (per process) the list of Aave v4 underlying addresses on a chain and the wrapped native token.\n */\nexport function ensureAaveV4ChainTokenCache(chainId: number): Promise<AaveV4ChainTokenCache> {\n const hit = aaveV4ChainTokenCache.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const [nativeWrapped, supportedUnderlying] = await Promise.all([\n fetchAaveV4NativeWrappedToken(chainId),\n fetchAaveV4SupportedUnderlyingAddressSet(chainId),\n ])\n return { supportedUnderlying, nativeWrapped }\n })()\n aaveV4ChainTokenCache.set(chainId, p)\n return p\n}\n\n// —— Hubs, collateral, borrowable (per UI “market” / Aave v4 pool) ——————————————\n\n/** UI market segment; maps to Aave v4 `Hub` by name (e.g. Plus ≈ “Main”, Core, Prime ≈ “Bluechip”). */\nexport type AaveV4UiMarketId = 'main' | 'core' | 'bluechip'\n\nexport type AaveV4Hub = {\n name: string\n address: `0x${string}`\n chain: { chainId: number; name?: string | null }\n}\n\n/** `summary` is included for hub `reserves` (market borrow/supply TVL, APYs). */\nexport type AaveV4HubReserveSummary = {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n borrowApy: { normalized: string; value: string }\n}\n\nexport type AaveV4HubReserve = {\n canBorrow: boolean\n canUseAsCollateral: boolean\n canSupply: boolean\n /** Spoke contract to call for `supply` on this reserve. */\n spoke: { address: string } | null\n settings: {\n borrowable: boolean\n collateral: boolean\n collateralFactor: { normalized: string; value: string }\n collateralRisk: { normalized: string; value: string }\n }\n asset: {\n underlying: {\n address: string\n info: { name: string; symbol: string; icon: string | null } | null\n }\n }\n /** Present when using the extended hub reserves query (borrow tab, market TVL). */\n summary?: AaveV4HubReserveSummary | null\n}\n\nconst aaveV4HubsByChain = new Map<number, Promise<readonly AaveV4Hub[]>>()\nconst aaveV4HubReserves = new Map<string, Promise<readonly AaveV4HubReserve[]>>()\n\nfunction hubReservesKey(chainId: number, hub: `0x${string}`) {\n return `v3spoke+summary:${chainId}:${hub.toLowerCase()}`\n}\n\nexport async function fetchAaveV4HubsForChain(chainId: number): Promise<readonly AaveV4Hub[]> {\n const hit = aaveV4HubsByChain.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ hubs: AaveV4Hub[] }>(\n `query F($h: HubsRequest!) { hubs(request: $h) { name address chain { chainId name } } }`,\n { h: { query: { chainIds: [chainId] } } },\n )\n const out = (d.hubs ?? []).map((h) => ({\n name: h.name,\n address: getAddress((h.address ?? '').trim() as `0x${string}`) as `0x${string}`,\n chain: h.chain,\n }))\n return out\n })()\n aaveV4HubsByChain.set(chainId, p)\n return p\n}\n\n/**\n * Resolves which Aave v4 hub (Core / Plus / Prime, etc.) a UI “market” refers to.\n * Main → Plus, Core → Core, Bluechip → Prime.\n */\nexport function resolveAaveV4HubForUiMarket(\n hubs: readonly AaveV4Hub[],\n market: AaveV4UiMarketId,\n chainId: number,\n): AaveV4Hub | null {\n const on = hubs.filter((h) => h.chain.chainId === chainId)\n if (!on.length) return null\n const find = (names: string[]) => {\n const set = new Set(names.map((n) => n.toLowerCase()))\n return on.find((h) => set.has((h.name ?? '').trim().toLowerCase())) ?? null\n }\n if (market === 'core') return find(['core'])\n if (market === 'bluechip') return find(['prime', 'bluechip', 'institutional'])\n // main: prefer Plus; fall back to common names, then first hub\n return find(['plus', 'main', 'default']) ?? on[0] ?? null\n}\n\n/**\n * Inverse of {@link resolveAaveV4HubForUiMarket} label mapping, for switching UI market when a hub is chosen by\n * “first hub on chain that lists this underlying”.\n */\nexport function aaveV4UiMarketIdForHubName(hubName: string): AaveV4UiMarketId {\n const n = (hubName ?? '').trim().toLowerCase()\n if (n === 'core') return 'core'\n if (n === 'plus' || n === 'main' || n === 'default') return 'main'\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 'bluechip'\n return 'main'\n}\n\n/**\n * When more than one hub lists the same underlying, the ideal hub is the one that matches the user’s *actual*\n * position (supply/debt on that hub’s Spoke). We don’t have that signal here, so we use a **deterministic** order after\n * {@link aaveV4UiMarketIdForHubName}: Core → Main/Plus → Bluechip/Prime (then name) so the choice is not tied to\n * GraphQL list order. Callers with wallet/user data can later prefer a hub whose Spoke appears in\n * `fetchAaveV4ReservesForUnderlying` with non-zero `userState`.\n */\nfunction aaveV4HubAutoPickTiebreakOrder(a: AaveV4Hub, b: AaveV4Hub): number {\n const rank = (name: string) => {\n const n = (name ?? '').trim().toLowerCase()\n if (n === 'core') return 0\n if (n === 'plus' || n === 'main' || n === 'default') return 1\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 2\n return 3\n }\n const ra = rank(a.name)\n const rb = rank(b.name)\n if (ra !== rb) return ra - rb\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\ntype AaveV4HubCollateralCandidate = {\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n}\n\n/**\n * Sort key for “which borrow is cheaper” on a **debt** reserve row. Lower is better; missing data sorts last.\n */\nfunction aaveV4HubReserveBorrowApyForSort(r: AaveV4HubReserve | null | undefined): number {\n if (!r) return Number.POSITIVE_INFINITY\n const norm = parseFloat((r.summary?.borrowApy?.normalized ?? '').trim())\n if (Number.isFinite(norm) && norm >= 0) return norm\n const v = parseFloat((r.summary?.borrowApy?.value ?? '').trim())\n if (Number.isFinite(v) && v >= 0) {\n if (v > 0 && v <= 1) return v * 100\n return v\n }\n return Number.POSITIVE_INFINITY\n}\n\n/**\n * `summary.suppliable` on a reserve is pool liquidity for borrowing that asset (human-notional, same units as\n * {@link formatAaveV4AmountHumanFromApiString}).\n */\nfunction aaveV4SuppliableHumanFromHubReserve(r: AaveV4HubReserve | null | undefined): number | null {\n if (!r) return null\n const n = parseFloat((r.summary?.suppliable?.amount?.value ?? '').trim())\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\n/**\n * The selected UI market maps to a single hub, but a token may only be listed in another hub (e.g. WETH in Core, not\n * Plus on Ethereum). Returns a hub on this chain where this underlying appears in hub reserves, so Spoke and\n * collateral can be resolved.\n *\n * **When no debt hint:** `preferHub` is tried first, then other hubs in {@link aaveV4HubAutoPickTiebreakOrder} order.\n *\n * **When `debtUnderlying` is set (user chose a debt asset on the borrow flow):** among hubs that list **both** the\n * **collateral** and that **debt** as borrowable, the hub with the **lowest debt borrow APY** is chosen. If\n * `debtBorrowAmountHumanForLiquidity` is a positive number string, we **prefer** hubs where `suppliable` on the debt\n * reserve is at least that amount; if none satisfy that, the lowest-APY hub among all debt-backed candidates is\n * used anyway.\n */\nexport async function findAaveV4HubReserveForChainUnderlying(args: {\n chainId: number\n hubs: readonly AaveV4Hub[]\n underlying: `0x${string}`\n /** Tried first; if the asset is not listed here, other hubs on the same chain are scanned. */\n preferHub: AaveV4Hub\n /** If set, disambiguate using this debt asset’s `borrowAPY` (and optional liquidity) per hub. */\n debtUnderlying?: `0x${string}` | null\n /**\n * When set, used with `debtUnderlying` to prefer hubs with enough `suppliable` on the debt line for a borrow\n * of that size (human amount; commas may be included).\n */\n debtBorrowAmountHumanForLiquidity?: string | null\n}): Promise<{\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n} | null> {\n const onChain = args.hubs.filter((h) => h.chain.chainId === args.chainId)\n if (!onChain.length) return null\n const prefer = getAddress(args.preferHub.address) as `0x${string}`\n const order = (() => {\n const rest = onChain\n .filter((h) => getAddress(h.address) !== prefer)\n .sort(aaveV4HubAutoPickTiebreakOrder)\n const first = onChain.find((h) => getAddress(h.address) === prefer)\n return first ? [first, ...rest] : rest\n })()\n\n const candidates: AaveV4HubCollateralCandidate[] = []\n for (const h of order) {\n const rows = await fetchAaveV4HubReserves({ chainId: args.chainId, hubAddress: h.address as `0x${string}` })\n const c = findHubReserveForUnderlying(rows, args.underlying)\n if (c) candidates.push({ hub: h, hubReserves: rows, reserve: c })\n }\n if (!candidates.length) return null\n\n const noDebt = (): AaveV4HubCollateralCandidate => candidates[0]!\n\n const rawDebt = (args.debtUnderlying ?? '').trim()\n if (!rawDebt || !isAddress(rawDebt)) {\n return noDebt()\n }\n const debtU = getAddress(rawDebt) as `0x${string}`\n\n const withDebt = candidates\n .map((c) => {\n const dr = findHubReserveForUnderlying(c.hubReserves, debtU)\n return { ...c, debtReserve: dr }\n })\n .filter(\n (x): x is AaveV4HubCollateralCandidate & { debtReserve: AaveV4HubReserve } =>\n x.debtReserve != null &&\n x.debtReserve.canBorrow === true &&\n x.debtReserve.settings?.borrowable === true,\n )\n if (!withDebt.length) {\n return noDebt()\n }\n\n const amountRaw = (args.debtBorrowAmountHumanForLiquidity ?? '')\n .trim()\n .replace(/,/g, '')\n const wantN = amountRaw && parseFloat(amountRaw) > 0 ? parseFloat(amountRaw) : null\n\n const sortKey = (a: (typeof withDebt)[0], b: (typeof withDebt)[0]): number => {\n const d = aaveV4HubReserveBorrowApyForSort(a.debtReserve) - aaveV4HubReserveBorrowApyForSort(b.debtReserve)\n if (d !== 0) return d\n const pa = getAddress(a.hub.address) === prefer ? 0 : 1\n const pb = getAddress(b.hub.address) === prefer ? 0 : 1\n if (pa !== pb) return pa - pb\n return aaveV4HubAutoPickTiebreakOrder(a.hub, b.hub)\n }\n\n if (wantN == null) {\n withDebt.sort(sortKey)\n const x = withDebt[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n }\n\n const sufficient = withDebt.filter((c) => {\n const s = aaveV4SuppliableHumanFromHubReserve(c.debtReserve)\n return s != null && s + 1e-9 >= wantN\n })\n const pool = sufficient.length ? sufficient : withDebt\n pool.sort(sortKey)\n const x = pool[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n}\n\nexport async function fetchAaveV4HubReserves(args: { chainId: number; hubAddress: `0x${string}` }): Promise<readonly AaveV4HubReserve[]> {\n const h = getAddress(args.hubAddress) as `0x${string}`\n const k = hubReservesKey(args.chainId, h)\n const hit = aaveV4HubReserves.get(k)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ reserves: AaveV4HubReserve[] }>(\n `query R($r: ReservesRequest!) {\n reserves(request: $r) {\n canBorrow\n canSupply\n canUseAsCollateral\n spoke { address }\n settings {\n borrowable\n collateral\n collateralFactor { normalized value }\n collateralRisk { normalized value }\n }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n borrowApy { normalized value }\n }\n asset { underlying { address info { name symbol icon } } }\n }\n }`,\n {\n r: {\n query: { hub: { address: h, chainId: args.chainId } },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n return d.reserves ?? []\n })()\n aaveV4HubReserves.set(k, p)\n return p\n}\n\n/**\n * LTV you can borrow against a unit of this asset, e.g. \"90%\".\n */\nexport function formatAaveV4PercentDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = (normalized ?? '').trim()\n if (n) {\n const f = parseFloat(n)\n if (!Number.isFinite(f)) return '—'\n if (f === 0) return '—'\n if (f % 1 === 0) return `${f.toFixed(0)}%`\n return `${f >= 10 ? f.toFixed(0) : f >= 1 ? f.toFixed(1).replace(/\\.0$/, '') : f.toFixed(2).replace(/\\.?0+$/, '')}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${Math.round(v * 100)}%`\n }\n return '—'\n}\n\n/**\n * Collateral / protocol risk on the same 0–100 style scale as the API, or a plain label if zero/empty.\n */\nexport function formatAaveV4RiskDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = parseFloat((normalized ?? '').trim())\n if (Number.isFinite(n) && n > 0) {\n return n >= 0.01 ? `${n.toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%` : `${n.toFixed(4)}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${(v * 100).toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%`\n }\n return 'Low'\n}\n\nexport function findHubReserveForUnderlying(\n list: readonly AaveV4HubReserve[],\n underlying: `0x${string}`,\n): AaveV4HubReserve | null {\n const t = getAddress(underlying).toLowerCase()\n return list.find((r) => (r.asset?.underlying?.address ?? '').toLowerCase() === t) ?? null\n}\n\nexport type AaveV4BorrowableDisplay = {\n address: string\n symbol: string\n name: string\n icon: string | null\n}\n\n/**\n * De-duplicated borrowable debt assets in a hub (what users can borrow there).\n */\nexport function borrowableAssetsFromHubReserves(rows: readonly AaveV4HubReserve[]): AaveV4BorrowableDisplay[] {\n const seen = new Set<string>()\n const out: AaveV4BorrowableDisplay[] = []\n for (const r of rows) {\n if (!r.canBorrow || !r.settings?.borrowable) continue\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (!a || !isAddress(a)) continue\n const lo = a.toLowerCase()\n if (seen.has(lo)) continue\n seen.add(lo)\n const info = r.asset?.underlying?.info\n out.push({\n address: getAddress(a as `0x${string}`),\n symbol: (info?.symbol ?? '—').trim() || '—',\n name: (info?.name ?? '').trim() || '—',\n icon: (info?.icon ?? '').trim() || null,\n })\n }\n out.sort((p, q) => p.symbol.localeCompare(q.symbol, undefined, { sensitivity: 'base' }))\n return out\n}\n\nconst USER_BORROWS_HUB = `\n query AaveV4UserBorrowsHub($r: UserBorrowsRequest!) {\n userBorrows(request: $r) {\n debt { amount { value } }\n reserve {\n asset { underlying { address } }\n }\n }\n }\n`\n\n/**\n * Current variable-debt balance per underlying token for this user in the given hub (one entry per asset).\n * Values are API decimal strings; format with {@link formatAaveV4AmountHumanFromApiString}.\n */\nexport async function fetchAaveV4UserBorrowsDebtByUnderlyingForHub(args: {\n user: `0x${string}`\n chainId: number\n hubAddress: `0x${string}`\n}): Promise<ReadonlyMap<string, string>> {\n const u = getAddress(args.user)\n const h = getAddress(args.hubAddress) as `0x${string}`\n const d = await aaveV4Gql<{\n userBorrows: {\n debt: { amount: { value: string } } | null\n reserve: { asset: { underlying: { address: string } } } | null\n }[]\n }>(USER_BORROWS_HUB, {\n r: {\n query: {\n userHub: {\n user: u,\n hub: { input: { address: h, chainId: args.chainId } },\n },\n },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n const m = new Map<string, string>()\n for (const row of d.userBorrows ?? []) {\n const addr = (row?.reserve?.asset?.underlying?.address ?? '').trim()\n if (!addr) continue\n const lo = getAddress(addr as `0x${string}`).toLowerCase()\n const v = (row?.debt?.amount?.value ?? '').trim()\n if (!v) continue\n const n = parseFloat(v)\n if (!Number.isFinite(n) || n === 0) continue\n const prev = m.get(lo)\n if (prev) {\n const p = parseFloat(prev)\n m.set(lo, String((Number.isFinite(p) ? p : 0) + n))\n } else {\n m.set(lo, v)\n }\n }\n return m\n}\n\nexport type AaveV4BorrowTableRow = {\n address: string\n symbol: string\n name: string\n icon: string | null\n yourBorrowedDisplay: string\n baseBorrowApyDisplay: string\n totalBorrowsDisplay: string\n liquidityDisplay: string\n}\n\n/**\n * One row per borrowable asset in the hub, using shared human-readable formatters.\n */\nexport function buildAaveV4BorrowTableRowsFromHub(\n borrowable: readonly AaveV4BorrowableDisplay[],\n hubReserves: readonly AaveV4HubReserve[] | null,\n /** `undefined` = not loaded or no wallet (show em dash for “your” column). */\n debtByUnderlying: ReadonlyMap<string, string> | undefined,\n): AaveV4BorrowTableRow[] {\n if (!hubReserves?.length) {\n return borrowable.map((b) => ({\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: debtByUnderlying === undefined ? '—' : `0${b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''}`,\n baseBorrowApyDisplay: '—',\n totalBorrowsDisplay: '—',\n liquidityDisplay: '—',\n }))\n }\n return borrowable.map((b) => {\n const lo = b.address.toLowerCase()\n const r = hubReserves.find((x) => (x.asset?.underlying?.address ?? '').toLowerCase() === lo) ?? null\n const s = r?.summary\n const debtRaw = debtByUnderlying?.get(lo) ?? null\n const symSuffix = b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''\n return {\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: (() => {\n if (debtByUnderlying === undefined) return '—'\n if (debtRaw == null || !String(debtRaw).trim()) return `0${symSuffix}`\n const n = parseFloat(String(debtRaw).trim())\n if (!Number.isFinite(n) || n === 0) return `0${symSuffix}`\n return `${formatAaveV4AmountHumanFromApiString(debtRaw)}${symSuffix}`\n })(),\n baseBorrowApyDisplay: formatAaveV4PercentDisplay(\n s?.borrowApy?.normalized,\n s?.borrowApy?.value,\n ),\n totalBorrowsDisplay: s\n ? `${formatAaveV4AmountHumanFromApiString(s.borrowed?.amount?.value)}${symSuffix}`\n : '—',\n liquidityDisplay: s\n ? `${formatAaveV4ReserveLiquidityFromSummary({\n suppliedValue: s.supplied?.amount?.value,\n borrowedValue: s.borrowed?.amount?.value,\n })}${symSuffix}`\n : '—',\n }\n })\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './api.js'\nexport * from './spokeOnChain.js'\nexport * from './multisign.js'\nexport * from './userPositionsApi.js'\nexport * from './positionActionsApi.js'\nexport * from './loadSupportedChainIds.js'\nexport * from './reserveDisplay.js'\n\nexport const AAVE_V4_PROTOCOL_ID = 'aave-v4'\n\nexport const aaveV4ProtocolModule: ProtocolModule = {\n id: AAVE_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'aave-v4.deposit', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Supply to Aave v4 Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.withdraw', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.borrow', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.repay', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Spoke debt', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(aaveV4ProtocolModule)\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './sameAssetBorrowLoop.js'\nexport * from './borrowCollateralMaxWithdrawWei.js'\nexport * from './vaultWithdrawMultisign.js'\nexport * from './isolatedLendMultisign.js'\nexport * from './isolatedBorrowMultisign.js'\nexport * from './borrowRepayMultisign.js'\nexport * from './borrowCollateralDepositMultisign.js'\nexport * from './borrowCollateralWithdrawMultisign.js'\nexport * from './eulerV2Subgraph.js'\nexport * from './eulerV2LendMarkets.js'\nexport * from './eulerV2EarnMarkets.js'\nexport * from './eulerV2BorrowPositionsLoad.js'\nexport * from './eulerV2LendSupplyPositionsLoad.js'\nexport * from './eulerV2BorrowRiskOnChain.js'\nexport * from './eulerV2VaultCapsOnChain.js'\nexport * from './eulerReulVestingOnChain.js'\nexport * from './eulerLabelsProducts.js'\nexport * from './eulerV2PortfolioUsd.js'\nexport * from './loadEulerV2SupportedChainIds.js'\nexport * from './eulerV2LendUi.js'\n\nexport const EULER_V2_PROTOCOL_ID = 'euler-v2'\n\nexport const eulerV2ProtocolModule: ProtocolModule = {\n id: EULER_V2_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'euler-v2.isolated-lend', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.isolated-borrow', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.vault-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.borrow-repay', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Euler borrow', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-deposit', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(eulerV2ProtocolModule)\n","import { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { McpToolDefinition } from './mcpTypes.js'\nimport { MCP_TOOL_DEFINITIONS } from './mcpTools.js'\nimport { getProtocolModules } from '../core/registry.js'\n\nconst skillsDir = join(dirname(fileURLToPath(import.meta.url)), 'skills')\n\nconst SKILL_PROTOCOL_IDS = [\n 'aave-v4',\n 'lido',\n 'uniswap-v4',\n 'curve-dao',\n 'ethena',\n 'euler-v2',\n 'maple-syrup',\n 'sky',\n] as const\n\nexport function getToolsForProtocol(protocolId: string): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS.filter((t) => t.protocolId === protocolId)\n}\n\nexport function getProtocolSkill(protocolId: string): string | undefined {\n if (!SKILL_PROTOCOL_IDS.includes(protocolId as (typeof SKILL_PROTOCOL_IDS)[number])) {\n return undefined\n }\n try {\n return readFileSync(join(skillsDir, protocolId, 'SKILL.md'), 'utf8')\n } catch {\n return undefined\n }\n}\n\nexport function listProtocolsWithSkills(): string[] {\n return [...SKILL_PROTOCOL_IDS]\n}\n\n/** Protocol metadata for MCP discovery (chains from advisor; actions from registry). */\nexport function getProtocolDiscoverySummary(protocolId: string) {\n const mod = getProtocolModules().find((p) => p.id === protocolId)\n if (!mod) return undefined\n return {\n protocolId: mod.id,\n chainCategory: mod.chainCategory,\n actions: mod.actions.map((a) => ({ id: a.id, description: a.description })),\n tools: getToolsForProtocol(protocolId).map((t) => ({\n name: t.name,\n actionId: t.actionId,\n description: t.description,\n prerequisites: t.prerequisites,\n followUp: t.followUp,\n })),\n }\n}\n","import { getAddress } from 'viem'\nimport { loadAaveV4SupportedChainIdsFromV4Api, ensureAaveV4ChainTokenCache } from '../../protocols/evm/aave-v4/api.js'\nimport { isCurveApiChainSupported } from '../../protocols/evm/curve-dao/support.js'\nimport { loadFullCurveSessionForRpc } from '../../protocols/evm/curve-dao/apiSession.js'\nimport {\n isEvmChainInEthenaUsdeList,\n listEthenaUsdeEvmNetworkRows,\n SUSDE_ETHEREUM_MAINNET,\n USDE_ETHEREUM_MAINNET,\n} from '../../protocols/evm/ethena/constants.js'\nimport { LIDO_ETHEREUM_MAINNET_CHAIN_ID } from '../../protocols/evm/lido/mainnet.js'\nimport { isUniswapV4ChainSupported } from '../../protocols/evm/uniswap-v4/constants.js'\nimport { MAPLE_PROTOCOL_ID } from '../../protocols/evm/maple/index.js'\nimport { SKY_PROTOCOL_ID } from '../../protocols/evm/sky/index.js'\nimport type { ProtocolSupportAdvisor, SupportedTokenRow, TokenFilterKind } from './types.js'\n\nconst EULER_V2_SUBGRAPH_CHAIN_IDS = [\n 1, 8453, 42161, 10, 137, 56, 43114, 100, 59144, 146, 1923, 130,\n] as const\n\nfunction advisor(\n protocolId: string,\n tokenFilter: TokenFilterKind,\n impl: Omit<ProtocolSupportAdvisor, 'protocolId' | 'tokenFilter'>,\n): ProtocolSupportAdvisor {\n return { protocolId, tokenFilter, ...impl }\n}\n\nexport const PROTOCOL_SUPPORT_ADVISORS: Record<string, ProtocolSupportAdvisor> = {\n 'aave-v4': advisor('aave-v4', 'api_underlyings', {\n async supportedChainIds() {\n const set = await loadAaveV4SupportedChainIdsFromV4Api()\n return [...set].sort((a, b) => a - b)\n },\n async supportedTokens(chainId) {\n const cache = await ensureAaveV4ChainTokenCache(chainId)\n const tokens: SupportedTokenRow[] = [...cache.supportedUnderlying].map((address) => ({\n address,\n roles: ['underlying'],\n }))\n if (cache.nativeWrapped) {\n tokens.unshift({\n address: cache.nativeWrapped,\n symbol: 'WETH',\n roles: ['native_wrapped'],\n })\n }\n return {\n tokens,\n nativeWrapped: cache.nativeWrapped ?? undefined,\n notes: 'Native ETH deposits use wrapped native token address from Aave v4 API.',\n }\n },\n async isTokenSupported(chainId, address) {\n const cache = await ensureAaveV4ChainTokenCache(chainId)\n let normalized: string\n try {\n normalized = getAddress(address).toLowerCase()\n } catch {\n return false\n }\n if (cache.nativeWrapped && getAddress(cache.nativeWrapped).toLowerCase() === normalized) {\n return true\n }\n return cache.supportedUnderlying.has(normalized)\n },\n }),\n\n 'uniswap-v4': advisor('uniswap-v4', 'any_erc20_on_chain', {\n async supportedChainIds() {\n const ids: number[] = []\n for (const id of [\n 1, 5, 11155111, 137, 80001, 10, 420, 42161, 421613, 42220, 44787, 56, 43114, 84531, 8453,\n 81457, 7777777, 324, 480, 1301, 130, 10143, 84532, 1868, 143, 59144, 4217, 196,\n ]) {\n if (isUniswapV4ChainSupported(id)) ids.push(id)\n }\n return ids\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes:\n 'Any ERC-20 or native token on a supported chain may be used. Resolve addresses via get_token_registry; tokenOut may be any address.',\n }\n },\n }),\n\n 'curve-dao': advisor('curve-dao', 'pool_graph', {\n async supportedChainIds() {\n return [1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554]\n },\n async supportedTokens(chainId, ctx) {\n if (!isCurveApiChainSupported(chainId)) {\n return { tokens: [], notes: 'Chain not supported by Curve SDK network constants.' }\n }\n const rpcUrl = ctx?.rpcUrl?.trim()\n if (!rpcUrl) {\n return {\n tokens: [],\n notes: 'Provide rpcUrl (from get_chain_registry) to load Curve pool graph token list.',\n }\n }\n const session = await loadFullCurveSessionForRpc(rpcUrl)\n if (!session?.swappableNodeKeys?.size) {\n return { tokens: [], notes: 'Curve session returned no swappable tokens for this RPC.' }\n }\n return {\n tokens: [...session.swappableNodeKeys].map((key) => {\n const address = key.startsWith('0x') ? key : key.split(':')[0] ?? key\n return { address, roles: ['swappable'] as string[] }\n }),\n }\n },\n }),\n\n lido: advisor('lido', 'mainnet_only', {\n async supportedChainIds() {\n return [LIDO_ETHEREUM_MAINNET_CHAIN_ID]\n },\n async supportedTokens() {\n return {\n tokens: [\n { address: '0x0000000000000000000000000000000000000000', symbol: 'ETH', roles: ['native', 'stake'] },\n { address: '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', symbol: 'stETH', roles: ['erc20'] },\n { address: '0x7f39C581F595B853cBbF37C12FfeeA971C5a5bEa', symbol: 'wstETH', roles: ['erc20'] },\n ],\n notes: 'Lido staking and withdrawals are Ethereum mainnet only.',\n }\n },\n }),\n\n ethena: advisor('ethena', 'minting_contract', {\n async supportedChainIds() {\n return listEthenaUsdeEvmNetworkRows().map((r) => r.chainId)\n },\n async supportedTokens(chainId) {\n if (chainId === 1) {\n return {\n tokens: [\n { address: USDE_ETHEREUM_MAINNET, symbol: 'USDe', roles: ['stake'] },\n { address: SUSDE_ETHEREUM_MAINNET, symbol: 'sUSDe', roles: ['vault'] },\n ],\n notes: 'Ethena stake/redeem UI actions are mainnet-only; USDe exists on other chains for transfers.',\n }\n }\n if (isEvmChainInEthenaUsdeList(chainId)) {\n const row = listEthenaUsdeEvmNetworkRows().find((r) => r.chainId === chainId)\n return {\n tokens: row ? [{ address: row.usde, symbol: 'USDe', roles: ['erc20'] }] : [],\n notes: 'USDe on L2; staking MCP tools target mainnet only.',\n }\n }\n return { tokens: [] }\n },\n }),\n\n 'euler-v2': advisor('euler-v2', 'subgraph_vaults', {\n async supportedChainIds() {\n return [...EULER_V2_SUBGRAPH_CHAIN_IDS]\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes:\n 'Euler vault/collateral assets vary by chain. Pass vault and asset addresses from Euler app or subgraph.',\n }\n },\n }),\n\n [MAPLE_PROTOCOL_ID]: advisor(MAPLE_PROTOCOL_ID, 'fixed_addresses', {\n async supportedChainIds() {\n return [1, 11155111]\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes: 'Maple Syrup pools are discovered via GraphQL; pass syrupRouter, pool, and asset from Maple UI.',\n }\n },\n }),\n\n [SKY_PROTOCOL_ID]: advisor(SKY_PROTOCOL_ID, 'fixed_addresses', {\n async supportedChainIds() {\n return [1]\n },\n async supportedTokens() {\n return {\n tokens: [],\n notes: 'Sky Lockstake and sUSDS use fixed mainnet contract addresses in protocol builders.',\n }\n },\n }),\n}\n\nexport function getProtocolSupportAdvisor(protocolId: string): ProtocolSupportAdvisor | undefined {\n return PROTOCOL_SUPPORT_ADVISORS[protocolId]\n}\n\nexport function listProtocolSupportAdvisorIds(): string[] {\n return Object.keys(PROTOCOL_SUPPORT_ADVISORS)\n}\n","import { z } from 'zod'\n\n/** Shared MCP-server inputs enriched from continuum-node-sdk (keyGenId + chain registry). */\nexport const mcpServerCommonInputSchema = z.object({\n keyGenId: z.string().min(1).describe('KeyGen id from fetch_key_gen_result / node preferred KeyGen'),\n chainId: z.number().int().positive().describe('EVM chain id; RPC and gas config resolved from chain registry'),\n purposeText: z.string().min(1).describe('Human-readable purpose for the sign request'),\n useCustomGas: z.boolean().optional().describe('Apply chain gas settings from registry when true'),\n})\n\nexport function mcpServerMultisignInput(fields: z.ZodRawShape) {\n return mcpServerCommonInputSchema.extend(fields)\n}\n\nexport const mcpServerSubmitOutputSchema = z\n .object({\n requestId: z.string().min(1),\n })\n .describe('mpc-auth multiSignRequest id; continue with trigger_sign_result / broadcast_sign_result')\n\n/** Tools that only build calldata / quotes — no submit. */\nexport const MCP_NON_SUBMIT_TOOL_NAMES = new Set([\n 'ctm_uniswap_v4_quote',\n 'ctm_uniswap_v4_create_swap',\n])\n\nexport type McpServerCommonInput = z.infer<typeof mcpServerCommonInputSchema>\n","import { getProtocolModules, getActionsByChainCategory, registerProtocolModule } from '../core/registry.js'\nimport { uniswapV4ProtocolModule } from '../protocols/evm/uniswap-v4/index.js'\nimport { curveDaoProtocolModule } from '../protocols/evm/curve-dao/index.js'\nimport { getAgentCatalogForMcp } from './mcpTools.js'\nimport { lidoProtocolModule } from '../protocols/evm/lido/index.js'\nimport { ethenaProtocolModule } from '../protocols/evm/ethena/index.js'\nimport { mapleProtocolModule } from '../protocols/evm/maple/index.js'\nimport { skyProtocolModule } from '../protocols/evm/sky/index.js'\nimport { aaveV4ProtocolModule } from '../protocols/evm/aave-v4/index.js'\nimport { eulerV2ProtocolModule } from '../protocols/evm/euler-v2/index.js'\n\nexport {\n getMcpToolDefinitions,\n getMcpToolByName,\n getAgentCatalogForMcp,\n getMcpToolInputSchema,\n getMcpToolOutputSchema,\n parseMcpToolInput,\n parseMcpToolOutput,\n MCP_TOOL_DEFINITIONS,\n MCP_TOOL_INPUT_SCHEMAS,\n MCP_TOOL_OUTPUT_SCHEMAS,\n} from './mcpTools.js'\nexport {\n getProtocolSkill,\n getToolsForProtocol,\n getProtocolDiscoverySummary,\n listProtocolsWithSkills,\n} from './skills.js'\nexport {\n getProtocolSupportAdvisor,\n listProtocolSupportAdvisorIds,\n PROTOCOL_SUPPORT_ADVISORS,\n} from './support/index.js'\nexport type { ProtocolSupportAdvisor, SupportedTokenRow, TokenFilterKind } from './support/index.js'\nexport {\n mcpServerCommonInputSchema,\n mcpServerMultisignInput,\n mcpServerSubmitOutputSchema,\n MCP_NON_SUBMIT_TOOL_NAMES,\n} from './mcpServerSchemas.js'\nexport type {\n McpToolDefinition,\n McpToolHandler,\n McpJsonSchema,\n McpSchemaProperty,\n McpToolName,\n McpToolInputMap,\n McpToolOutputMap,\n} from './mcpTools.js'\nexport { EVM_COMMON_PARAM_DOCS, MULTISIGN_OUTPUT_DOC, MANAGEMENT_SIG_DOC } from './commonParamDocs.js'\nexport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nexport * from './schemas/index.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\nregisterProtocolModule(lidoProtocolModule)\nregisterProtocolModule(ethenaProtocolModule)\nregisterProtocolModule(mapleProtocolModule)\nregisterProtocolModule(skyProtocolModule)\nregisterProtocolModule(aaveV4ProtocolModule)\nregisterProtocolModule(eulerV2ProtocolModule)\n\n/** Machine-readable catalog of protocol actions grouped by chain category. */\nexport function getAgentCatalog() {\n return {\n protocols: getProtocolModules(),\n byCategory: {\n evm: getActionsByChainCategory('evm'),\n solana: getActionsByChainCategory('solana'),\n near: getActionsByChainCategory('near'),\n },\n uniswapV4: uniswapV4ProtocolModule,\n curveDao: curveDaoProtocolModule,\n lido: lidoProtocolModule,\n ethena: ethenaProtocolModule,\n maple: mapleProtocolModule,\n sky: skyProtocolModule,\n aaveV4: aaveV4ProtocolModule,\n eulerV2: eulerV2ProtocolModule,\n /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */\n mcp: getAgentCatalogForMcp(),\n }\n}\n\nexport { getProtocolModules, getActionsByChainCategory }\n"]}
|