@continuumdao/ctm-mpc-defi 0.2.9 → 0.2.10
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 +519 -19
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +618 -14
- package/dist/agent/catalog.js +507 -20
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/hyperliquid/SKILL.md +34 -6
- package/dist/agent/skills/morpho/SKILL.md +48 -0
- package/dist/core/index.cjs +9 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.js +8 -1
- package/dist/core/index.js.map +1 -1
- package/dist/index.cjs +9 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.cjs +407 -34
- package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.d.ts +168 -15
- package/dist/protocols/evm/hyperliquid/index.js +390 -35
- package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
- package/dist/protocols/evm/maple/index.cjs.map +1 -1
- package/dist/protocols/evm/maple/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +1971 -0
- package/dist/protocols/evm/morpho/index.cjs.map +1 -0
- package/dist/protocols/evm/morpho/index.d.ts +522 -0
- package/dist/protocols/evm/morpho/index.js +1918 -0
- package/dist/protocols/evm/morpho/index.js.map +1 -0
- package/dist/protocols/evm/sky/index.cjs.map +1 -1
- package/dist/protocols/evm/sky/index.js.map +1 -1
- package/package.json +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/registry.ts","../../src/chains/evm/chainIdParse.ts","../../src/protocols/evm/uniswap-v4/constants.ts","../../src/protocols/evm/uniswap-v4/index.ts","../../src/protocols/evm/curve-dao/support.ts","../../src/protocols/evm/curve-dao/swapDestinations.ts","../../src/protocols/evm/curve-dao/apiSession.ts","../../src/protocols/evm/curve-dao/index.ts","../../src/agent/commonParamDocs.ts","../../src/agent/mcpMultisignSubmitMeta.ts","../../src/agent/zodToMcpJsonSchema.ts","../../src/agent/schemas/common.ts","../../src/agent/schemas/uniswapV4.ts","../../src/agent/schemas/curveDao.ts","../../src/agent/mcpServerSchemas.ts","../../src/agent/schemas/protocols.ts","../../src/agent/schemas/gmx.ts","../../src/agent/schemas/hyperliquid.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/protocols/evm/gmx/support.ts","../../src/protocols/evm/gmx/api.ts","../../src/protocols/evm/gmx/markets.ts","../../src/protocols/evm/gmx/reads.ts","../../src/protocols/evm/gmx/index.ts","../../src/protocols/evm/hyperliquid/support.ts","../../src/protocols/evm/hyperliquid/index.ts","../../src/agent/skills.ts","../../src/agent/support/advisors.ts","../../src/agent/catalog.ts"],"names":["session","zodToJsonSchema","z","getAddress","isAddress","require","createRequire","fileURLToPath","join","dirname","readFileSync"],"mappings":"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","file":"catalog.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { getAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Canonical Uniswap token-allowance contract on most EVM chains. */\nexport const PERMIT2_ADDRESS: Address = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\n\nconst UNIVERSAL_ROUTER_SPENDER: Partial<Record<number, string>> = {\n 1: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n 5: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',\n 137: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n 80001: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 10: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n 420: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n 421613: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42220: '0xcb695bc5D3Aa22cAD1E6DF07801b061a05A0233A',\n 44787: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 56: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n 43114: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n 84531: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n 8453: '0x6fF5693b99212da76ad316178a184ab56d299b43',\n 81457: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n 7777777: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n 324: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n 480: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n 1301: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n 130: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n 10143: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n 84532: '0x492e6456d9528771018deb9e87ef7750ef184104',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 143: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n 4217: '0x1febb76be10aaf3a1402f04e8e835f2c382f7914',\n 196: '0x5507749f2c558bb3e162c6e90c314c092e7372ff',\n}\n\nexport function isUniswapV4ChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n if (chainId == null) return false\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n const a = UNIVERSAL_ROUTER_SPENDER[n]\n return typeof a === 'string' && a.startsWith('0x')\n}\n\nexport function getUniswapUniversalRouterSpenderOrThrow(chainId: number): Address {\n const raw = UNIVERSAL_ROUTER_SPENDER[chainId]\n if (!raw || !raw.startsWith('0x')) {\n throw new Error(\n `No Uniswap Universal Router (spender) is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or use a chain supported by the Uniswap SDK.`,\n )\n }\n return getAddress(raw)\n}\n\nexport const MAX_UINT160 = (1n << 160n) - 1n\nexport const MAX_UINT48 = (1n << 48n) - 1n\n\nexport const UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_TRADE_BASE_DEFAULT = 'https://trade-api.gateway.uniswap.org/v1'\n/** Alternate LP API host (integration guide); trade-api `/v1/lp/*` is primary. */\nexport const UNISWAP_LP_API_BASE_DEFAULT = 'https://api.uniswap.org'\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\nexport const UNISWAP_LP_DEFAULT_EXPIRY_MINUTES = 30\nexport const UNISWAP_LP_DEFAULT_DEADLINE_SEC_OFFSET = UNISWAP_LP_DEFAULT_EXPIRY_MINUTES * 60\nexport const UNISWAP_LP_DEFAULT_SLIPPAGE_PERCENT = 0.5\n\n/** Position Manager (v4 periphery) per chain — for NFT position reads. */\nconst POSITION_MANAGER_BY_CHAIN: Partial<Record<number, string>> = {\n 1: '0xbd216513d74c8cf14cf4747e6aaa6420ff64ee9e',\n 10: '0x3c3ea4b57a46241e54610e5f022e5c45859a1017',\n 137: '0x1ec2ebf4f37e7363fdfe3551602425af0b3ceef9',\n 42161: '0xd88f38f930b7952f2db2432cb002e7abbf3dd869',\n 8453: '0x7C5f5A4bBd8fD63184577525326123B519429bDc',\n 11155111: '0x4B2C77d209D3405F41a037Ec6c77F7F5b8e2ca80',\n 130: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n}\n\nexport function getUniswapV4PositionManagerOrThrow(chainId: number): Address {\n const raw = POSITION_MANAGER_BY_CHAIN[chainId]\n if (!raw || !raw.startsWith('0x') || raw.length !== 42) {\n throw new Error(\n `No Uniswap V4 PositionManager is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or pass position manager from LP API response.`,\n )\n }\n return getAddress(raw)\n}\n\nexport function tryGetUniswapV4PositionManager(chainId: number): Address | null {\n try {\n return getUniswapV4PositionManagerOrThrow(chainId)\n } catch {\n return null\n }\n}\n\n/**\n * First block where the Position Manager existed (for narrowing `eth_getLogs` scans).\n * Source: https://docs.uniswap.org/contracts/v4/deployments\n */\nconst POSITION_MANAGER_DEPLOY_BLOCK_BY_CHAIN: Partial<Record<number, bigint>> = {\n /** Ethereum mainnet — Uniswap v4 launch (Jan 2025). */\n 1: 22_938_741n,\n}\n\n/** Default `eth_getLogs` span — many free RPCs cap at 250 blocks (e.g. Nodies). */\nexport const UNISWAP_V4_LP_LOG_CHUNK_SIZE_DEFAULT = 200n\nexport const UNISWAP_V4_LP_LOG_CHUNK_SIZE_MIN = 10n\n\nexport function getUniswapV4PositionManagerDeployBlock(chainId: number): bigint | undefined {\n return POSITION_MANAGER_DEPLOY_BLOCK_BY_CHAIN[chainId]\n}\n\nexport const UNISWAP_V4_LP_MINT_DEFAULT_GAS_UNITS = 1_800_000n\nexport const UNISWAP_V4_LP_INCREASE_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_V4_LP_DECREASE_DEFAULT_GAS_UNITS = 1_200_000n\nexport const UNISWAP_V4_LP_COLLECT_DEFAULT_GAS_UNITS = 900_000n\nexport const UNISWAP_V4_LP_ERC20_APPROVE_FALLBACK = 100_000n\nexport const UNISWAP_V4_LP_WETH_DEPOSIT_FALLBACK = 120_000n\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 './liquidityApi.js'\nexport * from './liquidityQuote.js'\nexport * from './liquidityMultisign.js'\nexport * from './positions.js'\nexport * from './poolId.js'\nexport * from './knownLpPools.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 { isUniswapV4LiquidityEvmSignRequest } from './liquidityMultisign.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 id: 'uniswap-v4.mint-liquidity',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Mint a new Uniswap V4 concentrated liquidity position (Position Manager NFT)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n lpResponse: { type: 'object', required: true, description: 'Full LP API create response' },\n nativeWrapped: { type: 'address', required: false, description: 'WETH when pool uses native ETH' },\n poolReference: { type: 'string', required: false, description: 'V4 pool id' },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap API key' },\n },\n },\n {\n id: 'uniswap-v4.increase-liquidity',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Increase liquidity on an existing Uniswap V4 position NFT',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n nftTokenId: { type: 'string', required: true, description: 'Position NFT token id' },\n lpResponse: { type: 'object', required: true, description: 'Full LP API increase response' },\n },\n },\n {\n id: 'uniswap-v4.decrease-liquidity',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Decrease liquidity on an existing Uniswap V4 position NFT',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n nftTokenId: { type: 'string', required: true, description: 'Position NFT token id' },\n lpResponse: { type: 'object', required: true, description: 'Full LP API decrease response' },\n },\n },\n {\n id: 'uniswap-v4.collect-fees',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Collect accrued fees from a Uniswap V4 position NFT',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n nftTokenId: { type: 'string', required: true, description: 'Position NFT token id' },\n lpResponse: { type: 'object', required: true, description: 'Full LP API claim response' },\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'\nimport {\n uniswapLpClaimFees,\n uniswapLpCreatePosition,\n uniswapLpDecreasePosition,\n uniswapLpIncreasePosition,\n} from './liquidityApi.js'\nimport {\n buildEvmMultisignBodyUniswapV4CollectFeesBatch,\n buildEvmMultisignBodyUniswapV4DecreaseLiquidityBatch,\n buildEvmMultisignBodyUniswapV4IncreaseLiquidityBatch,\n buildEvmMultisignBodyUniswapV4MintLiquidityBatch,\n} from './liquidityMultisign.js'\nimport { listUniswapV4PositionsForWallet } from './positions.js'\n\nexport const uniswapV4 = {\n quoteSwap,\n createSwap,\n swapExactInput: swapExactInputFn,\n swapFromQuote,\n buildSwapMultisignBody: buildEvmMultisignBodyUniswapV4SkipPermit2Batch,\n quote: uniswapTradeQuote,\n createLiquidityPosition: uniswapLpCreatePosition,\n increaseLiquidityPosition: uniswapLpIncreasePosition,\n decreaseLiquidityPosition: uniswapLpDecreasePosition,\n claimLiquidityFees: uniswapLpClaimFees,\n buildMintLiquidityMultisignBody: buildEvmMultisignBodyUniswapV4MintLiquidityBatch,\n buildIncreaseLiquidityMultisignBody: buildEvmMultisignBodyUniswapV4IncreaseLiquidityBatch,\n buildDecreaseLiquidityMultisignBody: buildEvmMultisignBodyUniswapV4DecreaseLiquidityBatch,\n buildCollectFeesMultisignBody: buildEvmMultisignBodyUniswapV4CollectFeesBatch,\n listPositions: listUniswapV4PositionsForWallet,\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 if (!session) {\n throw new Error('Failed to load Curve session for this RPC.')\n }\n const adjMap = session.adj\n if (!adjMap) {\n throw new Error('Curve session has no pool graph for this RPC.')\n }\n const adj: Record<string, string[]> = {}\n for (const [key, neighbors] of adjMap) {\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 Custom Gas Config from chainDetail / customGasChainDetails. Omitted baseFee/priorityFee is valid — live RPC fees are used at proposal; configured values are optional floors/multipliers. When false, use live 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\n/** MCP agent path: build_* tools auto-submit and return requestId. */\nexport const MULTISIGN_SUBMIT_OUTPUT_DOC = {\n description:\n 'Submitted mpc-auth multiSignRequest id. continuum-mcp-server builds, signs the management envelope, and POSTs /multiSignRequest. Continue with wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result. Do not call the same build tool again if requestId was returned.',\n fields: {\n requestId: {\n type: 'string',\n description: 'Sign request id from POST /multiSignRequest.',\n },\n },\n} as const\n\n/** Legacy unsigned builder output (node app / manual sign path — not MCP tool return value). */\nexport const MULTISIGN_OUTPUT_DOC = {\n description:\n 'Unsigned mpc-auth multiSignRequest payload from protocol builders. MCP agents receive { requestId } instead; node-app callers sign messageToSign and POST { ...bodyForSign, clientSig, signedMessage }.',\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","/** Shared MCP metadata for tools that build and auto-submit multiSignRequest. */\nexport const MCP_MULTISIGN_SUBMIT_DESCRIPTION_SUFFIX =\n 'Builds the unsigned batch, signs the management envelope, and POSTs /multiSignRequest. Returns { requestId } on success — do not call again; use list_sign_requests to verify duplicates.'\n\nexport const MCP_MULTISIGN_SUBMIT_FOLLOW_UP = [\n 'wait_for_sign_request_ready',\n 'sign_request_agree',\n 'trigger_sign_result',\n 'broadcast_sign_result',\n] as const\n\nexport function withMultisignSubmitMcpMeta(\n description: string,\n followUp: readonly string[] = MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n): { description: string; followUp: string[] } {\n return {\n description: `${description.trim()} ${MCP_MULTISIGN_SUBMIT_DESCRIPTION_SUFFIX}`,\n followUp: [...followUp],\n }\n}\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 Custom Gas Config from chainDetail / customGasChainDetails. Omitted baseFee/priorityFee is valid — builder uses live RPC fees; configured values are optional floors/multipliers. When false, use live 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/** Internal builder output before MCP management submit (not the MCP tool return value). */\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 from protocol builders (used internally before management submit).',\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\n/** Parse protocol builder output before signAndSubmitMultiSignRequest. */\nexport function parseMultisignBuilderOutput(data: unknown): MultisignOutput {\n return multisignOutputSchema.parse(data)\n}\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\nconst lpExistingPoolSchema = z.object({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n poolReference: z.string().min(1).describe('V4 pool id (bytes32 hex)'),\n})\n\nconst lpNewPoolSchema = z.object({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n fee: z.number().int().nonnegative(),\n tickSpacing: z.number().int().positive(),\n hooks: evmAddressSchema.optional(),\n initialPrice: z.string().min(1).describe('sqrtRatioX96 string for new pool'),\n})\n\nconst lpIndependentTokenSchema = z.object({\n tokenAddress: evmAddressSchema.describe('0x0 for native ETH'),\n amount: z.string().min(1).describe('Amount in token base units (wei)'),\n})\n\nconst lpPriceBoundsSchema = z.object({\n minPrice: z.string().min(1),\n maxPrice: z.string().min(1),\n})\n\nconst lpTickBoundsSchema = z.object({\n tickLower: z.number().int(),\n tickUpper: z.number().int(),\n})\n\nconst lpCommonApiInputSchema = z.object({\n uniswapApiKey: z.string().min(1),\n walletAddress: evmAddressSchema.optional(),\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n slippageTolerance: z.number().optional(),\n simulateTransaction: z.boolean().optional(),\n baseUrl: z.string().optional(),\n keyGen: z.string().optional(),\n managementNodeUrl: z.string().optional(),\n})\n\n/** MCP: POST /lp/create — poolPreset is resolved by the MCP adapter before validation. */\nexport const mcpUniswapV4LpCreatePositionInputSchema = lpCommonApiInputSchema.extend({\n existingPool: lpExistingPoolSchema.optional(),\n newPool: lpNewPoolSchema.optional(),\n independentToken: lpIndependentTokenSchema,\n priceBounds: lpPriceBoundsSchema.optional(),\n tickBounds: lpTickBoundsSchema.optional(),\n})\n\n/** MCP: list curated standard V4 LP pools (poolReference computed from pool key). */\nexport const mcpUniswapV4LpListPoolsInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n pair: z\n .string()\n .optional()\n .describe('Optional filter, e.g. eth-usdc or ETH/USDC'),\n})\n\nexport const mcpUniswapV4LpListPoolsOutputSchema = z.object({\n chainId: z.number().int().positive(),\n chainLabel: z.string(),\n pools: z.array(\n z.object({\n presetId: z.string(),\n pairSlug: z.string(),\n pairLabel: z.string(),\n fee: z.number().int(),\n feeLabel: z.string(),\n tickSpacing: z.number().int(),\n token0Symbol: z.string(),\n token1Symbol: z.string(),\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n poolReference: z.string(),\n hooks: evmAddressSchema,\n nativeWrapped: evmAddressSchema.optional(),\n usesNativeEth: z.boolean(),\n }),\n ),\n notes: z.string(),\n})\n\nexport const mcpUniswapV4LpCreatePositionOutputSchema = jsonObjectSchema\n\n/** MCP: POST /lp/increase */\nexport const mcpUniswapV4LpIncreaseInputSchema = lpCommonApiInputSchema.extend({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n independentToken: lpIndependentTokenSchema,\n})\n\nexport const mcpUniswapV4LpIncreaseOutputSchema = jsonObjectSchema\n\n/** MCP: POST /lp/decrease */\nexport const mcpUniswapV4LpDecreaseInputSchema = lpCommonApiInputSchema.extend({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n liquidityPercentageToDecrease: z.number().int().min(1).max(100),\n})\n\nexport const mcpUniswapV4LpDecreaseOutputSchema = jsonObjectSchema\n\n/** MCP: POST /lp/claim */\nexport const mcpUniswapV4LpClaimInputSchema = lpCommonApiInputSchema.extend({\n tokenId: z.union([z.string(), z.number()]),\n})\n\nexport const mcpUniswapV4LpClaimOutputSchema = jsonObjectSchema\n\n/** MCP: list position NFTs from node token registry (no RPC log scan). */\nexport const mcpUniswapV4LpListPositionsInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n keyGenId: z.string().min(1).optional(),\n walletAddress: evmAddressSchema.optional(),\n positionManagerAddress: evmAddressSchema.optional(),\n})\n\nexport const mcpUniswapV4LpListPositionsOutputSchema = z.object({\n source: z.literal('token_registry'),\n positions: z.array(\n z.object({\n tokenId: z.string(),\n positionManager: evmAddressSchema,\n owner: evmAddressSchema,\n name: z.string().optional(),\n symbol: z.string().optional(),\n }),\n ),\n})\n\n/** MCP: save a minted position NFT in the node token registry (management-signed). */\nexport const mcpUniswapV4RegisterPositionNftInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n tokenId: z.union([z.string(), z.number()]),\n keyGenId: z.string().min(1).optional(),\n positionManagerAddress: evmAddressSchema.optional(),\n name: z.string().optional(),\n symbol: z.string().optional(),\n tokenURI: z.string().optional(),\n})\n\nexport const mcpUniswapV4RegisterPositionNftOutputSchema = z.object({\n message: z.string(),\n tokenId: z.string(),\n positionManager: evmAddressSchema,\n})\n\n/** MCP: parse mint tx receipt and register position NFT (management-signed). */\nexport const mcpUniswapV4RegisterPositionFromMintTxInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n txHash: z.string().min(1),\n keyGenId: z.string().min(1).optional(),\n walletAddress: evmAddressSchema.optional(),\n rpcUrl: z.string().optional(),\n positionManagerAddress: evmAddressSchema.optional(),\n})\n\nexport const mcpUniswapV4RegisterPositionFromMintTxOutputSchema = z.object({\n message: z.string(),\n tokenId: z.string(),\n positionManager: evmAddressSchema,\n registered: z.boolean(),\n})\n\nconst lpBuildCommonSchema = {\n lpResponse: jsonObjectSchema.describe('Full LP API response (create/increase/decrease/claim)'),\n nativeWrapped: evmAddressSchema.optional(),\n poolReference: z.string().optional(),\n}\n\nexport const mcpUniswapV4BuildMintLiquidityMultisignInputSchema = evmMultisignCommonInputSchema.extend(\n lpBuildCommonSchema,\n)\n\nexport const mcpUniswapV4BuildIncreaseLiquidityMultisignInputSchema =\n evmMultisignCommonInputSchema.extend({\n ...lpBuildCommonSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n })\n\nexport const mcpUniswapV4BuildDecreaseLiquidityMultisignInputSchema =\n evmMultisignCommonInputSchema.extend({\n ...lpBuildCommonSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n })\n\nexport const mcpUniswapV4BuildCollectFeesMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n ...lpBuildCommonSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n})\n\nexport type McpUniswapV4LpCreatePositionInput = z.infer<typeof mcpUniswapV4LpCreatePositionInputSchema>\nexport type McpUniswapV4BuildMintLiquidityMultisignInput = z.infer<\n typeof mcpUniswapV4BuildMintLiquidityMultisignInputSchema\n>\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'\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\n .string()\n .min(1)\n .describe('Sign request id from POST /multiSignRequest — success; do not retry the same build tool.'),\n })\n .describe(\n 'Submitted mpc-auth multiSignRequest. Continue with wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result.',\n )\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 { 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 }\nexport { mcpServerSubmitOutputSchema as mcpMultisignSubmitOutputSchema } from '../mcpServerSchemas.js'\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 ——\nconst mcpAaveV4MarketIdSchema = z\n .string()\n .min(1)\n .optional()\n .describe('UI market segment: main (Plus), core, or bluechip (Prime). Default main.')\n\nconst mcpAaveV4HealthPreviewSchema = {\n skipHealthPreview: z\n .boolean()\n .optional()\n .describe('Skip Aave v4 health-factor preview before withdraw/borrow/repay (not recommended).'),\n acknowledgeHealthRisk: z\n .boolean()\n .optional()\n .describe(\n 'Required true when preview returns a confirm-level health risk (withdraw/borrow/repay).',\n ),\n}\n\nexport const mcpAaveV4DepositInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema\n .optional()\n .describe('Omit — continuum-mcp-server resolves spoke from Aave v4 API.'),\n underlying: evmAddressSchema.describe(\n 'Asset to supply. Native ETH: 0x0 or wrapped native with isNativeIn true.',\n ),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n isNativeIn: z\n .boolean()\n .optional()\n .describe('Wrap native to wrapped native before supply (e.g. ETH → WETH).'),\n enableAsCollateralAfterSupply: z\n .boolean()\n .optional()\n .describe('Append setUsingAsCollateral after supply in the same batch.'),\n})\n\nexport const mcpAaveV4WithdrawInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema.optional().describe('Omit — server resolves from Aave v4 API.'),\n underlying: evmAddressSchema.describe('Supplied asset to withdraw.'),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n ...mcpAaveV4HealthPreviewSchema,\n})\n\nexport const mcpAaveV4BorrowInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema.optional().describe('Omit — server resolves from Aave v4 API.'),\n underlying: evmAddressSchema.describe('Debt asset to borrow (e.g. USDC), not collateral.'),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n collateralUnderlying: evmAddressSchema\n .optional()\n .describe('Collateral token already supplied; helps pick hub when debt exists on multiple hubs.'),\n ...mcpAaveV4HealthPreviewSchema,\n})\n\nexport const mcpAaveV4RepayInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema.optional().describe('Omit — server resolves from Aave v4 API.'),\n underlying: evmAddressSchema.describe('Debt token to repay.'),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n ...mcpAaveV4HealthPreviewSchema,\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 { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema } from './common.js'\n\nexport function mcpGmxMultisignInput(fields: z.ZodRawShape) {\n return evmMultisignCommonInputSchema.extend(fields)\n}\n\nexport { mcpServerSubmitOutputSchema as mcpGmxMultisignOutputSchema } from '../mcpServerSchemas.js'\n\nconst gmxDirectionSchema = z.enum(['long', 'short'])\nconst gmxOrderTypeSchema = z.enum(['market', 'limit'])\n\nexport const mcpGmxFetchMarketsInputSchema = z.object({\n chainId: z.number().int().positive(),\n})\n\nexport const mcpGmxFetchMarketsOutputSchema = z.object({\n markets: z.array(\n z.object({\n symbol: z.string(),\n marketTokenAddress: z.string(),\n maxLeverageLabel: z.string().nullable(),\n }),\n ),\n})\n\nexport const mcpGmxFetchPositionsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpGmxFetchPositionsOutputSchema = z.object({\n positions: z.array(z.record(z.unknown())),\n})\n\nexport const mcpGmxIncreaseInputSchema = mcpGmxMultisignInput({\n symbol: z.string().min(1),\n direction: gmxDirectionSchema,\n orderType: gmxOrderTypeSchema,\n sizeUsdHuman: z.string().min(1),\n collateralToken: z.string().min(1),\n collateralAmountHuman: z.string().min(1),\n triggerPriceUsdHuman: z.string().optional(),\n slippageBps: z.number().int().nonnegative().optional(),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxDecreaseInputSchema = mcpGmxMultisignInput({\n symbol: z.string().min(1),\n direction: gmxDirectionSchema,\n orderType: gmxOrderTypeSchema,\n sizeUsdHuman: z.string().min(1),\n collateralToken: z.string().min(1),\n receiveToken: z.string().optional(),\n triggerPriceUsdHuman: z.string().optional(),\n keepLeverage: z.boolean().optional(),\n slippageBps: z.number().int().nonnegative().optional(),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxCancelInputSchema = mcpGmxMultisignInput({\n orderId: z.string().min(1),\n})\n\nexport const mcpGmxGmDepositInputSchema = mcpGmxMultisignInput({\n marketSymbol: z.string().min(1),\n collateralToken: z.string().min(1),\n collateralAmountHuman: z.string().min(1),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n isNativeIn: z.boolean().optional(),\n nativeWrapped: evmAddressSchema.optional(),\n})\n\nexport const mcpGmxGmWithdrawInputSchema = mcpGmxMultisignInput({\n marketSymbol: z.string().min(1),\n gmAmountHuman: z.string().min(1),\n gmDecimals: z.number().int().nonnegative().optional(),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n isNativeOut: z.boolean().optional(),\n})\n\nexport const mcpGmxStakeGmxInputSchema = mcpGmxMultisignInput({\n amountHuman: z.string().min(1),\n gmxDecimals: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxUnstakeGmxInputSchema = mcpGmxMultisignInput({\n amountHuman: z.string().min(1),\n gmxDecimals: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxFetchGmMarketsInputSchema = z.object({\n chainId: z.number().int().positive(),\n})\n\nconst mcpGmxGmMarketApyRowSchema = z.object({\n symbol: z.string(),\n marketTokenAddress: z.string(),\n longTokenSymbol: z.string().nullable(),\n shortTokenSymbol: z.string().nullable(),\n apy: z.number().nullable(),\n baseApy: z.number().nullable(),\n bonusApr: z.number().nullable(),\n apyPercentLabel: z.string().nullable(),\n})\n\nexport const mcpGmxFetchGmMarketsOutputSchema = z.object({\n markets: z.array(mcpGmxGmMarketApyRowSchema),\n})\n\nexport const mcpGmxFetchGmApyInputSchema = z.object({\n chainId: z.number().int().positive(),\n})\n\nexport const mcpGmxFetchGmApyOutputSchema = z.object({\n markets: z.array(\n z.object({\n symbol: z.string(),\n marketTokenAddress: z.string(),\n longTokenSymbol: z.string().nullable(),\n shortTokenSymbol: z.string().nullable(),\n apy: z.number().nullable(),\n baseApy: z.number().nullable(),\n bonusApr: z.number().nullable(),\n apyPercentLabel: z.string().nullable(),\n }),\n ),\n})\n\nexport const mcpGmxFetchStakingPowerInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpGmxFetchStakingPowerOutputSchema = z.object({\n stakingPower: z.record(z.unknown()),\n})\n\nconst gmxOhlcvTimeframeSchema = z.enum(['1m', '5m', '15m', '1h', '4h', '1d', '1w', '1M'])\n\nconst gmxOhlcvCandleSchema = z.object({\n timestampMs: z.number(),\n timeLabel: z.string(),\n open: z.string(),\n high: z.string(),\n low: z.string(),\n close: z.string(),\n})\n\nexport const mcpGmxFetchMarketPricesInputSchema = z.object({\n chainId: z.number().int().positive(),\n symbol: z.string().min(1),\n collateralSymbol: z.string().min(1),\n})\n\nexport const mcpGmxFetchMarketPricesOutputSchema = z.object({\n symbol: z.string(),\n indexLabel: z.string(),\n collateralSymbol: z.string(),\n indexMarkUsd: z.string().nullable(),\n collateralUsd: z.string().nullable(),\n indexPerCollateral: z.string().nullable(),\n fetchedAtMs: z.number(),\n})\n\nexport const mcpGmxFetchOhlcvInputSchema = z.object({\n chainId: z.number().int().positive(),\n symbol: z.string().min(1),\n timeframe: gmxOhlcvTimeframeSchema.optional(),\n limit: z.number().int().positive().max(500).optional(),\n sort: z.enum(['asc', 'desc']).optional(),\n})\n\nexport const mcpGmxFetchOhlcvOutputSchema = z.object({\n symbol: z.string(),\n timeframe: gmxOhlcvTimeframeSchema,\n candles: z.array(gmxOhlcvCandleSchema),\n})\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema } from './common.js'\n\nexport function mcpHyperliquidMultisignInput(fields: z.ZodRawShape) {\n return evmMultisignCommonInputSchema.extend(fields)\n}\n\nconst hyperliquidTifSchema = z.enum(['alo', 'gtc', 'ioc'])\nconst hyperliquidOhlcvIntervalSchema = z.enum([\n '1m',\n '3m',\n '5m',\n '15m',\n '30m',\n '1h',\n '2h',\n '4h',\n '8h',\n '12h',\n '1d',\n '3d',\n '1w',\n '1M',\n])\n\nconst hyperliquidPositionRowSchema = z.object({\n key: z.string(),\n coin: z.string(),\n isLong: z.boolean(),\n size: z.string().nullable(),\n entryPx: z.string().nullable(),\n positionValueUsd: z.string().nullable(),\n unrealizedPnlUsd: z.string().nullable(),\n liquidationPx: z.string().nullable(),\n leverageLabel: z.string().nullable(),\n maxLeverage: z.number().nullable(),\n marginUsedUsd: z.string().nullable(),\n returnOnEquity: z.string().nullable(),\n})\n\nconst hyperliquidActiveAssetSchema = z.object({\n markPx: z.string().nullable(),\n leverageLabel: z.string().nullable(),\n availableToBuy: z.string().nullable(),\n availableToSell: z.string().nullable(),\n})\n\nconst hyperliquidAccountSummarySchema = z.object({\n accountValueUsd: z.string().nullable(),\n totalMarginUsedUsd: z.string().nullable(),\n withdrawableUsd: z.string().nullable(),\n})\n\nexport const mcpHyperliquidFetchMarketsInputSchema = z.object({\n chainId: z.number().int().positive(),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchMarketsOutputSchema = z.object({\n markets: z.array(\n z.object({\n name: z.string(),\n asset: z.number(),\n szDecimals: z.number(),\n maxLeverage: z.number(),\n onlyIsolated: z.boolean().optional(),\n }),\n ),\n dexes: z.array(\n z.object({\n name: z.string(),\n fullName: z.string(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchOpenContextInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n coin: z.string().min(1),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchOpenContextOutputSchema = z.object({\n context: z.object({\n account: hyperliquidAccountSummarySchema,\n activeAsset: hyperliquidActiveAssetSchema,\n }),\n})\n\nexport const mcpHyperliquidFetchPositionsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchPositionsOutputSchema = z.object({\n positions: z.array(hyperliquidPositionRowSchema),\n})\n\nexport const mcpHyperliquidFetchOpenOrdersInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchOpenOrdersOutputSchema = z.object({\n orders: z.array(\n z.object({\n coin: z.string(),\n side: z.string(),\n limitPx: z.string(),\n sz: z.string(),\n oid: z.number(),\n timestamp: z.number(),\n reduceOnly: z.boolean().optional(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchMarketSnapshotInputSchema = z.object({\n chainId: z.number().int().positive(),\n coin: z.string().min(1),\n interval: hyperliquidOhlcvIntervalSchema.optional(),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchMarketSnapshotOutputSchema = z.object({\n snapshot: z.object({\n coin: z.string(),\n midUsd: z.string().nullable(),\n fetchedAtMs: z.number(),\n interval: hyperliquidOhlcvIntervalSchema,\n candles: z.array(\n z.object({\n timestampMs: z.number(),\n open: z.string(),\n high: z.string(),\n low: z.string(),\n close: z.string(),\n volume: z.string(),\n }),\n ),\n }),\n})\n\nexport const mcpHyperliquidFetchUsdClassBalancesInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchUsdClassBalancesOutputSchema = z.object({\n balances: z.object({\n spotUsdcAvailable: z.string(),\n perpWithdrawable: z.string(),\n }),\n})\n\nexport const mcpHyperliquidFetchVaultsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema.optional(),\n})\n\nexport const mcpHyperliquidFetchVaultsOutputSchema = z.object({\n vaults: z.array(\n z.object({\n vaultAddress: z.string(),\n name: z.string(),\n apr: z.number().nullable(),\n tvlUsd: z.string().nullable(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchUserVaultEquitiesInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchUserVaultEquitiesOutputSchema = z.object({\n rows: z.array(\n z.object({\n vaultAddress: z.string(),\n equity: z.string(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchStakingSummaryInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchStakingSummaryOutputSchema = z.object({\n summary: z.object({\n delegated: z.string(),\n undelegated: z.string(),\n }),\n})\n\nexport const mcpHyperliquidFetchDelegationsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchDelegationsOutputSchema = z.object({\n delegations: z.array(\n z.object({\n validator: z.string(),\n amount: z.string(),\n }),\n ),\n})\n\nexport const mcpHyperliquidLimitOrderInputSchema = mcpHyperliquidMultisignInput({\n coin: z.string().min(1),\n isBuy: z.boolean(),\n limitPxHuman: z.string().min(1),\n szHuman: z.string().min(1),\n marketKind: z.enum(['perp', 'spot']).optional(),\n tif: hyperliquidTifSchema.optional(),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidCloseInputSchema = mcpHyperliquidMultisignInput({\n coin: z.string().min(1),\n isLong: z.boolean(),\n limitPxHuman: z.string().min(1),\n szHuman: z.string().min(1),\n dex: z.string().optional(),\n tif: hyperliquidTifSchema.optional(),\n})\n\nexport const mcpHyperliquidCancelInputSchema = mcpHyperliquidMultisignInput({\n coin: z.string().min(1),\n oid: z.number().int().positive(),\n marketKind: z.enum(['perp', 'spot']).optional(),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidUsdTransferInputSchema = mcpHyperliquidMultisignInput({\n usdHuman: z.string().min(1),\n toPerp: z.boolean(),\n})\n\nexport const mcpHyperliquidVaultDepositInputSchema = mcpHyperliquidMultisignInput({\n vaultAddress: evmAddressSchema,\n usdHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidVaultWithdrawInputSchema = mcpHyperliquidMultisignInput({\n vaultAddress: evmAddressSchema,\n usdHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidStakeInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidUnstakeInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidDelegateInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n validator: evmAddressSchema,\n})\n\nexport const mcpHyperliquidUndelegateInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n validator: evmAddressSchema,\n})\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 mcpMultisignSubmitOutputSchema,\n mcpSkyLockstakeCloseInputSchema,\n mcpSkyLockstakeDrawInputSchema,\n mcpSkyLockstakeGetRewardInputSchema,\n mcpSkyLockstakeStakeInputSchema,\n mcpSkyLockstakeWipeInputSchema,\n mcpSkySusdsDepositInputSchema,\n mcpSkySusdsRedeemInputSchema,\n} from './schemas/protocols.js'\nimport {\n mcpGmxCancelInputSchema,\n mcpGmxDecreaseInputSchema,\n mcpGmxGmDepositInputSchema,\n mcpGmxGmWithdrawInputSchema,\n mcpGmxIncreaseInputSchema,\n mcpGmxStakeGmxInputSchema,\n mcpGmxUnstakeGmxInputSchema,\n} from './schemas/gmx.js'\nimport {\n mcpHyperliquidCancelInputSchema,\n mcpHyperliquidCloseInputSchema,\n mcpHyperliquidDelegateInputSchema,\n mcpHyperliquidLimitOrderInputSchema,\n mcpHyperliquidStakeInputSchema,\n mcpHyperliquidUndelegateInputSchema,\n mcpHyperliquidUnstakeInputSchema,\n mcpHyperliquidUsdTransferInputSchema,\n mcpHyperliquidVaultDepositInputSchema,\n mcpHyperliquidVaultWithdrawInputSchema,\n} from './schemas/hyperliquid.js'\nimport {\n MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n withMultisignSubmitMcpMeta,\n} from './mcpMultisignSubmitMeta.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 mcpMultisignSubmitOutputSchema>> {\n const meta = withMultisignSubmitMcpMeta(def.description, def.followUp ?? MCP_MULTISIGN_SUBMIT_FOLLOW_UP)\n return {\n ...def,\n description: meta.description,\n followUp: meta.followUp,\n outputZod: mcpMultisignSubmitOutputSchema,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(mcpMultisignSubmitOutputSchema),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => mcpMultisignSubmitOutputSchema.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: 'Create and submit mpc-auth multiSignRequest for Lido ETH stake (submit).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 (wrap native, approve, supply).',\n prerequisites: ['keyGenId', 'chainId', 'underlying', 'amountHuman', 'get_defi_protocol_skill for hubs/spokes'],\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; health-factor preview when user has borrow debt.',\n prerequisites: ['keyGenId', 'chainId', 'underlying (supplied asset)', 'amountHuman'],\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; underlying is debt asset; collateral must be supplied first.',\n prerequisites: [\n 'keyGenId',\n 'chainId',\n 'underlying (debt token)',\n 'amountHuman',\n 'collateral supplied via deposit',\n ],\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 (approve if needed + repay).',\n prerequisites: ['keyGenId', 'chainId', 'underlying (debt token)', 'amountHuman'],\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 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 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 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 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 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 handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch' },\n inputZod: mcpEulerV2CollateralWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_increase_multisign',\n actionId: 'gmx.increase',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for GMX classic increase order (open/add perp). Keeper executes asynchronously after on-chain broadcast.',\n prerequisites: ['keyGen', 'executorAddress', 'GMX market symbol', 'classic mode only — no subaccounts'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxIncreaseBatch' },\n inputZod: mcpGmxIncreaseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_decrease_multisign',\n actionId: 'gmx.decrease',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest for GMX classic decrease order (close/reduce perp).',\n prerequisites: ['keyGen', 'executorAddress', 'position market symbol'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxDecreaseBatch' },\n inputZod: mcpGmxDecreaseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_cancel_multisign',\n actionId: 'gmx.cancel',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to cancel a pending GMX order (classic on-chain).',\n prerequisites: ['keyGen', 'executorAddress', 'orderId from fetchOrders'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxCancelBatch' },\n inputZod: mcpGmxCancelInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_gm_deposit_multisign',\n actionId: 'gmx.gmDeposit',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for GMX GM pool deposit (ExchangeRouter multicall). Keeper executes asynchronously.',\n prerequisites: ['keyGen', 'executorAddress', 'marketSymbol', 'collateral token'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxGmDepositBatch' },\n inputZod: mcpGmxGmDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_gm_withdraw_multisign',\n actionId: 'gmx.gmWithdraw',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for GMX GM pool withdrawal (ExchangeRouter multicall). Keeper executes asynchronously.',\n prerequisites: ['keyGen', 'executorAddress', 'GM market token balance'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxGmWithdrawBatch' },\n inputZod: mcpGmxGmWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_stake_gmx_multisign',\n actionId: 'gmx.stakeGmx',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to stake GMX via RewardRouter.',\n prerequisites: ['keyGen', 'executorAddress', 'GMX token balance'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxStakeGmxBatch' },\n inputZod: mcpGmxStakeGmxInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_unstake_gmx_multisign',\n actionId: 'gmx.unstakeGmx',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to unstake GMX via RewardRouter.',\n prerequisites: ['keyGen', 'executorAddress', 'staked GMX balance'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxUnstakeGmxBatch' },\n inputZod: mcpGmxUnstakeGmxInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_limit_order_multisign',\n actionId: 'hyperliquid.limitOrder',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for a Hyperliquid limit/IoC order via HyperEVM CoreWriter.',\n prerequisites: ['keyGen', 'executorAddress', 'chainId 999 or 998', 'coin', 'limitPxHuman', 'szHuman'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidLimitOrderBatch' },\n inputZod: mcpHyperliquidLimitOrderInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_close_multisign',\n actionId: 'hyperliquid.close',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest to close/reduce a perp (IoC reduce-only limit via CoreWriter).',\n prerequisites: ['keyGen', 'executorAddress', 'open position from fetch_positions', 'isLong matches position'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidCloseBatch' },\n inputZod: mcpHyperliquidCloseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_cancel_multisign',\n actionId: 'hyperliquid.cancel',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to cancel a Hyperliquid open order.',\n prerequisites: ['keyGen', 'executorAddress', 'oid from fetch_open_orders'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidCancelBatch' },\n inputZod: mcpHyperliquidCancelInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_usd_transfer_multisign',\n actionId: 'hyperliquid.usdTransfer',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to move USDC between spot and perp margin.',\n prerequisites: ['keyGen', 'executorAddress', 'usdHuman', 'toPerp boolean'],\n handler: {\n importPath: 'protocols/evm/hyperliquid',\n exportName: 'buildEvmMultisignBodyHyperliquidUsdClassTransferBatch',\n },\n inputZod: mcpHyperliquidUsdTransferInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_vault_deposit_multisign',\n actionId: 'hyperliquid.vaultDeposit',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest for Hyperliquid vault deposit.',\n prerequisites: ['keyGen', 'executorAddress', 'vaultAddress from fetch_vaults'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidVaultDepositBatch' },\n inputZod: mcpHyperliquidVaultDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_vault_withdraw_multisign',\n actionId: 'hyperliquid.vaultWithdraw',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for Hyperliquid vault withdraw (includes accrued PnL).',\n prerequisites: ['keyGen', 'executorAddress', 'vaultAddress', 'equity from fetch_user_vault_equities'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidVaultWithdrawBatch' },\n inputZod: mcpHyperliquidVaultWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_stake_multisign',\n actionId: 'hyperliquid.stake',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to stake HYPE via CoreWriter.',\n prerequisites: ['keyGen', 'executorAddress', 'HYPE balance on Hyperliquid account'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidStakeDepositBatch' },\n inputZod: mcpHyperliquidStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_unstake_multisign',\n actionId: 'hyperliquid.unstake',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to unstake HYPE via CoreWriter.',\n prerequisites: ['keyGen', 'executorAddress', 'staked HYPE'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidStakeWithdrawBatch' },\n inputZod: mcpHyperliquidUnstakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_delegate_multisign',\n actionId: 'hyperliquid.delegate',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to delegate staked HYPE to a validator.',\n prerequisites: ['keyGen', 'executorAddress', 'validator address', 'hypeHuman'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidDelegateOnlyBatch' },\n inputZod: mcpHyperliquidDelegateInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_undelegate_multisign',\n actionId: 'hyperliquid.undelegate',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to undelegate HYPE from a validator.',\n prerequisites: ['keyGen', 'executorAddress', 'delegation from fetch_delegations'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidUndelegateBatch' },\n inputZod: mcpHyperliquidUndelegateInputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport {\n EVM_COMMON_PARAM_DOCS,\n MULTISIGN_OUTPUT_DOC,\n MULTISIGN_SUBMIT_OUTPUT_DOC,\n MANAGEMENT_SIG_DOC,\n} from './commonParamDocs.js'\nimport {\n MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n withMultisignSubmitMcpMeta,\n} from './mcpMultisignSubmitMeta.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 mcpGmxFetchMarketsInputSchema,\n mcpGmxFetchMarketsOutputSchema,\n mcpGmxFetchMarketPricesInputSchema,\n mcpGmxFetchMarketPricesOutputSchema,\n mcpGmxFetchOhlcvInputSchema,\n mcpGmxFetchOhlcvOutputSchema,\n mcpGmxFetchPositionsInputSchema,\n mcpGmxFetchPositionsOutputSchema,\n mcpGmxFetchGmMarketsInputSchema,\n mcpGmxFetchGmMarketsOutputSchema,\n mcpGmxFetchGmApyInputSchema,\n mcpGmxFetchGmApyOutputSchema,\n mcpGmxFetchStakingPowerInputSchema,\n mcpGmxFetchStakingPowerOutputSchema,\n mcpUniswapV4BuildSwapMultisignInputSchema,\n mcpUniswapV4BuildMintLiquidityMultisignInputSchema,\n mcpUniswapV4BuildIncreaseLiquidityMultisignInputSchema,\n mcpUniswapV4BuildDecreaseLiquidityMultisignInputSchema,\n mcpUniswapV4BuildCollectFeesMultisignInputSchema,\n mcpUniswapV4CreateSwapInputSchema,\n mcpUniswapV4CreateSwapOutputSchema,\n mcpUniswapV4LpCreatePositionInputSchema,\n mcpUniswapV4LpCreatePositionOutputSchema,\n mcpUniswapV4LpIncreaseInputSchema,\n mcpUniswapV4LpIncreaseOutputSchema,\n mcpUniswapV4LpDecreaseInputSchema,\n mcpUniswapV4LpDecreaseOutputSchema,\n mcpUniswapV4LpClaimInputSchema,\n mcpUniswapV4LpClaimOutputSchema,\n mcpUniswapV4LpListPositionsInputSchema,\n mcpUniswapV4LpListPositionsOutputSchema,\n mcpUniswapV4LpListPoolsInputSchema,\n mcpUniswapV4LpListPoolsOutputSchema,\n mcpUniswapV4RegisterPositionNftInputSchema,\n mcpUniswapV4RegisterPositionNftOutputSchema,\n mcpUniswapV4RegisterPositionFromMintTxInputSchema,\n mcpUniswapV4RegisterPositionFromMintTxOutputSchema,\n mcpUniswapV4QuoteInputSchema,\n mcpUniswapV4QuoteOutputSchema,\n mcpMultisignSubmitOutputSchema,\n mcpHyperliquidFetchMarketsInputSchema,\n mcpHyperliquidFetchMarketsOutputSchema,\n mcpHyperliquidFetchOpenContextInputSchema,\n mcpHyperliquidFetchOpenContextOutputSchema,\n mcpHyperliquidFetchPositionsInputSchema,\n mcpHyperliquidFetchPositionsOutputSchema,\n mcpHyperliquidFetchOpenOrdersInputSchema,\n mcpHyperliquidFetchOpenOrdersOutputSchema,\n mcpHyperliquidFetchMarketSnapshotInputSchema,\n mcpHyperliquidFetchMarketSnapshotOutputSchema,\n mcpHyperliquidFetchUsdClassBalancesInputSchema,\n mcpHyperliquidFetchUsdClassBalancesOutputSchema,\n mcpHyperliquidFetchVaultsInputSchema,\n mcpHyperliquidFetchVaultsOutputSchema,\n mcpHyperliquidFetchUserVaultEquitiesInputSchema,\n mcpHyperliquidFetchUserVaultEquitiesOutputSchema,\n mcpHyperliquidFetchStakingSummaryInputSchema,\n mcpHyperliquidFetchStakingSummaryOutputSchema,\n mcpHyperliquidFetchDelegationsInputSchema,\n mcpHyperliquidFetchDelegationsOutputSchema,\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\nfunction defineMultisignSubmitMcpTool<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 mcpMultisignSubmitOutputSchema>> {\n const meta = withMultisignSubmitMcpMeta(def.description, def.followUp ?? MCP_MULTISIGN_SUBMIT_FOLLOW_UP)\n return defineMcpTool({\n ...def,\n description: meta.description,\n followUp: meta.followUp,\n outputZod: mcpMultisignSubmitOutputSchema,\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: [\n 'UNISWAP_API_KEY in node Variables',\n 'get_defi_protocol_skill for full quote → create_swap → build flow',\n 'keyGenId (resolves swapper)',\n ],\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: [\n 'ctm_uniswap_v4_quote output (fullQuoteFromPermit)',\n 'get_defi_protocol_skill for deadline and field alignment',\n ],\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 defineMultisignSubmitMcpTool({\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 'Create and submit mpc-auth multiSignRequest for a Uniswap V4 swap. May batch 1–3 EVM txs: ERC-20 approve(s) + Universal Router swap (or 1 tx for native-in).',\n prerequisites: [\n 'ctm_uniswap_v4_create_swap output + matching quote snapshot and swapDeadlineUnix',\n 'keyGenId + chainId + purposeText',\n ],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'buildEvmMultisignBodyUniswapV4SkipPermit2Batch' },\n inputZod: mcpUniswapV4BuildSwapMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_list_lp_pools',\n actionId: 'uniswap-v4.lp-list-pools',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'List standard Uniswap V4 LP pools for a chain (ETH/USDC and other main pairs at common fee tiers). Returns presetId, token addresses, fee, tickSpacing, and computed poolReference (bytes32 pool id). Use presetId as poolPreset on lp_create_position.',\n prerequisites: ['chainId'],\n followUp: ['ctm_uniswap_v4_lp_create_position'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapV4ListStandardLpPools' },\n inputZod: mcpUniswapV4LpListPoolsInputSchema,\n outputZod: mcpUniswapV4LpListPoolsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_create_position',\n actionId: 'uniswap-v4.lp-create',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Call Uniswap LP API POST /lp/create for a new V4 position. Returns token amounts and `create` transaction calldata. Does NOT create a sign request — call ctm_uniswap_v4_build_mint_liquidity_multisign next. Pass poolPreset from list_lp_pools, or existingPool with poolReference (or fee+tickSpacing to derive pool id).',\n prerequisites: [\n 'UNISWAP_API_KEY',\n 'ctm_uniswap_v4_list_lp_pools for standard pairs',\n 'get_defi_protocol_skill for LP flow',\n ],\n followUp: ['ctm_uniswap_v4_build_mint_liquidity_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpCreatePosition' },\n inputZod: mcpUniswapV4LpCreatePositionInputSchema,\n outputZod: mcpUniswapV4LpCreatePositionOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_mint_liquidity_multisign',\n actionId: 'uniswap-v4.mint-liquidity',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for minting a Uniswap V4 LP position. Batches ERC-20 approve(s) + Position Manager tx from LP create response.',\n prerequisites: ['ctm_uniswap_v4_lp_create_position output', 'keyGenId + chainId + purposeText'],\n followUp: [\n ...MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n 'After broadcast: ctm_uniswap_v4_register_position_from_mint_tx (mint tx hash)',\n ],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4MintLiquidityBatch',\n },\n inputZod: mcpUniswapV4BuildMintLiquidityMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_increase',\n actionId: 'uniswap-v4.lp-increase',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Call Uniswap LP API POST /lp/increase. Returns `increase` transaction calldata.',\n prerequisites: ['UNISWAP_API_KEY', 'nftTokenId from ctm_uniswap_v4_lp_list_positions'],\n followUp: ['ctm_uniswap_v4_build_increase_liquidity_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpIncreasePosition' },\n inputZod: mcpUniswapV4LpIncreaseInputSchema,\n outputZod: mcpUniswapV4LpIncreaseOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_increase_liquidity_multisign',\n actionId: 'uniswap-v4.increase-liquidity',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to increase Uniswap V4 position liquidity.',\n prerequisites: ['ctm_uniswap_v4_lp_increase output'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4IncreaseLiquidityBatch',\n },\n inputZod: mcpUniswapV4BuildIncreaseLiquidityMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_decrease',\n actionId: 'uniswap-v4.lp-decrease',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Call Uniswap LP API POST /lp/decrease. Returns `decrease` transaction calldata.',\n prerequisites: ['UNISWAP_API_KEY', 'nftTokenId'],\n followUp: ['ctm_uniswap_v4_build_decrease_liquidity_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpDecreasePosition' },\n inputZod: mcpUniswapV4LpDecreaseInputSchema,\n outputZod: mcpUniswapV4LpDecreaseOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_decrease_liquidity_multisign',\n actionId: 'uniswap-v4.decrease-liquidity',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to decrease Uniswap V4 position liquidity.',\n prerequisites: ['ctm_uniswap_v4_lp_decrease output'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4DecreaseLiquidityBatch',\n },\n inputZod: mcpUniswapV4BuildDecreaseLiquidityMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_collect',\n actionId: 'uniswap-v4.lp-claim',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Call Uniswap LP API POST /lp/claim to collect accrued fees from a V4 position.',\n prerequisites: ['UNISWAP_API_KEY', 'nftTokenId'],\n followUp: ['ctm_uniswap_v4_build_collect_fees_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpClaimFees' },\n inputZod: mcpUniswapV4LpClaimInputSchema,\n outputZod: mcpUniswapV4LpClaimOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_collect_fees_multisign',\n actionId: 'uniswap-v4.collect-fees',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to collect fees from a Uniswap V4 position.',\n prerequisites: ['ctm_uniswap_v4_lp_collect output'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4CollectFeesBatch',\n },\n inputZod: mcpUniswapV4BuildCollectFeesMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_list_positions',\n actionId: 'uniswap-v4.lp-list-positions',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'List Uniswap V4 position NFTs from the node token registry (ERC721 entries for the Position Manager on this chain). Does not scan blockchain logs. Pass keyGenId + chainId.',\n prerequisites: ['keyGenId + chainId', 'Positions saved via register_position_nft or add_to_token_registry'],\n followUp: ['ctm_uniswap_v4_lp_increase', 'ctm_uniswap_v4_lp_decrease', 'ctm_uniswap_v4_lp_collect'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'uniswapV4ListPositionsRegistryMcpPlaceholder',\n },\n inputZod: mcpUniswapV4LpListPositionsInputSchema,\n outputZod: mcpUniswapV4LpListPositionsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_register_position_nft',\n actionId: 'uniswap-v4.register-position-nft',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Add a Uniswap V4 position NFT to the node token registry (ERC721, management-signed). Call after mint execute when tokenId is known.',\n prerequisites: ['chainId', 'tokenId', 'keyGenId for management signing'],\n followUp: ['ctm_uniswap_v4_lp_list_positions', 'ctm_uniswap_v4_lp_increase'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'uniswapV4RegisterPositionNftPlaceholder',\n },\n inputZod: mcpUniswapV4RegisterPositionNftInputSchema,\n outputZod: mcpUniswapV4RegisterPositionNftOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_register_position_from_mint_tx',\n actionId: 'uniswap-v4.register-position-from-mint-tx',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Parse a completed mint transaction receipt for the new position tokenId and add it to the node token registry (management-signed).',\n prerequisites: ['chainId', 'txHash from mint batch execute', 'keyGenId'],\n followUp: ['ctm_uniswap_v4_lp_list_positions'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'uniswapV4RegisterPositionFromMintTxPlaceholder',\n },\n inputZod: mcpUniswapV4RegisterPositionFromMintTxInputSchema,\n outputZod: mcpUniswapV4RegisterPositionFromMintTxOutputSchema,\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 'get_defi_protocol_skill for native placeholder vs wrapped native on build',\n 'chainId + tokenIn + tokenOut + amountHuman',\n 'rpcGateway 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 defineMultisignSubmitMcpTool({\n name: 'ctm_curve_dao_build_swap_multisign',\n actionId: 'curve-dao.swap',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n 'Create and submit 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.',\n prerequisites: [\n 'ctm_curve_dao_quote (recommended)',\n 'keyGenId + chainId + purposeText + slippagePercent (0–100 exclusive)',\n 'get_defi_protocol_skill for tokenIn address rules',\n ],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'buildEvmMultisignBodyCurveDaoBatch' },\n inputZod: mcpCurveDaoBuildSwapMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_markets',\n actionId: 'gmx.fetch-markets',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'List GMX V2 perp markets for a chain (symbol, market token, maxLeverageLabel). Read-only; uses GMX HTTP API.',\n prerequisites: ['chainId'],\n followUp: ['ctm_gmx_build_increase_multisign', 'ctm_gmx_build_decrease_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchMarketsSummary' },\n inputZod: mcpGmxFetchMarketsInputSchema,\n outputZod: mcpGmxFetchMarketsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_positions',\n actionId: 'gmx.fetch-positions',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Fetch open GMX perp positions for an executor address. Read-only.',\n prerequisites: ['chainId', 'executorAddress (MPC ethereumaddress)'],\n followUp: ['ctm_gmx_build_decrease_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchPositionsForExecutor' },\n inputZod: mcpGmxFetchPositionsInputSchema,\n outputZod: mcpGmxFetchPositionsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_market_prices',\n actionId: 'gmx.fetch-market-prices',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Latest GMX index mark and collateral USD prices for a perp market. Read-only via GMX HTTP API.',\n prerequisites: ['chainId', 'symbol from ctm_gmx_fetch_markets', 'collateralSymbol e.g. USDC'],\n followUp: ['ctm_gmx_fetch_ohlcv', 'ctm_gmx_build_increase_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchMarketPrices' },\n inputZod: mcpGmxFetchMarketPricesInputSchema,\n outputZod: mcpGmxFetchMarketPricesOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_ohlcv',\n actionId: 'gmx.fetch-ohlcv',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'OHLCV candle table for a GMX perp index (USD). Default timeframe 15m. Read-only via GMX HTTP API.',\n prerequisites: ['chainId', 'symbol from ctm_gmx_fetch_markets'],\n followUp: ['ctm_gmx_fetch_market_prices'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchOhlcv' },\n inputZod: mcpGmxFetchOhlcvInputSchema,\n outputZod: mcpGmxFetchOhlcvOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_gm_markets',\n actionId: 'gmx.fetch-gm-markets',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'List GMX GM liquidity pool markets with long/short collateral symbols and estimated APY. Read-only.',\n prerequisites: ['chainId'],\n followUp: ['ctm_gmx_build_gm_deposit_multisign', 'ctm_gmx_build_gm_withdraw_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchGmMarkets' },\n inputZod: mcpGmxFetchGmMarketsInputSchema,\n outputZod: mcpGmxFetchGmMarketsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_gm_apy',\n actionId: 'gmx.fetch-gm-apy',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Fetch estimated GM liquidity pool APY for each GMX market (sorted highest first). Read-only.',\n prerequisites: ['chainId'],\n followUp: ['ctm_gmx_build_gm_deposit_multisign', 'ctm_gmx_fetch_gm_markets'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchGmApy' },\n inputZod: mcpGmxFetchGmApyInputSchema,\n outputZod: mcpGmxFetchGmApyOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_staking_power',\n actionId: 'gmx.fetch-staking-power',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Fetch GMX token staking power for an executor address. Read-only.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_gmx_build_stake_gmx_multisign', 'ctm_gmx_build_unstake_gmx_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchStakingPower' },\n inputZod: mcpGmxFetchStakingPowerInputSchema,\n outputZod: mcpGmxFetchStakingPowerOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_markets',\n actionId: 'hyperliquid.fetch-markets',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'List Hyperliquid perp markets (coin, maxLeverage, szDecimals) and HIP-3 dex names. chainId 999 mainnet or 998 testnet.',\n prerequisites: ['chainId 999 or 998'],\n followUp: ['ctm_hyperliquid_fetch_open_context', 'ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchMarketsSummary' },\n inputZod: mcpHyperliquidFetchMarketsInputSchema,\n outputZod: mcpHyperliquidFetchMarketsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_open_context',\n actionId: 'hyperliquid.fetch-open-context',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Per-market trading context: account value, withdrawable, margin used, leverage setting, mark price, available buy/sell size.',\n prerequisites: ['chainId', 'executorAddress', 'coin from fetch_markets'],\n followUp: ['ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchOpenContextSummary' },\n inputZod: mcpHyperliquidFetchOpenContextInputSchema,\n outputZod: mcpHyperliquidFetchOpenContextOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_positions',\n actionId: 'hyperliquid.fetch-positions',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Open Hyperliquid perp positions for executor (size, entry, uPnL, liq price, leverage, margin).',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_close_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchPositionsForExecutor' },\n inputZod: mcpHyperliquidFetchPositionsInputSchema,\n outputZod: mcpHyperliquidFetchPositionsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_open_orders',\n actionId: 'hyperliquid.fetch-open-orders',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Pending Hyperliquid open orders for executor (oid, coin, side, price, size).',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_cancel_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchOpenOrdersSummary' },\n inputZod: mcpHyperliquidFetchOpenOrdersInputSchema,\n outputZod: mcpHyperliquidFetchOpenOrdersOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_market_snapshot',\n actionId: 'hyperliquid.fetch-market-snapshot',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Mid price and OHLCV candles for a Hyperliquid perp coin. Default interval 15m.',\n prerequisites: ['chainId', 'coin'],\n followUp: ['ctm_hyperliquid_fetch_open_context', 'ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchMarketSnapshotSummary' },\n inputZod: mcpHyperliquidFetchMarketSnapshotInputSchema,\n outputZod: mcpHyperliquidFetchMarketSnapshotOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_usd_class_balances',\n actionId: 'hyperliquid.fetch-usd-balances',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Spot USDC available and perp withdrawable USD for spot↔perp transfers.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_usd_transfer_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchUsdClassBalancesSummary' },\n inputZod: mcpHyperliquidFetchUsdClassBalancesInputSchema,\n outputZod: mcpHyperliquidFetchUsdClassBalancesOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_vaults',\n actionId: 'hyperliquid.fetch-vaults',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Vault catalog by TVL with APR (mainnet only; may take ~10–15s). Pass executorAddress to merge user-held vaults.',\n prerequisites: ['chainId 999 for catalog'],\n followUp: ['ctm_hyperliquid_build_vault_deposit_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchVaultCatalogSummary' },\n inputZod: mcpHyperliquidFetchVaultsInputSchema,\n outputZod: mcpHyperliquidFetchVaultsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_user_vault_equities',\n actionId: 'hyperliquid.fetch-user-vault-equities',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'USD equity the user holds in Hyperliquid vaults.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_vault_withdraw_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchUserVaultEquitiesSummary' },\n inputZod: mcpHyperliquidFetchUserVaultEquitiesInputSchema,\n outputZod: mcpHyperliquidFetchUserVaultEquitiesOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_staking_summary',\n actionId: 'hyperliquid.fetch-staking-summary',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'HYPE staking summary: delegated and undelegated amounts.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_stake_multisign', 'ctm_hyperliquid_build_delegate_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchStakingSummaryForExecutor' },\n inputZod: mcpHyperliquidFetchStakingSummaryInputSchema,\n outputZod: mcpHyperliquidFetchStakingSummaryOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_delegations',\n actionId: 'hyperliquid.fetch-delegations',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'HYPE delegations by validator for executor.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_undelegate_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchDelegationsForExecutor' },\n inputZod: mcpHyperliquidFetchDelegationsInputSchema,\n outputZod: mcpHyperliquidFetchDelegationsOutputSchema,\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 multisignSubmitOutput: MULTISIGN_SUBMIT_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 → { requestId } (MCP auto-submits)',\n '4. wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result',\n ],\n evmSwapManualTypical: [\n '1. Quote (protocol-specific API if needed)',\n '2. Build protocol calldata',\n '3. Protocol builder → { bodyForSign, messageToSign } (node app only)',\n '4. Sign messageToSign and 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","/** GMX V2 production chains supported in Continuum multi-sign v1. */\nexport const GMX_SUPPORTED_CHAIN_IDS = [42161, 43114] as const\n\nexport type GmxSupportedChainId = (typeof GMX_SUPPORTED_CHAIN_IDS)[number]\n\nexport function isGmxChainSupported(chainId: number): chainId is GmxSupportedChainId {\n return (GMX_SUPPORTED_CHAIN_IDS as readonly number[]).includes(chainId)\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { isGmxChainSupported } from './support.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { GmxApiSdk } = require('@gmx-io/sdk/v2') as {\n GmxApiSdk: new (args: { chainId: number; api?: GmxHttpApi }) => GmxApiSdkInstance\n}\n\nconst GMX_HTTP_TIMEOUT_MS = 30_000\n\n/** Prefer .io (primary GMX API); .ai is secondary. Base host only — SDK paths include `/v1/...`. */\nconst GMX_API_BASE_URLS: Record<number, readonly [string, string]> = {\n 42161: ['https://arbitrum.gmxapi.io', 'https://arbitrum.gmxapi.ai'],\n 43114: ['https://avalanche.gmxapi.io', 'https://avalanche.gmxapi.ai'],\n}\n\ntype GmxHttpApi = {\n fetchJson: (path: string, opts?: GmxFetchJsonOpts) => Promise<unknown>\n postJson: (path: string, body: unknown, opts?: GmxPostJsonOpts) => Promise<unknown>\n}\n\ntype GmxFetchJsonOpts = {\n query?: Record<string, unknown>\n transform?: (raw: unknown) => unknown\n}\n\ntype GmxPostJsonOpts = {\n transform?: (raw: unknown) => unknown\n}\n\nfunction buildGmxUrl(baseUrl: string, path: string, query?: Record<string, unknown>): string {\n const base = baseUrl.replace(/\\/$/, '')\n if (!query) return `${base}${path}`\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) params.set(key, String(value))\n }\n const qs = params.toString()\n return qs ? `${base}${path}?${qs}` : `${base}${path}`\n}\n\nfunction bigintReplacer(_key: string, value: unknown) {\n return typeof value === 'bigint' ? value.toString() : value\n}\n\nasync function gmxHttpFetchJson(baseUrl: string, path: string, opts?: GmxFetchJsonOpts): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path, opts?.query)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const body = (await response.json()) as { message?: string }\n if (body?.message) message = `HTTP ${response.status}: ${body.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nasync function gmxHttpPostJson(\n baseUrl: string,\n path: string,\n body: unknown,\n opts?: GmxPostJsonOpts,\n): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify(body, bigintReplacer),\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const errBody = (await response.json()) as { message?: string }\n if (errBody?.message) message = `HTTP ${response.status}: ${errBody.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nfunction createIoFirstGmxHttpApi(chainId: number): GmxHttpApi {\n const urls = GMX_API_BASE_URLS[chainId]\n if (!urls) {\n throw new Error(`GMX API URLs are not configured for chain ${chainId}.`)\n }\n async function withIoFirstFallback<T>(fn: (baseUrl: string) => Promise<T>): Promise<T> {\n let lastError: unknown\n for (const baseUrl of urls) {\n try {\n return await fn(baseUrl)\n } catch (e) {\n lastError = e\n }\n }\n const detail = lastError instanceof Error ? lastError.message : String(lastError)\n throw new Error(\n `GMX API request failed on all endpoints (${urls.join(', ')}). Last error: ${detail}`,\n )\n }\n return {\n fetchJson: (path, opts) => withIoFirstFallback((baseUrl) => gmxHttpFetchJson(baseUrl, path, opts)),\n postJson: (path, body, opts) => withIoFirstFallback((baseUrl) => gmxHttpPostJson(baseUrl, path, body, opts)),\n }\n}\n\nexport type GmxApiSdkInstance = {\n fetchMarkets: () => Promise<GmxMarketRow[]>\n fetchMarketsTickers: (args?: { symbols?: string[] }) => Promise<unknown[]>\n fetchOhlcv: (args: {\n symbol: string\n timeframe: string\n limit?: number\n since?: number\n }) => Promise<Array<{ timestamp: number; open: string; high: string; low: string; close: string }>>\n fetchTokens: () => Promise<GmxTokenRow[]>\n fetchTokensData: () => Promise<unknown[]>\n fetchPositionsInfo: (args: { address: string; includeRelatedOrders?: boolean }) => Promise<GmxPositionRow[]>\n fetchOrders: (args: { address: string }) => Promise<GmxOrderRow[]>\n fetchStakingPower: (args: { address: string }) => Promise<Record<string, unknown>>\n fetchApy: (params?: Record<string, unknown>) => Promise<Record<string, unknown>>\n prepareOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n prepareCancelOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n}\n\nexport type GmxMarketRow = {\n symbol: string\n marketTokenAddress: string\n indexTokenAddress?: string\n longTokenAddress?: string\n shortTokenAddress?: string\n isSpotOnly?: boolean\n isListed?: boolean\n}\n\nexport type GmxTokenRow = {\n symbol: string\n address: string\n decimals: number\n}\n\nexport type GmxPositionRow = {\n key?: string\n indexName?: string\n isLong?: boolean\n sizeInUsd?: bigint | string | number\n collateralUsd?: bigint | string | number\n marketAddress?: string\n}\n\nexport type GmxOrderRow = {\n key?: string\n isLong?: boolean\n sizeDeltaUsd?: bigint | string | number\n triggerPrice?: bigint | string | number\n}\n\nexport type GmxPrepareOrderResponse = {\n requestId?: string\n payloadType: 'transaction' | 'typed-data'\n mode: string\n payload: {\n to?: string\n data?: string\n value?: string | bigint | number\n }\n estimates?: Record<string, unknown>\n}\n\nconst sdkByChain = new Map<number, GmxApiSdkInstance>()\n\nexport function getGmxApiSdk(chainId: number): GmxApiSdkInstance {\n if (!isGmxChainSupported(chainId)) {\n throw new Error(`GMX is not supported on chain ${chainId}. Supported: 42161 (Arbitrum), 43114 (Avalanche).`)\n }\n let sdk = sdkByChain.get(chainId)\n if (!sdk) {\n sdk = new GmxApiSdk({ chainId, api: createIoFirstGmxHttpApi(chainId) })\n sdkByChain.set(chainId, sdk)\n }\n return sdk\n}\n","import { getAddress } from 'viem'\nimport { gmxEnrichGmMarketRowWithApy, type GmxMarketApySource } from './apy.js'\nimport { getGmxApiSdk, type GmxMarketRow, type GmxTokenRow } from './api.js'\n\nexport async function gmxFetchMarkets(chainId: number): Promise<GmxMarketRow[]> {\n const sdk = getGmxApiSdk(chainId)\n const markets = await sdk.fetchMarkets()\n return markets\n .filter((m) => !m.isSpotOnly && m.isListed !== false)\n .sort((a, b) => a.symbol.localeCompare(b.symbol, undefined, { sensitivity: 'base' }))\n}\n\nexport async function gmxFetchTokens(chainId: number): Promise<GmxTokenRow[]> {\n const sdk = getGmxApiSdk(chainId)\n return sdk.fetchTokens()\n}\n\nexport async function gmxResolveTokenBySymbol(chainId: number, symbol: string): Promise<GmxTokenRow> {\n const sym = symbol.trim().toUpperCase()\n const tokens = await gmxFetchTokens(chainId)\n const row = tokens.find((t) => t.symbol?.toUpperCase() === sym)\n if (!row) throw new Error(`GMX token symbol not found on chain ${chainId}: ${symbol}`)\n return row\n}\n\nexport async function gmxIsCollateralTokenSupported(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const addr = getAddress(tokenAddress).toLowerCase()\n const tokens = await gmxFetchTokens(chainId)\n return tokens.some((t) => t.address?.toLowerCase() === addr)\n } catch {\n return false\n }\n}\n\n/** Parse collateral pool tokens from e.g. `ETH/USD [WETH-USDC]` → `WETH`, `USDC`. */\nexport function gmxMarketCollateralTokens(marketSymbol: string): string[] {\n const m = marketSymbol.match(/\\[([^[\\]]+)\\]/)\n if (!m?.[1]) return []\n return m[1].split('-').map((s) => s.trim()).filter(Boolean)\n}\n\nexport function gmxMarketAcceptsCollateral(marketSymbol: string, collateralSymbol: string): boolean {\n const col = collateralSymbol.trim().toUpperCase()\n if (!col) return true\n const tokens = gmxMarketCollateralTokens(marketSymbol)\n if (tokens.length === 0) return true\n return tokens.some((t) => t.toUpperCase() === col)\n}\n\nexport async function gmxMarketsForCollateralSymbol(\n chainId: number,\n collateralSymbol: string,\n): Promise<GmxMarketRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n return markets.filter((m) => gmxMarketAcceptsCollateral(m.symbol, collateralSymbol))\n}\n\nexport async function gmxResolveMarketBySymbol(chainId: number, symbol: string): Promise<GmxMarketRow> {\n const sym = symbol.trim()\n const markets = await gmxFetchMarkets(chainId)\n const row = markets.find((m) => m.symbol === sym)\n if (!row) throw new Error(`GMX market symbol not found on chain ${chainId}: ${symbol}`)\n if (!row.longTokenAddress || !row.shortTokenAddress) {\n throw new Error(`GMX market \"${symbol}\" is missing long/short token addresses.`)\n }\n return row\n}\n\nexport async function gmxResolveMarketByGmTokenAddress(\n chainId: number,\n gmTokenAddress: string,\n): Promise<GmxMarketRow | null> {\n const addr = getAddress(gmTokenAddress).toLowerCase()\n const markets = await gmxFetchMarkets(chainId)\n return markets.find((m) => m.marketTokenAddress?.toLowerCase() === addr) ?? null\n}\n\nexport type GmxGmMarketSummaryRow = {\n symbol: string\n marketTokenAddress: string\n longTokenSymbol: string | null\n shortTokenSymbol: string | null\n apy: number | null\n baseApy: number | null\n bonusApr: number | null\n apyPercentLabel: string | null\n}\n\nexport async function gmxFetchGmMarketsSummary(chainId: number): Promise<GmxGmMarketSummaryRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n const tokens = await gmxFetchTokens(chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t.symbol]))\n const sdk = getGmxApiSdk(chainId)\n const emptyApyMarkets: Record<string, GmxMarketApySource> = {}\n const apyRes = await sdk.fetchApy().catch(() => ({ markets: emptyApyMarkets }))\n const apyByMarket = (apyRes.markets ?? emptyApyMarkets) as Record<string, GmxMarketApySource>\n return markets.map((m) =>\n gmxEnrichGmMarketRowWithApy(\n {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n longTokenSymbol: tokenByAddr.get((m.longTokenAddress ?? '').toLowerCase()) ?? null,\n shortTokenSymbol: tokenByAddr.get((m.shortTokenAddress ?? '').toLowerCase()) ?? null,\n },\n apyByMarket,\n ),\n )\n}\n","import { getAddress } from 'viem'\nimport { getGmxApiSdk } from './api.js'\nimport { gmxFormatPositionsForDisplay } from './positionDisplay.js'\nimport { gmxMarketMaxLeverageLabel } from './leverage.js'\nimport { loadGmxMarketContext } from './marketContext.js'\nimport {\n gmxFetchGmMarketsSummary,\n gmxFetchMarkets,\n gmxFetchTokens,\n gmxResolveMarketByGmTokenAddress,\n} from './markets.js'\nimport { gmxContractAddress } from './contracts.js'\n\nexport async function gmxFetchPositionsForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const positions = await sdk.fetchPositionsInfo({\n address: args.executorAddress,\n includeRelatedOrders: true,\n })\n return {\n positions: positions as Array<Record<string, unknown>>,\n }\n}\n\nexport async function gmxFetchPositionDisplayRows(args: { chainId: number; executorAddress: string }) {\n const { positions } = await gmxFetchPositionsForExecutor(args)\n return gmxFormatPositionsForDisplay(args.chainId, positions)\n}\n\nexport async function gmxFetchOrdersForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n return sdk.fetchOrders({ address: args.executorAddress })\n}\n\nexport async function gmxFetchMarketsSummary(args: { chainId: number }) {\n const [markets, ctx] = await Promise.all([gmxFetchMarkets(args.chainId), loadGmxMarketContext(args.chainId)])\n return {\n markets: markets.map((m) => {\n const addr = String(m.marketTokenAddress ?? '')\n const info =\n ctx.marketsInfoData[addr] ??\n ctx.marketsInfoData[addr.toLowerCase()] ??\n Object.values(ctx.marketsInfoData).find(\n (row) => String(row.marketTokenAddress ?? '').toLowerCase() === addr.toLowerCase(),\n )\n return {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n maxLeverageLabel: info ? gmxMarketMaxLeverageLabel(info) : null,\n }\n }),\n }\n}\n\nexport async function gmxFetchCollateralTokens(args: { chainId: number }) {\n const tokens = await gmxFetchTokens(args.chainId)\n return tokens.map((t) => ({\n symbol: t.symbol,\n address: t.address,\n decimals: t.decimals,\n }))\n}\n\nexport async function gmxFetchGmMarkets(args: { chainId: number }) {\n const markets = await gmxFetchGmMarketsSummary(args.chainId)\n return { markets }\n}\n\n/** GM liquidity pool APY per market (sorted highest APY first). Read-only. */\nexport async function gmxFetchGmApy(args: { chainId: number }) {\n const { markets } = await gmxFetchGmMarkets(args)\n const sorted = [...markets].sort((a, b) => (b.apy ?? 0) - (a.apy ?? 0))\n return { markets: sorted }\n}\n\nexport async function gmxFetchStakingPower(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const power = await sdk.fetchStakingPower({ address: args.executorAddress })\n return {\n stakingPower: JSON.parse(JSON.stringify(power, (_, v) => (typeof v === 'bigint' ? v.toString() : v))),\n }\n}\n\nexport async function gmxFetchGmMarketForToken(args: { chainId: number; gmTokenAddress: string }) {\n const market = await gmxResolveMarketByGmTokenAddress(args.chainId, args.gmTokenAddress)\n if (!market) return { market: null }\n const tokens = await gmxFetchTokens(args.chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t]))\n const long = tokenByAddr.get((market.longTokenAddress ?? '').toLowerCase())\n const short = tokenByAddr.get((market.shortTokenAddress ?? '').toLowerCase())\n return {\n market: {\n symbol: market.symbol,\n marketTokenAddress: market.marketTokenAddress,\n longTokenSymbol: long?.symbol ?? null,\n shortTokenSymbol: short?.symbol ?? null,\n gmDecimals: 18,\n },\n }\n}\n\nexport function gmxGmxTokenAddress(chainId: number): string {\n return gmxContractAddress(chainId, 'GMX')\n}\n\nexport async function gmxIsGmMarketTokenAddress(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const market = await gmxResolveMarketByGmTokenAddress(chainId, tokenAddress)\n return market != null\n } catch {\n return false\n }\n}\n\nexport function gmxIsGmxStakeTokenAddress(chainId: number, tokenAddress: string): boolean {\n try {\n return getAddress(tokenAddress).toLowerCase() === gmxGmxTokenAddress(chainId).toLowerCase()\n } catch {\n return false\n }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isGmxChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './api.js'\nexport * from './amounts.js'\nexport * from './apy.js'\nexport * from './markets.js'\nexport * from './reads.js'\nexport * from './multisign.js'\nexport * from './gmLiquidityMultisign.js'\nexport * from './gmxTokenStakingMultisign.js'\nexport * from './contracts.js'\nexport * from './executionFee.js'\nexport * from './gmLiquidityReads.js'\nexport * from './format.js'\nexport * from './estimates.js'\nexport * from './leverage.js'\nexport * from './positionDisplay.js'\nexport * from './prices.js'\nexport * from './native.js'\n\nexport const GMX_PROTOCOL_ID = 'gmx'\n\nexport const gmxProtocolModule: ProtocolModule = {\n id: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const chainId = typeof ctx.chainId === 'number' ? ctx.chainId : Number(ctx.chainId)\n return Number.isFinite(chainId) && isGmxChainSupported(chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'erc20'\n },\n actions: [\n {\n id: 'gmx.increase',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Open or add to a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol e.g. ETH/USD [WETH-USDC]' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Position size in USD' },\n collateralToken: { type: 'string', required: true, description: 'Collateral token symbol e.g. USDC' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Collateral amount in token units' },\n },\n },\n {\n id: 'gmx.decrease',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Close or reduce a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Size to close in USD' },\n collateralToken: { type: 'string', required: true, description: 'Position collateral token symbol' },\n },\n },\n {\n id: 'gmx.cancel',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Cancel a pending GMX order (classic on-chain)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n orderId: { type: 'string', required: true, description: 'Order key from fetchOrders' },\n },\n },\n {\n id: 'gmx.gmDeposit',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Deposit collateral into a GMX GM liquidity pool (ExchangeRouter multicall)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol e.g. ETH/USD [WETH-USDC]' },\n collateralToken: { type: 'string', required: true, description: 'Pool collateral token symbol' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Amount in token units' },\n },\n },\n {\n id: 'gmx.gmWithdraw',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Withdraw GM market tokens from a GMX liquidity pool',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol' },\n gmAmountHuman: { type: 'string', required: true, description: 'GM token amount to withdraw' },\n },\n },\n {\n id: 'gmx.stakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Stake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to stake' },\n },\n },\n {\n id: 'gmx.unstakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Unstake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to unstake' },\n },\n },\n ],\n}\n\nregisterProtocolModule(gmxProtocolModule)\n","/** HyperEVM chains for Hyperliquid CoreWriter integration. */\nexport const HYPERLIQUID_SUPPORTED_CHAIN_IDS = [999, 998] as const\n\nexport type HyperliquidSupportedChainId = (typeof HYPERLIQUID_SUPPORTED_CHAIN_IDS)[number]\n\nexport function isHyperliquidChainSupported(chainId: number): chainId is HyperliquidSupportedChainId {\n return (HYPERLIQUID_SUPPORTED_CHAIN_IDS as readonly number[]).includes(chainId)\n}\n\nexport function hyperliquidApiBaseUrl(chainId: number): string {\n return chainId === 998 ? 'https://api.hyperliquid-testnet.xyz' : 'https://api.hyperliquid.xyz'\n}\n\n/** Stats feed used by app.hyperliquid.xyz/vaults (official vaultSummaries returns []). */\nexport function hyperliquidVaultStatsUrl(chainId: number): string | null {\n return chainId === 998 ? null : 'https://stats-data.hyperliquid.xyz/Mainnet/vaults'\n}\n\nexport const HYPERLIQUID_HLP_VAULT_ADDRESS = '0xdfc24b077bc1425ad1dea75bcb6f8158e10df303'\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isHyperliquidChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './constants.js'\nexport * from './api.js'\nexport * from './assets.js'\nexport * from './reads.js'\nexport * from './coreWriter.js'\nexport * from './multisign.js'\nexport * from './vaultMultisign.js'\nexport * from './stakingMultisign.js'\n\nexport const HYPERLIQUID_PROTOCOL_ID = 'hyperliquid'\n\nexport const hyperliquidProtocolModule: ProtocolModule = {\n id: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const chainId = typeof ctx.chainId === 'number' ? ctx.chainId : Number(ctx.chainId)\n return Number.isFinite(chainId) && isHyperliquidChainSupported(chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'erc20' || token.kind === 'native'\n },\n actions: [\n {\n id: 'hyperliquid.limitOrder',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Place a Hyperliquid limit/IoC order via HyperEVM CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n coin: { type: 'string', required: true, description: 'Market coin e.g. BTC' },\n isBuy: { type: 'boolean', required: true, description: 'true for buy/long, false for sell/short' },\n limitPxHuman: { type: 'string', required: true, description: 'Limit price' },\n szHuman: { type: 'string', required: true, description: 'Order size in coin units' },\n marketKind: { type: 'string', required: false, description: 'perp (default) or spot' },\n tif: { type: 'string', required: false, description: 'gtc, ioc, or alo' },\n dex: { type: 'string', required: false, description: 'HIP-3 dex name when applicable' },\n },\n },\n {\n id: 'hyperliquid.close',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Close or reduce a perp via IoC reduce-only limit order (CoreWriter)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n coin: { type: 'string', required: true, description: 'Market coin' },\n isLong: { type: 'boolean', required: true, description: 'true if closing a long position' },\n limitPxHuman: { type: 'string', required: true, description: 'Limit price' },\n szHuman: { type: 'string', required: true, description: 'Size to close in coin units' },\n },\n },\n {\n id: 'hyperliquid.cancel',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Cancel a Hyperliquid open order via CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n coin: { type: 'string', required: true, description: 'Market coin' },\n oid: { type: 'number', required: true, description: 'Order id from openOrders' },\n },\n },\n {\n id: 'hyperliquid.usdTransfer',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Move USDC between Hyperliquid spot and perp margin accounts',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n usdHuman: { type: 'string', required: true, description: 'USD amount' },\n toPerp: { type: 'boolean', required: true, description: 'true spot→perp, false perp→spot' },\n },\n },\n {\n id: 'hyperliquid.vaultDeposit',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Deposit USD into a Hyperliquid vault',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n vaultAddress: { type: 'string', required: true, description: 'Vault address' },\n usdHuman: { type: 'string', required: true, description: 'USD amount' },\n },\n },\n {\n id: 'hyperliquid.vaultWithdraw',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Withdraw USD from a Hyperliquid vault (includes accrued PnL)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n vaultAddress: { type: 'string', required: true, description: 'Vault address' },\n usdHuman: { type: 'string', required: true, description: 'USD amount' },\n },\n },\n {\n id: 'hyperliquid.stake',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Stake HYPE via CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n },\n },\n {\n id: 'hyperliquid.unstake',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Unstake HYPE via CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n },\n },\n {\n id: 'hyperliquid.delegate',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Delegate staked HYPE to a validator',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n validator: { type: 'string', required: true, description: 'Validator address' },\n },\n },\n {\n id: 'hyperliquid.undelegate',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Undelegate HYPE from a validator',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n validator: { type: 'string', required: true, description: 'Validator address' },\n },\n },\n ],\n}\n\nregisterProtocolModule(hyperliquidProtocolModule)\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 'gmx',\n 'hyperliquid',\n] as const\n\nexport function getToolsForProtocol(protocolId: string): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS.filter((t) => t.protocolId === protocolId)\n}\n\nfunction readSharedMultisignMcpGasSection(): string {\n try {\n return readFileSync(join(skillsDir, '_shared', 'multisign-mcp-gas.md'), 'utf8').trim()\n } catch {\n return ''\n }\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 const skill = readFileSync(join(skillsDir, protocolId, 'SKILL.md'), 'utf8').trim()\n const shared = readSharedMultisignMcpGasSection()\n if (!shared) return skill\n if (skill.includes('## Gas and MCP submit')) return skill\n return `${skill}\\n\\n${shared}\\n`\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 { GMX_PROTOCOL_ID } from '../../protocols/evm/gmx/index.js'\nimport { gmxFetchCollateralTokens } from '../../protocols/evm/gmx/reads.js'\nimport { isGmxChainSupported } from '../../protocols/evm/gmx/support.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 [GMX_PROTOCOL_ID]: advisor(GMX_PROTOCOL_ID, 'api_underlyings', {\n async supportedChainIds() {\n return [42161, 43114]\n },\n async supportedTokens(chainId) {\n if (!isGmxChainSupported(chainId)) {\n return { tokens: [], notes: 'GMX v1 supports Arbitrum (42161) and Avalanche (43114).' }\n }\n const tokens = await gmxFetchCollateralTokens({ chainId })\n return {\n tokens: tokens.map((t) => ({\n address: t.address,\n symbol: t.symbol,\n roles: ['collateral'],\n })),\n notes: 'Collateral ERC-20 tokens from GMX API. Perp markets listed via fetch_markets.',\n }\n },\n async isTokenSupported(chainId, address) {\n if (!isGmxChainSupported(chainId)) return false\n const tokens = await gmxFetchCollateralTokens({ chainId })\n try {\n const normalized = getAddress(address).toLowerCase()\n return tokens.some((t) => t.address.toLowerCase() === normalized)\n } catch {\n return false\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 { 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'\nimport { gmxProtocolModule } from '../protocols/evm/gmx/index.js'\nimport { hyperliquidProtocolModule } from '../protocols/evm/hyperliquid/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 {\n EVM_COMMON_PARAM_DOCS,\n MULTISIGN_OUTPUT_DOC,\n MULTISIGN_SUBMIT_OUTPUT_DOC,\n MANAGEMENT_SIG_DOC,\n} from './commonParamDocs.js'\nexport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nexport * from './schemas/index.js'\nexport { parseMultisignBuilderOutput } from './schemas/common.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\nregisterProtocolModule(lidoProtocolModule)\nregisterProtocolModule(ethenaProtocolModule)\nregisterProtocolModule(mapleProtocolModule)\nregisterProtocolModule(skyProtocolModule)\nregisterProtocolModule(aaveV4ProtocolModule)\nregisterProtocolModule(eulerV2ProtocolModule)\nregisterProtocolModule(gmxProtocolModule)\nregisterProtocolModule(hyperliquidProtocolModule)\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 gmx: gmxProtocolModule,\n hyperliquid: hyperliquidProtocolModule,\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/mcpMultisignSubmitMeta.ts","../../src/agent/zodToMcpJsonSchema.ts","../../src/agent/schemas/common.ts","../../src/agent/schemas/uniswapV4.ts","../../src/agent/schemas/curveDao.ts","../../src/agent/mcpServerSchemas.ts","../../src/agent/schemas/protocols.ts","../../src/agent/schemas/morpho.ts","../../src/agent/schemas/gmx.ts","../../src/agent/schemas/hyperliquid.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/protocols/evm/gmx/support.ts","../../src/protocols/evm/gmx/api.ts","../../src/protocols/evm/gmx/markets.ts","../../src/protocols/evm/gmx/reads.ts","../../src/protocols/evm/gmx/index.ts","../../src/protocols/evm/hyperliquid/support.ts","../../src/protocols/evm/hyperliquid/index.ts","../../src/protocols/evm/morpho/api.ts","../../src/protocols/evm/morpho/vaultMarkets.ts","../../src/protocols/evm/morpho/index.ts","../../src/agent/skills.ts","../../src/agent/support/advisors.ts","../../src/agent/catalog.ts"],"names":["session","zodToJsonSchema","z","getAddress","r","isAddress","require","createRequire","fileURLToPath","join","dirname","readFileSync"],"mappings":"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","file":"catalog.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { getAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Canonical Uniswap token-allowance contract on most EVM chains. */\nexport const PERMIT2_ADDRESS: Address = '0x000000000022D473030F116dDEE9F6B43aC78BA3'\n\nconst UNIVERSAL_ROUTER_SPENDER: Partial<Record<number, string>> = {\n 1: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n 5: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 11155111: '0x3a9d48ab9751398bbfa63ad67599bb04e4bdf98b',\n 137: '0x1095692a6237d83c6a72f3f5efedb9a670c49223',\n 80001: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 10: '0x851116d9223fabed8e56c0e6b8ad0c31d98b3507',\n 420: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42161: '0xa51afafe0263b40edaef0df8781ea9aa03e381a3',\n 421613: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 42220: '0xcb695bc5D3Aa22cAD1E6DF07801b061a05A0233A',\n 44787: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',\n 56: '0x1906c1d672b88cd1b9ac7593301ca990f94eae07',\n 43114: '0x94b75331ae8d42c1b61065089b7d48fe14aa73b7',\n 84531: '0xd0872d928672ae2ff74bdb2f5130ac12229cafaf',\n 8453: '0x6fF5693b99212da76ad316178a184ab56d299b43',\n 81457: '0xeabbcb3e8e415306207ef514f660a3f820025be3',\n 7777777: '0x3315ef7ca28db74abadc6c44570efdf06b04b020',\n 324: '0x28731BCC616B5f51dD52CF2e4dF0E78dD1136C06',\n 480: '0x8ac7bee993bb44dab564ea4bc9ea67bf9eb5e743',\n 1301: '0xf70536b3bcc1bd1a972dc186a2cf84cc6da6be5d',\n 130: '0xef740bf23acae26f6492b10de645d6b98dc8eaf3',\n 10143: '0x3ae6d8a282d67893e17aa70ebffb33ee5aa65893',\n 84532: '0x492e6456d9528771018deb9e87ef7750ef184104',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 143: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n 4217: '0x1febb76be10aaf3a1402f04e8e835f2c382f7914',\n 196: '0x5507749f2c558bb3e162c6e90c314c092e7372ff',\n}\n\nexport function isUniswapV4ChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n if (chainId == null) return false\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n const a = UNIVERSAL_ROUTER_SPENDER[n]\n return typeof a === 'string' && a.startsWith('0x')\n}\n\nexport function getUniswapUniversalRouterSpenderOrThrow(chainId: number): Address {\n const raw = UNIVERSAL_ROUTER_SPENDER[chainId]\n if (!raw || !raw.startsWith('0x')) {\n throw new Error(\n `No Uniswap Universal Router (spender) is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or use a chain supported by the Uniswap SDK.`,\n )\n }\n return getAddress(raw)\n}\n\nexport const MAX_UINT160 = (1n << 160n) - 1n\nexport const MAX_UINT48 = (1n << 48n) - 1n\n\nexport const UNISWAP_UNIVERSAL_ROUTER_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_TRADE_BASE_DEFAULT = 'https://trade-api.gateway.uniswap.org/v1'\n/** Alternate LP API host (integration guide); trade-api `/v1/lp/*` is primary. */\nexport const UNISWAP_LP_API_BASE_DEFAULT = 'https://api.uniswap.org'\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\nexport const UNISWAP_LP_DEFAULT_EXPIRY_MINUTES = 30\nexport const UNISWAP_LP_DEFAULT_DEADLINE_SEC_OFFSET = UNISWAP_LP_DEFAULT_EXPIRY_MINUTES * 60\nexport const UNISWAP_LP_DEFAULT_SLIPPAGE_PERCENT = 0.5\n\n/** Position Manager (v4 periphery) per chain — for NFT position reads. */\nconst POSITION_MANAGER_BY_CHAIN: Partial<Record<number, string>> = {\n 1: '0xbd216513d74c8cf14cf4747e6aaa6420ff64ee9e',\n 10: '0x3c3ea4b57a46241e54610e5f022e5c45859a1017',\n 137: '0x1ec2ebf4f37e7363fdfe3551602425af0b3ceef9',\n 42161: '0xd88f38f930b7952f2db2432cb002e7abbf3dd869',\n 8453: '0x7C5f5A4bBd8fD63184577525326123B519429bDc',\n 11155111: '0x4B2C77d209D3405F41a037Ec6c77F7F5b8e2ca80',\n 130: '0x0d97dc33264bfc1c226207428a79b26757fb9dc3',\n 1868: '0x0e2850543f69f678257266e0907ff9a58b3f13de',\n 59144: '0x661e93cca42afacb172121ef892830ca3b70f08d',\n}\n\nexport function getUniswapV4PositionManagerOrThrow(chainId: number): Address {\n const raw = POSITION_MANAGER_BY_CHAIN[chainId]\n if (!raw || !raw.startsWith('0x') || raw.length !== 42) {\n throw new Error(\n `No Uniswap V4 PositionManager is configured for chainId ${chainId}. Add this chain to uniswap-v4/constants or pass position manager from LP API response.`,\n )\n }\n return getAddress(raw)\n}\n\nexport function tryGetUniswapV4PositionManager(chainId: number): Address | null {\n try {\n return getUniswapV4PositionManagerOrThrow(chainId)\n } catch {\n return null\n }\n}\n\n/**\n * First block where the Position Manager existed (for narrowing `eth_getLogs` scans).\n * Source: https://docs.uniswap.org/contracts/v4/deployments\n */\nconst POSITION_MANAGER_DEPLOY_BLOCK_BY_CHAIN: Partial<Record<number, bigint>> = {\n /** Ethereum mainnet — Uniswap v4 launch (Jan 2025). */\n 1: 22_938_741n,\n}\n\n/** Default `eth_getLogs` span — many free RPCs cap at 250 blocks (e.g. Nodies). */\nexport const UNISWAP_V4_LP_LOG_CHUNK_SIZE_DEFAULT = 200n\nexport const UNISWAP_V4_LP_LOG_CHUNK_SIZE_MIN = 10n\n\nexport function getUniswapV4PositionManagerDeployBlock(chainId: number): bigint | undefined {\n return POSITION_MANAGER_DEPLOY_BLOCK_BY_CHAIN[chainId]\n}\n\nexport const UNISWAP_V4_LP_MINT_DEFAULT_GAS_UNITS = 1_800_000n\nexport const UNISWAP_V4_LP_INCREASE_DEFAULT_GAS_UNITS = 1_500_000n\nexport const UNISWAP_V4_LP_DECREASE_DEFAULT_GAS_UNITS = 1_200_000n\nexport const UNISWAP_V4_LP_COLLECT_DEFAULT_GAS_UNITS = 900_000n\nexport const UNISWAP_V4_LP_ERC20_APPROVE_FALLBACK = 100_000n\nexport const UNISWAP_V4_LP_WETH_DEPOSIT_FALLBACK = 120_000n\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 './liquidityApi.js'\nexport * from './liquidityQuote.js'\nexport * from './liquidityMultisign.js'\nexport * from './positions.js'\nexport * from './poolId.js'\nexport * from './knownLpPools.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 { isUniswapV4LiquidityEvmSignRequest } from './liquidityMultisign.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 id: 'uniswap-v4.mint-liquidity',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Mint a new Uniswap V4 concentrated liquidity position (Position Manager NFT)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n lpResponse: { type: 'object', required: true, description: 'Full LP API create response' },\n nativeWrapped: { type: 'address', required: false, description: 'WETH when pool uses native ETH' },\n poolReference: { type: 'string', required: false, description: 'V4 pool id' },\n uniswapApiKey: { type: 'string', required: true, description: 'Uniswap API key' },\n },\n },\n {\n id: 'uniswap-v4.increase-liquidity',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Increase liquidity on an existing Uniswap V4 position NFT',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n nftTokenId: { type: 'string', required: true, description: 'Position NFT token id' },\n lpResponse: { type: 'object', required: true, description: 'Full LP API increase response' },\n },\n },\n {\n id: 'uniswap-v4.decrease-liquidity',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Decrease liquidity on an existing Uniswap V4 position NFT',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n nftTokenId: { type: 'string', required: true, description: 'Position NFT token id' },\n lpResponse: { type: 'object', required: true, description: 'Full LP API decrease response' },\n },\n },\n {\n id: 'uniswap-v4.collect-fees',\n protocolId: UNISWAP_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Collect accrued fees from a Uniswap V4 position NFT',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n nftTokenId: { type: 'string', required: true, description: 'Position NFT token id' },\n lpResponse: { type: 'object', required: true, description: 'Full LP API claim response' },\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'\nimport {\n uniswapLpClaimFees,\n uniswapLpCreatePosition,\n uniswapLpDecreasePosition,\n uniswapLpIncreasePosition,\n} from './liquidityApi.js'\nimport {\n buildEvmMultisignBodyUniswapV4CollectFeesBatch,\n buildEvmMultisignBodyUniswapV4DecreaseLiquidityBatch,\n buildEvmMultisignBodyUniswapV4IncreaseLiquidityBatch,\n buildEvmMultisignBodyUniswapV4MintLiquidityBatch,\n} from './liquidityMultisign.js'\nimport { listUniswapV4PositionsForWallet } from './positions.js'\n\nexport const uniswapV4 = {\n quoteSwap,\n createSwap,\n swapExactInput: swapExactInputFn,\n swapFromQuote,\n buildSwapMultisignBody: buildEvmMultisignBodyUniswapV4SkipPermit2Batch,\n quote: uniswapTradeQuote,\n createLiquidityPosition: uniswapLpCreatePosition,\n increaseLiquidityPosition: uniswapLpIncreasePosition,\n decreaseLiquidityPosition: uniswapLpDecreasePosition,\n claimLiquidityFees: uniswapLpClaimFees,\n buildMintLiquidityMultisignBody: buildEvmMultisignBodyUniswapV4MintLiquidityBatch,\n buildIncreaseLiquidityMultisignBody: buildEvmMultisignBodyUniswapV4IncreaseLiquidityBatch,\n buildDecreaseLiquidityMultisignBody: buildEvmMultisignBodyUniswapV4DecreaseLiquidityBatch,\n buildCollectFeesMultisignBody: buildEvmMultisignBodyUniswapV4CollectFeesBatch,\n listPositions: listUniswapV4PositionsForWallet,\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 if (!session) {\n throw new Error('Failed to load Curve session for this RPC.')\n }\n const adjMap = session.adj\n if (!adjMap) {\n throw new Error('Curve session has no pool graph for this RPC.')\n }\n const adj: Record<string, string[]> = {}\n for (const [key, neighbors] of adjMap) {\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 Custom Gas Config from chainDetail / customGasChainDetails. Omitted baseFee/priorityFee is valid — live RPC fees are used at proposal; configured values are optional floors/multipliers. When false, use live 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\n/** MCP agent path: build_* tools auto-submit and return requestId. */\nexport const MULTISIGN_SUBMIT_OUTPUT_DOC = {\n description:\n 'Submitted mpc-auth multiSignRequest id. continuum-mcp-server builds, signs the management envelope, and POSTs /multiSignRequest. Continue with wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result. Do not call the same build tool again if requestId was returned.',\n fields: {\n requestId: {\n type: 'string',\n description: 'Sign request id from POST /multiSignRequest.',\n },\n },\n} as const\n\n/** Legacy unsigned builder output (node app / manual sign path — not MCP tool return value). */\nexport const MULTISIGN_OUTPUT_DOC = {\n description:\n 'Unsigned mpc-auth multiSignRequest payload from protocol builders. MCP agents receive { requestId } instead; node-app callers sign messageToSign and POST { ...bodyForSign, clientSig, signedMessage }.',\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","/** Shared MCP metadata for tools that build and auto-submit multiSignRequest. */\nexport const MCP_MULTISIGN_SUBMIT_DESCRIPTION_SUFFIX =\n 'Builds the unsigned batch, signs the management envelope, and POSTs /multiSignRequest. Returns { requestId } on success — do not call again; use list_sign_requests to verify duplicates.'\n\nexport const MCP_MULTISIGN_SUBMIT_FOLLOW_UP = [\n 'wait_for_sign_request_ready',\n 'sign_request_agree',\n 'trigger_sign_result',\n 'broadcast_sign_result',\n] as const\n\nexport function withMultisignSubmitMcpMeta(\n description: string,\n followUp: readonly string[] = MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n): { description: string; followUp: string[] } {\n return {\n description: `${description.trim()} ${MCP_MULTISIGN_SUBMIT_DESCRIPTION_SUFFIX}`,\n followUp: [...followUp],\n }\n}\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 Custom Gas Config from chainDetail / customGasChainDetails. Omitted baseFee/priorityFee is valid — builder uses live RPC fees; configured values are optional floors/multipliers. When false, use live 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/** Internal builder output before MCP management submit (not the MCP tool return value). */\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 from protocol builders (used internally before management submit).',\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\n/** Parse protocol builder output before signAndSubmitMultiSignRequest. */\nexport function parseMultisignBuilderOutput(data: unknown): MultisignOutput {\n return multisignOutputSchema.parse(data)\n}\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\nconst lpExistingPoolSchema = z.object({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n poolReference: z.string().min(1).describe('V4 pool id (bytes32 hex)'),\n})\n\nconst lpNewPoolSchema = z.object({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n fee: z.number().int().nonnegative(),\n tickSpacing: z.number().int().positive(),\n hooks: evmAddressSchema.optional(),\n initialPrice: z.string().min(1).describe('sqrtRatioX96 string for new pool'),\n})\n\nconst lpIndependentTokenSchema = z.object({\n tokenAddress: evmAddressSchema.describe('0x0 for native ETH'),\n amount: z.string().min(1).describe('Amount in token base units (wei)'),\n})\n\nconst lpPriceBoundsSchema = z.object({\n minPrice: z.string().min(1),\n maxPrice: z.string().min(1),\n})\n\nconst lpTickBoundsSchema = z.object({\n tickLower: z.number().int(),\n tickUpper: z.number().int(),\n})\n\nconst lpCommonApiInputSchema = z.object({\n uniswapApiKey: z.string().min(1),\n walletAddress: evmAddressSchema.optional(),\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n slippageTolerance: z.number().optional(),\n simulateTransaction: z.boolean().optional(),\n baseUrl: z.string().optional(),\n keyGen: z.string().optional(),\n managementNodeUrl: z.string().optional(),\n})\n\n/** MCP: POST /lp/create — poolPreset is resolved by the MCP adapter before validation. */\nexport const mcpUniswapV4LpCreatePositionInputSchema = lpCommonApiInputSchema.extend({\n existingPool: lpExistingPoolSchema.optional(),\n newPool: lpNewPoolSchema.optional(),\n independentToken: lpIndependentTokenSchema,\n priceBounds: lpPriceBoundsSchema.optional(),\n tickBounds: lpTickBoundsSchema.optional(),\n})\n\n/** MCP: list curated standard V4 LP pools (poolReference computed from pool key). */\nexport const mcpUniswapV4LpListPoolsInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n pair: z\n .string()\n .optional()\n .describe('Optional filter, e.g. eth-usdc or ETH/USDC'),\n})\n\nexport const mcpUniswapV4LpListPoolsOutputSchema = z.object({\n chainId: z.number().int().positive(),\n chainLabel: z.string(),\n pools: z.array(\n z.object({\n presetId: z.string(),\n pairSlug: z.string(),\n pairLabel: z.string(),\n fee: z.number().int(),\n feeLabel: z.string(),\n tickSpacing: z.number().int(),\n token0Symbol: z.string(),\n token1Symbol: z.string(),\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n poolReference: z.string(),\n hooks: evmAddressSchema,\n nativeWrapped: evmAddressSchema.optional(),\n usesNativeEth: z.boolean(),\n }),\n ),\n notes: z.string(),\n})\n\nexport const mcpUniswapV4LpCreatePositionOutputSchema = jsonObjectSchema\n\n/** MCP: POST /lp/increase */\nexport const mcpUniswapV4LpIncreaseInputSchema = lpCommonApiInputSchema.extend({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n independentToken: lpIndependentTokenSchema,\n})\n\nexport const mcpUniswapV4LpIncreaseOutputSchema = jsonObjectSchema\n\n/** MCP: POST /lp/decrease */\nexport const mcpUniswapV4LpDecreaseInputSchema = lpCommonApiInputSchema.extend({\n token0Address: evmAddressSchema,\n token1Address: evmAddressSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n liquidityPercentageToDecrease: z.number().int().min(1).max(100),\n})\n\nexport const mcpUniswapV4LpDecreaseOutputSchema = jsonObjectSchema\n\n/** MCP: POST /lp/claim */\nexport const mcpUniswapV4LpClaimInputSchema = lpCommonApiInputSchema.extend({\n tokenId: z.union([z.string(), z.number()]),\n})\n\nexport const mcpUniswapV4LpClaimOutputSchema = jsonObjectSchema\n\n/** MCP: list position NFTs from node token registry (no RPC log scan). */\nexport const mcpUniswapV4LpListPositionsInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n keyGenId: z.string().min(1).optional(),\n walletAddress: evmAddressSchema.optional(),\n positionManagerAddress: evmAddressSchema.optional(),\n})\n\nexport const mcpUniswapV4LpListPositionsOutputSchema = z.object({\n source: z.literal('token_registry'),\n positions: z.array(\n z.object({\n tokenId: z.string(),\n positionManager: evmAddressSchema,\n owner: evmAddressSchema,\n name: z.string().optional(),\n symbol: z.string().optional(),\n }),\n ),\n})\n\n/** MCP: save a minted position NFT in the node token registry (management-signed). */\nexport const mcpUniswapV4RegisterPositionNftInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n tokenId: z.union([z.string(), z.number()]),\n keyGenId: z.string().min(1).optional(),\n positionManagerAddress: evmAddressSchema.optional(),\n name: z.string().optional(),\n symbol: z.string().optional(),\n tokenURI: z.string().optional(),\n})\n\nexport const mcpUniswapV4RegisterPositionNftOutputSchema = z.object({\n message: z.string(),\n tokenId: z.string(),\n positionManager: evmAddressSchema,\n})\n\n/** MCP: parse mint tx receipt and register position NFT (management-signed). */\nexport const mcpUniswapV4RegisterPositionFromMintTxInputSchema = z.object({\n chainId: z.union([z.number().int().positive(), z.string().min(1)]),\n txHash: z.string().min(1),\n keyGenId: z.string().min(1).optional(),\n walletAddress: evmAddressSchema.optional(),\n rpcUrl: z.string().optional(),\n positionManagerAddress: evmAddressSchema.optional(),\n})\n\nexport const mcpUniswapV4RegisterPositionFromMintTxOutputSchema = z.object({\n message: z.string(),\n tokenId: z.string(),\n positionManager: evmAddressSchema,\n registered: z.boolean(),\n})\n\nconst lpBuildCommonSchema = {\n lpResponse: jsonObjectSchema.describe('Full LP API response (create/increase/decrease/claim)'),\n nativeWrapped: evmAddressSchema.optional(),\n poolReference: z.string().optional(),\n}\n\nexport const mcpUniswapV4BuildMintLiquidityMultisignInputSchema = evmMultisignCommonInputSchema.extend(\n lpBuildCommonSchema,\n)\n\nexport const mcpUniswapV4BuildIncreaseLiquidityMultisignInputSchema =\n evmMultisignCommonInputSchema.extend({\n ...lpBuildCommonSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n })\n\nexport const mcpUniswapV4BuildDecreaseLiquidityMultisignInputSchema =\n evmMultisignCommonInputSchema.extend({\n ...lpBuildCommonSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n })\n\nexport const mcpUniswapV4BuildCollectFeesMultisignInputSchema = evmMultisignCommonInputSchema.extend({\n ...lpBuildCommonSchema,\n nftTokenId: z.union([z.string(), z.number()]),\n})\n\nexport type McpUniswapV4LpCreatePositionInput = z.infer<typeof mcpUniswapV4LpCreatePositionInputSchema>\nexport type McpUniswapV4BuildMintLiquidityMultisignInput = z.infer<\n typeof mcpUniswapV4BuildMintLiquidityMultisignInputSchema\n>\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'\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\n .string()\n .min(1)\n .describe('Sign request id from POST /multiSignRequest — success; do not retry the same build tool.'),\n })\n .describe(\n 'Submitted mpc-auth multiSignRequest. Continue with wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result.',\n )\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 { 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 }\nexport { mcpServerSubmitOutputSchema as mcpMultisignSubmitOutputSchema } from '../mcpServerSchemas.js'\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 ——\nconst mcpAaveV4MarketIdSchema = z\n .string()\n .min(1)\n .optional()\n .describe('UI market segment: main (Plus), core, or bluechip (Prime). Default main.')\n\nconst mcpAaveV4HealthPreviewSchema = {\n skipHealthPreview: z\n .boolean()\n .optional()\n .describe('Skip Aave v4 health-factor preview before withdraw/borrow/repay (not recommended).'),\n acknowledgeHealthRisk: z\n .boolean()\n .optional()\n .describe(\n 'Required true when preview returns a confirm-level health risk (withdraw/borrow/repay).',\n ),\n}\n\nexport const mcpAaveV4DepositInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema\n .optional()\n .describe('Omit — continuum-mcp-server resolves spoke from Aave v4 API.'),\n underlying: evmAddressSchema.describe(\n 'Asset to supply. Native ETH: 0x0 or wrapped native with isNativeIn true.',\n ),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n isNativeIn: z\n .boolean()\n .optional()\n .describe('Wrap native to wrapped native before supply (e.g. ETH → WETH).'),\n enableAsCollateralAfterSupply: z\n .boolean()\n .optional()\n .describe('Append setUsingAsCollateral after supply in the same batch.'),\n})\n\nexport const mcpAaveV4WithdrawInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema.optional().describe('Omit — server resolves from Aave v4 API.'),\n underlying: evmAddressSchema.describe('Supplied asset to withdraw.'),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n ...mcpAaveV4HealthPreviewSchema,\n})\n\nexport const mcpAaveV4BorrowInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema.optional().describe('Omit — server resolves from Aave v4 API.'),\n underlying: evmAddressSchema.describe('Debt asset to borrow (e.g. USDC), not collateral.'),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n collateralUnderlying: evmAddressSchema\n .optional()\n .describe('Collateral token already supplied; helps pick hub when debt exists on multiple hubs.'),\n ...mcpAaveV4HealthPreviewSchema,\n})\n\nexport const mcpAaveV4RepayInputSchema = mcpMultisignInput({\n spoke: evmAddressSchema.optional().describe('Omit — server resolves from Aave v4 API.'),\n underlying: evmAddressSchema.describe('Debt token to repay.'),\n amountHuman: z.string().min(1),\n marketId: mcpAaveV4MarketIdSchema,\n ...mcpAaveV4HealthPreviewSchema,\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\n// —— Morpho ——\nexport const mcpMorphoVaultDepositInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n underlying: evmAddressSchema.describe('Underlying asset; use wrapped native with isNativeIn for ETH.'),\n amountHuman: z.string().min(1),\n isNativeIn: z.boolean().optional(),\n})\n\nexport const mcpMorphoVaultWithdrawInputSchema = mcpMultisignInput({\n vault: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpMorphoBlueCollateralDepositInputSchema = mcpMultisignInput({\n marketId: z.string().min(1).describe('Morpho Blue marketId from API.'),\n collateralToken: evmAddressSchema,\n amountHuman: z.string().min(1),\n isNativeIn: z.boolean().optional(),\n})\n\nexport const mcpMorphoBlueBorrowInputSchema = mcpMultisignInput({\n marketId: z.string().min(1),\n loanToken: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpMorphoBlueRepayInputSchema = mcpMultisignInput({\n marketId: z.string().min(1),\n loanToken: evmAddressSchema,\n amountHuman: z.string().min(1),\n})\n\nexport const mcpMorphoBlueCollateralWithdrawInputSchema = mcpMultisignInput({\n marketId: z.string().min(1),\n amountHuman: z.string().min(1),\n collateralDecimals: z.number().int().min(0).max(36).optional(),\n})\n\nexport const mcpMorphoMerklClaimInputSchema = mcpMultisignInput({\n claimData: z.string().min(1).describe('Hex calldata for Merkl Distributor.claim from Merkl API.'),\n distributor: evmAddressSchema.optional(),\n valueWei: z.string().optional(),\n})\n\nexport type McpMorphoVaultDepositInput = z.infer<typeof mcpMorphoVaultDepositInputSchema>\n","import { z } from 'zod'\n\nconst morphoExposureRowSchema = z.object({\n label: z.string(),\n allocatedUsdLabel: z.string(),\n allocationPercentLabel: z.string(),\n})\n\nexport const mcpMorphoFetchEarnVaultsInputSchema = z.object({\n chainId: z.number().int().positive(),\n underlying: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe('Deposit asset symbol (e.g. USDC) or ERC-20 address. Omit to search all listed vaults on the chain.'),\n query: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe('Case-insensitive filter on vault name, symbol, address, or underlying symbol (e.g. Steakhouse, bbqUSDC).'),\n limit: z.number().int().min(1).max(200).optional().describe('Max rows (default 50).'),\n})\n\nexport const mcpMorphoFetchEarnVaultsOutputSchema = z.object({\n vaults: z.array(\n z.object({\n vaultAddress: z.string(),\n vaultName: z.string(),\n vaultSymbol: z.string(),\n underlyingAddress: z.string(),\n underlyingSymbol: z.string(),\n apy: z.string(),\n netApy: z.string(),\n netApy7d: z.string(),\n netApy30d: z.string(),\n netApy90d: z.string(),\n performanceFee: z.string(),\n managementFee: z.string().nullable(),\n totalDepositsUsd: z.string(),\n liquidityUsd: z.string(),\n exposure: z.array(morphoExposureRowSchema),\n }),\n ),\n})\n\nexport type McpMorphoFetchEarnVaultsInput = z.infer<typeof mcpMorphoFetchEarnVaultsInputSchema>\nexport type McpMorphoFetchEarnVaultsOutput = z.infer<typeof mcpMorphoFetchEarnVaultsOutputSchema>\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema } from './common.js'\n\nexport function mcpGmxMultisignInput(fields: z.ZodRawShape) {\n return evmMultisignCommonInputSchema.extend(fields)\n}\n\nexport { mcpServerSubmitOutputSchema as mcpGmxMultisignOutputSchema } from '../mcpServerSchemas.js'\n\nconst gmxDirectionSchema = z.enum(['long', 'short'])\nconst gmxOrderTypeSchema = z.enum(['market', 'limit'])\n\nexport const mcpGmxFetchMarketsInputSchema = z.object({\n chainId: z.number().int().positive(),\n})\n\nexport const mcpGmxFetchMarketsOutputSchema = z.object({\n markets: z.array(\n z.object({\n symbol: z.string(),\n marketTokenAddress: z.string(),\n maxLeverageLabel: z.string().nullable(),\n }),\n ),\n})\n\nexport const mcpGmxFetchPositionsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpGmxFetchPositionsOutputSchema = z.object({\n positions: z.array(z.record(z.unknown())),\n})\n\nexport const mcpGmxIncreaseInputSchema = mcpGmxMultisignInput({\n symbol: z.string().min(1),\n direction: gmxDirectionSchema,\n orderType: gmxOrderTypeSchema,\n sizeUsdHuman: z.string().min(1),\n collateralToken: z.string().min(1),\n collateralAmountHuman: z.string().min(1),\n triggerPriceUsdHuman: z.string().optional(),\n slippageBps: z.number().int().nonnegative().optional(),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxDecreaseInputSchema = mcpGmxMultisignInput({\n symbol: z.string().min(1),\n direction: gmxDirectionSchema,\n orderType: gmxOrderTypeSchema,\n sizeUsdHuman: z.string().min(1),\n collateralToken: z.string().min(1),\n receiveToken: z.string().optional(),\n triggerPriceUsdHuman: z.string().optional(),\n keepLeverage: z.boolean().optional(),\n slippageBps: z.number().int().nonnegative().optional(),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxCancelInputSchema = mcpGmxMultisignInput({\n orderId: z.string().min(1),\n})\n\nexport const mcpGmxGmDepositInputSchema = mcpGmxMultisignInput({\n marketSymbol: z.string().min(1),\n collateralToken: z.string().min(1),\n collateralAmountHuman: z.string().min(1),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n isNativeIn: z.boolean().optional(),\n nativeWrapped: evmAddressSchema.optional(),\n})\n\nexport const mcpGmxGmWithdrawInputSchema = mcpGmxMultisignInput({\n marketSymbol: z.string().min(1),\n gmAmountHuman: z.string().min(1),\n gmDecimals: z.number().int().nonnegative().optional(),\n executionFeeBufferBps: z.number().int().nonnegative().optional(),\n isNativeOut: z.boolean().optional(),\n})\n\nexport const mcpGmxStakeGmxInputSchema = mcpGmxMultisignInput({\n amountHuman: z.string().min(1),\n gmxDecimals: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxUnstakeGmxInputSchema = mcpGmxMultisignInput({\n amountHuman: z.string().min(1),\n gmxDecimals: z.number().int().nonnegative().optional(),\n})\n\nexport const mcpGmxFetchGmMarketsInputSchema = z.object({\n chainId: z.number().int().positive(),\n})\n\nconst mcpGmxGmMarketApyRowSchema = z.object({\n symbol: z.string(),\n marketTokenAddress: z.string(),\n longTokenSymbol: z.string().nullable(),\n shortTokenSymbol: z.string().nullable(),\n apy: z.number().nullable(),\n baseApy: z.number().nullable(),\n bonusApr: z.number().nullable(),\n apyPercentLabel: z.string().nullable(),\n})\n\nexport const mcpGmxFetchGmMarketsOutputSchema = z.object({\n markets: z.array(mcpGmxGmMarketApyRowSchema),\n})\n\nexport const mcpGmxFetchGmApyInputSchema = z.object({\n chainId: z.number().int().positive(),\n})\n\nexport const mcpGmxFetchGmApyOutputSchema = z.object({\n markets: z.array(\n z.object({\n symbol: z.string(),\n marketTokenAddress: z.string(),\n longTokenSymbol: z.string().nullable(),\n shortTokenSymbol: z.string().nullable(),\n apy: z.number().nullable(),\n baseApy: z.number().nullable(),\n bonusApr: z.number().nullable(),\n apyPercentLabel: z.string().nullable(),\n }),\n ),\n})\n\nexport const mcpGmxFetchStakingPowerInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpGmxFetchStakingPowerOutputSchema = z.object({\n stakingPower: z.record(z.unknown()),\n})\n\nconst gmxOhlcvTimeframeSchema = z.enum(['1m', '5m', '15m', '1h', '4h', '1d', '1w', '1M'])\n\nconst gmxOhlcvCandleSchema = z.object({\n timestampMs: z.number(),\n timeLabel: z.string(),\n open: z.string(),\n high: z.string(),\n low: z.string(),\n close: z.string(),\n})\n\nexport const mcpGmxFetchMarketPricesInputSchema = z.object({\n chainId: z.number().int().positive(),\n symbol: z.string().min(1),\n collateralSymbol: z.string().min(1),\n})\n\nexport const mcpGmxFetchMarketPricesOutputSchema = z.object({\n symbol: z.string(),\n indexLabel: z.string(),\n collateralSymbol: z.string(),\n indexMarkUsd: z.string().nullable(),\n collateralUsd: z.string().nullable(),\n indexPerCollateral: z.string().nullable(),\n fetchedAtMs: z.number(),\n})\n\nexport const mcpGmxFetchOhlcvInputSchema = z.object({\n chainId: z.number().int().positive(),\n symbol: z.string().min(1),\n timeframe: gmxOhlcvTimeframeSchema.optional(),\n limit: z.number().int().positive().max(500).optional(),\n sort: z.enum(['asc', 'desc']).optional(),\n})\n\nexport const mcpGmxFetchOhlcvOutputSchema = z.object({\n symbol: z.string(),\n timeframe: gmxOhlcvTimeframeSchema,\n candles: z.array(gmxOhlcvCandleSchema),\n})\n","import { z } from 'zod'\nimport { evmAddressSchema, evmMultisignCommonInputSchema } from './common.js'\n\nexport function mcpHyperliquidMultisignInput(fields: z.ZodRawShape) {\n return evmMultisignCommonInputSchema.extend(fields)\n}\n\nconst hyperliquidTifSchema = z.enum(['alo', 'gtc', 'ioc'])\nconst hyperliquidOhlcvIntervalSchema = z.enum([\n '1m',\n '3m',\n '5m',\n '15m',\n '30m',\n '1h',\n '2h',\n '4h',\n '8h',\n '12h',\n '1d',\n '3d',\n '1w',\n '1M',\n])\n\nconst hyperliquidPositionRowSchema = z.object({\n key: z.string(),\n coin: z.string(),\n isLong: z.boolean(),\n size: z.string().nullable(),\n entryPx: z.string().nullable(),\n positionValueUsd: z.string().nullable(),\n unrealizedPnlUsd: z.string().nullable(),\n liquidationPx: z.string().nullable(),\n leverageLabel: z.string().nullable(),\n maxLeverage: z.number().nullable(),\n marginUsedUsd: z.string().nullable(),\n returnOnEquity: z.string().nullable(),\n})\n\nconst hyperliquidActiveAssetSchema = z.object({\n markPx: z.string().nullable(),\n leverageLabel: z.string().nullable(),\n availableToBuy: z.string().nullable(),\n availableToSell: z.string().nullable(),\n})\n\nconst hyperliquidAccountSummarySchema = z.object({\n accountValueUsd: z.string().nullable(),\n totalMarginUsedUsd: z.string().nullable(),\n withdrawableUsd: z.string().nullable(),\n})\n\nexport const mcpHyperliquidFetchMarketsInputSchema = z.object({\n chainId: z.number().int().positive(),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchMarketsOutputSchema = z.object({\n markets: z.array(\n z.object({\n name: z.string(),\n asset: z.number(),\n szDecimals: z.number(),\n maxLeverage: z.number(),\n onlyIsolated: z.boolean().optional(),\n dex: z.string().optional(),\n }),\n ),\n dexes: z.array(\n z.object({\n name: z.string(),\n fullName: z.string(),\n }),\n ),\n})\n\nexport const mcpHyperliquidSearchMarketsInputSchema = z.object({\n chainId: z.number().int().positive(),\n query: z.string().min(1),\n dex: z.string().optional(),\n limit: z.number().int().positive().max(50).optional(),\n})\n\nexport const mcpHyperliquidSearchMarketsOutputSchema = z.object({\n matches: z.array(\n z.object({\n coin: z.string(),\n symbol: z.string(),\n dex: z.string().optional(),\n asset: z.number(),\n szDecimals: z.number(),\n maxLeverage: z.number(),\n onlyIsolated: z.boolean().optional(),\n displayName: z.string().optional(),\n category: z.string().optional(),\n keywords: z.array(z.string()).optional(),\n matchScore: z.number(),\n matchReason: z.string(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchOpenContextInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n coin: z.string().min(1),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchOpenContextOutputSchema = z.object({\n context: z.object({\n account: hyperliquidAccountSummarySchema,\n activeAsset: hyperliquidActiveAssetSchema,\n }),\n})\n\nexport const mcpHyperliquidFetchPositionsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchPositionsOutputSchema = z.object({\n positions: z.array(hyperliquidPositionRowSchema),\n})\n\nexport const mcpHyperliquidFetchOpenOrdersInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidFetchOpenOrdersOutputSchema = z.object({\n orders: z.array(\n z.object({\n coin: z.string(),\n side: z.string(),\n limitPx: z.string(),\n sz: z.string(),\n oid: z.number(),\n timestamp: z.number(),\n reduceOnly: z.boolean().optional(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchMarketSnapshotInputSchema = z.object({\n chainId: z.number().int().positive(),\n coin: z.string().min(1),\n interval: hyperliquidOhlcvIntervalSchema.optional(),\n dex: z.string().optional(),\n /** Recent OHLCV bars to return (default 48, max 200). Live price is always current. */\n candleLimit: z.number().int().positive().max(200).optional(),\n})\n\nconst hyperliquidOhlcvCandleSchema = z.object({\n timestampMs: z.number(),\n open: z.string(),\n high: z.string(),\n low: z.string(),\n close: z.string(),\n volume: z.string(),\n})\n\nconst hyperliquidLivePriceSchema = z.object({\n markPx: z.string().nullable(),\n midPx: z.string().nullable(),\n oraclePx: z.string().nullable(),\n prevDayPx: z.string().nullable(),\n midUsd: z.string(),\n source: z.enum(['midPx', 'markPx', 'allMids']),\n})\n\nexport const mcpHyperliquidFetchMarketSnapshotOutputSchema = z.object({\n snapshot: z.object({\n coin: z.string(),\n dex: z.string().nullable(),\n livePrice: hyperliquidLivePriceSchema,\n midUsd: z.string(),\n fetchedAtMs: z.number(),\n interval: hyperliquidOhlcvIntervalSchema,\n latestCandle: hyperliquidOhlcvCandleSchema.nullable(),\n candles: z.array(hyperliquidOhlcvCandleSchema),\n candleCount: z.number(),\n }),\n resolvedCoin: z.string(),\n dex: z.string().nullable(),\n})\n\nexport const mcpHyperliquidFetchOhlcvInputSchema = z.object({\n chainId: z.number().int().positive(),\n coin: z.string().min(1),\n interval: hyperliquidOhlcvIntervalSchema.optional(),\n dex: z.string().optional(),\n /** Calendar-day lookback ending now (e.g. 7 = last week). Preferred for agent requests. */\n lookbackDays: z.number().positive().max(90).optional(),\n /** Hour lookback ending now. Alternative to lookbackDays. */\n lookbackHours: z.number().positive().max(90 * 24).optional(),\n /** Explicit range start (ms since epoch). Use with endTimeMs. */\n startTimeMs: z.number().int().positive().optional(),\n /** Explicit range end (ms since epoch). Defaults to now. */\n endTimeMs: z.number().int().positive().optional(),\n})\n\nexport const mcpHyperliquidFetchOhlcvOutputSchema = z.object({\n ohlcv: z.object({\n coin: z.string(),\n dex: z.string().nullable(),\n interval: hyperliquidOhlcvIntervalSchema,\n startTimeMs: z.number(),\n endTimeMs: z.number(),\n expectedBars: z.number(),\n candleCount: z.number(),\n latestCandle: hyperliquidOhlcvCandleSchema.nullable(),\n candles: z.array(hyperliquidOhlcvCandleSchema),\n fetchedAtMs: z.number(),\n }),\n resolvedCoin: z.string(),\n dex: z.string().nullable(),\n})\n\nexport const mcpHyperliquidFetchUsdClassBalancesInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchUsdClassBalancesOutputSchema = z.object({\n balances: z.object({\n spotUsdcAvailable: z.string(),\n perpWithdrawable: z.string(),\n }),\n})\n\nexport const mcpHyperliquidFetchVaultsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema.optional(),\n})\n\nexport const mcpHyperliquidFetchVaultsOutputSchema = z.object({\n vaults: z.array(\n z.object({\n vaultAddress: z.string(),\n name: z.string(),\n apr: z.number().nullable(),\n tvlUsd: z.string().nullable(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchUserVaultEquitiesInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchUserVaultEquitiesOutputSchema = z.object({\n rows: z.array(\n z.object({\n vaultAddress: z.string(),\n equity: z.string(),\n }),\n ),\n})\n\nexport const mcpHyperliquidFetchStakingSummaryInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchStakingSummaryOutputSchema = z.object({\n summary: z.object({\n delegated: z.string(),\n undelegated: z.string(),\n }),\n})\n\nexport const mcpHyperliquidFetchDelegationsInputSchema = z.object({\n chainId: z.number().int().positive(),\n executorAddress: evmAddressSchema,\n})\n\nexport const mcpHyperliquidFetchDelegationsOutputSchema = z.object({\n delegations: z.array(\n z.object({\n validator: z.string(),\n amount: z.string(),\n }),\n ),\n})\n\nexport const mcpHyperliquidLimitOrderInputSchema = mcpHyperliquidMultisignInput({\n coin: z.string().min(1),\n isBuy: z.boolean(),\n limitPxHuman: z.string().min(1),\n szHuman: z.string().min(1),\n marketKind: z.enum(['perp', 'spot']).optional(),\n tif: hyperliquidTifSchema.optional(),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidCloseInputSchema = mcpHyperliquidMultisignInput({\n coin: z.string().min(1),\n isLong: z.boolean(),\n limitPxHuman: z.string().min(1),\n szHuman: z.string().min(1),\n dex: z.string().optional(),\n tif: hyperliquidTifSchema.optional(),\n})\n\nexport const mcpHyperliquidCancelInputSchema = mcpHyperliquidMultisignInput({\n coin: z.string().min(1),\n oid: z.number().int().positive(),\n marketKind: z.enum(['perp', 'spot']).optional(),\n dex: z.string().optional(),\n})\n\nexport const mcpHyperliquidUsdTransferInputSchema = mcpHyperliquidMultisignInput({\n usdHuman: z.string().min(1),\n toPerp: z.boolean(),\n})\n\nexport const mcpHyperliquidVaultDepositInputSchema = mcpHyperliquidMultisignInput({\n vaultAddress: evmAddressSchema,\n usdHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidVaultWithdrawInputSchema = mcpHyperliquidMultisignInput({\n vaultAddress: evmAddressSchema,\n usdHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidStakeInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidUnstakeInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n})\n\nexport const mcpHyperliquidDelegateInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n validator: evmAddressSchema,\n})\n\nexport const mcpHyperliquidUndelegateInputSchema = mcpHyperliquidMultisignInput({\n hypeHuman: z.string().min(1),\n validator: evmAddressSchema,\n})\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 mcpMorphoBlueBorrowInputSchema,\n mcpMorphoBlueCollateralDepositInputSchema,\n mcpMorphoBlueCollateralWithdrawInputSchema,\n mcpMorphoBlueRepayInputSchema,\n mcpMorphoMerklClaimInputSchema,\n mcpMorphoVaultDepositInputSchema,\n mcpMorphoVaultWithdrawInputSchema,\n mcpMultisignSubmitOutputSchema,\n mcpSkyLockstakeCloseInputSchema,\n mcpSkyLockstakeDrawInputSchema,\n mcpSkyLockstakeGetRewardInputSchema,\n mcpSkyLockstakeStakeInputSchema,\n mcpSkyLockstakeWipeInputSchema,\n mcpSkySusdsDepositInputSchema,\n mcpSkySusdsRedeemInputSchema,\n} from './schemas/protocols.js'\nimport {\n mcpGmxCancelInputSchema,\n mcpGmxDecreaseInputSchema,\n mcpGmxGmDepositInputSchema,\n mcpGmxGmWithdrawInputSchema,\n mcpGmxIncreaseInputSchema,\n mcpGmxStakeGmxInputSchema,\n mcpGmxUnstakeGmxInputSchema,\n} from './schemas/gmx.js'\nimport {\n mcpHyperliquidCancelInputSchema,\n mcpHyperliquidCloseInputSchema,\n mcpHyperliquidDelegateInputSchema,\n mcpHyperliquidLimitOrderInputSchema,\n mcpHyperliquidStakeInputSchema,\n mcpHyperliquidUndelegateInputSchema,\n mcpHyperliquidUnstakeInputSchema,\n mcpHyperliquidUsdTransferInputSchema,\n mcpHyperliquidVaultDepositInputSchema,\n mcpHyperliquidVaultWithdrawInputSchema,\n} from './schemas/hyperliquid.js'\nimport {\n MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n withMultisignSubmitMcpMeta,\n} from './mcpMultisignSubmitMeta.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 mcpMultisignSubmitOutputSchema>> {\n const meta = withMultisignSubmitMcpMeta(def.description, def.followUp ?? MCP_MULTISIGN_SUBMIT_FOLLOW_UP)\n return {\n ...def,\n description: meta.description,\n followUp: meta.followUp,\n outputZod: mcpMultisignSubmitOutputSchema,\n inputSchema: zodSchemaToMcpJsonSchema(def.inputZod),\n outputSchema: zodSchemaToMcpJsonSchema(mcpMultisignSubmitOutputSchema),\n parseInput: (data: unknown) => def.inputZod.parse(data),\n parseOutput: (data: unknown) => mcpMultisignSubmitOutputSchema.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: 'Create and submit mpc-auth multiSignRequest for Lido ETH stake (submit).',\n prerequisites: ['keyGen', 'executorAddress', 'RPC URL'],\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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 (wrap native, approve, supply).',\n prerequisites: ['keyGenId', 'chainId', 'underlying', 'amountHuman', 'get_defi_protocol_skill for hubs/spokes'],\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; health-factor preview when user has borrow debt.',\n prerequisites: ['keyGenId', 'chainId', 'underlying (supplied asset)', 'amountHuman'],\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; underlying is debt asset; collateral must be supplied first.',\n prerequisites: [\n 'keyGenId',\n 'chainId',\n 'underlying (debt token)',\n 'amountHuman',\n 'collateral supplied via deposit',\n ],\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 (approve if needed + repay).',\n prerequisites: ['keyGenId', 'chainId', 'underlying (debt token)', 'amountHuman'],\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 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 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 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 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 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 handler: { importPath: 'protocols/evm/euler-v2', exportName: 'buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch' },\n inputZod: mcpEulerV2CollateralWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_morpho_build_vault_deposit_multisign',\n actionId: 'morpho.vault-deposit',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description: 'Build Morpho vault deposit batch (wrap/approve + deposit). Works with listed V1 and V2 vaults.',\n prerequisites: [\n 'keyGenId',\n 'chainId',\n 'vaultAddress from ctm_morpho_fetch_earn_vaults',\n 'underlying',\n 'amountHuman',\n ],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'buildEvmMultisignBodyMorphoVaultDepositBatch' },\n inputZod: mcpMorphoVaultDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_morpho_build_vault_withdraw_multisign',\n actionId: 'morpho.vault-withdraw',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description: 'Build Morpho vault withdraw batch. Works with listed V1 and V2 vaults.',\n prerequisites: [\n 'keyGenId',\n 'chainId',\n 'vaultAddress from ctm_morpho_fetch_earn_vaults or user positions',\n 'amountHuman',\n ],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'buildEvmMultisignBodyMorphoVaultWithdraw' },\n inputZod: mcpMorphoVaultWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_morpho_build_blue_collateral_deposit_multisign',\n actionId: 'morpho.blue-collateral-deposit',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description: 'Build Morpho Blue supplyCollateral batch.',\n prerequisites: ['keyGenId', 'chainId', 'marketId', 'collateralToken', 'amountHuman'],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'buildEvmMultisignBodyMorphoBlueSupplyCollateralBatch' },\n inputZod: mcpMorphoBlueCollateralDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_morpho_build_blue_borrow_multisign',\n actionId: 'morpho.blue-borrow',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description: 'Build Morpho Blue borrow batch.',\n prerequisites: ['keyGenId', 'chainId', 'marketId', 'loanToken', 'amountHuman'],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'buildEvmMultisignBodyMorphoBlueBorrowBatch' },\n inputZod: mcpMorphoBlueBorrowInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_morpho_build_blue_repay_multisign',\n actionId: 'morpho.blue-repay',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description: 'Build Morpho Blue repay batch.',\n prerequisites: ['keyGenId', 'chainId', 'marketId', 'loanToken', 'amountHuman'],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'buildEvmMultisignBodyMorphoBlueRepayBatch' },\n inputZod: mcpMorphoBlueRepayInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_morpho_build_blue_collateral_withdraw_multisign',\n actionId: 'morpho.blue-collateral-withdraw',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description: 'Build Morpho Blue withdrawCollateral batch.',\n prerequisites: ['keyGenId', 'chainId', 'marketId', 'amountHuman'],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'buildEvmMultisignBodyMorphoBlueWithdrawCollateralBatch' },\n inputZod: mcpMorphoBlueCollateralWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_morpho_build_merkl_claim_multisign',\n actionId: 'morpho.merkl-claim',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description: 'Build Morpho Merkl Distributor.claim transaction.',\n prerequisites: ['keyGenId', 'chainId', 'claim calldata from Merkl API'],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'buildEvmMultisignBodyMorphoMerklDistributorClaim' },\n inputZod: mcpMorphoMerklClaimInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_increase_multisign',\n actionId: 'gmx.increase',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for GMX classic increase order (open/add perp). Keeper executes asynchronously after on-chain broadcast.',\n prerequisites: ['keyGen', 'executorAddress', 'GMX market symbol', 'classic mode only — no subaccounts'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxIncreaseBatch' },\n inputZod: mcpGmxIncreaseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_decrease_multisign',\n actionId: 'gmx.decrease',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest for GMX classic decrease order (close/reduce perp).',\n prerequisites: ['keyGen', 'executorAddress', 'position market symbol'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxDecreaseBatch' },\n inputZod: mcpGmxDecreaseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_cancel_multisign',\n actionId: 'gmx.cancel',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to cancel a pending GMX order (classic on-chain).',\n prerequisites: ['keyGen', 'executorAddress', 'orderId from fetchOrders'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxCancelBatch' },\n inputZod: mcpGmxCancelInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_gm_deposit_multisign',\n actionId: 'gmx.gmDeposit',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for GMX GM pool deposit (ExchangeRouter multicall). Keeper executes asynchronously.',\n prerequisites: ['keyGen', 'executorAddress', 'marketSymbol', 'collateral token'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxGmDepositBatch' },\n inputZod: mcpGmxGmDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_gm_withdraw_multisign',\n actionId: 'gmx.gmWithdraw',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for GMX GM pool withdrawal (ExchangeRouter multicall). Keeper executes asynchronously.',\n prerequisites: ['keyGen', 'executorAddress', 'GM market token balance'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxGmWithdrawBatch' },\n inputZod: mcpGmxGmWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_stake_gmx_multisign',\n actionId: 'gmx.stakeGmx',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to stake GMX via RewardRouter.',\n prerequisites: ['keyGen', 'executorAddress', 'GMX token balance'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxStakeGmxBatch' },\n inputZod: mcpGmxStakeGmxInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_gmx_build_unstake_gmx_multisign',\n actionId: 'gmx.unstakeGmx',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to unstake GMX via RewardRouter.',\n prerequisites: ['keyGen', 'executorAddress', 'staked GMX balance'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'buildEvmMultisignBodyGmxUnstakeGmxBatch' },\n inputZod: mcpGmxUnstakeGmxInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_limit_order_multisign',\n actionId: 'hyperliquid.limitOrder',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for a Hyperliquid limit/IoC order via HyperEVM CoreWriter.',\n prerequisites: ['keyGen', 'executorAddress', 'chainId 999 or 998', 'coin', 'limitPxHuman', 'szHuman'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidLimitOrderBatch' },\n inputZod: mcpHyperliquidLimitOrderInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_close_multisign',\n actionId: 'hyperliquid.close',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest to close/reduce a perp (IoC reduce-only limit via CoreWriter).',\n prerequisites: ['keyGen', 'executorAddress', 'open position from fetch_positions', 'isLong matches position'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidCloseBatch' },\n inputZod: mcpHyperliquidCloseInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_cancel_multisign',\n actionId: 'hyperliquid.cancel',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to cancel a Hyperliquid open order.',\n prerequisites: ['keyGen', 'executorAddress', 'oid from fetch_open_orders'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidCancelBatch' },\n inputZod: mcpHyperliquidCancelInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_usd_transfer_multisign',\n actionId: 'hyperliquid.usdTransfer',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to move USDC between spot and perp margin.',\n prerequisites: ['keyGen', 'executorAddress', 'usdHuman', 'toPerp boolean'],\n handler: {\n importPath: 'protocols/evm/hyperliquid',\n exportName: 'buildEvmMultisignBodyHyperliquidUsdClassTransferBatch',\n },\n inputZod: mcpHyperliquidUsdTransferInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_vault_deposit_multisign',\n actionId: 'hyperliquid.vaultDeposit',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest for Hyperliquid vault deposit.',\n prerequisites: ['keyGen', 'executorAddress', 'vaultAddress from fetch_vaults'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidVaultDepositBatch' },\n inputZod: mcpHyperliquidVaultDepositInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_vault_withdraw_multisign',\n actionId: 'hyperliquid.vaultWithdraw',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for Hyperliquid vault withdraw (includes accrued PnL).',\n prerequisites: ['keyGen', 'executorAddress', 'vaultAddress', 'equity from fetch_user_vault_equities'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidVaultWithdrawBatch' },\n inputZod: mcpHyperliquidVaultWithdrawInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_stake_multisign',\n actionId: 'hyperliquid.stake',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to stake HYPE via CoreWriter.',\n prerequisites: ['keyGen', 'executorAddress', 'HYPE balance on Hyperliquid account'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidStakeDepositBatch' },\n inputZod: mcpHyperliquidStakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_unstake_multisign',\n actionId: 'hyperliquid.unstake',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to unstake HYPE via CoreWriter.',\n prerequisites: ['keyGen', 'executorAddress', 'staked HYPE'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidStakeWithdrawBatch' },\n inputZod: mcpHyperliquidUnstakeInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_delegate_multisign',\n actionId: 'hyperliquid.delegate',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to delegate staked HYPE to a validator.',\n prerequisites: ['keyGen', 'executorAddress', 'validator address', 'hypeHuman'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidDelegateOnlyBatch' },\n inputZod: mcpHyperliquidDelegateInputSchema,\n }),\n defineProtocolMcpTool({\n name: 'ctm_hyperliquid_build_undelegate_multisign',\n actionId: 'hyperliquid.undelegate',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to undelegate HYPE from a validator.',\n prerequisites: ['keyGen', 'executorAddress', 'delegation from fetch_delegations'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'buildEvmMultisignBodyHyperliquidUndelegateBatch' },\n inputZod: mcpHyperliquidUndelegateInputSchema,\n }),\n] as const satisfies readonly McpToolDefinition[]\n","import type { z } from 'zod'\nimport type { ChainCategory } from '../core/types.js'\nimport {\n EVM_COMMON_PARAM_DOCS,\n MULTISIGN_OUTPUT_DOC,\n MULTISIGN_SUBMIT_OUTPUT_DOC,\n MANAGEMENT_SIG_DOC,\n} from './commonParamDocs.js'\nimport {\n MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n withMultisignSubmitMcpMeta,\n} from './mcpMultisignSubmitMeta.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 mcpGmxFetchMarketsInputSchema,\n mcpGmxFetchMarketsOutputSchema,\n mcpGmxFetchMarketPricesInputSchema,\n mcpGmxFetchMarketPricesOutputSchema,\n mcpGmxFetchOhlcvInputSchema,\n mcpGmxFetchOhlcvOutputSchema,\n mcpGmxFetchPositionsInputSchema,\n mcpGmxFetchPositionsOutputSchema,\n mcpGmxFetchGmMarketsInputSchema,\n mcpGmxFetchGmMarketsOutputSchema,\n mcpGmxFetchGmApyInputSchema,\n mcpGmxFetchGmApyOutputSchema,\n mcpGmxFetchStakingPowerInputSchema,\n mcpGmxFetchStakingPowerOutputSchema,\n mcpUniswapV4BuildSwapMultisignInputSchema,\n mcpUniswapV4BuildMintLiquidityMultisignInputSchema,\n mcpUniswapV4BuildIncreaseLiquidityMultisignInputSchema,\n mcpUniswapV4BuildDecreaseLiquidityMultisignInputSchema,\n mcpUniswapV4BuildCollectFeesMultisignInputSchema,\n mcpUniswapV4CreateSwapInputSchema,\n mcpUniswapV4CreateSwapOutputSchema,\n mcpUniswapV4LpCreatePositionInputSchema,\n mcpUniswapV4LpCreatePositionOutputSchema,\n mcpUniswapV4LpIncreaseInputSchema,\n mcpUniswapV4LpIncreaseOutputSchema,\n mcpUniswapV4LpDecreaseInputSchema,\n mcpUniswapV4LpDecreaseOutputSchema,\n mcpUniswapV4LpClaimInputSchema,\n mcpUniswapV4LpClaimOutputSchema,\n mcpUniswapV4LpListPositionsInputSchema,\n mcpUniswapV4LpListPositionsOutputSchema,\n mcpUniswapV4LpListPoolsInputSchema,\n mcpUniswapV4LpListPoolsOutputSchema,\n mcpUniswapV4RegisterPositionNftInputSchema,\n mcpUniswapV4RegisterPositionNftOutputSchema,\n mcpUniswapV4RegisterPositionFromMintTxInputSchema,\n mcpUniswapV4RegisterPositionFromMintTxOutputSchema,\n mcpUniswapV4QuoteInputSchema,\n mcpUniswapV4QuoteOutputSchema,\n mcpMultisignSubmitOutputSchema,\n mcpHyperliquidFetchMarketsInputSchema,\n mcpHyperliquidFetchMarketsOutputSchema,\n mcpHyperliquidSearchMarketsInputSchema,\n mcpHyperliquidSearchMarketsOutputSchema,\n mcpHyperliquidFetchOpenContextInputSchema,\n mcpHyperliquidFetchOpenContextOutputSchema,\n mcpHyperliquidFetchPositionsInputSchema,\n mcpHyperliquidFetchPositionsOutputSchema,\n mcpHyperliquidFetchOpenOrdersInputSchema,\n mcpHyperliquidFetchOpenOrdersOutputSchema,\n mcpHyperliquidFetchMarketSnapshotInputSchema,\n mcpHyperliquidFetchMarketSnapshotOutputSchema,\n mcpHyperliquidFetchOhlcvInputSchema,\n mcpHyperliquidFetchOhlcvOutputSchema,\n mcpHyperliquidFetchUsdClassBalancesInputSchema,\n mcpHyperliquidFetchUsdClassBalancesOutputSchema,\n mcpHyperliquidFetchVaultsInputSchema,\n mcpHyperliquidFetchVaultsOutputSchema,\n mcpHyperliquidFetchUserVaultEquitiesInputSchema,\n mcpHyperliquidFetchUserVaultEquitiesOutputSchema,\n mcpHyperliquidFetchStakingSummaryInputSchema,\n mcpHyperliquidFetchStakingSummaryOutputSchema,\n mcpHyperliquidFetchDelegationsInputSchema,\n mcpHyperliquidFetchDelegationsOutputSchema,\n mcpMorphoFetchEarnVaultsInputSchema,\n mcpMorphoFetchEarnVaultsOutputSchema,\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\nfunction defineMultisignSubmitMcpTool<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 mcpMultisignSubmitOutputSchema>> {\n const meta = withMultisignSubmitMcpMeta(def.description, def.followUp ?? MCP_MULTISIGN_SUBMIT_FOLLOW_UP)\n return defineMcpTool({\n ...def,\n description: meta.description,\n followUp: meta.followUp,\n outputZod: mcpMultisignSubmitOutputSchema,\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: [\n 'UNISWAP_API_KEY in node Variables',\n 'get_defi_protocol_skill for full quote → create_swap → build flow',\n 'keyGenId (resolves swapper)',\n ],\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: [\n 'ctm_uniswap_v4_quote output (fullQuoteFromPermit)',\n 'get_defi_protocol_skill for deadline and field alignment',\n ],\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 defineMultisignSubmitMcpTool({\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 'Create and submit mpc-auth multiSignRequest for a Uniswap V4 swap. May batch 1–3 EVM txs: ERC-20 approve(s) + Universal Router swap (or 1 tx for native-in).',\n prerequisites: [\n 'ctm_uniswap_v4_create_swap output + matching quote snapshot and swapDeadlineUnix',\n 'keyGenId + chainId + purposeText',\n ],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'buildEvmMultisignBodyUniswapV4SkipPermit2Batch' },\n inputZod: mcpUniswapV4BuildSwapMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_list_lp_pools',\n actionId: 'uniswap-v4.lp-list-pools',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'List standard Uniswap V4 LP pools for a chain (ETH/USDC and other main pairs at common fee tiers). Returns presetId, token addresses, fee, tickSpacing, and computed poolReference (bytes32 pool id). Use presetId as poolPreset on lp_create_position.',\n prerequisites: ['chainId'],\n followUp: ['ctm_uniswap_v4_lp_create_position'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapV4ListStandardLpPools' },\n inputZod: mcpUniswapV4LpListPoolsInputSchema,\n outputZod: mcpUniswapV4LpListPoolsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_create_position',\n actionId: 'uniswap-v4.lp-create',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Call Uniswap LP API POST /lp/create for a new V4 position. Returns token amounts and `create` transaction calldata. Does NOT create a sign request — call ctm_uniswap_v4_build_mint_liquidity_multisign next. Pass poolPreset from list_lp_pools, or existingPool with poolReference (or fee+tickSpacing to derive pool id).',\n prerequisites: [\n 'UNISWAP_API_KEY',\n 'ctm_uniswap_v4_list_lp_pools for standard pairs',\n 'get_defi_protocol_skill for LP flow',\n ],\n followUp: ['ctm_uniswap_v4_build_mint_liquidity_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpCreatePosition' },\n inputZod: mcpUniswapV4LpCreatePositionInputSchema,\n outputZod: mcpUniswapV4LpCreatePositionOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_mint_liquidity_multisign',\n actionId: 'uniswap-v4.mint-liquidity',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Create and submit mpc-auth multiSignRequest for minting a Uniswap V4 LP position. Batches ERC-20 approve(s) + Position Manager tx from LP create response.',\n prerequisites: ['ctm_uniswap_v4_lp_create_position output', 'keyGenId + chainId + purposeText'],\n followUp: [\n ...MCP_MULTISIGN_SUBMIT_FOLLOW_UP,\n 'After broadcast: ctm_uniswap_v4_register_position_from_mint_tx (mint tx hash)',\n ],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4MintLiquidityBatch',\n },\n inputZod: mcpUniswapV4BuildMintLiquidityMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_increase',\n actionId: 'uniswap-v4.lp-increase',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Call Uniswap LP API POST /lp/increase. Returns `increase` transaction calldata.',\n prerequisites: ['UNISWAP_API_KEY', 'nftTokenId from ctm_uniswap_v4_lp_list_positions'],\n followUp: ['ctm_uniswap_v4_build_increase_liquidity_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpIncreasePosition' },\n inputZod: mcpUniswapV4LpIncreaseInputSchema,\n outputZod: mcpUniswapV4LpIncreaseOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_increase_liquidity_multisign',\n actionId: 'uniswap-v4.increase-liquidity',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to increase Uniswap V4 position liquidity.',\n prerequisites: ['ctm_uniswap_v4_lp_increase output'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4IncreaseLiquidityBatch',\n },\n inputZod: mcpUniswapV4BuildIncreaseLiquidityMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_decrease',\n actionId: 'uniswap-v4.lp-decrease',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Call Uniswap LP API POST /lp/decrease. Returns `decrease` transaction calldata.',\n prerequisites: ['UNISWAP_API_KEY', 'nftTokenId'],\n followUp: ['ctm_uniswap_v4_build_decrease_liquidity_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpDecreasePosition' },\n inputZod: mcpUniswapV4LpDecreaseInputSchema,\n outputZod: mcpUniswapV4LpDecreaseOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_decrease_liquidity_multisign',\n actionId: 'uniswap-v4.decrease-liquidity',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to decrease Uniswap V4 position liquidity.',\n prerequisites: ['ctm_uniswap_v4_lp_decrease output'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4DecreaseLiquidityBatch',\n },\n inputZod: mcpUniswapV4BuildDecreaseLiquidityMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_collect',\n actionId: 'uniswap-v4.lp-claim',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Call Uniswap LP API POST /lp/claim to collect accrued fees from a V4 position.',\n prerequisites: ['UNISWAP_API_KEY', 'nftTokenId'],\n followUp: ['ctm_uniswap_v4_build_collect_fees_multisign'],\n handler: { importPath: 'protocols/evm/uniswap-v4', exportName: 'uniswapLpClaimFees' },\n inputZod: mcpUniswapV4LpClaimInputSchema,\n outputZod: mcpUniswapV4LpClaimOutputSchema,\n }),\n defineMultisignSubmitMcpTool({\n name: 'ctm_uniswap_v4_build_collect_fees_multisign',\n actionId: 'uniswap-v4.collect-fees',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description: 'Create and submit mpc-auth multiSignRequest to collect fees from a Uniswap V4 position.',\n prerequisites: ['ctm_uniswap_v4_lp_collect output'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'buildEvmMultisignBodyUniswapV4CollectFeesBatch',\n },\n inputZod: mcpUniswapV4BuildCollectFeesMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_lp_list_positions',\n actionId: 'uniswap-v4.lp-list-positions',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'List Uniswap V4 position NFTs from the node token registry (ERC721 entries for the Position Manager on this chain). Does not scan blockchain logs. Pass keyGenId + chainId.',\n prerequisites: ['keyGenId + chainId', 'Positions saved via register_position_nft or add_to_token_registry'],\n followUp: ['ctm_uniswap_v4_lp_increase', 'ctm_uniswap_v4_lp_decrease', 'ctm_uniswap_v4_lp_collect'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'uniswapV4ListPositionsRegistryMcpPlaceholder',\n },\n inputZod: mcpUniswapV4LpListPositionsInputSchema,\n outputZod: mcpUniswapV4LpListPositionsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_register_position_nft',\n actionId: 'uniswap-v4.register-position-nft',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Add a Uniswap V4 position NFT to the node token registry (ERC721, management-signed). Call after mint execute when tokenId is known.',\n prerequisites: ['chainId', 'tokenId', 'keyGenId for management signing'],\n followUp: ['ctm_uniswap_v4_lp_list_positions', 'ctm_uniswap_v4_lp_increase'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'uniswapV4RegisterPositionNftPlaceholder',\n },\n inputZod: mcpUniswapV4RegisterPositionNftInputSchema,\n outputZod: mcpUniswapV4RegisterPositionNftOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_uniswap_v4_register_position_from_mint_tx',\n actionId: 'uniswap-v4.register-position-from-mint-tx',\n protocolId: 'uniswap-v4',\n chainCategory: 'evm',\n description:\n 'Parse a completed mint transaction receipt for the new position tokenId and add it to the node token registry (management-signed).',\n prerequisites: ['chainId', 'txHash from mint batch execute', 'keyGenId'],\n followUp: ['ctm_uniswap_v4_lp_list_positions'],\n handler: {\n importPath: 'protocols/evm/uniswap-v4',\n exportName: 'uniswapV4RegisterPositionFromMintTxPlaceholder',\n },\n inputZod: mcpUniswapV4RegisterPositionFromMintTxInputSchema,\n outputZod: mcpUniswapV4RegisterPositionFromMintTxOutputSchema,\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 'get_defi_protocol_skill for native placeholder vs wrapped native on build',\n 'chainId + tokenIn + tokenOut + amountHuman',\n 'rpcGateway 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 defineMultisignSubmitMcpTool({\n name: 'ctm_curve_dao_build_swap_multisign',\n actionId: 'curve-dao.swap',\n protocolId: 'curve-dao',\n chainCategory: 'evm',\n description:\n 'Create and submit 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.',\n prerequisites: [\n 'ctm_curve_dao_quote (recommended)',\n 'keyGenId + chainId + purposeText + slippagePercent (0–100 exclusive)',\n 'get_defi_protocol_skill for tokenIn address rules',\n ],\n handler: { importPath: 'protocols/evm/curve-dao', exportName: 'buildEvmMultisignBodyCurveDaoBatch' },\n inputZod: mcpCurveDaoBuildSwapMultisignInputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_markets',\n actionId: 'gmx.fetch-markets',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'List GMX V2 perp markets for a chain (symbol, market token, maxLeverageLabel). Read-only; uses GMX HTTP API.',\n prerequisites: ['chainId'],\n followUp: ['ctm_gmx_build_increase_multisign', 'ctm_gmx_build_decrease_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchMarketsSummary' },\n inputZod: mcpGmxFetchMarketsInputSchema,\n outputZod: mcpGmxFetchMarketsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_positions',\n actionId: 'gmx.fetch-positions',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Fetch open GMX perp positions for an executor address. Read-only.',\n prerequisites: ['chainId', 'executorAddress (MPC ethereumaddress)'],\n followUp: ['ctm_gmx_build_decrease_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchPositionsForExecutor' },\n inputZod: mcpGmxFetchPositionsInputSchema,\n outputZod: mcpGmxFetchPositionsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_market_prices',\n actionId: 'gmx.fetch-market-prices',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Latest GMX index mark and collateral USD prices for a perp market. Read-only via GMX HTTP API.',\n prerequisites: ['chainId', 'symbol from ctm_gmx_fetch_markets', 'collateralSymbol e.g. USDC'],\n followUp: ['ctm_gmx_fetch_ohlcv', 'ctm_gmx_build_increase_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchMarketPrices' },\n inputZod: mcpGmxFetchMarketPricesInputSchema,\n outputZod: mcpGmxFetchMarketPricesOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_ohlcv',\n actionId: 'gmx.fetch-ohlcv',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'OHLCV candle table for a GMX perp index (USD). Default timeframe 15m. Read-only via GMX HTTP API.',\n prerequisites: ['chainId', 'symbol from ctm_gmx_fetch_markets'],\n followUp: ['ctm_gmx_fetch_market_prices'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchOhlcv' },\n inputZod: mcpGmxFetchOhlcvInputSchema,\n outputZod: mcpGmxFetchOhlcvOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_gm_markets',\n actionId: 'gmx.fetch-gm-markets',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'List GMX GM liquidity pool markets with long/short collateral symbols and estimated APY. Read-only.',\n prerequisites: ['chainId'],\n followUp: ['ctm_gmx_build_gm_deposit_multisign', 'ctm_gmx_build_gm_withdraw_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchGmMarkets' },\n inputZod: mcpGmxFetchGmMarketsInputSchema,\n outputZod: mcpGmxFetchGmMarketsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_gm_apy',\n actionId: 'gmx.fetch-gm-apy',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description:\n 'Fetch estimated GM liquidity pool APY for each GMX market (sorted highest first). Read-only.',\n prerequisites: ['chainId'],\n followUp: ['ctm_gmx_build_gm_deposit_multisign', 'ctm_gmx_fetch_gm_markets'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchGmApy' },\n inputZod: mcpGmxFetchGmApyInputSchema,\n outputZod: mcpGmxFetchGmApyOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_gmx_fetch_staking_power',\n actionId: 'gmx.fetch-staking-power',\n protocolId: 'gmx',\n chainCategory: 'evm',\n description: 'Fetch GMX token staking power for an executor address. Read-only.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_gmx_build_stake_gmx_multisign', 'ctm_gmx_build_unstake_gmx_multisign'],\n handler: { importPath: 'protocols/evm/gmx', exportName: 'gmxFetchStakingPower' },\n inputZod: mcpGmxFetchStakingPowerInputSchema,\n outputZod: mcpGmxFetchStakingPowerOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_markets',\n actionId: 'hyperliquid.fetch-markets',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'List Hyperliquid perp markets (native + all HIP-3 dexes when dex omitted). Each market has coin name, maxLeverage, szDecimals, and optional dex (e.g. xyz for xyz:AAPL). chainId 999 mainnet or 998 testnet.',\n prerequisites: ['chainId 999 or 998'],\n followUp: ['ctm_hyperliquid_fetch_open_context', 'ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchMarketsSummary' },\n inputZod: mcpHyperliquidFetchMarketsInputSchema,\n outputZod: mcpHyperliquidFetchMarketsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_search_markets',\n actionId: 'hyperliquid.search-markets',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Search Hyperliquid perp markets across all dexes by ticker (AAPL, BTC), display name, or keyword (Apple, tesla). Case-insensitive. Returns canonical coin names (e.g. xyz:AAPL).',\n prerequisites: ['chainId 999 or 998', 'query'],\n followUp: ['ctm_hyperliquid_fetch_open_context', 'ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidSearchMarketsSummary' },\n inputZod: mcpHyperliquidSearchMarketsInputSchema,\n outputZod: mcpHyperliquidSearchMarketsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_open_context',\n actionId: 'hyperliquid.fetch-open-context',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Per-market trading context: account value, withdrawable, margin used, leverage setting, mark price, available buy/sell size. Resolves ticker/name (AAPL, Apple) across dexes.',\n prerequisites: ['chainId', 'executorAddress', 'coin from fetch_markets'],\n followUp: ['ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchOpenContextSummary' },\n inputZod: mcpHyperliquidFetchOpenContextInputSchema,\n outputZod: mcpHyperliquidFetchOpenContextOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_positions',\n actionId: 'hyperliquid.fetch-positions',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Open Hyperliquid perp positions for executor (size, entry, uPnL, liq price, leverage, margin).',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_close_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchPositionsForExecutor' },\n inputZod: mcpHyperliquidFetchPositionsInputSchema,\n outputZod: mcpHyperliquidFetchPositionsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_open_orders',\n actionId: 'hyperliquid.fetch-open-orders',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Pending Hyperliquid open orders for executor (oid, coin, side, price, size).',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_cancel_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchOpenOrdersSummary' },\n inputZod: mcpHyperliquidFetchOpenOrdersInputSchema,\n outputZod: mcpHyperliquidFetchOpenOrdersOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_market_snapshot',\n actionId: 'hyperliquid.fetch-market-snapshot',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Live mark/mid price plus recent OHLCV candles for a Hyperliquid perp. Uses metaAndAssetCtxs for live prices (not stale candle close). Default interval 15m, 48 bars. Throws if live price unavailable.',\n prerequisites: ['chainId', 'coin'],\n followUp: ['ctm_hyperliquid_fetch_open_context', 'ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchMarketSnapshotSummary' },\n inputZod: mcpHyperliquidFetchMarketSnapshotInputSchema,\n outputZod: mcpHyperliquidFetchMarketSnapshotOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_ohlcv',\n actionId: 'hyperliquid.fetch-ohlcv',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'OHLCV candle history for a Hyperliquid perp over an explicit lookback or time range. Requests only the needed window from Hyperliquid (e.g. lookbackDays: 7, interval: 15m → ~672 bars). Max 2000 bars — use coarser interval for longer history. Resolves ticker/name across dexes.',\n prerequisites: ['chainId 999 or 998', 'coin', 'lookbackDays or lookbackHours or startTimeMs'],\n followUp: ['ctm_hyperliquid_fetch_market_snapshot', 'ctm_hyperliquid_build_limit_order_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchOhlcvSummary' },\n inputZod: mcpHyperliquidFetchOhlcvInputSchema,\n outputZod: mcpHyperliquidFetchOhlcvOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_usd_class_balances',\n actionId: 'hyperliquid.fetch-usd-balances',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'Spot USDC available and perp withdrawable USD for spot↔perp transfers.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_usd_transfer_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchUsdClassBalancesSummary' },\n inputZod: mcpHyperliquidFetchUsdClassBalancesInputSchema,\n outputZod: mcpHyperliquidFetchUsdClassBalancesOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_vaults',\n actionId: 'hyperliquid.fetch-vaults',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description:\n 'Vault catalog by TVL with APR (mainnet only; may take ~10–15s). Pass executorAddress to merge user-held vaults.',\n prerequisites: ['chainId 999 for catalog'],\n followUp: ['ctm_hyperliquid_build_vault_deposit_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchVaultCatalogSummary' },\n inputZod: mcpHyperliquidFetchVaultsInputSchema,\n outputZod: mcpHyperliquidFetchVaultsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_user_vault_equities',\n actionId: 'hyperliquid.fetch-user-vault-equities',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'USD equity the user holds in Hyperliquid vaults.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_vault_withdraw_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchUserVaultEquitiesSummary' },\n inputZod: mcpHyperliquidFetchUserVaultEquitiesInputSchema,\n outputZod: mcpHyperliquidFetchUserVaultEquitiesOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_staking_summary',\n actionId: 'hyperliquid.fetch-staking-summary',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'HYPE staking summary: delegated and undelegated amounts.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_stake_multisign', 'ctm_hyperliquid_build_delegate_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchStakingSummaryForExecutor' },\n inputZod: mcpHyperliquidFetchStakingSummaryInputSchema,\n outputZod: mcpHyperliquidFetchStakingSummaryOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_hyperliquid_fetch_delegations',\n actionId: 'hyperliquid.fetch-delegations',\n protocolId: 'hyperliquid',\n chainCategory: 'evm',\n description: 'HYPE delegations by validator for executor.',\n prerequisites: ['chainId', 'executorAddress'],\n followUp: ['ctm_hyperliquid_build_undelegate_multisign'],\n handler: { importPath: 'protocols/evm/hyperliquid', exportName: 'hyperliquidFetchDelegationsForExecutor' },\n inputZod: mcpHyperliquidFetchDelegationsInputSchema,\n outputZod: mcpHyperliquidFetchDelegationsOutputSchema,\n }),\n defineMcpTool({\n name: 'ctm_morpho_fetch_earn_vaults',\n actionId: 'morpho.fetch-earn-vaults',\n protocolId: 'morpho',\n chainCategory: 'evm',\n description:\n 'Morpho-listed earn vaults (V1 + V2 unified). Filter by deposit asset symbol/address and/or case-insensitive vault name search. Returns vaultAddress for deposit/withdraw multisign tools.',\n prerequisites: ['chainId'],\n followUp: [\n 'ctm_morpho_build_vault_deposit_multisign',\n 'ctm_morpho_build_vault_withdraw_multisign',\n ],\n handler: { importPath: 'protocols/evm/morpho', exportName: 'morphoFetchEarnVaultsSummary' },\n inputZod: mcpMorphoFetchEarnVaultsInputSchema,\n outputZod: mcpMorphoFetchEarnVaultsOutputSchema,\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 multisignSubmitOutput: MULTISIGN_SUBMIT_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 → { requestId } (MCP auto-submits)',\n '4. wait_for_sign_request_ready → sign_request_agree → trigger_sign_result → broadcast_sign_result',\n ],\n evmSwapManualTypical: [\n '1. Quote (protocol-specific API if needed)',\n '2. Build protocol calldata',\n '3. Protocol builder → { bodyForSign, messageToSign } (node app only)',\n '4. Sign messageToSign and 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 morphoGraphqlProxyUrl: 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 setMorphoGraphqlProxyUrl(url: string | undefined): void {\n morphoGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoGraphqlProxyUrl(): string | undefined {\n return morphoGraphqlProxyUrl\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","/** GMX V2 production chains supported in Continuum multi-sign v1. */\nexport const GMX_SUPPORTED_CHAIN_IDS = [42161, 43114] as const\n\nexport type GmxSupportedChainId = (typeof GMX_SUPPORTED_CHAIN_IDS)[number]\n\nexport function isGmxChainSupported(chainId: number): chainId is GmxSupportedChainId {\n return (GMX_SUPPORTED_CHAIN_IDS as readonly number[]).includes(chainId)\n}\n","import { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { isGmxChainSupported } from './support.js'\n\nconst require = createRequire(fileURLToPath(import.meta.url))\nconst { GmxApiSdk } = require('@gmx-io/sdk/v2') as {\n GmxApiSdk: new (args: { chainId: number; api?: GmxHttpApi }) => GmxApiSdkInstance\n}\n\nconst GMX_HTTP_TIMEOUT_MS = 30_000\n\n/** Prefer .io (primary GMX API); .ai is secondary. Base host only — SDK paths include `/v1/...`. */\nconst GMX_API_BASE_URLS: Record<number, readonly [string, string]> = {\n 42161: ['https://arbitrum.gmxapi.io', 'https://arbitrum.gmxapi.ai'],\n 43114: ['https://avalanche.gmxapi.io', 'https://avalanche.gmxapi.ai'],\n}\n\ntype GmxHttpApi = {\n fetchJson: (path: string, opts?: GmxFetchJsonOpts) => Promise<unknown>\n postJson: (path: string, body: unknown, opts?: GmxPostJsonOpts) => Promise<unknown>\n}\n\ntype GmxFetchJsonOpts = {\n query?: Record<string, unknown>\n transform?: (raw: unknown) => unknown\n}\n\ntype GmxPostJsonOpts = {\n transform?: (raw: unknown) => unknown\n}\n\nfunction buildGmxUrl(baseUrl: string, path: string, query?: Record<string, unknown>): string {\n const base = baseUrl.replace(/\\/$/, '')\n if (!query) return `${base}${path}`\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) params.set(key, String(value))\n }\n const qs = params.toString()\n return qs ? `${base}${path}?${qs}` : `${base}${path}`\n}\n\nfunction bigintReplacer(_key: string, value: unknown) {\n return typeof value === 'bigint' ? value.toString() : value\n}\n\nasync function gmxHttpFetchJson(baseUrl: string, path: string, opts?: GmxFetchJsonOpts): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path, opts?.query)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const body = (await response.json()) as { message?: string }\n if (body?.message) message = `HTTP ${response.status}: ${body.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nasync function gmxHttpPostJson(\n baseUrl: string,\n path: string,\n body: unknown,\n opts?: GmxPostJsonOpts,\n): Promise<unknown> {\n const url = buildGmxUrl(baseUrl, path)\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), GMX_HTTP_TIMEOUT_MS)\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify(body, bigintReplacer),\n signal: controller.signal,\n })\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`\n try {\n const errBody = (await response.json()) as { message?: string }\n if (errBody?.message) message = `HTTP ${response.status}: ${errBody.message}`\n } catch {\n // ignore parse errors\n }\n throw new Error(`${message} (${url})`)\n }\n const json = await response.json()\n return opts?.transform ? opts.transform(json) : json\n } finally {\n clearTimeout(timeoutId)\n }\n}\n\nfunction createIoFirstGmxHttpApi(chainId: number): GmxHttpApi {\n const urls = GMX_API_BASE_URLS[chainId]\n if (!urls) {\n throw new Error(`GMX API URLs are not configured for chain ${chainId}.`)\n }\n async function withIoFirstFallback<T>(fn: (baseUrl: string) => Promise<T>): Promise<T> {\n let lastError: unknown\n for (const baseUrl of urls) {\n try {\n return await fn(baseUrl)\n } catch (e) {\n lastError = e\n }\n }\n const detail = lastError instanceof Error ? lastError.message : String(lastError)\n throw new Error(\n `GMX API request failed on all endpoints (${urls.join(', ')}). Last error: ${detail}`,\n )\n }\n return {\n fetchJson: (path, opts) => withIoFirstFallback((baseUrl) => gmxHttpFetchJson(baseUrl, path, opts)),\n postJson: (path, body, opts) => withIoFirstFallback((baseUrl) => gmxHttpPostJson(baseUrl, path, body, opts)),\n }\n}\n\nexport type GmxApiSdkInstance = {\n fetchMarkets: () => Promise<GmxMarketRow[]>\n fetchMarketsTickers: (args?: { symbols?: string[] }) => Promise<unknown[]>\n fetchOhlcv: (args: {\n symbol: string\n timeframe: string\n limit?: number\n since?: number\n }) => Promise<Array<{ timestamp: number; open: string; high: string; low: string; close: string }>>\n fetchTokens: () => Promise<GmxTokenRow[]>\n fetchTokensData: () => Promise<unknown[]>\n fetchPositionsInfo: (args: { address: string; includeRelatedOrders?: boolean }) => Promise<GmxPositionRow[]>\n fetchOrders: (args: { address: string }) => Promise<GmxOrderRow[]>\n fetchStakingPower: (args: { address: string }) => Promise<Record<string, unknown>>\n fetchApy: (params?: Record<string, unknown>) => Promise<Record<string, unknown>>\n prepareOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n prepareCancelOrder: (args: Record<string, unknown>) => Promise<GmxPrepareOrderResponse>\n}\n\nexport type GmxMarketRow = {\n symbol: string\n marketTokenAddress: string\n indexTokenAddress?: string\n longTokenAddress?: string\n shortTokenAddress?: string\n isSpotOnly?: boolean\n isListed?: boolean\n}\n\nexport type GmxTokenRow = {\n symbol: string\n address: string\n decimals: number\n}\n\nexport type GmxPositionRow = {\n key?: string\n indexName?: string\n isLong?: boolean\n sizeInUsd?: bigint | string | number\n collateralUsd?: bigint | string | number\n marketAddress?: string\n}\n\nexport type GmxOrderRow = {\n key?: string\n isLong?: boolean\n sizeDeltaUsd?: bigint | string | number\n triggerPrice?: bigint | string | number\n}\n\nexport type GmxPrepareOrderResponse = {\n requestId?: string\n payloadType: 'transaction' | 'typed-data'\n mode: string\n payload: {\n to?: string\n data?: string\n value?: string | bigint | number\n }\n estimates?: Record<string, unknown>\n}\n\nconst sdkByChain = new Map<number, GmxApiSdkInstance>()\n\nexport function getGmxApiSdk(chainId: number): GmxApiSdkInstance {\n if (!isGmxChainSupported(chainId)) {\n throw new Error(`GMX is not supported on chain ${chainId}. Supported: 42161 (Arbitrum), 43114 (Avalanche).`)\n }\n let sdk = sdkByChain.get(chainId)\n if (!sdk) {\n sdk = new GmxApiSdk({ chainId, api: createIoFirstGmxHttpApi(chainId) })\n sdkByChain.set(chainId, sdk)\n }\n return sdk\n}\n","import { getAddress } from 'viem'\nimport { gmxEnrichGmMarketRowWithApy, type GmxMarketApySource } from './apy.js'\nimport { getGmxApiSdk, type GmxMarketRow, type GmxTokenRow } from './api.js'\n\nexport async function gmxFetchMarkets(chainId: number): Promise<GmxMarketRow[]> {\n const sdk = getGmxApiSdk(chainId)\n const markets = await sdk.fetchMarkets()\n return markets\n .filter((m) => !m.isSpotOnly && m.isListed !== false)\n .sort((a, b) => a.symbol.localeCompare(b.symbol, undefined, { sensitivity: 'base' }))\n}\n\nexport async function gmxFetchTokens(chainId: number): Promise<GmxTokenRow[]> {\n const sdk = getGmxApiSdk(chainId)\n return sdk.fetchTokens()\n}\n\nexport async function gmxResolveTokenBySymbol(chainId: number, symbol: string): Promise<GmxTokenRow> {\n const sym = symbol.trim().toUpperCase()\n const tokens = await gmxFetchTokens(chainId)\n const row = tokens.find((t) => t.symbol?.toUpperCase() === sym)\n if (!row) throw new Error(`GMX token symbol not found on chain ${chainId}: ${symbol}`)\n return row\n}\n\nexport async function gmxIsCollateralTokenSupported(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const addr = getAddress(tokenAddress).toLowerCase()\n const tokens = await gmxFetchTokens(chainId)\n return tokens.some((t) => t.address?.toLowerCase() === addr)\n } catch {\n return false\n }\n}\n\n/** Parse collateral pool tokens from e.g. `ETH/USD [WETH-USDC]` → `WETH`, `USDC`. */\nexport function gmxMarketCollateralTokens(marketSymbol: string): string[] {\n const m = marketSymbol.match(/\\[([^[\\]]+)\\]/)\n if (!m?.[1]) return []\n return m[1].split('-').map((s) => s.trim()).filter(Boolean)\n}\n\nexport function gmxMarketAcceptsCollateral(marketSymbol: string, collateralSymbol: string): boolean {\n const col = collateralSymbol.trim().toUpperCase()\n if (!col) return true\n const tokens = gmxMarketCollateralTokens(marketSymbol)\n if (tokens.length === 0) return true\n return tokens.some((t) => t.toUpperCase() === col)\n}\n\nexport async function gmxMarketsForCollateralSymbol(\n chainId: number,\n collateralSymbol: string,\n): Promise<GmxMarketRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n return markets.filter((m) => gmxMarketAcceptsCollateral(m.symbol, collateralSymbol))\n}\n\nexport async function gmxResolveMarketBySymbol(chainId: number, symbol: string): Promise<GmxMarketRow> {\n const sym = symbol.trim()\n const markets = await gmxFetchMarkets(chainId)\n const row = markets.find((m) => m.symbol === sym)\n if (!row) throw new Error(`GMX market symbol not found on chain ${chainId}: ${symbol}`)\n if (!row.longTokenAddress || !row.shortTokenAddress) {\n throw new Error(`GMX market \"${symbol}\" is missing long/short token addresses.`)\n }\n return row\n}\n\nexport async function gmxResolveMarketByGmTokenAddress(\n chainId: number,\n gmTokenAddress: string,\n): Promise<GmxMarketRow | null> {\n const addr = getAddress(gmTokenAddress).toLowerCase()\n const markets = await gmxFetchMarkets(chainId)\n return markets.find((m) => m.marketTokenAddress?.toLowerCase() === addr) ?? null\n}\n\nexport type GmxGmMarketSummaryRow = {\n symbol: string\n marketTokenAddress: string\n longTokenSymbol: string | null\n shortTokenSymbol: string | null\n apy: number | null\n baseApy: number | null\n bonusApr: number | null\n apyPercentLabel: string | null\n}\n\nexport async function gmxFetchGmMarketsSummary(chainId: number): Promise<GmxGmMarketSummaryRow[]> {\n const markets = await gmxFetchMarkets(chainId)\n const tokens = await gmxFetchTokens(chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t.symbol]))\n const sdk = getGmxApiSdk(chainId)\n const emptyApyMarkets: Record<string, GmxMarketApySource> = {}\n const apyRes = await sdk.fetchApy().catch(() => ({ markets: emptyApyMarkets }))\n const apyByMarket = (apyRes.markets ?? emptyApyMarkets) as Record<string, GmxMarketApySource>\n return markets.map((m) =>\n gmxEnrichGmMarketRowWithApy(\n {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n longTokenSymbol: tokenByAddr.get((m.longTokenAddress ?? '').toLowerCase()) ?? null,\n shortTokenSymbol: tokenByAddr.get((m.shortTokenAddress ?? '').toLowerCase()) ?? null,\n },\n apyByMarket,\n ),\n )\n}\n","import { getAddress } from 'viem'\nimport { getGmxApiSdk } from './api.js'\nimport { gmxFormatPositionsForDisplay } from './positionDisplay.js'\nimport { gmxMarketMaxLeverageLabel } from './leverage.js'\nimport { loadGmxMarketContext } from './marketContext.js'\nimport {\n gmxFetchGmMarketsSummary,\n gmxFetchMarkets,\n gmxFetchTokens,\n gmxResolveMarketByGmTokenAddress,\n} from './markets.js'\nimport { gmxContractAddress } from './contracts.js'\n\nexport async function gmxFetchPositionsForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const positions = await sdk.fetchPositionsInfo({\n address: args.executorAddress,\n includeRelatedOrders: true,\n })\n return {\n positions: positions as Array<Record<string, unknown>>,\n }\n}\n\nexport async function gmxFetchPositionDisplayRows(args: { chainId: number; executorAddress: string }) {\n const { positions } = await gmxFetchPositionsForExecutor(args)\n return gmxFormatPositionsForDisplay(args.chainId, positions)\n}\n\nexport async function gmxFetchOrdersForExecutor(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n return sdk.fetchOrders({ address: args.executorAddress })\n}\n\nexport async function gmxFetchMarketsSummary(args: { chainId: number }) {\n const [markets, ctx] = await Promise.all([gmxFetchMarkets(args.chainId), loadGmxMarketContext(args.chainId)])\n return {\n markets: markets.map((m) => {\n const addr = String(m.marketTokenAddress ?? '')\n const info =\n ctx.marketsInfoData[addr] ??\n ctx.marketsInfoData[addr.toLowerCase()] ??\n Object.values(ctx.marketsInfoData).find(\n (row) => String(row.marketTokenAddress ?? '').toLowerCase() === addr.toLowerCase(),\n )\n return {\n symbol: m.symbol,\n marketTokenAddress: m.marketTokenAddress,\n maxLeverageLabel: info ? gmxMarketMaxLeverageLabel(info) : null,\n }\n }),\n }\n}\n\nexport async function gmxFetchCollateralTokens(args: { chainId: number }) {\n const tokens = await gmxFetchTokens(args.chainId)\n return tokens.map((t) => ({\n symbol: t.symbol,\n address: t.address,\n decimals: t.decimals,\n }))\n}\n\nexport async function gmxFetchGmMarkets(args: { chainId: number }) {\n const markets = await gmxFetchGmMarketsSummary(args.chainId)\n return { markets }\n}\n\n/** GM liquidity pool APY per market (sorted highest APY first). Read-only. */\nexport async function gmxFetchGmApy(args: { chainId: number }) {\n const { markets } = await gmxFetchGmMarkets(args)\n const sorted = [...markets].sort((a, b) => (b.apy ?? 0) - (a.apy ?? 0))\n return { markets: sorted }\n}\n\nexport async function gmxFetchStakingPower(args: { chainId: number; executorAddress: string }) {\n const sdk = getGmxApiSdk(args.chainId)\n const power = await sdk.fetchStakingPower({ address: args.executorAddress })\n return {\n stakingPower: JSON.parse(JSON.stringify(power, (_, v) => (typeof v === 'bigint' ? v.toString() : v))),\n }\n}\n\nexport async function gmxFetchGmMarketForToken(args: { chainId: number; gmTokenAddress: string }) {\n const market = await gmxResolveMarketByGmTokenAddress(args.chainId, args.gmTokenAddress)\n if (!market) return { market: null }\n const tokens = await gmxFetchTokens(args.chainId)\n const tokenByAddr = new Map(tokens.map((t) => [t.address.toLowerCase(), t]))\n const long = tokenByAddr.get((market.longTokenAddress ?? '').toLowerCase())\n const short = tokenByAddr.get((market.shortTokenAddress ?? '').toLowerCase())\n return {\n market: {\n symbol: market.symbol,\n marketTokenAddress: market.marketTokenAddress,\n longTokenSymbol: long?.symbol ?? null,\n shortTokenSymbol: short?.symbol ?? null,\n gmDecimals: 18,\n },\n }\n}\n\nexport function gmxGmxTokenAddress(chainId: number): string {\n return gmxContractAddress(chainId, 'GMX')\n}\n\nexport async function gmxIsGmMarketTokenAddress(chainId: number, tokenAddress: string): Promise<boolean> {\n try {\n const market = await gmxResolveMarketByGmTokenAddress(chainId, tokenAddress)\n return market != null\n } catch {\n return false\n }\n}\n\nexport function gmxIsGmxStakeTokenAddress(chainId: number, tokenAddress: string): boolean {\n try {\n return getAddress(tokenAddress).toLowerCase() === gmxGmxTokenAddress(chainId).toLowerCase()\n } catch {\n return false\n }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isGmxChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './api.js'\nexport * from './amounts.js'\nexport * from './apy.js'\nexport * from './markets.js'\nexport * from './reads.js'\nexport * from './multisign.js'\nexport * from './gmLiquidityMultisign.js'\nexport * from './gmxTokenStakingMultisign.js'\nexport * from './contracts.js'\nexport * from './executionFee.js'\nexport * from './gmLiquidityReads.js'\nexport * from './format.js'\nexport * from './estimates.js'\nexport * from './leverage.js'\nexport * from './positionDisplay.js'\nexport * from './prices.js'\nexport * from './native.js'\n\nexport const GMX_PROTOCOL_ID = 'gmx'\n\nexport const gmxProtocolModule: ProtocolModule = {\n id: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const chainId = typeof ctx.chainId === 'number' ? ctx.chainId : Number(ctx.chainId)\n return Number.isFinite(chainId) && isGmxChainSupported(chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'erc20'\n },\n actions: [\n {\n id: 'gmx.increase',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Open or add to a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol e.g. ETH/USD [WETH-USDC]' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Position size in USD' },\n collateralToken: { type: 'string', required: true, description: 'Collateral token symbol e.g. USDC' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Collateral amount in token units' },\n },\n },\n {\n id: 'gmx.decrease',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Close or reduce a GMX perp position (classic on-chain order)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n symbol: { type: 'string', required: true, description: 'GMX market symbol' },\n direction: { type: 'string', required: true, description: 'long or short' },\n orderType: { type: 'string', required: true, description: 'market or limit' },\n sizeUsdHuman: { type: 'string', required: true, description: 'Size to close in USD' },\n collateralToken: { type: 'string', required: true, description: 'Position collateral token symbol' },\n },\n },\n {\n id: 'gmx.cancel',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Cancel a pending GMX order (classic on-chain)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n orderId: { type: 'string', required: true, description: 'Order key from fetchOrders' },\n },\n },\n {\n id: 'gmx.gmDeposit',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Deposit collateral into a GMX GM liquidity pool (ExchangeRouter multicall)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol e.g. ETH/USD [WETH-USDC]' },\n collateralToken: { type: 'string', required: true, description: 'Pool collateral token symbol' },\n collateralAmountHuman: { type: 'string', required: true, description: 'Amount in token units' },\n },\n },\n {\n id: 'gmx.gmWithdraw',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Withdraw GM market tokens from a GMX liquidity pool',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n marketSymbol: { type: 'string', required: true, description: 'GM market symbol' },\n gmAmountHuman: { type: 'string', required: true, description: 'GM token amount to withdraw' },\n },\n },\n {\n id: 'gmx.stakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Stake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to stake' },\n },\n },\n {\n id: 'gmx.unstakeGmx',\n protocolId: GMX_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Unstake GMX tokens via RewardRouter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n amountHuman: { type: 'string', required: true, description: 'GMX amount to unstake' },\n },\n },\n ],\n}\n\nregisterProtocolModule(gmxProtocolModule)\n","/** HyperEVM chains for Hyperliquid CoreWriter integration. */\nexport const HYPERLIQUID_SUPPORTED_CHAIN_IDS = [999, 998] as const\n\nexport type HyperliquidSupportedChainId = (typeof HYPERLIQUID_SUPPORTED_CHAIN_IDS)[number]\n\nexport function isHyperliquidChainSupported(chainId: number): chainId is HyperliquidSupportedChainId {\n return (HYPERLIQUID_SUPPORTED_CHAIN_IDS as readonly number[]).includes(chainId)\n}\n\nexport function hyperliquidApiBaseUrl(chainId: number): string {\n return chainId === 998 ? 'https://api.hyperliquid-testnet.xyz' : 'https://api.hyperliquid.xyz'\n}\n\n/** Stats feed used by app.hyperliquid.xyz/vaults (official vaultSummaries returns []). */\nexport function hyperliquidVaultStatsUrl(chainId: number): string | null {\n return chainId === 998 ? null : 'https://stats-data.hyperliquid.xyz/Mainnet/vaults'\n}\n\nexport const HYPERLIQUID_HLP_VAULT_ADDRESS = '0xdfc24b077bc1425ad1dea75bcb6f8158e10df303'\n\n/** HIP-3 coins use `{dex}:{symbol}` (e.g. `xyz:AAPL`). Returns dex segment when present. */\nexport function hyperliquidInferDexFromCoin(coin: string): string | undefined {\n const trimmed = coin.trim()\n const sep = trimmed.indexOf(':')\n if (sep <= 0) return undefined\n return trimmed.slice(0, sep)\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isHyperliquidChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './constants.js'\nexport * from './api.js'\nexport * from './assets.js'\nexport * from './marketSearch.js'\nexport * from './reads.js'\nexport * from './coreWriter.js'\nexport * from './multisign.js'\nexport * from './vaultMultisign.js'\nexport * from './stakingMultisign.js'\n\nexport const HYPERLIQUID_PROTOCOL_ID = 'hyperliquid'\n\nexport const hyperliquidProtocolModule: ProtocolModule = {\n id: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const chainId = typeof ctx.chainId === 'number' ? ctx.chainId : Number(ctx.chainId)\n return Number.isFinite(chainId) && isHyperliquidChainSupported(chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'erc20' || token.kind === 'native'\n },\n actions: [\n {\n id: 'hyperliquid.limitOrder',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Place a Hyperliquid limit/IoC order via HyperEVM CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n coin: { type: 'string', required: true, description: 'Market coin e.g. BTC' },\n isBuy: { type: 'boolean', required: true, description: 'true for buy/long, false for sell/short' },\n limitPxHuman: { type: 'string', required: true, description: 'Limit price' },\n szHuman: { type: 'string', required: true, description: 'Order size in coin units' },\n marketKind: { type: 'string', required: false, description: 'perp (default) or spot' },\n tif: { type: 'string', required: false, description: 'gtc, ioc, or alo' },\n dex: { type: 'string', required: false, description: 'HIP-3 dex name when applicable' },\n },\n },\n {\n id: 'hyperliquid.close',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Close or reduce a perp via IoC reduce-only limit order (CoreWriter)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n coin: { type: 'string', required: true, description: 'Market coin' },\n isLong: { type: 'boolean', required: true, description: 'true if closing a long position' },\n limitPxHuman: { type: 'string', required: true, description: 'Limit price' },\n szHuman: { type: 'string', required: true, description: 'Size to close in coin units' },\n },\n },\n {\n id: 'hyperliquid.cancel',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Cancel a Hyperliquid open order via CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n coin: { type: 'string', required: true, description: 'Market coin' },\n oid: { type: 'number', required: true, description: 'Order id from openOrders' },\n },\n },\n {\n id: 'hyperliquid.usdTransfer',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Move USDC between Hyperliquid spot and perp margin accounts',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n usdHuman: { type: 'string', required: true, description: 'USD amount' },\n toPerp: { type: 'boolean', required: true, description: 'true spot→perp, false perp→spot' },\n },\n },\n {\n id: 'hyperliquid.vaultDeposit',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Deposit USD into a Hyperliquid vault',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n vaultAddress: { type: 'string', required: true, description: 'Vault address' },\n usdHuman: { type: 'string', required: true, description: 'USD amount' },\n },\n },\n {\n id: 'hyperliquid.vaultWithdraw',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Withdraw USD from a Hyperliquid vault (includes accrued PnL)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n vaultAddress: { type: 'string', required: true, description: 'Vault address' },\n usdHuman: { type: 'string', required: true, description: 'USD amount' },\n },\n },\n {\n id: 'hyperliquid.stake',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Stake HYPE via CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n },\n },\n {\n id: 'hyperliquid.unstake',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Unstake HYPE via CoreWriter',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n },\n },\n {\n id: 'hyperliquid.delegate',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Delegate staked HYPE to a validator',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n validator: { type: 'string', required: true, description: 'Validator address' },\n },\n },\n {\n id: 'hyperliquid.undelegate',\n protocolId: HYPERLIQUID_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Undelegate HYPE from a validator',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n hypeHuman: { type: 'string', required: true, description: 'HYPE amount' },\n validator: { type: 'string', required: true, description: 'Validator address' },\n },\n },\n ],\n}\n\nregisterProtocolModule(hyperliquidProtocolModule)\n","import { getAddress, isAddress } from 'viem'\nimport { getMorphoGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\n\nexport const MORPHO_GRAPHQL_URL = 'https://api.morpho.org/graphql'\n\ntype GqlError = { message?: string }\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function morphoGql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const j = await postJsonViaOptionalProxy<GqlData<T>>({\n directUrl: MORPHO_GRAPHQL_URL,\n body,\n proxyUrl: getMorphoGraphqlProxyUrl(),\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) throw new Error('Morpho API: empty response')\n return j.data\n}\n\nexport type MorphoChainRow = { id: number; network?: string | null }\n\nexport async function fetchMorphoChains(): Promise<readonly MorphoChainRow[]> {\n const d = await morphoGql<{ chains: MorphoChainRow[] }>(`\n query { chains { id network } }\n `)\n return d.chains ?? []\n}\n\nexport async function loadMorphoSupportedChainIds(): Promise<ReadonlySet<number>> {\n const rows = await fetchMorphoChains()\n const s = new Set<number>()\n for (const c of rows) {\n if (typeof c.id === 'number' && Number.isFinite(c.id)) s.add(c.id)\n }\n return s\n}\n\nexport type MorphoAssetRef = {\n address?: string | null\n symbol?: string | null\n decimals?: number | null\n price?: { usd?: number | null } | null\n}\n\nexport type MorphoMarketApiRow = {\n marketId: string\n loanAsset: MorphoAssetRef\n collateralAsset: MorphoAssetRef\n lltv: string\n irmAddress: string\n oracle: { address: string }\n morphoBlue: { address: string }\n state?: {\n supplyApy?: number | null\n borrowApy?: number | null\n netSupplyApy?: number | null\n netBorrowApy?: number | null\n supplyAssetsUsd?: number | null\n borrowAssetsUsd?: number | null\n collateralAssetsUsd?: number | null\n utilization?: number | null\n rewards?: readonly { asset?: MorphoAssetRef | null; supplyApr?: number | null; borrowApr?: number | null }[] | null\n } | null\n}\n\nexport type MorphoVaultApiRow = {\n address: string\n symbol?: string | null\n name?: string | null\n listed?: boolean | null\n asset: MorphoAssetRef\n chain?: { id: number } | null\n liquidity?: { usd?: number | null } | null\n state?: {\n apy?: number | null\n netApy?: number | null\n fee?: number | null\n totalAssetsUsd?: number | null\n allRewards?: readonly { asset?: MorphoAssetRef | null; supplyApr?: number | null }[] | null\n } | null\n}\n\n/** Morpho Vault V2 — APY/TVL on the vault node (not nested `state`). */\nexport type MorphoVaultV2ApiRow = {\n address: string\n symbol?: string | null\n name?: string | null\n asset: MorphoAssetRef\n chain?: { id: number } | null\n listed?: boolean | null\n apy?: number | null\n netApy?: number | null\n totalAssetsUsd?: number | null\n liquidityUsd?: number | null\n performanceFee?: number | null\n managementFee?: number | null\n rewards?: readonly { asset?: MorphoAssetRef | null; supplyApr?: number | null }[] | null\n}\n\nexport function morphoKeyForAssetRow(args: {\n contractAddress: string\n nativeWrapped?: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n if (!raw) return null\n const lower = raw.toLowerCase()\n if (lower === '0x0000000000000000000000000000000000000000' || lower === 'native') {\n const w = (args.nativeWrapped ?? '').trim()\n if (!w || !isAddress(w)) return null\n return getAddress(w).toLowerCase()\n }\n if (!isAddress(raw)) return null\n return getAddress(raw).toLowerCase()\n}\n\nexport function formatMorphoApyPct(apy: number | null | undefined): string {\n if (apy == null || !Number.isFinite(apy)) return '—'\n return `${(apy * 100).toFixed(2)}%`\n}\n\n/** Morpho fee fields are decimals (0.1 = 10%). */\nexport function formatMorphoFeePct(fee: number | null | undefined): string {\n if (fee == null || !Number.isFinite(fee)) return '—'\n return `${(fee * 100).toFixed(2)}%`\n}\n\nexport function formatMorphoUsd(n: number | null | undefined): string {\n if (n == null || !Number.isFinite(n)) return '—'\n if (n >= 1_000_000) return `$${(n / 1_000_000).toFixed(2)}M`\n if (n >= 1_000) return `$${(n / 1_000).toFixed(2)}K`\n return `$${n.toFixed(2)}`\n}\n","import { getAddress, isAddress } from 'viem'\nimport {\n morphoGql,\n morphoKeyForAssetRow,\n formatMorphoApyPct,\n formatMorphoFeePct,\n formatMorphoUsd,\n type MorphoVaultApiRow,\n type MorphoVaultV2ApiRow,\n} from './api.js'\nimport { enrichMorphoEarnOfferingRowsForAgent, emptyMorphoEarnVaultDetailFields } from './vaultEarnDetails.js'\n\nconst EMPTY_EARN_DETAIL = emptyMorphoEarnVaultDetailFields()\n\nexport type MorphoEarnOfferingRow = {\n vaultAddress: string\n vaultSymbol: string\n vaultName: string\n underlyingAddress: string\n underlyingSymbol: string\n underlyingDecimals: number\n apyLabel: string\n netApyLabel: string\n performanceFeeLabel: string\n managementFeeLabel: string\n totalAssetsUsdLabel: string\n liquidityUsdLabel: string\n netApy7dLabel: string\n netApy30dLabel: string\n netApy90dLabel: string\n exposure: MorphoEarnVaultExposureRow[]\n vaultId: string\n /** V1 meta-morpho vault vs Vault V2 (ERC-4626). */\n vaultGeneration: 'v1' | 'v2'\n}\n\nexport type MorphoEarnVaultExposureRow = {\n label: string\n allocatedUsdLabel: string\n allocationPercentLabel: string\n}\n\n/** Agent/MCP-facing earn vault row (V1 + V2 unified; no generation field). */\nexport type MorphoEarnVaultDiscoveryRow = {\n vaultAddress: string\n vaultName: string\n vaultSymbol: string\n underlyingAddress: string\n underlyingSymbol: string\n apy: string\n netApy: string\n netApy7d: string\n netApy30d: string\n netApy90d: string\n performanceFee: string\n managementFee: string | null\n totalDepositsUsd: string\n liquidityUsd: string\n exposure: MorphoEarnVaultExposureRow[]\n}\n\nconst VAULT_PAGE_SIZE = 100\nconst VAULT_ASSET_QUERY_LIMIT = 200\nconst DISCOVERY_DEFAULT_LIMIT = 50\nconst DISCOVERY_CHAIN_FETCH_LIMIT = 300\n\nfunction parseUsdLabel(s: string): number {\n const n = parseFloat(s.replace(/[^0-9.]/g, ''))\n return Number.isFinite(n) ? n : 0\n}\n\nfunction sortEarnRowsByTvl(rows: MorphoEarnOfferingRow[]): MorphoEarnOfferingRow[] {\n return [...rows].sort((a, b) => parseUsdLabel(b.totalAssetsUsdLabel) - parseUsdLabel(a.totalAssetsUsdLabel))\n}\n\nexport function morphoEarnOfferingToDiscoveryRow(row: MorphoEarnOfferingRow): MorphoEarnVaultDiscoveryRow {\n const mgmt = row.managementFeeLabel\n return {\n vaultAddress: row.vaultAddress,\n vaultName: row.vaultName,\n vaultSymbol: row.vaultSymbol,\n underlyingAddress: row.underlyingAddress,\n underlyingSymbol: row.underlyingSymbol,\n apy: row.apyLabel,\n netApy: row.netApyLabel,\n netApy7d: row.netApy7dLabel,\n netApy30d: row.netApy30dLabel,\n netApy90d: row.netApy90dLabel,\n performanceFee: row.performanceFeeLabel,\n managementFee: mgmt === '—' || mgmt === '0.00%' ? null : mgmt,\n totalDepositsUsd: row.totalAssetsUsdLabel,\n liquidityUsd: row.liquidityUsdLabel,\n exposure: row.exposure,\n }\n}\n\nfunction matchesMorphoVaultSearch(row: MorphoEarnVaultDiscoveryRow, query: string): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return true\n const haystack = [row.vaultName, row.vaultSymbol, row.vaultAddress, row.underlyingSymbol].join(' ').toLowerCase()\n return haystack.includes(q)\n}\n\nfunction matchesMorphoUnderlyingFilter(row: MorphoEarnVaultDiscoveryRow, underlying: string): boolean {\n const u = underlying.trim()\n if (!u) return true\n if (isAddress(u)) {\n try {\n return row.underlyingAddress.toLowerCase() === getAddress(u).toLowerCase()\n } catch {\n return false\n }\n }\n return row.underlyingSymbol.toLowerCase().includes(u.toLowerCase())\n}\n\nasync function fetchAllListedEarnVaultsForChain(chainId: number): Promise<MorphoEarnOfferingRow[]> {\n const [v1Vaults, v2Vaults] = await Promise.all([\n fetchMorphoVaultsForChain(chainId, DISCOVERY_CHAIN_FETCH_LIMIT),\n fetchMorphoVaultV2sForChain(chainId, DISCOVERY_CHAIN_FETCH_LIMIT, 0),\n ])\n const byAddr = new Map<string, MorphoEarnOfferingRow>()\n const defaultDecimals = 18\n\n for (const v of v1Vaults) {\n if (v.listed === false) continue\n const row = earnRowFromVault({\n chainId,\n address: v.address,\n symbol: v.symbol,\n name: v.name,\n asset: v.asset,\n apy: v.state?.apy,\n netApy: v.state?.netApy,\n performanceFee: v.state?.fee,\n managementFee: null,\n totalAssetsUsd: v.state?.totalAssetsUsd,\n underlyingDecimals: v.asset?.decimals ?? defaultDecimals,\n vaultGeneration: 'v1',\n })\n if (row) byAddr.set(row.vaultAddress.toLowerCase(), row)\n }\n\n for (const v of v2Vaults) {\n if (v.listed === false) continue\n const row = earnRowFromVault({\n chainId,\n address: v.address,\n symbol: v.symbol,\n name: v.name,\n asset: v.asset,\n apy: v.apy,\n netApy: v.netApy,\n performanceFee: v.performanceFee,\n managementFee: v.managementFee,\n totalAssetsUsd: v.totalAssetsUsd,\n underlyingDecimals: v.asset?.decimals ?? defaultDecimals,\n vaultGeneration: 'v2',\n })\n if (row) byAddr.set(row.vaultAddress.toLowerCase(), row)\n }\n\n return sortEarnRowsByTvl([...byAddr.values()])\n}\n\n/** Listed Morpho earn vaults (V1 + V2). Filter by deposit asset (symbol or address) and/or vault search query. */\nexport async function searchMorphoListedEarnVaults(args: {\n chainId: number\n underlying?: string\n query?: string\n limit?: number\n}): Promise<MorphoEarnVaultDiscoveryRow[]> {\n const limit = args.limit ?? DISCOVERY_DEFAULT_LIMIT\n const underlying = args.underlying?.trim() ?? ''\n const query = args.query?.trim() ?? ''\n\n let rows: MorphoEarnOfferingRow[]\n\n const enrichedFromAsset = Boolean(underlying && isAddress(underlying))\n\n if (enrichedFromAsset) {\n rows = await fetchMorphoEarnOfferingsForAsset({\n chainId: args.chainId,\n contractAddress: underlying,\n underlyingDecimals: 18,\n suppliedAssetSymbol: undefined,\n })\n } else {\n rows = await fetchAllListedEarnVaultsForChain(args.chainId)\n }\n\n if (underlying) {\n rows = rows.filter((r) => matchesMorphoUnderlyingFilter(morphoEarnOfferingToDiscoveryRow(r), underlying))\n }\n if (query) {\n rows = rows.filter((r) => matchesMorphoVaultSearch(morphoEarnOfferingToDiscoveryRow(r), query))\n }\n\n rows = rows.slice(0, Math.max(1, Math.min(limit, 200)))\n rows = await enrichMorphoEarnOfferingRowsForAgent(args.chainId, rows)\n\n return rows.map(morphoEarnOfferingToDiscoveryRow)\n}\n\nexport async function isMorphoVaultListed(args: { chainId: number; vaultAddress: string }): Promise<boolean> {\n const row = await fetchMorphoVaultByAddress(args)\n return row?.listed === true\n}\n\nfunction earnRowFromVault(args: {\n chainId: number\n address: string\n symbol?: string | null\n name?: string | null\n asset: MorphoVaultApiRow['asset']\n apy?: number | null\n netApy?: number | null\n performanceFee?: number | null\n managementFee?: number | null\n totalAssetsUsd?: number | null\n liquidityUsd?: number | null\n underlyingDecimals: number\n suppliedAssetSymbol?: string\n vaultGeneration: 'v1' | 'v2'\n}): MorphoEarnOfferingRow | null {\n const assetAddr = (args.asset?.address ?? '').trim()\n if (!isAddress(assetAddr)) return null\n const vaultAddress = getAddress(args.address)\n const sym = (args.symbol ?? args.name ?? 'Vault').trim() || 'Vault'\n const vaultName = (args.name ?? sym).trim() || sym\n const underlyingSymbol = (args.asset?.symbol ?? args.suppliedAssetSymbol ?? 'ASSET').trim()\n const dec = args.asset?.decimals ?? args.underlyingDecimals\n return {\n vaultAddress,\n vaultSymbol: sym,\n vaultName,\n underlyingAddress: getAddress(assetAddr),\n underlyingSymbol,\n underlyingDecimals: dec,\n apyLabel: formatMorphoApyPct(args.apy),\n netApyLabel: formatMorphoApyPct(args.netApy),\n performanceFeeLabel: formatMorphoFeePct(args.performanceFee),\n managementFeeLabel: formatMorphoFeePct(args.managementFee),\n totalAssetsUsdLabel: formatMorphoUsd(args.totalAssetsUsd),\n liquidityUsdLabel: formatMorphoUsd(args.liquidityUsd),\n netApy7dLabel: EMPTY_EARN_DETAIL.netApy7dLabel,\n netApy30dLabel: EMPTY_EARN_DETAIL.netApy30dLabel,\n netApy90dLabel: EMPTY_EARN_DETAIL.netApy90dLabel,\n exposure: EMPTY_EARN_DETAIL.exposure,\n vaultId: `${args.chainId}:${vaultAddress.toLowerCase()}`,\n vaultGeneration: args.vaultGeneration,\n }\n}\n\nexport async function fetchMorphoVaultsForChain(chainId: number, first = 100): Promise<readonly MorphoVaultApiRow[]> {\n const d = await morphoGql<{ vaults: { items: MorphoVaultApiRow[] } }>(\n `\n query MorphoVaults($chainId: Int!, $first: Int!) {\n vaults(first: $first, where: { chainId_in: [$chainId], listed: true }, orderBy: TotalAssetsUsd, orderDirection: Desc) {\n items {\n address symbol name listed\n asset { address symbol decimals price { usd } }\n chain { id }\n state { apy netApy fee totalAssetsUsd allRewards { supplyApr asset { address symbol } } }\n }\n }\n }\n `,\n { chainId, first },\n )\n return d.vaults?.items ?? []\n}\n\nexport async function fetchMorphoVaultV2sForChain(chainId: number, first = 100, skip = 0): Promise<readonly MorphoVaultV2ApiRow[]> {\n const d = await morphoGql<{ vaultV2s: { items: MorphoVaultV2ApiRow[] } }>(\n `\n query MorphoVaultV2s($chainId: Int!, $first: Int!, $skip: Int!) {\n vaultV2s(\n first: $first\n skip: $skip\n where: { chainId_in: [$chainId], listed: true }\n orderBy: TotalAssetsUsd\n orderDirection: Desc\n ) {\n items {\n address symbol name listed\n asset { address symbol decimals price { usd } }\n chain { id }\n apy netApy performanceFee managementFee totalAssetsUsd\n rewards { supplyApr asset { address symbol } }\n }\n }\n }\n `,\n { chainId, first, skip },\n )\n return d.vaultV2s?.items ?? []\n}\n\nasync function fetchMorphoVaultsForAssetAddress(args: {\n chainId: number\n assetAddress: string\n}): Promise<MorphoVaultApiRow[]> {\n const asset = getAddress(args.assetAddress)\n const d = await morphoGql<{ vaults: { items: MorphoVaultApiRow[] } }>(\n `\n query MorphoVaultsForAsset($chainId: Int!, $asset: String!, $first: Int!) {\n vaults(\n first: $first\n where: { chainId_in: [$chainId], assetAddress_in: [$asset], listed: true }\n orderBy: TotalAssetsUsd\n orderDirection: Desc\n ) {\n items {\n address symbol name listed\n asset { address symbol decimals }\n liquidity { usd }\n state { apy netApy fee totalAssetsUsd }\n }\n }\n }\n `,\n { chainId: args.chainId, asset, first: VAULT_ASSET_QUERY_LIMIT },\n )\n return d.vaults?.items ?? []\n}\n\nasync function fetchMorphoVaultV2sForAssetAddress(args: {\n chainId: number\n assetAddress: string\n}): Promise<MorphoVaultV2ApiRow[]> {\n const asset = getAddress(args.assetAddress)\n const d = await morphoGql<{ vaultV2s: { items: MorphoVaultV2ApiRow[] } }>(\n `\n query MorphoVaultV2sForAsset($chainId: Int!, $asset: Address!, $first: Int!) {\n vaultV2s(\n first: $first\n where: { chainId_in: [$chainId], assetAddress_in: [$asset], listed: true }\n orderBy: TotalAssetsUsd\n orderDirection: Desc\n ) {\n items {\n address symbol name listed\n asset { address symbol decimals }\n apy netApy performanceFee managementFee totalAssetsUsd liquidityUsd\n }\n }\n }\n `,\n { chainId: args.chainId, asset, first: VAULT_ASSET_QUERY_LIMIT },\n )\n return d.vaultV2s?.items ?? []\n}\n\nasync function fetchAllMorphoVaultV2AssetAddresses(chainId: number): Promise<Set<string>> {\n const out = new Set<string>()\n let skip = 0\n for (let page = 0; page < 20; page++) {\n const batch = await fetchMorphoVaultV2sForChain(chainId, VAULT_PAGE_SIZE, skip)\n if (!batch.length) break\n for (const v of batch) {\n const a = (v.asset?.address ?? '').trim()\n if (isAddress(a)) out.add(getAddress(a).toLowerCase())\n }\n if (batch.length < VAULT_PAGE_SIZE) break\n skip += VAULT_PAGE_SIZE\n }\n return out\n}\n\nexport async function fetchMorphoVaultByAddress(args: {\n chainId: number\n vaultAddress: string\n}): Promise<(MorphoVaultApiRow | MorphoVaultV2ApiRow) | null> {\n const addr = args.vaultAddress.trim()\n if (!isAddress(addr)) return null\n const checksummed = getAddress(addr)\n\n const v2 = await morphoGql<{ vaultV2ByAddress: MorphoVaultV2ApiRow | null }>(\n `\n query MorphoVaultV2ByAddress($address: String!, $chainId: Int!) {\n vaultV2ByAddress(address: $address, chainId: $chainId) {\n address symbol name listed\n asset { address symbol decimals price { usd } }\n chain { id }\n apy netApy totalAssetsUsd\n rewards { supplyApr asset { address symbol } }\n }\n }\n `,\n { address: checksummed, chainId: args.chainId },\n ).catch(() => ({ vaultV2ByAddress: null }))\n if (v2.vaultV2ByAddress?.address) return v2.vaultV2ByAddress\n\n const d = await morphoGql<{ vaultByAddress: MorphoVaultApiRow | null }>(\n `\n query MorphoVaultByAddress($address: String!, $chainId: Int!) {\n vaultByAddress(address: $address, chainId: $chainId) {\n address symbol name listed\n asset { address symbol decimals price { usd } }\n chain { id }\n state { apy netApy fee totalAssetsUsd allRewards { supplyApr asset { address symbol } } }\n }\n }\n `,\n { address: checksummed, chainId: args.chainId },\n ).catch(() => ({ vaultByAddress: null }))\n return d.vaultByAddress\n}\n\nexport async function fetchMorphoEarnOfferingsForAsset(args: {\n chainId: number\n contractAddress: string\n underlyingDecimals: number\n suppliedAssetSymbol?: string\n}): Promise<MorphoEarnOfferingRow[]> {\n const key = morphoKeyForAssetRow({ contractAddress: args.contractAddress })\n if (!key) return []\n\n const assetAddress = getAddress(key)\n const [v1Vaults, v2Vaults] = await Promise.all([\n fetchMorphoVaultsForAssetAddress({ chainId: args.chainId, assetAddress }),\n fetchMorphoVaultV2sForAssetAddress({ chainId: args.chainId, assetAddress }),\n ])\n\n const byAddr = new Map<string, MorphoEarnOfferingRow>()\n\n for (const v of v1Vaults) {\n const row = earnRowFromVault({\n chainId: args.chainId,\n address: v.address,\n symbol: v.symbol,\n name: v.name,\n asset: v.asset,\n apy: v.state?.apy,\n netApy: v.state?.netApy,\n performanceFee: v.state?.fee,\n managementFee: null,\n totalAssetsUsd: v.state?.totalAssetsUsd,\n liquidityUsd: v.liquidity?.usd,\n underlyingDecimals: args.underlyingDecimals,\n suppliedAssetSymbol: args.suppliedAssetSymbol,\n vaultGeneration: 'v1',\n })\n if (row) byAddr.set(row.vaultAddress.toLowerCase(), row)\n }\n\n for (const v of v2Vaults) {\n const row = earnRowFromVault({\n chainId: args.chainId,\n address: v.address,\n symbol: v.symbol,\n name: v.name,\n asset: v.asset,\n apy: v.apy,\n netApy: v.netApy,\n performanceFee: v.performanceFee,\n managementFee: v.managementFee,\n totalAssetsUsd: v.totalAssetsUsd,\n liquidityUsd: v.liquidityUsd,\n underlyingDecimals: args.underlyingDecimals,\n suppliedAssetSymbol: args.suppliedAssetSymbol,\n vaultGeneration: 'v2',\n })\n if (row) byAddr.set(row.vaultAddress.toLowerCase(), row)\n }\n\n return sortEarnRowsByTvl([...byAddr.values()])\n}\n\ntype ChainAssetCache = {\n modesByUnderlying: Map<string, { earn: boolean; borrow: boolean; collateral: boolean }>\n nativeWrapped: string | null\n}\n\nconst chainAssetCache = new Map<number, ChainAssetCache>()\n\nexport async function ensureMorphoChainAssetCache(chainId: number): Promise<ChainAssetCache> {\n const hit = chainAssetCache.get(chainId)\n if (hit) return hit\n\n const modes = new Map<string, { earn: boolean; borrow: boolean; collateral: boolean }>()\n\n const [v1Vaults, v2Assets] = await Promise.all([\n fetchMorphoVaultsForChain(chainId, 300),\n fetchAllMorphoVaultV2AssetAddresses(chainId),\n ])\n\n for (const v of v1Vaults) {\n const a = (v.asset?.address ?? '').trim()\n if (!isAddress(a)) continue\n const k = getAddress(a).toLowerCase()\n const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false }\n prev.earn = true\n modes.set(k, prev)\n }\n for (const k of v2Assets) {\n const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false }\n prev.earn = true\n modes.set(k, prev)\n }\n\n const marketsD = await morphoGql<{ markets: { items: { loanAsset: { address?: string }; collateralAsset: { address?: string } }[] } }>(\n `\n query MorphoMarketsAssets($chainId: Int!) {\n markets(first: 500, where: { chainId_in: [$chainId] }) {\n items {\n loanAsset { address }\n collateralAsset { address }\n }\n }\n }\n `,\n { chainId },\n )\n for (const m of marketsD.markets?.items ?? []) {\n const loanAddr = (m.loanAsset?.address ?? '').trim()\n const colAddr = (m.collateralAsset?.address ?? '').trim()\n if (isAddress(loanAddr)) {\n const k = getAddress(loanAddr).toLowerCase()\n const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false }\n prev.borrow = true\n modes.set(k, prev)\n }\n if (isAddress(colAddr)) {\n const k = getAddress(colAddr).toLowerCase()\n const prev = modes.get(k) ?? { earn: false, borrow: false, collateral: false }\n prev.collateral = true\n modes.set(k, prev)\n }\n }\n\n const cache: ChainAssetCache = { modesByUnderlying: modes, nativeWrapped: null }\n chainAssetCache.set(chainId, cache)\n return cache\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './api.js'\nexport * from './marketParams.js'\nexport * from './vaultMarkets.js'\nexport * from './vaultEarnDetails.js'\nexport * from './earnDiscovery.js'\nexport * from './blueMarkets.js'\nexport * from './userPositionsApi.js'\nexport * from './midnightTypes.js'\nexport * from './vaultSharesOnChain.js'\nexport * from './blueRiskOnChain.js'\nexport * from './vaultDepositMultisign.js'\nexport * from './vaultWithdrawMultisign.js'\nexport * from './blueMultisign.js'\nexport * from './merklMultisign.js'\nexport { loadMorphoSupportedChainIds } from './api.js'\n\nexport const MORPHO_PROTOCOL_ID = 'morpho'\n\nexport const morphoProtocolModule: ProtocolModule = {\n id: MORPHO_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: 'morpho.fetch-earn-vaults', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Search Morpho-listed earn vaults by asset or name', commonParams: [], params: {} },\n { id: 'morpho.vault-deposit', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Morpho-listed earn vault (V1 or V2)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.vault-withdraw', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Morpho earn vault (V1 or V2)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.blue-collateral-deposit', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Supply collateral to Morpho Blue market', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.blue-borrow', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Morpho Blue market', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.blue-repay', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Morpho Blue borrow', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.blue-collateral-withdraw', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw Morpho Blue collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.merkl-claim', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim Morpho Merkl rewards', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-borrow', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight fixed-rate borrow (coming soon)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(morphoProtocolModule)\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 'gmx',\n 'hyperliquid',\n 'morpho',\n] as const\n\nexport function getToolsForProtocol(protocolId: string): readonly McpToolDefinition[] {\n return MCP_TOOL_DEFINITIONS.filter((t) => t.protocolId === protocolId)\n}\n\nfunction readSharedMultisignMcpGasSection(): string {\n try {\n return readFileSync(join(skillsDir, '_shared', 'multisign-mcp-gas.md'), 'utf8').trim()\n } catch {\n return ''\n }\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 const skill = readFileSync(join(skillsDir, protocolId, 'SKILL.md'), 'utf8').trim()\n const shared = readSharedMultisignMcpGasSection()\n if (!shared) return skill\n if (skill.includes('## Gas and MCP submit')) return skill\n return `${skill}\\n\\n${shared}\\n`\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 { GMX_PROTOCOL_ID } from '../../protocols/evm/gmx/index.js'\nimport { loadMorphoSupportedChainIds } from '../../protocols/evm/morpho/api.js'\nimport { ensureMorphoChainAssetCache } from '../../protocols/evm/morpho/vaultMarkets.js'\nimport { gmxFetchCollateralTokens } from '../../protocols/evm/gmx/reads.js'\nimport { isGmxChainSupported } from '../../protocols/evm/gmx/support.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 morpho: advisor('morpho', 'api_underlyings', {\n async supportedChainIds() {\n const set = await loadMorphoSupportedChainIds()\n return [...set].sort((a, b) => a - b)\n },\n async supportedTokens(chainId) {\n const cache = await ensureMorphoChainAssetCache(chainId)\n const tokens = [...cache.modesByUnderlying.entries()].map(([address, modes]) => ({\n address,\n roles: [\n ...(modes.earn ? ['vault_underlying'] : []),\n ...(modes.borrow ? ['loan'] : []),\n ...(modes.collateral ? ['collateral'] : []),\n ],\n }))\n return {\n tokens,\n notes: 'Morpho vault assets and Blue market loan/collateral tokens from api.morpho.org.',\n }\n },\n async isTokenSupported(chainId, address) {\n const cache = await ensureMorphoChainAssetCache(chainId)\n let normalized: string\n try {\n normalized = getAddress(address).toLowerCase()\n } catch {\n return false\n }\n return cache.modesByUnderlying.has(normalized)\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 [GMX_PROTOCOL_ID]: advisor(GMX_PROTOCOL_ID, 'api_underlyings', {\n async supportedChainIds() {\n return [42161, 43114]\n },\n async supportedTokens(chainId) {\n if (!isGmxChainSupported(chainId)) {\n return { tokens: [], notes: 'GMX v1 supports Arbitrum (42161) and Avalanche (43114).' }\n }\n const tokens = await gmxFetchCollateralTokens({ chainId })\n return {\n tokens: tokens.map((t) => ({\n address: t.address,\n symbol: t.symbol,\n roles: ['collateral'],\n })),\n notes: 'Collateral ERC-20 tokens from GMX API. Perp markets listed via fetch_markets.',\n }\n },\n async isTokenSupported(chainId, address) {\n if (!isGmxChainSupported(chainId)) return false\n const tokens = await gmxFetchCollateralTokens({ chainId })\n try {\n const normalized = getAddress(address).toLowerCase()\n return tokens.some((t) => t.address.toLowerCase() === normalized)\n } catch {\n return false\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 { 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'\nimport { gmxProtocolModule } from '../protocols/evm/gmx/index.js'\nimport { hyperliquidProtocolModule } from '../protocols/evm/hyperliquid/index.js'\nimport { morphoProtocolModule } from '../protocols/evm/morpho/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 {\n EVM_COMMON_PARAM_DOCS,\n MULTISIGN_OUTPUT_DOC,\n MULTISIGN_SUBMIT_OUTPUT_DOC,\n MANAGEMENT_SIG_DOC,\n} from './commonParamDocs.js'\nexport { zodSchemaToMcpJsonSchema } from './zodToMcpJsonSchema.js'\nexport * from './schemas/index.js'\nexport { parseMultisignBuilderOutput } from './schemas/common.js'\n\nregisterProtocolModule(uniswapV4ProtocolModule)\nregisterProtocolModule(curveDaoProtocolModule)\nregisterProtocolModule(lidoProtocolModule)\nregisterProtocolModule(ethenaProtocolModule)\nregisterProtocolModule(mapleProtocolModule)\nregisterProtocolModule(skyProtocolModule)\nregisterProtocolModule(aaveV4ProtocolModule)\nregisterProtocolModule(eulerV2ProtocolModule)\nregisterProtocolModule(gmxProtocolModule)\nregisterProtocolModule(hyperliquidProtocolModule)\nregisterProtocolModule(morphoProtocolModule)\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 gmx: gmxProtocolModule,\n hyperliquid: hyperliquidProtocolModule,\n morpho: morphoProtocolModule,\n /** Prefer getAgentCatalogForMcp() or getMcpToolDefinitions() for MCP servers. */\n mcp: getAgentCatalogForMcp(),\n }\n}\n\nexport { getProtocolModules, getActionsByChainCategory }\n"]}
|