@continuumdao/ctm-mpc-defi 0.2.12 → 0.2.16

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.
Files changed (41) hide show
  1. package/dist/agent/catalog.cjs +868 -283
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +1657 -304
  4. package/dist/agent/catalog.js +861 -284
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/morpho/SKILL.md +8 -22
  7. package/dist/chains/evm/index.cjs +75 -0
  8. package/dist/chains/evm/index.cjs.map +1 -1
  9. package/dist/chains/evm/index.d.ts +31 -1
  10. package/dist/chains/evm/index.js +73 -2
  11. package/dist/chains/evm/index.js.map +1 -1
  12. package/dist/index.cjs +140 -32
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.js +138 -34
  16. package/dist/index.js.map +1 -1
  17. package/dist/protocols/evm/euler-v2/index.cjs +29 -2
  18. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  19. package/dist/protocols/evm/euler-v2/index.d.ts +23 -1
  20. package/dist/protocols/evm/euler-v2/index.js +29 -3
  21. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  22. package/dist/protocols/evm/gmx/index.cjs +42 -8
  23. package/dist/protocols/evm/gmx/index.cjs.map +1 -1
  24. package/dist/protocols/evm/gmx/index.d.ts +20 -4
  25. package/dist/protocols/evm/gmx/index.js +42 -9
  26. package/dist/protocols/evm/gmx/index.js.map +1 -1
  27. package/dist/protocols/evm/maple/index.cjs +9 -1
  28. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  29. package/dist/protocols/evm/maple/index.d.ts +2 -1
  30. package/dist/protocols/evm/maple/index.js +9 -1
  31. package/dist/protocols/evm/maple/index.js.map +1 -1
  32. package/dist/protocols/evm/morpho/index.cjs +56 -0
  33. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  34. package/dist/protocols/evm/morpho/index.d.ts +28 -1
  35. package/dist/protocols/evm/morpho/index.js +56 -1
  36. package/dist/protocols/evm/morpho/index.js.map +1 -1
  37. package/dist/protocols/evm/uniswap-v4/index.cjs +98 -26
  38. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  39. package/dist/protocols/evm/uniswap-v4/index.js +99 -27
  40. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  41. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/morpho/api.ts","../../../../src/protocols/evm/morpho/marketParams.ts","../../../../src/protocols/evm/morpho/vaultEarnDetails.ts","../../../../src/protocols/evm/morpho/vaultMarkets.ts","../../../../src/protocols/evm/morpho/earnDiscovery.ts","../../../../src/protocols/evm/morpho/blueMarkets.ts","../../../../src/protocols/evm/morpho/userPositionsApi.ts","../../../../src/protocols/evm/morpho/midnightTypes.ts","../../../../src/protocols/evm/morpho/vaultSharesOnChain.ts","../../../../src/protocols/evm/morpho/blueRiskOnChain.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/morpho/vaultDepositMultisign.ts","../../../../src/protocols/evm/morpho/vaultWithdrawMultisign.ts","../../../../src/protocols/evm/morpho/blueMultisign.ts","../../../../src/protocols/evm/morpho/merklMultisign.ts","../../../../src/protocols/evm/morpho/index.ts"],"names":["getAddress","isAddress","light","exposure","detail","parseAbi","defineChain","createPublicClient","http","gasLimitFromEstimateAndChainConfig","parseUnits","encodeFunctionData","MORPHO_ERC20_APPROVE_FALLBACK","MORPHO_WETH_DEPOSIT_FALLBACK","wethDepositAbi","erc20AllowanceAbi","erc20ApproveAbi","morphoBlueAbi"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/**\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 { 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, type Address } from 'viem'\nimport { morphoGql, type MorphoMarketApiRow } from './api.js'\n\nexport type MorphoMarketParams = {\n loanToken: Address\n collateralToken: Address\n oracle: Address\n irm: Address\n lltv: bigint\n}\n\nexport type ResolvedMorphoMarket = MorphoMarketApiRow & {\n morphoBlueAddress: Address\n marketParams: MorphoMarketParams\n}\n\nexport function marketParamsFromApiRow(row: MorphoMarketApiRow): MorphoMarketParams {\n const loanToken = getAddress(row.loanAsset.address ?? '')\n const collateralToken = getAddress(row.collateralAsset.address ?? '')\n const oracle = getAddress(row.oracle.address)\n const irm = getAddress(row.irmAddress)\n const lltv = BigInt(row.lltv)\n return { loanToken, collateralToken, oracle, irm, lltv }\n}\n\nexport async function fetchMorphoMarketById(args: {\n chainId: number\n marketId: string\n}): Promise<ResolvedMorphoMarket | null> {\n const marketId = args.marketId.trim()\n if (!marketId) return null\n const d = await morphoGql<{ marketById: MorphoMarketApiRow | null }>(\n `\n query MorphoMarketById($marketId: String!, $chainId: Int!) {\n marketById(marketId: $marketId, chainId: $chainId) {\n marketId\n loanAsset { address symbol decimals price { usd } }\n collateralAsset { address symbol decimals price { usd } }\n lltv\n oracle { address }\n irmAddress\n morphoBlue { address }\n state {\n supplyApy borrowApy netSupplyApy netBorrowApy\n supplyAssetsUsd borrowAssetsUsd collateralAssetsUsd utilization\n rewards { supplyApr borrowApr asset { address symbol } }\n }\n }\n }\n `,\n { marketId, chainId: args.chainId },\n )\n const row = d.marketById\n if (!row?.marketId || !row.morphoBlue?.address) return null\n return {\n ...row,\n morphoBlueAddress: getAddress(row.morphoBlue.address),\n marketParams: marketParamsFromApiRow(row),\n }\n}\n","import { getAddress, isAddress } from 'viem'\nimport { formatMorphoApyPct, formatMorphoUsd, morphoGql } from './api.js'\nimport type { MorphoEarnOfferingRow, MorphoEarnVaultExposureRow } from './vaultMarkets.js'\n\nconst LIGHT_BATCH_SIZE = 8\nconst V2_EXPOSURE_POSITION_LIMIT = 20\nconst EXPOSURE_FETCH_CONCURRENCY = 4\n\nexport type MorphoEarnVaultDetailFields = Pick<\n MorphoEarnOfferingRow,\n 'liquidityUsdLabel' | 'netApy7dLabel' | 'netApy30dLabel' | 'netApy90dLabel' | 'exposure'\n>\n\nfunction formatAllocationPercent(partUsd: number, totalUsd: number): string {\n if (!Number.isFinite(partUsd) || !Number.isFinite(totalUsd) || totalUsd <= 0) return '—'\n return `${((partUsd / totalUsd) * 100).toFixed(1)}%`\n}\n\nfunction marketExposureLabel(loan?: string | null, collateral?: string | null): string {\n const loanSym = (loan ?? '').trim() || 'LOAN'\n const colSym = (collateral ?? '').trim()\n return colSym ? `${loanSym}/${colSym}` : loanSym\n}\n\nfunction latestHistoryApy(points: { y?: number | null }[] | null | undefined): number | null {\n const y = points?.[0]?.y\n return y != null && Number.isFinite(y) ? y : null\n}\n\nfunction parseV1Exposure(\n allocation: {\n supplyAssetsUsd?: number | null\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n }[],\n totalUsd: number,\n): MorphoEarnVaultExposureRow[] {\n const out: MorphoEarnVaultExposureRow[] = []\n for (const a of allocation) {\n const usd = a.supplyAssetsUsd\n if (usd == null || !Number.isFinite(usd) || usd <= 0) continue\n out.push({\n label: marketExposureLabel(a.market?.loanAsset?.symbol, a.market?.collateralAsset?.symbol),\n allocatedUsdLabel: formatMorphoUsd(usd),\n allocationPercentLabel: formatAllocationPercent(usd, totalUsd),\n })\n }\n return out.sort((a, b) => parseFloat(b.allocatedUsdLabel.replace(/[^0-9.]/g, '')) - parseFloat(a.allocatedUsdLabel.replace(/[^0-9.]/g, '')))\n}\n\nfunction parseV2Exposure(\n adapters: {\n __typename?: string\n assetsUsd?: number | null\n innerVault?: { name?: string | null; asset?: { symbol?: string | null } | null } | null\n positions?: {\n items?: {\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n state?: { supplyAssetsUsd?: number | null } | null\n }[]\n } | null\n }[],\n totalUsd: number,\n): MorphoEarnVaultExposureRow[] {\n const byKey = new Map<string, number>()\n\n for (const adapter of adapters) {\n if (adapter.__typename === 'MorphoVaultV2Adapter') {\n const usd = adapter.assetsUsd\n if (usd == null || !Number.isFinite(usd) || usd <= 0) continue\n const label = (adapter.innerVault?.name ?? adapter.innerVault?.asset?.symbol ?? 'Vault V2 adapter').trim() || 'Vault V2 adapter'\n byKey.set(label, (byKey.get(label) ?? 0) + usd)\n continue\n }\n if (adapter.__typename === 'MorphoMarketV1Adapter') {\n for (const p of adapter.positions?.items ?? []) {\n const usd = p.state?.supplyAssetsUsd\n if (usd == null || !Number.isFinite(usd) || usd <= 0) continue\n const label = marketExposureLabel(p.market?.loanAsset?.symbol, p.market?.collateralAsset?.symbol)\n byKey.set(label, (byKey.get(label) ?? 0) + usd)\n }\n const adapterUsd = adapter.assetsUsd\n if (!adapter.positions?.items?.length && adapterUsd != null && Number.isFinite(adapterUsd) && adapterUsd > 0) {\n byKey.set('Morpho markets', (byKey.get('Morpho markets') ?? 0) + adapterUsd)\n }\n }\n }\n\n return [...byKey.entries()]\n .map(([label, usd]) => ({\n label,\n allocatedUsdLabel: formatMorphoUsd(usd),\n allocationPercentLabel: formatAllocationPercent(usd, totalUsd),\n }))\n .sort((a, b) => parseFloat(b.allocatedUsdLabel.replace(/[^0-9.]/g, '')) - parseFloat(a.allocatedUsdLabel.replace(/[^0-9.]/g, '')))\n}\n\nexport function emptyMorphoEarnVaultDetailFields(): MorphoEarnVaultDetailFields {\n return {\n liquidityUsdLabel: '—',\n netApy7dLabel: '—',\n netApy30dLabel: '—',\n netApy90dLabel: '—',\n exposure: [],\n }\n}\n\nasync function fetchV1EarnVaultLightBatch(args: {\n chainId: number\n addresses: string[]\n}): Promise<Map<string, MorphoEarnVaultDetailFields>> {\n const out = new Map<string, MorphoEarnVaultDetailFields>()\n if (!args.addresses.length) return out\n\n const d = await morphoGql<{\n vaults: {\n items: {\n address: string\n liquidity?: { usd?: number | null } | null\n }[]\n }\n }>(\n `\n query MorphoV1EarnVaultLight($chainId: Int!, $addresses: [String!]!) {\n vaults(where: { chainId_in: [$chainId], address_in: $addresses, listed: true }) {\n items {\n address\n liquidity { usd }\n }\n }\n }\n `,\n { chainId: args.chainId, addresses: args.addresses.map((a) => getAddress(a)) },\n )\n\n for (const v of d.vaults?.items ?? []) {\n const addr = (v.address ?? '').trim()\n if (!isAddress(addr)) continue\n out.set(getAddress(addr).toLowerCase(), {\n ...emptyMorphoEarnVaultDetailFields(),\n liquidityUsdLabel: formatMorphoUsd(v.liquidity?.usd),\n })\n }\n return out\n}\n\nasync function fetchV1EarnVaultPeriodApys(args: {\n chainId: number\n address: string\n}): Promise<Pick<MorphoEarnVaultDetailFields, 'netApy7dLabel' | 'netApy30dLabel' | 'netApy90dLabel'>> {\n const d = await morphoGql<{\n vaultByAddress: {\n historicalState?: {\n weeklyNetApy?: { y?: number | null }[] | null\n monthlyNetApy?: { y?: number | null }[] | null\n quarterlyNetApy?: { y?: number | null }[] | null\n } | null\n } | null\n }>(\n `\n query MorphoV1EarnVaultPeriodApys($chainId: Int!, $address: String!) {\n vaultByAddress(chainId: $chainId, address: $address) {\n historicalState {\n weeklyNetApy { y }\n monthlyNetApy { y }\n quarterlyNetApy { y }\n }\n }\n }\n `,\n { chainId: args.chainId, address: getAddress(args.address) },\n )\n\n const hs = d.vaultByAddress?.historicalState\n return {\n netApy7dLabel: formatMorphoApyPct(latestHistoryApy(hs?.weeklyNetApy)),\n netApy30dLabel: formatMorphoApyPct(latestHistoryApy(hs?.monthlyNetApy)),\n netApy90dLabel: formatMorphoApyPct(latestHistoryApy(hs?.quarterlyNetApy)),\n }\n}\n\nasync function fetchV2EarnVaultLightBatch(args: {\n chainId: number\n addresses: string[]\n}): Promise<Map<string, MorphoEarnVaultDetailFields>> {\n const out = new Map<string, MorphoEarnVaultDetailFields>()\n if (!args.addresses.length) return out\n\n const d = await morphoGql<{\n vaultV2s: {\n items: {\n address: string\n liquidityUsd?: number | null\n avgNetApy7d?: number | null\n avgNetApy30d?: number | null\n avgNetApy90d?: number | null\n }[]\n }\n }>(\n `\n query MorphoV2EarnVaultLight($chainId: Int!, $addresses: [String!]!) {\n vaultV2s(where: { chainId_in: [$chainId], address_in: $addresses, listed: true }) {\n items {\n address\n liquidityUsd\n avgNetApy7d: avgNetApy(lookback: SEVEN_DAYS)\n avgNetApy30d: avgNetApy(lookback: THIRTY_DAYS)\n avgNetApy90d: avgNetApy(lookback: NINETY_DAYS)\n }\n }\n }\n `,\n {\n chainId: args.chainId,\n addresses: args.addresses.map((a) => getAddress(a)),\n },\n )\n\n for (const v of d.vaultV2s?.items ?? []) {\n const addr = (v.address ?? '').trim()\n if (!isAddress(addr)) continue\n out.set(getAddress(addr).toLowerCase(), {\n liquidityUsdLabel: formatMorphoUsd(v.liquidityUsd),\n netApy7dLabel: formatMorphoApyPct(v.avgNetApy7d),\n netApy30dLabel: formatMorphoApyPct(v.avgNetApy30d),\n netApy90dLabel: formatMorphoApyPct(v.avgNetApy90d),\n exposure: [],\n })\n }\n return out\n}\n\nasync function fetchV1EarnVaultExposure(args: {\n chainId: number\n address: string\n}): Promise<MorphoEarnVaultExposureRow[]> {\n const d = await morphoGql<{\n vaultByAddress: {\n address?: string | null\n state?: {\n totalAssetsUsd?: number | null\n allocation?: {\n supplyAssetsUsd?: number | null\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n }[] | null\n } | null\n } | null\n }>(\n `\n query MorphoV1EarnVaultExposure($chainId: Int!, $address: String!) {\n vaultByAddress(chainId: $chainId, address: $address) {\n address\n state {\n totalAssetsUsd\n allocation {\n supplyAssetsUsd\n market { loanAsset { symbol } collateralAsset { symbol } }\n }\n }\n }\n }\n `,\n { chainId: args.chainId, address: getAddress(args.address) },\n )\n\n const v = d.vaultByAddress\n if (!v?.address) return []\n return parseV1Exposure(v.state?.allocation ?? [], v.state?.totalAssetsUsd ?? 0)\n}\n\nasync function fetchV2EarnVaultExposure(args: {\n chainId: number\n address: string\n}): Promise<MorphoEarnVaultExposureRow[]> {\n const d = await morphoGql<{\n vaultV2ByAddress: {\n address?: string | null\n totalAssetsUsd?: number | null\n adapters?: {\n items?: {\n __typename?: string\n assetsUsd?: number | null\n innerVault?: { name?: string | null; asset?: { symbol?: string | null } | null } | null\n positions?: {\n items?: {\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n state?: { supplyAssetsUsd?: number | null } | null\n }[]\n } | null\n }[]\n } | null\n } | null\n }>(\n `\n query MorphoV2EarnVaultExposure($chainId: Int!, $address: String!, $posLimit: Int!) {\n vaultV2ByAddress(chainId: $chainId, address: $address) {\n address\n totalAssetsUsd\n adapters {\n items {\n __typename\n assetsUsd\n ... on MorphoVaultV2Adapter {\n innerVault { name asset { symbol } }\n }\n ... on MorphoMarketV1Adapter {\n positions(first: $posLimit) {\n items {\n market { loanAsset { symbol } collateralAsset { symbol } }\n state { supplyAssetsUsd }\n }\n }\n }\n }\n }\n }\n }\n `,\n { chainId: args.chainId, address: getAddress(args.address), posLimit: V2_EXPOSURE_POSITION_LIMIT },\n )\n\n const v = d.vaultV2ByAddress\n if (!v?.address) return []\n return parseV2Exposure(v.adapters?.items ?? [], v.totalAssetsUsd ?? 0)\n}\n\n/** Full detail fetch for one vault (period APYs, liquidity, exposure). Safe for UI expand / agent single-vault lookup. */\nexport async function fetchMorphoEarnVaultDetails(args: {\n chainId: number\n vaultAddress: string\n vaultGeneration: 'v1' | 'v2'\n}): Promise<MorphoEarnVaultDetailFields> {\n const addr = args.vaultAddress.trim()\n if (!isAddress(addr)) return emptyMorphoEarnVaultDetailFields()\n\n if (args.vaultGeneration === 'v1') {\n const [light, periodApys, exposure] = await Promise.all([\n fetchV1EarnVaultLightBatch({ chainId: args.chainId, addresses: [addr] }),\n fetchV1EarnVaultPeriodApys({ chainId: args.chainId, address: addr }),\n fetchV1EarnVaultExposure({ chainId: args.chainId, address: addr }),\n ])\n const detail = light.get(getAddress(addr).toLowerCase()) ?? emptyMorphoEarnVaultDetailFields()\n return { ...detail, ...periodApys, exposure }\n }\n\n const [light, exposure] = await Promise.all([\n fetchV2EarnVaultLightBatch({ chainId: args.chainId, addresses: [addr] }),\n fetchV2EarnVaultExposure({ chainId: args.chainId, address: addr }),\n ])\n const detail = light.get(getAddress(addr).toLowerCase()) ?? emptyMorphoEarnVaultDetailFields()\n return { ...detail, exposure }\n}\n\nasync function enrichMorphoEarnOfferingRowsLight(\n chainId: number,\n rows: MorphoEarnOfferingRow[],\n): Promise<MorphoEarnOfferingRow[]> {\n if (!rows.length) return rows\n\n const v1Addrs: string[] = []\n const v2Addrs: string[] = []\n for (const r of rows) {\n if (r.vaultGeneration === 'v1') v1Addrs.push(r.vaultAddress)\n else v2Addrs.push(r.vaultAddress)\n }\n\n const detailByAddr = new Map<string, MorphoEarnVaultDetailFields>()\n\n for (let i = 0; i < v1Addrs.length; i += LIGHT_BATCH_SIZE) {\n const batch = await fetchV1EarnVaultLightBatch({ chainId, addresses: v1Addrs.slice(i, i + LIGHT_BATCH_SIZE) })\n for (const [k, v] of batch) detailByAddr.set(k, v)\n }\n for (let i = 0; i < v2Addrs.length; i += LIGHT_BATCH_SIZE) {\n const batch = await fetchV2EarnVaultLightBatch({ chainId, addresses: v2Addrs.slice(i, i + LIGHT_BATCH_SIZE) })\n for (const [k, v] of batch) detailByAddr.set(k, v)\n }\n\n return rows.map((row) => {\n const detail = detailByAddr.get(row.vaultAddress.toLowerCase())\n if (!detail) return row\n return {\n ...row,\n liquidityUsdLabel: detail.liquidityUsdLabel !== '—' ? detail.liquidityUsdLabel : row.liquidityUsdLabel,\n netApy7dLabel: detail.netApy7dLabel,\n netApy30dLabel: detail.netApy30dLabel,\n netApy90dLabel: detail.netApy90dLabel,\n }\n })\n}\n\nasync function attachAgentVaultDetails(chainId: number, rows: MorphoEarnOfferingRow[]): Promise<MorphoEarnOfferingRow[]> {\n if (!rows.length) return rows\n const out = [...rows]\n\n for (let i = 0; i < out.length; i += EXPOSURE_FETCH_CONCURRENCY) {\n const chunk = out.slice(i, i + EXPOSURE_FETCH_CONCURRENCY)\n const details = await Promise.all(\n chunk.map(async (row) => {\n const exposure =\n row.vaultGeneration === 'v1'\n ? await fetchV1EarnVaultExposure({ chainId, address: row.vaultAddress })\n : await fetchV2EarnVaultExposure({ chainId, address: row.vaultAddress })\n const periodApys =\n row.vaultGeneration === 'v1'\n ? await fetchV1EarnVaultPeriodApys({ chainId, address: row.vaultAddress })\n : {\n netApy7dLabel: row.netApy7dLabel,\n netApy30dLabel: row.netApy30dLabel,\n netApy90dLabel: row.netApy90dLabel,\n }\n return { exposure, periodApys }\n }),\n )\n for (let j = 0; j < chunk.length; j++) {\n out[i + j] = { ...out[i + j], ...details[j].periodApys, exposure: details[j].exposure }\n }\n }\n\n return out\n}\n\n/** Light enrichment (liquidity + period APYs). No exposure — use fetchMorphoEarnVaultDetails for one vault. */\nexport async function enrichMorphoEarnOfferingRows(\n chainId: number,\n rows: MorphoEarnOfferingRow[],\n): Promise<MorphoEarnOfferingRow[]> {\n return enrichMorphoEarnOfferingRowsLight(chainId, rows)\n}\n\n/** MCP / agent: light enrichment plus per-vault exposure (chunked to stay under API complexity limits). */\nexport async function enrichMorphoEarnOfferingRowsForAgent(\n chainId: number,\n rows: MorphoEarnOfferingRow[],\n): Promise<MorphoEarnOfferingRow[]> {\n const light = await enrichMorphoEarnOfferingRowsLight(chainId, rows)\n return attachAgentVaultDetails(chainId, light)\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 { getAddress, isAddress } from 'viem'\nimport { searchMorphoListedEarnVaults, type MorphoEarnVaultDiscoveryRow } from './vaultMarkets.js'\n\n/** MCP: Morpho-listed earn vaults (V1 + V2 merged). Filter by deposit asset and/or vault name. */\nexport async function morphoFetchEarnVaultsSummary(args: {\n chainId: number\n underlying?: string\n query?: string\n limit?: number\n}): Promise<{ vaults: MorphoEarnVaultDiscoveryRow[] }> {\n const vaults = await searchMorphoListedEarnVaults({\n chainId: args.chainId,\n underlying: args.underlying?.trim() || undefined,\n query: args.query?.trim() || undefined,\n limit: args.limit,\n })\n return { vaults }\n}\n\n/** Resolve vault by address when the agent already has one; rejects unlisted vaults. */\nexport async function morphoResolveListedEarnVaultByAddress(args: {\n chainId: number\n vaultAddress: string\n}): Promise<MorphoEarnVaultDiscoveryRow | null> {\n const addr = args.vaultAddress.trim()\n if (!isAddress(addr)) return null\n const rows = await searchMorphoListedEarnVaults({\n chainId: args.chainId,\n query: getAddress(addr),\n limit: 5,\n })\n const hit = rows.find((r) => r.vaultAddress.toLowerCase() === getAddress(addr).toLowerCase())\n return hit ?? null\n}\n\nexport type { MorphoEarnVaultDiscoveryRow }\n","import { getAddress, isAddress } from 'viem'\nimport { morphoGql, morphoKeyForAssetRow, formatMorphoApyPct, formatMorphoUsd, type MorphoMarketApiRow } from './api.js'\n\nexport type MorphoBorrowMarketRow = {\n marketId: string\n morphoBlueAddress: string\n loanAssetAddress: string\n loanAssetSymbol: string\n loanAssetDecimals: number\n collateralAssetAddress: string\n collateralAssetSymbol: string\n collateralAssetDecimals: number\n borrowApyLabel: string\n supplyApyLabel: string\n borrowAssetsUsdLabel: string\n lltvLabel: string\n marketLabel: string\n}\n\nfunction lltvToPctLabel(lltv: string): string {\n try {\n const wad = BigInt(lltv)\n const pct = Number(wad) / 1e16\n if (!Number.isFinite(pct)) return '—'\n return `${pct.toFixed(1)}%`\n } catch {\n return '—'\n }\n}\n\nexport async function fetchMorphoMarketsForChain(chainId: number, first = 200): Promise<readonly MorphoMarketApiRow[]> {\n const d = await morphoGql<{ markets: { items: MorphoMarketApiRow[] } }>(\n `\n query MorphoMarkets($chainId: Int!, $first: Int!) {\n markets(first: $first, where: { chainId_in: [$chainId] }, orderBy: BorrowAssetsUsd, orderDirection: Desc) {\n items {\n marketId\n loanAsset { address symbol decimals price { usd } }\n collateralAsset { address symbol decimals price { usd } }\n lltv\n oracle { address }\n irmAddress\n morphoBlue { address }\n state {\n supplyApy borrowApy netSupplyApy netBorrowApy\n supplyAssetsUsd borrowAssetsUsd collateralAssetsUsd utilization\n rewards { supplyApr borrowApr asset { address symbol } }\n }\n }\n }\n }\n `,\n { chainId, first },\n )\n return d.markets?.items ?? []\n}\n\nexport function morphoMarketToBorrowRow(m: MorphoMarketApiRow): MorphoBorrowMarketRow | null {\n if (!m.marketId || !m.morphoBlue?.address) return null\n const loan = m.loanAsset\n const col = m.collateralAsset\n if (!isAddress(loan?.address ?? '') || !isAddress(col?.address ?? '')) return null\n const loanSym = (loan.symbol ?? 'LOAN').trim()\n const colSym = (col.symbol ?? 'COL').trim()\n return {\n marketId: m.marketId,\n morphoBlueAddress: getAddress(m.morphoBlue.address),\n loanAssetAddress: getAddress(loan.address!),\n loanAssetSymbol: loanSym,\n loanAssetDecimals: loan.decimals ?? 18,\n collateralAssetAddress: getAddress(col.address!),\n collateralAssetSymbol: colSym,\n collateralAssetDecimals: col.decimals ?? 18,\n borrowApyLabel: formatMorphoApyPct(m.state?.borrowApy),\n supplyApyLabel: formatMorphoApyPct(m.state?.supplyApy),\n borrowAssetsUsdLabel: formatMorphoUsd(m.state?.borrowAssetsUsd),\n lltvLabel: lltvToPctLabel(m.lltv),\n marketLabel: `${colSym}/${loanSym}`,\n }\n}\n\nexport async function fetchMorphoBorrowMarketsForCollateral(args: {\n chainId: number\n collateralAddress: string\n}): Promise<MorphoBorrowMarketRow[]> {\n const key = morphoKeyForAssetRow({ contractAddress: args.collateralAddress })\n if (!key) return []\n const markets = await fetchMorphoMarketsForChain(args.chainId, 300)\n const out: MorphoBorrowMarketRow[] = []\n for (const m of markets) {\n const col = (m.collateralAsset?.address ?? '').trim().toLowerCase()\n if (!col || col !== key) continue\n const row = morphoMarketToBorrowRow(m)\n if (row) out.push(row)\n }\n return out\n}\n\nexport async function fetchMorphoBorrowMarketsForLoan(args: {\n chainId: number\n loanAddress: string\n}): Promise<MorphoBorrowMarketRow[]> {\n const key = morphoKeyForAssetRow({ contractAddress: args.loanAddress })\n if (!key) return []\n const markets = await fetchMorphoMarketsForChain(args.chainId, 300)\n const out: MorphoBorrowMarketRow[] = []\n for (const m of markets) {\n const loan = (m.loanAsset?.address ?? '').trim().toLowerCase()\n if (!loan || loan !== key) continue\n const row = morphoMarketToBorrowRow(m)\n if (row) out.push(row)\n }\n return out\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport { morphoGql, formatMorphoApyPct, formatMorphoUsd } from './api.js'\nimport { morphoMarketToBorrowRow, type MorphoBorrowMarketRow } from './blueMarkets.js'\n\nfunction formatMorphoPositionAssets(raw: string | number | null | undefined, decimals: number): string {\n if (raw == null) return '0'\n const s = String(raw).trim()\n if (!s || s === '0') return '0'\n try {\n return formatUnits(BigInt(s), decimals)\n } catch {\n return s\n }\n}\n\nfunction isZeroPositionAmount(raw: string | number | null | undefined): boolean {\n if (raw == null) return true\n const s = String(raw).trim()\n return !s || s === '0' || s === '0.0'\n}\n\nexport type MorphoVaultPositionRow = {\n vaultAddress: string\n vaultSymbol: string\n underlyingSymbol: string\n assetsHuman: string\n assetsUsdLabel: string\n shares: string\n}\n\nexport type MorphoBluePositionRow = {\n marketId: string\n marketLabel: string\n loanAssetSymbol: string\n collateralAssetSymbol: string\n collateralHuman: string\n borrowHuman: string\n healthFactorLabel: string\n borrowMarket: MorphoBorrowMarketRow\n}\n\nexport async function fetchMorphoUserVaultPositions(args: {\n user: string\n chainId: number\n}): Promise<MorphoVaultPositionRow[]> {\n const user = args.user.trim()\n if (!isAddress(user)) return []\n const d = await morphoGql<{\n userByAddress: {\n vaultPositions: {\n vault: {\n address: string\n symbol?: string | null\n asset?: { symbol?: string | null; decimals?: number | null } | null\n }\n state?: { assets?: string | number | null; assetsUsd?: number | null; shares?: string | null } | null\n }[]\n vaultV2Positions: {\n vault: {\n address: string\n symbol?: string | null\n asset?: { symbol?: string | null; decimals?: number | null } | null\n }\n assets?: string | number | null\n assetsUsd?: number | null\n shares?: string | null\n }[]\n } | null\n }>(\n `\n query MorphoUserVaultPositions($address: String!, $chainId: Int!) {\n userByAddress(address: $address, chainId: $chainId) {\n vaultPositions {\n vault { address symbol asset { symbol decimals } }\n state { assets assetsUsd shares }\n }\n vaultV2Positions {\n vault { address symbol asset { symbol decimals } }\n assets assetsUsd shares\n }\n }\n }\n `,\n { address: getAddress(user), chainId: args.chainId },\n )\n const byVault = new Map<string, MorphoVaultPositionRow>()\n\n for (const p of d.userByAddress?.vaultPositions ?? []) {\n const vaultAddr = (p.vault?.address ?? '').trim()\n if (!isAddress(vaultAddr)) continue\n const rawAssets = p.state?.assets\n if (isZeroPositionAmount(rawAssets)) continue\n const decimals = p.vault?.asset?.decimals ?? 18\n const vaultAddress = getAddress(vaultAddr)\n byVault.set(vaultAddress.toLowerCase(), {\n vaultAddress,\n vaultSymbol: (p.vault?.symbol ?? 'Vault').trim(),\n underlyingSymbol: (p.vault?.asset?.symbol ?? '').trim() || '—',\n assetsHuman: formatMorphoPositionAssets(rawAssets, decimals),\n assetsUsdLabel: formatMorphoUsd(p.state?.assetsUsd),\n shares: String(p.state?.shares ?? '0').trim(),\n })\n }\n\n for (const p of d.userByAddress?.vaultV2Positions ?? []) {\n const vaultAddr = (p.vault?.address ?? '').trim()\n if (!isAddress(vaultAddr)) continue\n const rawAssets = p.assets\n if (isZeroPositionAmount(rawAssets)) continue\n const decimals = p.vault?.asset?.decimals ?? 18\n const vaultAddress = getAddress(vaultAddr)\n byVault.set(vaultAddress.toLowerCase(), {\n vaultAddress,\n vaultSymbol: (p.vault?.symbol ?? p.vault?.asset?.symbol ?? 'Vault').trim() || 'Vault',\n underlyingSymbol: (p.vault?.asset?.symbol ?? '').trim() || '—',\n assetsHuman: formatMorphoPositionAssets(rawAssets, decimals),\n assetsUsdLabel: formatMorphoUsd(p.assetsUsd),\n shares: String(p.shares ?? '0').trim(),\n })\n }\n\n return [...byVault.values()]\n}\n\nexport async function fetchMorphoUserBluePositions(args: {\n user: string\n chainId: number\n}): Promise<MorphoBluePositionRow[]> {\n const user = args.user.trim()\n if (!isAddress(user)) return []\n const d = await morphoGql<{\n userByAddress: {\n marketPositions: {\n healthFactor?: number | null\n market: {\n marketId: string\n loanAsset: { address?: string; symbol?: string | null; decimals?: number | null }\n collateralAsset: { address?: string; symbol?: string | null; decimals?: number | null }\n lltv: string\n oracle: { address: string }\n irmAddress: string\n morphoBlue: { address: string }\n state?: { borrowApy?: number | null; supplyApy?: number | null; borrowAssetsUsd?: number | null } | null\n }\n state?: {\n collateral?: string | null\n borrowAssets?: string | null\n } | null\n }[]\n } | null\n }>(\n `\n query MorphoUserBluePositions($address: String!, $chainId: Int!) {\n userByAddress(address: $address, chainId: $chainId) {\n marketPositions {\n healthFactor\n market {\n marketId\n loanAsset { address symbol decimals }\n collateralAsset { address symbol decimals }\n lltv\n oracle { address }\n irmAddress\n morphoBlue { address }\n state { borrowApy supplyApy borrowAssetsUsd }\n }\n state { collateral borrowAssets }\n }\n }\n }\n `,\n { address: getAddress(user), chainId: args.chainId },\n )\n const out: MorphoBluePositionRow[] = []\n for (const p of d.userByAddress?.marketPositions ?? []) {\n const borrow = (p.state?.borrowAssets ?? '0').trim()\n const collateral = (p.state?.collateral ?? '0').trim()\n if ((borrow === '0' || borrow === '0.0') && (collateral === '0' || collateral === '0.0')) continue\n const borrowMarket = morphoMarketToBorrowRow(p.market)\n if (!borrowMarket) continue\n const hf = p.healthFactor\n out.push({\n marketId: p.market.marketId,\n marketLabel: borrowMarket.marketLabel,\n loanAssetSymbol: borrowMarket.loanAssetSymbol,\n collateralAssetSymbol: borrowMarket.collateralAssetSymbol,\n collateralHuman: collateral || '0',\n borrowHuman: borrow || '0',\n healthFactorLabel: hf != null && Number.isFinite(hf) ? hf.toFixed(2) : '—',\n borrowMarket,\n })\n }\n return out\n}\n\nexport async function fetchMorphoUserPortfolioUsd(args: {\n user: string\n chainId: number\n}): Promise<{ vaultUsd: number; borrowCollateralUsd: number; totalUsd: number }> {\n const user = args.user.trim()\n if (!isAddress(user)) return { vaultUsd: 0, borrowCollateralUsd: 0, totalUsd: 0 }\n const d = await morphoGql<{\n userByAddress: {\n vaultPositions: { state?: { assetsUsd?: number | null } | null }[]\n vaultV2Positions: { assetsUsd?: number | null }[]\n marketPositions: { state?: { collateralUsd?: number | null; borrowAssetsUsd?: number | null } | null }[]\n } | null\n }>(\n `\n query MorphoUserPortfolio($address: String!, $chainId: Int!) {\n userByAddress(address: $address, chainId: $chainId) {\n vaultPositions { state { assetsUsd } }\n vaultV2Positions { assetsUsd }\n marketPositions { state { collateralUsd borrowAssetsUsd } }\n }\n }\n `,\n { address: getAddress(user), chainId: args.chainId },\n )\n let vaultUsd = 0\n let borrowCollateralUsd = 0\n for (const v of d.userByAddress?.vaultPositions ?? []) {\n const n = v.state?.assetsUsd\n if (n != null && Number.isFinite(n)) vaultUsd += n\n }\n for (const v of d.userByAddress?.vaultV2Positions ?? []) {\n const n = v.assetsUsd\n if (n != null && Number.isFinite(n)) vaultUsd += n\n }\n for (const m of d.userByAddress?.marketPositions ?? []) {\n const n = m.state?.collateralUsd\n if (n != null && Number.isFinite(n)) borrowCollateralUsd += n\n }\n return { vaultUsd, borrowCollateralUsd, totalUsd: vaultUsd + borrowCollateralUsd }\n}\n\nexport function formatMorphoMarketApySummary(apy: number | null | undefined): string {\n return formatMorphoApyPct(apy)\n}\n","/**\n * Morpho Midnight (fixed-rate, fixed-term) — scaffold types until mainnet contracts/API are live.\n * @see https://morpho.org/blog/morpho-v2-liberating-the-potential-of-onchain-loans\n */\n\nexport type MorphoMidnightLoanIntentStatus = 'coming_soon' | 'open' | 'matched' | 'active' | 'repaid' | 'cancelled'\n\nexport type MorphoMidnightLoanIntent = {\n id: string\n status: MorphoMidnightLoanIntentStatus\n chainId: number\n /** Fixed annual rate (wad or human — TBD when API ships). */\n fixedRate?: string | null\n /** Loan term in seconds. */\n durationSeconds?: number | null\n loanAssetSymbol?: string | null\n collateralAssetSymbol?: string | null\n amountHuman?: string | null\n}\n\nexport const MORPHO_MIDNIGHT_UNAVAILABLE_MESSAGE =\n 'Morpho Midnight fixed-rate lending is not yet available on mainnet. This tab will activate after the progressive mainnet rollout.'\n\n/** Placeholder until Morpho exposes Midnight GraphQL queries. */\nexport async function fetchMorphoMidnightIntents(_args: {\n chainId: number\n user?: string\n}): Promise<readonly MorphoMidnightLoanIntent[]> {\n return []\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\n\nconst erc4626Abi = parseAbi([\n 'function asset() view returns (address)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function maxWithdraw(address owner) view returns (uint256)',\n])\n\nexport async function fetchMorphoVaultAssetDecimals(args: {\n rpcUrl: string\n chainId: number\n vault: Address\n}): Promise<number> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoVault',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const vault = getAddress(args.vault)\n const assetAddr = await publicClient.readContract({\n address: vault,\n abi: erc4626Abi,\n functionName: 'asset',\n })\n const d = await publicClient.readContract({\n address: getAddress(assetAddr),\n abi: parseAbi(['function decimals() view returns (uint8)']),\n functionName: 'decimals',\n })\n const n = typeof d === 'bigint' ? Number(d) : Number(d)\n return !Number.isFinite(n) || n < 0 || n > 36 ? 18 : n\n}\n\nexport async function fetchMorphoVaultMaxWithdrawWei(args: {\n rpcUrl: string\n chainId: number\n vault: Address\n owner: Address\n}): Promise<bigint> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoVault',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n return publicClient.readContract({\n address: getAddress(args.vault),\n abi: erc4626Abi,\n functionName: 'maxWithdraw',\n args: [getAddress(args.owner)],\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\nconst morphoBlueAbi = parseAbi([\n 'function position(bytes32 id, address user) view returns (uint256 supplyShares, uint128 borrowShares, uint128 collateral)',\n 'function market(bytes32 id) view returns (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee)',\n 'function idToMarketParams(bytes32 id) view returns (address loanToken, address collateralToken, address oracle, address irm, uint256 lltv)',\n])\n\nconst oracleAbi = parseAbi(['function price() view returns (uint256)'])\n\nconst WAD = 10n ** 18n\nconst ORACLE_PRICE_SCALE = 10n ** 36n\n\nexport async function previewMorphoBlueHealthAfterCollateralWithdraw(args: {\n rpcUrl: string\n chainId: number\n morphoBlue: Address\n marketId: `0x${string}`\n user: Address\n withdrawCollateralWei: bigint\n}): Promise<{ healthy: boolean; healthFactor: number | null }> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoBlue',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const morpho = getAddress(args.morphoBlue)\n const user = getAddress(args.user)\n const id = args.marketId\n\n const [pos, mkt, params] = await Promise.all([\n publicClient.readContract({\n address: morpho,\n abi: morphoBlueAbi,\n functionName: 'position',\n args: [id, user],\n }),\n publicClient.readContract({\n address: morpho,\n abi: morphoBlueAbi,\n functionName: 'market',\n args: [id],\n }),\n publicClient.readContract({\n address: morpho,\n abi: morphoBlueAbi,\n functionName: 'idToMarketParams',\n args: [id],\n }),\n ])\n\n const borrowShares = BigInt(pos[1])\n if (borrowShares === 0n) return { healthy: true, healthFactor: null }\n\n const collateral = BigInt(pos[2]) - args.withdrawCollateralWei\n const oracle = getAddress(params[2])\n const lltv = BigInt(params[4])\n const price = await publicClient.readContract({\n address: oracle,\n abi: oracleAbi,\n functionName: 'price',\n })\n\n const totalBorrowAssets = BigInt(mkt[2])\n const totalBorrowShares = BigInt(mkt[3])\n if (totalBorrowShares === 0n) return { healthy: true, healthFactor: null }\n\n const borrowed = (borrowShares * totalBorrowAssets + totalBorrowShares - 1n) / totalBorrowShares\n const maxBorrow = (collateral * price / ORACLE_PRICE_SCALE) * lltv / WAD\n const healthy = maxBorrow >= borrowed\n const hf = borrowed === 0n ? null : Number((maxBorrow * WAD) / borrowed) / Number(WAD)\n return { healthy, healthFactor: hf != null && Number.isFinite(hf) ? hf : null }\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { fetchMorphoVaultAssetDecimals } from './vaultSharesOnChain.js'\n\nexport const MORPHO_VAULT_DEPOSIT_FALLBACK_GAS = 950_000n\nconst MORPHO_ERC20_APPROVE_FALLBACK = 100_000n\nconst MORPHO_WETH_DEPOSIT_FALLBACK = 120_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\nconst vaultDepositAbi = parseAbi([\n 'function deposit(uint256 assets, address onBehalf) returns (uint256 shares)',\n])\n\ntype BuildStep = { kind: 'weth_deposit' | 'approve' | 'vault_deposit'; to: Address; data: `0x${string}`; value: bigint }\n\n/**\n * Morpho Vault V2: optional WETH wrap, ERC-20 approve, then `deposit(assets, onBehalf)`.\n */\nexport async function buildEvmMultisignBodyMorphoVaultDepositBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n vault: Address\n underlying: Address\n isNativeIn: boolean\n nativeWrapped: Address\n amountHuman: string\n onBehalf: Address\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const asset = getAddress(args.underlying)\n const vault = getAddress(args.vault)\n const weth = getAddress(args.nativeWrapped)\n const executor = getAddress(args.executorAddress)\n const onBehalf = getAddress(args.onBehalf)\n if (args.isNativeIn && asset.toLowerCase() !== weth.toLowerCase()) {\n throw new Error('Native deposit path: underlying asset must match the chain wrapped native token.')\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoVaultDeposit',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const dec = await fetchMorphoVaultAssetDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, vault })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Deposit amount is zero after converting with token decimals.')\n\n const steps: BuildStep[] = []\n if (args.isNativeIn) {\n const wethData = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' })\n steps.push({ kind: 'weth_deposit', to: weth, data: wethData, value: amountWei })\n }\n\n const spendToken = args.isNativeIn ? weth : asset\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, vault],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [vault, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [vault, amountWei] }),\n value: 0n,\n })\n }\n\n const depositData = encodeFunctionData({\n abi: vaultDepositAbi,\n functionName: 'deposit',\n args: [amountWei, onBehalf],\n })\n steps.push({ kind: 'vault_deposit', to: vault, data: depositData, value: 0n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Morpho vault'\n const purposeSuffix = `Morpho: ${steps.length}-tx — VaultV2.deposit (${args.amountHuman} underlying) into \"${vaultLabel}\".`\n\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit'\n ? MORPHO_WETH_DEPOSIT_FALLBACK\n : s.kind === 'approve'\n ? MORPHO_ERC20_APPROVE_FALLBACK\n : MORPHO_VAULT_DEPOSIT_FALLBACK_GAS,\n }))\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: vault,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'Morpho',\n name: 'VaultV2.deposit',\n vault,\n onBehalf,\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_vault_deposit', version: 1, chainId: String(args.chainId) },\n morpho: {\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n vault,\n onBehalf,\n gasBuildDeposit: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n","import {\n type Address,\n encodeFunctionData,\n getAddress,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { fetchMorphoVaultAssetDecimals, fetchMorphoVaultMaxWithdrawWei } from './vaultSharesOnChain.js'\n\nexport const MORPHO_VAULT_WITHDRAW_FALLBACK_GAS = 900_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst vaultWithdrawAbi = parseAbi([\n 'function withdraw(uint256 assets, address receiver, address onBehalf) returns (uint256 shares)',\n])\n\nexport async function buildEvmMultisignBodyMorphoVaultWithdraw(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n vault: Address\n amountHuman: string\n receiver: Address\n vaultShareOwner?: Address\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const vault = getAddress(args.vault)\n const receiver = getAddress(args.receiver)\n const shareOwner = getAddress(args.vaultShareOwner ?? args.receiver)\n const executor = getAddress(args.executorAddress)\n\n const dec = await fetchMorphoVaultAssetDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, vault })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Withdraw amount is zero after converting with token decimals.')\n\n const maxW = await fetchMorphoVaultMaxWithdrawWei({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n vault,\n owner: shareOwner,\n })\n if (amountWei > maxW) {\n throw new Error('Withdraw amount exceeds maxWithdraw for this vault. Try a smaller amount.')\n }\n\n const withdrawData = encodeFunctionData({\n abi: vaultWithdrawAbi,\n functionName: 'withdraw',\n args: [amountWei, receiver, shareOwner],\n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Morpho vault'\n const purposeSuffix = `Morpho: 1-tx — VaultV2.withdraw (${args.amountHuman} underlying) from \"${vaultLabel}\".`\n\n const evmSteps: EvmTxStep[] = [\n { to: vault, data: withdrawData, value: 0n, fallbackGas: MORPHO_VAULT_WITHDRAW_FALLBACK_GAS },\n ]\n const firstDataNo0x = withdrawData.startsWith('0x') ? withdrawData.slice(2) : withdrawData\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: vault,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'Morpho',\n name: 'VaultV2.withdraw',\n vault,\n receiver,\n owner: shareOwner,\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_vault_withdraw', version: 1, chainId: String(args.chainId) },\n morpho: {\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n vault,\n owner: shareOwner,\n gasBuildWithdraw: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport type { MorphoMarketParams } from './marketParams.js'\n\nexport const MORPHO_BLUE_COLLATERAL_DEPOSIT_FALLBACK_GAS = 1_200_000n\nexport const MORPHO_BLUE_BORROW_FALLBACK_GAS = 1_100_000n\nexport const MORPHO_BLUE_REPAY_FALLBACK_GAS = 1_000_000n\nexport const MORPHO_BLUE_COLLATERAL_WITHDRAW_FALLBACK_GAS = 900_000n\nconst MORPHO_ERC20_APPROVE_FALLBACK = 100_000n\nconst MORPHO_WETH_DEPOSIT_FALLBACK = 120_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\nconst morphoBlueAbi = parseAbi([\n 'function supplyCollateral((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, address onBehalf, bytes data)',\n 'function borrow((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, address receiver)',\n 'function repay((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, bytes data)',\n 'function withdrawCollateral((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, address onBehalf, address receiver)',\n])\n\nfunction marketParamsTuple(p: MorphoMarketParams) {\n return {\n loanToken: p.loanToken,\n collateralToken: p.collateralToken,\n oracle: p.oracle,\n irm: p.irm,\n lltv: p.lltv,\n }\n}\n\nasync function readTokenDecimals(args: {\n rpcUrl: string\n chainId: number\n token: Address\n}): Promise<number> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoToken',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const d = await publicClient.readContract({\n address: args.token,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const n = typeof d === 'bigint' ? Number(d) : Number(d)\n return !Number.isFinite(n) || n < 0 || n > 36 ? 18 : n\n}\n\ntype ApproveStep = { kind: 'weth_deposit' | 'approve'; to: Address; data: `0x${string}`; value: bigint }\n\nasync function buildApproveSteps(args: {\n rpcUrl: string\n chainId: number\n token: Address\n spender: Address\n amountWei: bigint\n executor: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n}): Promise<ApproveStep[]> {\n const steps: ApproveStep[] = []\n let spendToken = args.token\n if (args.isNativeIn && args.nativeWrapped) {\n const weth = getAddress(args.nativeWrapped)\n if (spendToken.toLowerCase() !== weth.toLowerCase()) {\n throw new Error('Native collateral path: token must match wrapped native.')\n }\n const wethData = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' })\n steps.push({ kind: 'weth_deposit', to: weth, data: wethData, value: args.amountWei })\n spendToken = weth\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoApprove',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [args.executor, args.spender],\n })\n if (currentAllowance < args.amountWei) {\n if (currentAllowance > 0n) {\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, args.amountWei] }),\n value: 0n,\n })\n }\n return steps\n}\n\nfunction stepsToEvm(steps: readonly ApproveStep[], final: EvmTxStep): EvmTxStep[] {\n return [\n ...steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'weth_deposit' ? MORPHO_WETH_DEPOSIT_FALLBACK : MORPHO_ERC20_APPROVE_FALLBACK,\n })),\n final,\n ]\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueSupplyCollateralBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n collateralToken: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n amountHuman: string\n onBehalf: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const executor = getAddress(args.executorAddress)\n const collateral = getAddress(args.collateralToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: collateral })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Collateral amount is zero.')\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: collateral,\n spender: morphoBlue,\n amountWei,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n })\n\n const supplyData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'supplyCollateral',\n args: [marketParamsTuple(args.marketParams), amountWei, onBehalf, '0x'],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps = stepsToEvm(approveSteps, {\n to: morphoBlue,\n data: supplyData,\n value: 0n,\n fallbackGas: MORPHO_BLUE_COLLATERAL_DEPOSIT_FALLBACK_GAS,\n })\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: supplyCollateral (${args.amountHuman}) for \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'supplyCollateral', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_supply_collateral', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueBorrowBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n loanToken: Address\n amountHuman: string\n onBehalf: Address\n receiver: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const receiver = getAddress(args.receiver)\n const executor = getAddress(args.executorAddress)\n const loan = getAddress(args.loanToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loan })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Borrow amount is zero.')\n\n const borrowData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'borrow',\n args: [marketParamsTuple(args.marketParams), amountWei, 0n, onBehalf, receiver],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps: EvmTxStep[] = [\n { to: morphoBlue, data: borrowData, value: 0n, fallbackGas: MORPHO_BLUE_BORROW_FALLBACK_GAS },\n ]\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: borrow (${args.amountHuman}) from \"${marketLabel}\".`,\n firstMsgRawNo0x: borrowData.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'borrow', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_borrow', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueRepayBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n loanToken: Address\n amountHuman: string\n onBehalf: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const executor = getAddress(args.executorAddress)\n const loan = getAddress(args.loanToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loan })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Repay amount is zero.')\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loan,\n spender: morphoBlue,\n amountWei,\n executor,\n })\n\n const repayData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'repay',\n args: [marketParamsTuple(args.marketParams), amountWei, 0n, onBehalf, '0x'],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps = stepsToEvm(approveSteps, {\n to: morphoBlue,\n data: repayData,\n value: 0n,\n fallbackGas: MORPHO_BLUE_REPAY_FALLBACK_GAS,\n })\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: repay (${args.amountHuman}) for \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'repay', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_repay', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueWithdrawCollateralBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n amountHuman: string\n collateralDecimals: number\n onBehalf: Address\n receiver: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const receiver = getAddress(args.receiver)\n const executor = getAddress(args.executorAddress)\n const amountWei = parseUnits(args.amountHuman, args.collateralDecimals)\n if (amountWei === 0n) throw new Error('Collateral withdraw amount is zero.')\n\n const withdrawData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'withdrawCollateral',\n args: [marketParamsTuple(args.marketParams), amountWei, onBehalf, receiver],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps: EvmTxStep[] = [\n { to: morphoBlue, data: withdrawData, value: 0n, fallbackGas: MORPHO_BLUE_COLLATERAL_WITHDRAW_FALLBACK_GAS },\n ]\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: withdrawCollateral (${args.amountHuman}) from \"${marketLabel}\".`,\n firstMsgRawNo0x: withdrawData.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'withdrawCollateral', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_withdraw_collateral', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n","import { getAddress, type Address } from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\n\nconst MORPHO_MERKL_CLAIM_FALLBACK_GAS = 500_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\n/** Merkl `Distributor.claim` — same calldata pattern as Euler v2 / Aave. */\nexport async function buildEvmMultisignBodyMorphoMerklDistributorClaim(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n to: Address\n data: `0x${string}`\n valueWei: bigint\n claimLeafCount: number\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n const firstDataNo0x = args.data.startsWith('0x') ? args.data.slice(2) : args.data\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: [{ to, data: args.data, value: args.valueWei, fallbackGas: MORPHO_MERKL_CLAIM_FALLBACK_GAS }],\n purposeSuffix: `Morpho: 1-tx — Merkl distributor claim (${args.claimLeafCount} reward(s)).`,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: to,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'Morpho',\n name: 'Merkl Distributor claim',\n claimLeafCount: args.claimLeafCount,\n chainId: args.chainId,\n }),\n evm: { type: 'morpho_merkl_distributor_claim', version: 1, chainId: String(args.chainId) },\n morpho: { step: 'merkl_distributor_claim', claimLeafCount: args.claimLeafCount, gasBuildClaim: { baseGasUnits: gasLimit.toString() } },\n }),\n })\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"]}
1
+ {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/morpho/api.ts","../../../../src/protocols/evm/morpho/marketParams.ts","../../../../src/protocols/evm/morpho/vaultEarnDetails.ts","../../../../src/protocols/evm/morpho/vaultMarkets.ts","../../../../src/protocols/evm/morpho/earnDiscovery.ts","../../../../src/protocols/evm/morpho/blueMarkets.ts","../../../../src/protocols/evm/morpho/blueDiscovery.ts","../../../../src/protocols/evm/morpho/userPositionsApi.ts","../../../../src/protocols/evm/morpho/midnightTypes.ts","../../../../src/protocols/evm/morpho/vaultSharesOnChain.ts","../../../../src/protocols/evm/morpho/blueRiskOnChain.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/morpho/vaultDepositMultisign.ts","../../../../src/protocols/evm/morpho/vaultWithdrawMultisign.ts","../../../../src/protocols/evm/morpho/blueMultisign.ts","../../../../src/protocols/evm/morpho/merklMultisign.ts","../../../../src/protocols/evm/morpho/index.ts"],"names":["getAddress","isAddress","light","exposure","detail","parseAbi","defineChain","createPublicClient","http","gasLimitFromEstimateAndChainConfig","parseUnits","encodeFunctionData","MORPHO_ERC20_APPROVE_FALLBACK","MORPHO_WETH_DEPOSIT_FALLBACK","wethDepositAbi","erc20AllowanceAbi","erc20ApproveAbi","morphoBlueAbi"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/**\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 { 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, type Address } from 'viem'\nimport { morphoGql, type MorphoMarketApiRow } from './api.js'\n\nexport type MorphoMarketParams = {\n loanToken: Address\n collateralToken: Address\n oracle: Address\n irm: Address\n lltv: bigint\n}\n\nexport type ResolvedMorphoMarket = MorphoMarketApiRow & {\n morphoBlueAddress: Address\n marketParams: MorphoMarketParams\n}\n\nexport function marketParamsFromApiRow(row: MorphoMarketApiRow): MorphoMarketParams {\n const loanToken = getAddress(row.loanAsset.address ?? '')\n const collateralToken = getAddress(row.collateralAsset.address ?? '')\n const oracle = getAddress(row.oracle.address)\n const irm = getAddress(row.irmAddress)\n const lltv = BigInt(row.lltv)\n return { loanToken, collateralToken, oracle, irm, lltv }\n}\n\nexport async function fetchMorphoMarketById(args: {\n chainId: number\n marketId: string\n}): Promise<ResolvedMorphoMarket | null> {\n const marketId = args.marketId.trim()\n if (!marketId) return null\n const d = await morphoGql<{ marketById: MorphoMarketApiRow | null }>(\n `\n query MorphoMarketById($marketId: String!, $chainId: Int!) {\n marketById(marketId: $marketId, chainId: $chainId) {\n marketId\n loanAsset { address symbol decimals price { usd } }\n collateralAsset { address symbol decimals price { usd } }\n lltv\n oracle { address }\n irmAddress\n morphoBlue { address }\n state {\n supplyApy borrowApy netSupplyApy netBorrowApy\n supplyAssetsUsd borrowAssetsUsd collateralAssetsUsd utilization\n rewards { supplyApr borrowApr asset { address symbol } }\n }\n }\n }\n `,\n { marketId, chainId: args.chainId },\n )\n const row = d.marketById\n if (!row?.marketId || !row.morphoBlue?.address) return null\n return {\n ...row,\n morphoBlueAddress: getAddress(row.morphoBlue.address),\n marketParams: marketParamsFromApiRow(row),\n }\n}\n","import { getAddress, isAddress } from 'viem'\nimport { formatMorphoApyPct, formatMorphoUsd, morphoGql } from './api.js'\nimport type { MorphoEarnOfferingRow, MorphoEarnVaultExposureRow } from './vaultMarkets.js'\n\nconst LIGHT_BATCH_SIZE = 8\nconst V2_EXPOSURE_POSITION_LIMIT = 20\nconst EXPOSURE_FETCH_CONCURRENCY = 4\n\nexport type MorphoEarnVaultDetailFields = Pick<\n MorphoEarnOfferingRow,\n 'liquidityUsdLabel' | 'netApy7dLabel' | 'netApy30dLabel' | 'netApy90dLabel' | 'exposure'\n>\n\nfunction formatAllocationPercent(partUsd: number, totalUsd: number): string {\n if (!Number.isFinite(partUsd) || !Number.isFinite(totalUsd) || totalUsd <= 0) return '—'\n return `${((partUsd / totalUsd) * 100).toFixed(1)}%`\n}\n\nfunction marketExposureLabel(loan?: string | null, collateral?: string | null): string {\n const loanSym = (loan ?? '').trim() || 'LOAN'\n const colSym = (collateral ?? '').trim()\n return colSym ? `${loanSym}/${colSym}` : loanSym\n}\n\nfunction latestHistoryApy(points: { y?: number | null }[] | null | undefined): number | null {\n const y = points?.[0]?.y\n return y != null && Number.isFinite(y) ? y : null\n}\n\nfunction parseV1Exposure(\n allocation: {\n supplyAssetsUsd?: number | null\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n }[],\n totalUsd: number,\n): MorphoEarnVaultExposureRow[] {\n const out: MorphoEarnVaultExposureRow[] = []\n for (const a of allocation) {\n const usd = a.supplyAssetsUsd\n if (usd == null || !Number.isFinite(usd) || usd <= 0) continue\n out.push({\n label: marketExposureLabel(a.market?.loanAsset?.symbol, a.market?.collateralAsset?.symbol),\n allocatedUsdLabel: formatMorphoUsd(usd),\n allocationPercentLabel: formatAllocationPercent(usd, totalUsd),\n })\n }\n return out.sort((a, b) => parseFloat(b.allocatedUsdLabel.replace(/[^0-9.]/g, '')) - parseFloat(a.allocatedUsdLabel.replace(/[^0-9.]/g, '')))\n}\n\nfunction parseV2Exposure(\n adapters: {\n __typename?: string\n assetsUsd?: number | null\n innerVault?: { name?: string | null; asset?: { symbol?: string | null } | null } | null\n positions?: {\n items?: {\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n state?: { supplyAssetsUsd?: number | null } | null\n }[]\n } | null\n }[],\n totalUsd: number,\n): MorphoEarnVaultExposureRow[] {\n const byKey = new Map<string, number>()\n\n for (const adapter of adapters) {\n if (adapter.__typename === 'MorphoVaultV2Adapter') {\n const usd = adapter.assetsUsd\n if (usd == null || !Number.isFinite(usd) || usd <= 0) continue\n const label = (adapter.innerVault?.name ?? adapter.innerVault?.asset?.symbol ?? 'Vault V2 adapter').trim() || 'Vault V2 adapter'\n byKey.set(label, (byKey.get(label) ?? 0) + usd)\n continue\n }\n if (adapter.__typename === 'MorphoMarketV1Adapter') {\n for (const p of adapter.positions?.items ?? []) {\n const usd = p.state?.supplyAssetsUsd\n if (usd == null || !Number.isFinite(usd) || usd <= 0) continue\n const label = marketExposureLabel(p.market?.loanAsset?.symbol, p.market?.collateralAsset?.symbol)\n byKey.set(label, (byKey.get(label) ?? 0) + usd)\n }\n const adapterUsd = adapter.assetsUsd\n if (!adapter.positions?.items?.length && adapterUsd != null && Number.isFinite(adapterUsd) && adapterUsd > 0) {\n byKey.set('Morpho markets', (byKey.get('Morpho markets') ?? 0) + adapterUsd)\n }\n }\n }\n\n return [...byKey.entries()]\n .map(([label, usd]) => ({\n label,\n allocatedUsdLabel: formatMorphoUsd(usd),\n allocationPercentLabel: formatAllocationPercent(usd, totalUsd),\n }))\n .sort((a, b) => parseFloat(b.allocatedUsdLabel.replace(/[^0-9.]/g, '')) - parseFloat(a.allocatedUsdLabel.replace(/[^0-9.]/g, '')))\n}\n\nexport function emptyMorphoEarnVaultDetailFields(): MorphoEarnVaultDetailFields {\n return {\n liquidityUsdLabel: '—',\n netApy7dLabel: '—',\n netApy30dLabel: '—',\n netApy90dLabel: '—',\n exposure: [],\n }\n}\n\nasync function fetchV1EarnVaultLightBatch(args: {\n chainId: number\n addresses: string[]\n}): Promise<Map<string, MorphoEarnVaultDetailFields>> {\n const out = new Map<string, MorphoEarnVaultDetailFields>()\n if (!args.addresses.length) return out\n\n const d = await morphoGql<{\n vaults: {\n items: {\n address: string\n liquidity?: { usd?: number | null } | null\n }[]\n }\n }>(\n `\n query MorphoV1EarnVaultLight($chainId: Int!, $addresses: [String!]!) {\n vaults(where: { chainId_in: [$chainId], address_in: $addresses, listed: true }) {\n items {\n address\n liquidity { usd }\n }\n }\n }\n `,\n { chainId: args.chainId, addresses: args.addresses.map((a) => getAddress(a)) },\n )\n\n for (const v of d.vaults?.items ?? []) {\n const addr = (v.address ?? '').trim()\n if (!isAddress(addr)) continue\n out.set(getAddress(addr).toLowerCase(), {\n ...emptyMorphoEarnVaultDetailFields(),\n liquidityUsdLabel: formatMorphoUsd(v.liquidity?.usd),\n })\n }\n return out\n}\n\nasync function fetchV1EarnVaultPeriodApys(args: {\n chainId: number\n address: string\n}): Promise<Pick<MorphoEarnVaultDetailFields, 'netApy7dLabel' | 'netApy30dLabel' | 'netApy90dLabel'>> {\n const d = await morphoGql<{\n vaultByAddress: {\n historicalState?: {\n weeklyNetApy?: { y?: number | null }[] | null\n monthlyNetApy?: { y?: number | null }[] | null\n quarterlyNetApy?: { y?: number | null }[] | null\n } | null\n } | null\n }>(\n `\n query MorphoV1EarnVaultPeriodApys($chainId: Int!, $address: String!) {\n vaultByAddress(chainId: $chainId, address: $address) {\n historicalState {\n weeklyNetApy { y }\n monthlyNetApy { y }\n quarterlyNetApy { y }\n }\n }\n }\n `,\n { chainId: args.chainId, address: getAddress(args.address) },\n )\n\n const hs = d.vaultByAddress?.historicalState\n return {\n netApy7dLabel: formatMorphoApyPct(latestHistoryApy(hs?.weeklyNetApy)),\n netApy30dLabel: formatMorphoApyPct(latestHistoryApy(hs?.monthlyNetApy)),\n netApy90dLabel: formatMorphoApyPct(latestHistoryApy(hs?.quarterlyNetApy)),\n }\n}\n\nasync function fetchV2EarnVaultLightBatch(args: {\n chainId: number\n addresses: string[]\n}): Promise<Map<string, MorphoEarnVaultDetailFields>> {\n const out = new Map<string, MorphoEarnVaultDetailFields>()\n if (!args.addresses.length) return out\n\n const d = await morphoGql<{\n vaultV2s: {\n items: {\n address: string\n liquidityUsd?: number | null\n avgNetApy7d?: number | null\n avgNetApy30d?: number | null\n avgNetApy90d?: number | null\n }[]\n }\n }>(\n `\n query MorphoV2EarnVaultLight($chainId: Int!, $addresses: [String!]!) {\n vaultV2s(where: { chainId_in: [$chainId], address_in: $addresses, listed: true }) {\n items {\n address\n liquidityUsd\n avgNetApy7d: avgNetApy(lookback: SEVEN_DAYS)\n avgNetApy30d: avgNetApy(lookback: THIRTY_DAYS)\n avgNetApy90d: avgNetApy(lookback: NINETY_DAYS)\n }\n }\n }\n `,\n {\n chainId: args.chainId,\n addresses: args.addresses.map((a) => getAddress(a)),\n },\n )\n\n for (const v of d.vaultV2s?.items ?? []) {\n const addr = (v.address ?? '').trim()\n if (!isAddress(addr)) continue\n out.set(getAddress(addr).toLowerCase(), {\n liquidityUsdLabel: formatMorphoUsd(v.liquidityUsd),\n netApy7dLabel: formatMorphoApyPct(v.avgNetApy7d),\n netApy30dLabel: formatMorphoApyPct(v.avgNetApy30d),\n netApy90dLabel: formatMorphoApyPct(v.avgNetApy90d),\n exposure: [],\n })\n }\n return out\n}\n\nasync function fetchV1EarnVaultExposure(args: {\n chainId: number\n address: string\n}): Promise<MorphoEarnVaultExposureRow[]> {\n const d = await morphoGql<{\n vaultByAddress: {\n address?: string | null\n state?: {\n totalAssetsUsd?: number | null\n allocation?: {\n supplyAssetsUsd?: number | null\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n }[] | null\n } | null\n } | null\n }>(\n `\n query MorphoV1EarnVaultExposure($chainId: Int!, $address: String!) {\n vaultByAddress(chainId: $chainId, address: $address) {\n address\n state {\n totalAssetsUsd\n allocation {\n supplyAssetsUsd\n market { loanAsset { symbol } collateralAsset { symbol } }\n }\n }\n }\n }\n `,\n { chainId: args.chainId, address: getAddress(args.address) },\n )\n\n const v = d.vaultByAddress\n if (!v?.address) return []\n return parseV1Exposure(v.state?.allocation ?? [], v.state?.totalAssetsUsd ?? 0)\n}\n\nasync function fetchV2EarnVaultExposure(args: {\n chainId: number\n address: string\n}): Promise<MorphoEarnVaultExposureRow[]> {\n const d = await morphoGql<{\n vaultV2ByAddress: {\n address?: string | null\n totalAssetsUsd?: number | null\n adapters?: {\n items?: {\n __typename?: string\n assetsUsd?: number | null\n innerVault?: { name?: string | null; asset?: { symbol?: string | null } | null } | null\n positions?: {\n items?: {\n market?: { loanAsset?: { symbol?: string | null } | null; collateralAsset?: { symbol?: string | null } | null } | null\n state?: { supplyAssetsUsd?: number | null } | null\n }[]\n } | null\n }[]\n } | null\n } | null\n }>(\n `\n query MorphoV2EarnVaultExposure($chainId: Int!, $address: String!, $posLimit: Int!) {\n vaultV2ByAddress(chainId: $chainId, address: $address) {\n address\n totalAssetsUsd\n adapters {\n items {\n __typename\n assetsUsd\n ... on MorphoVaultV2Adapter {\n innerVault { name asset { symbol } }\n }\n ... on MorphoMarketV1Adapter {\n positions(first: $posLimit) {\n items {\n market { loanAsset { symbol } collateralAsset { symbol } }\n state { supplyAssetsUsd }\n }\n }\n }\n }\n }\n }\n }\n `,\n { chainId: args.chainId, address: getAddress(args.address), posLimit: V2_EXPOSURE_POSITION_LIMIT },\n )\n\n const v = d.vaultV2ByAddress\n if (!v?.address) return []\n return parseV2Exposure(v.adapters?.items ?? [], v.totalAssetsUsd ?? 0)\n}\n\n/** Full detail fetch for one vault (period APYs, liquidity, exposure). Safe for UI expand / agent single-vault lookup. */\nexport async function fetchMorphoEarnVaultDetails(args: {\n chainId: number\n vaultAddress: string\n vaultGeneration: 'v1' | 'v2'\n}): Promise<MorphoEarnVaultDetailFields> {\n const addr = args.vaultAddress.trim()\n if (!isAddress(addr)) return emptyMorphoEarnVaultDetailFields()\n\n if (args.vaultGeneration === 'v1') {\n const [light, periodApys, exposure] = await Promise.all([\n fetchV1EarnVaultLightBatch({ chainId: args.chainId, addresses: [addr] }),\n fetchV1EarnVaultPeriodApys({ chainId: args.chainId, address: addr }),\n fetchV1EarnVaultExposure({ chainId: args.chainId, address: addr }),\n ])\n const detail = light.get(getAddress(addr).toLowerCase()) ?? emptyMorphoEarnVaultDetailFields()\n return { ...detail, ...periodApys, exposure }\n }\n\n const [light, exposure] = await Promise.all([\n fetchV2EarnVaultLightBatch({ chainId: args.chainId, addresses: [addr] }),\n fetchV2EarnVaultExposure({ chainId: args.chainId, address: addr }),\n ])\n const detail = light.get(getAddress(addr).toLowerCase()) ?? emptyMorphoEarnVaultDetailFields()\n return { ...detail, exposure }\n}\n\nasync function enrichMorphoEarnOfferingRowsLight(\n chainId: number,\n rows: MorphoEarnOfferingRow[],\n): Promise<MorphoEarnOfferingRow[]> {\n if (!rows.length) return rows\n\n const v1Addrs: string[] = []\n const v2Addrs: string[] = []\n for (const r of rows) {\n if (r.vaultGeneration === 'v1') v1Addrs.push(r.vaultAddress)\n else v2Addrs.push(r.vaultAddress)\n }\n\n const detailByAddr = new Map<string, MorphoEarnVaultDetailFields>()\n\n for (let i = 0; i < v1Addrs.length; i += LIGHT_BATCH_SIZE) {\n const batch = await fetchV1EarnVaultLightBatch({ chainId, addresses: v1Addrs.slice(i, i + LIGHT_BATCH_SIZE) })\n for (const [k, v] of batch) detailByAddr.set(k, v)\n }\n for (let i = 0; i < v2Addrs.length; i += LIGHT_BATCH_SIZE) {\n const batch = await fetchV2EarnVaultLightBatch({ chainId, addresses: v2Addrs.slice(i, i + LIGHT_BATCH_SIZE) })\n for (const [k, v] of batch) detailByAddr.set(k, v)\n }\n\n return rows.map((row) => {\n const detail = detailByAddr.get(row.vaultAddress.toLowerCase())\n if (!detail) return row\n return {\n ...row,\n liquidityUsdLabel: detail.liquidityUsdLabel !== '—' ? detail.liquidityUsdLabel : row.liquidityUsdLabel,\n netApy7dLabel: detail.netApy7dLabel,\n netApy30dLabel: detail.netApy30dLabel,\n netApy90dLabel: detail.netApy90dLabel,\n }\n })\n}\n\nasync function attachAgentVaultDetails(chainId: number, rows: MorphoEarnOfferingRow[]): Promise<MorphoEarnOfferingRow[]> {\n if (!rows.length) return rows\n const out = [...rows]\n\n for (let i = 0; i < out.length; i += EXPOSURE_FETCH_CONCURRENCY) {\n const chunk = out.slice(i, i + EXPOSURE_FETCH_CONCURRENCY)\n const details = await Promise.all(\n chunk.map(async (row) => {\n const exposure =\n row.vaultGeneration === 'v1'\n ? await fetchV1EarnVaultExposure({ chainId, address: row.vaultAddress })\n : await fetchV2EarnVaultExposure({ chainId, address: row.vaultAddress })\n const periodApys =\n row.vaultGeneration === 'v1'\n ? await fetchV1EarnVaultPeriodApys({ chainId, address: row.vaultAddress })\n : {\n netApy7dLabel: row.netApy7dLabel,\n netApy30dLabel: row.netApy30dLabel,\n netApy90dLabel: row.netApy90dLabel,\n }\n return { exposure, periodApys }\n }),\n )\n for (let j = 0; j < chunk.length; j++) {\n out[i + j] = { ...out[i + j], ...details[j].periodApys, exposure: details[j].exposure }\n }\n }\n\n return out\n}\n\n/** Light enrichment (liquidity + period APYs). No exposure — use fetchMorphoEarnVaultDetails for one vault. */\nexport async function enrichMorphoEarnOfferingRows(\n chainId: number,\n rows: MorphoEarnOfferingRow[],\n): Promise<MorphoEarnOfferingRow[]> {\n return enrichMorphoEarnOfferingRowsLight(chainId, rows)\n}\n\n/** MCP / agent: light enrichment plus per-vault exposure (chunked to stay under API complexity limits). */\nexport async function enrichMorphoEarnOfferingRowsForAgent(\n chainId: number,\n rows: MorphoEarnOfferingRow[],\n): Promise<MorphoEarnOfferingRow[]> {\n const light = await enrichMorphoEarnOfferingRowsLight(chainId, rows)\n return attachAgentVaultDetails(chainId, light)\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 { getAddress, isAddress } from 'viem'\nimport { searchMorphoListedEarnVaults, type MorphoEarnVaultDiscoveryRow } from './vaultMarkets.js'\n\n/** MCP: Morpho-listed earn vaults (V1 + V2 merged). Filter by deposit asset and/or vault name. */\nexport async function morphoFetchEarnVaultsSummary(args: {\n chainId: number\n underlying?: string\n query?: string\n limit?: number\n}): Promise<{ vaults: MorphoEarnVaultDiscoveryRow[] }> {\n const vaults = await searchMorphoListedEarnVaults({\n chainId: args.chainId,\n underlying: args.underlying?.trim() || undefined,\n query: args.query?.trim() || undefined,\n limit: args.limit,\n })\n return { vaults }\n}\n\n/** Resolve vault by address when the agent already has one; rejects unlisted vaults. */\nexport async function morphoResolveListedEarnVaultByAddress(args: {\n chainId: number\n vaultAddress: string\n}): Promise<MorphoEarnVaultDiscoveryRow | null> {\n const addr = args.vaultAddress.trim()\n if (!isAddress(addr)) return null\n const rows = await searchMorphoListedEarnVaults({\n chainId: args.chainId,\n query: getAddress(addr),\n limit: 5,\n })\n const hit = rows.find((r) => r.vaultAddress.toLowerCase() === getAddress(addr).toLowerCase())\n return hit ?? null\n}\n\nexport type { MorphoEarnVaultDiscoveryRow }\n","import { getAddress, isAddress } from 'viem'\nimport { morphoGql, morphoKeyForAssetRow, formatMorphoApyPct, formatMorphoUsd, type MorphoMarketApiRow } from './api.js'\n\nexport type MorphoBorrowMarketRow = {\n marketId: string\n morphoBlueAddress: string\n loanAssetAddress: string\n loanAssetSymbol: string\n loanAssetDecimals: number\n collateralAssetAddress: string\n collateralAssetSymbol: string\n collateralAssetDecimals: number\n borrowApyLabel: string\n supplyApyLabel: string\n borrowAssetsUsdLabel: string\n lltvLabel: string\n marketLabel: string\n}\n\nfunction lltvToPctLabel(lltv: string): string {\n try {\n const wad = BigInt(lltv)\n const pct = Number(wad) / 1e16\n if (!Number.isFinite(pct)) return '—'\n return `${pct.toFixed(1)}%`\n } catch {\n return '—'\n }\n}\n\nexport async function fetchMorphoMarketsForChain(chainId: number, first = 200): Promise<readonly MorphoMarketApiRow[]> {\n const d = await morphoGql<{ markets: { items: MorphoMarketApiRow[] } }>(\n `\n query MorphoMarkets($chainId: Int!, $first: Int!) {\n markets(first: $first, where: { chainId_in: [$chainId] }, orderBy: BorrowAssetsUsd, orderDirection: Desc) {\n items {\n marketId\n loanAsset { address symbol decimals price { usd } }\n collateralAsset { address symbol decimals price { usd } }\n lltv\n oracle { address }\n irmAddress\n morphoBlue { address }\n state {\n supplyApy borrowApy netSupplyApy netBorrowApy\n supplyAssetsUsd borrowAssetsUsd collateralAssetsUsd utilization\n rewards { supplyApr borrowApr asset { address symbol } }\n }\n }\n }\n }\n `,\n { chainId, first },\n )\n return d.markets?.items ?? []\n}\n\nexport function morphoMarketToBorrowRow(m: MorphoMarketApiRow): MorphoBorrowMarketRow | null {\n if (!m.marketId || !m.morphoBlue?.address) return null\n const loan = m.loanAsset\n const col = m.collateralAsset\n if (!isAddress(loan?.address ?? '') || !isAddress(col?.address ?? '')) return null\n const loanSym = (loan.symbol ?? 'LOAN').trim()\n const colSym = (col.symbol ?? 'COL').trim()\n return {\n marketId: m.marketId,\n morphoBlueAddress: getAddress(m.morphoBlue.address),\n loanAssetAddress: getAddress(loan.address!),\n loanAssetSymbol: loanSym,\n loanAssetDecimals: loan.decimals ?? 18,\n collateralAssetAddress: getAddress(col.address!),\n collateralAssetSymbol: colSym,\n collateralAssetDecimals: col.decimals ?? 18,\n borrowApyLabel: formatMorphoApyPct(m.state?.borrowApy),\n supplyApyLabel: formatMorphoApyPct(m.state?.supplyApy),\n borrowAssetsUsdLabel: formatMorphoUsd(m.state?.borrowAssetsUsd),\n lltvLabel: lltvToPctLabel(m.lltv),\n marketLabel: `${colSym}/${loanSym}`,\n }\n}\n\nexport async function fetchMorphoBorrowMarketsForCollateral(args: {\n chainId: number\n collateralAddress: string\n}): Promise<MorphoBorrowMarketRow[]> {\n const key = morphoKeyForAssetRow({ contractAddress: args.collateralAddress })\n if (!key) return []\n const markets = await fetchMorphoMarketsForChain(args.chainId, 300)\n const out: MorphoBorrowMarketRow[] = []\n for (const m of markets) {\n const col = (m.collateralAsset?.address ?? '').trim().toLowerCase()\n if (!col || col !== key) continue\n const row = morphoMarketToBorrowRow(m)\n if (row) out.push(row)\n }\n return out\n}\n\nexport async function fetchMorphoBorrowMarketsForLoan(args: {\n chainId: number\n loanAddress: string\n}): Promise<MorphoBorrowMarketRow[]> {\n const key = morphoKeyForAssetRow({ contractAddress: args.loanAddress })\n if (!key) return []\n const markets = await fetchMorphoMarketsForChain(args.chainId, 300)\n const out: MorphoBorrowMarketRow[] = []\n for (const m of markets) {\n const loan = (m.loanAsset?.address ?? '').trim().toLowerCase()\n if (!loan || loan !== key) continue\n const row = morphoMarketToBorrowRow(m)\n if (row) out.push(row)\n }\n return out\n}\n","import {\n fetchMorphoBorrowMarketsForCollateral,\n fetchMorphoBorrowMarketsForLoan,\n fetchMorphoMarketsForChain,\n morphoMarketToBorrowRow,\n type MorphoBorrowMarketRow,\n} from './blueMarkets.js'\n\nexport type MorphoBlueMarketDiscoveryRow = {\n marketId: string\n marketLabel: string\n morphoBlueAddress: string\n collateralTokenAddress: string\n collateralTokenSymbol: string\n collateralTokenDecimals: number\n loanTokenAddress: string\n loanTokenSymbol: string\n loanTokenDecimals: number\n borrowApyLabel: string\n supplyApyLabel: string\n}\n\nfunction toDiscoveryRow(row: MorphoBorrowMarketRow): MorphoBlueMarketDiscoveryRow {\n return {\n marketId: row.marketId,\n marketLabel: row.marketLabel,\n morphoBlueAddress: row.morphoBlueAddress,\n collateralTokenAddress: row.collateralAssetAddress,\n collateralTokenSymbol: row.collateralAssetSymbol,\n collateralTokenDecimals: row.collateralAssetDecimals,\n loanTokenAddress: row.loanAssetAddress,\n loanTokenSymbol: row.loanAssetSymbol,\n loanTokenDecimals: row.loanAssetDecimals,\n borrowApyLabel: row.borrowApyLabel,\n supplyApyLabel: row.supplyApyLabel,\n }\n}\n\n/** MCP: list/search Morpho Blue markets for collateral deposit / borrow flows. */\nexport async function morphoFetchBlueMarketsSummary(args: {\n chainId: number\n /** Collateral asset symbol or address — filters markets where this token is collateral. */\n collateral?: string\n /** Loan asset symbol or address — filters markets where this token is loan. */\n loan?: string\n /** Case-insensitive filter on marketLabel, symbols, or marketId substring. */\n query?: string\n limit?: number\n}): Promise<{ markets: MorphoBlueMarketDiscoveryRow[] }> {\n const limit = Math.min(Math.max(args.limit ?? 50, 1), 200)\n let rows: MorphoBorrowMarketRow[] = []\n\n const collateral = args.collateral?.trim()\n const loan = args.loan?.trim()\n if (collateral) {\n rows = await fetchMorphoBorrowMarketsForCollateral({\n chainId: args.chainId,\n collateralAddress: collateral,\n })\n } else if (loan) {\n rows = await fetchMorphoBorrowMarketsForLoan({\n chainId: args.chainId,\n loanAddress: loan,\n })\n } else {\n const raw = await fetchMorphoMarketsForChain(args.chainId, 300)\n for (const m of raw) {\n const row = morphoMarketToBorrowRow(m)\n if (row) rows.push(row)\n }\n }\n\n const q = (args.query ?? '').trim().toLowerCase()\n if (q) {\n rows = rows.filter((r) => {\n const hay = [\n r.marketLabel,\n r.marketId,\n r.collateralAssetSymbol,\n r.loanAssetSymbol,\n r.collateralAssetAddress,\n r.loanAssetAddress,\n ]\n .join(' ')\n .toLowerCase()\n return hay.includes(q)\n })\n }\n\n return { markets: rows.slice(0, limit).map(toDiscoveryRow) }\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport { morphoGql, formatMorphoApyPct, formatMorphoUsd } from './api.js'\nimport { morphoMarketToBorrowRow, type MorphoBorrowMarketRow } from './blueMarkets.js'\n\nfunction formatMorphoPositionAssets(raw: string | number | null | undefined, decimals: number): string {\n if (raw == null) return '0'\n const s = String(raw).trim()\n if (!s || s === '0') return '0'\n try {\n return formatUnits(BigInt(s), decimals)\n } catch {\n return s\n }\n}\n\nfunction isZeroPositionAmount(raw: string | number | null | undefined): boolean {\n if (raw == null) return true\n const s = String(raw).trim()\n return !s || s === '0' || s === '0.0'\n}\n\nexport type MorphoVaultPositionRow = {\n vaultAddress: string\n vaultSymbol: string\n underlyingSymbol: string\n assetsHuman: string\n assetsUsdLabel: string\n shares: string\n}\n\nexport type MorphoBluePositionRow = {\n marketId: string\n marketLabel: string\n loanAssetSymbol: string\n collateralAssetSymbol: string\n collateralHuman: string\n borrowHuman: string\n healthFactorLabel: string\n borrowMarket: MorphoBorrowMarketRow\n}\n\nexport async function fetchMorphoUserVaultPositions(args: {\n user: string\n chainId: number\n}): Promise<MorphoVaultPositionRow[]> {\n const user = args.user.trim()\n if (!isAddress(user)) return []\n const d = await morphoGql<{\n userByAddress: {\n vaultPositions: {\n vault: {\n address: string\n symbol?: string | null\n asset?: { symbol?: string | null; decimals?: number | null } | null\n }\n state?: { assets?: string | number | null; assetsUsd?: number | null; shares?: string | null } | null\n }[]\n vaultV2Positions: {\n vault: {\n address: string\n symbol?: string | null\n asset?: { symbol?: string | null; decimals?: number | null } | null\n }\n assets?: string | number | null\n assetsUsd?: number | null\n shares?: string | null\n }[]\n } | null\n }>(\n `\n query MorphoUserVaultPositions($address: String!, $chainId: Int!) {\n userByAddress(address: $address, chainId: $chainId) {\n vaultPositions {\n vault { address symbol asset { symbol decimals } }\n state { assets assetsUsd shares }\n }\n vaultV2Positions {\n vault { address symbol asset { symbol decimals } }\n assets assetsUsd shares\n }\n }\n }\n `,\n { address: getAddress(user), chainId: args.chainId },\n )\n const byVault = new Map<string, MorphoVaultPositionRow>()\n\n for (const p of d.userByAddress?.vaultPositions ?? []) {\n const vaultAddr = (p.vault?.address ?? '').trim()\n if (!isAddress(vaultAddr)) continue\n const rawAssets = p.state?.assets\n if (isZeroPositionAmount(rawAssets)) continue\n const decimals = p.vault?.asset?.decimals ?? 18\n const vaultAddress = getAddress(vaultAddr)\n byVault.set(vaultAddress.toLowerCase(), {\n vaultAddress,\n vaultSymbol: (p.vault?.symbol ?? 'Vault').trim(),\n underlyingSymbol: (p.vault?.asset?.symbol ?? '').trim() || '—',\n assetsHuman: formatMorphoPositionAssets(rawAssets, decimals),\n assetsUsdLabel: formatMorphoUsd(p.state?.assetsUsd),\n shares: String(p.state?.shares ?? '0').trim(),\n })\n }\n\n for (const p of d.userByAddress?.vaultV2Positions ?? []) {\n const vaultAddr = (p.vault?.address ?? '').trim()\n if (!isAddress(vaultAddr)) continue\n const rawAssets = p.assets\n if (isZeroPositionAmount(rawAssets)) continue\n const decimals = p.vault?.asset?.decimals ?? 18\n const vaultAddress = getAddress(vaultAddr)\n byVault.set(vaultAddress.toLowerCase(), {\n vaultAddress,\n vaultSymbol: (p.vault?.symbol ?? p.vault?.asset?.symbol ?? 'Vault').trim() || 'Vault',\n underlyingSymbol: (p.vault?.asset?.symbol ?? '').trim() || '—',\n assetsHuman: formatMorphoPositionAssets(rawAssets, decimals),\n assetsUsdLabel: formatMorphoUsd(p.assetsUsd),\n shares: String(p.shares ?? '0').trim(),\n })\n }\n\n return [...byVault.values()]\n}\n\nexport async function fetchMorphoUserBluePositions(args: {\n user: string\n chainId: number\n}): Promise<MorphoBluePositionRow[]> {\n const user = args.user.trim()\n if (!isAddress(user)) return []\n const d = await morphoGql<{\n userByAddress: {\n marketPositions: {\n healthFactor?: number | null\n market: {\n marketId: string\n loanAsset: { address?: string; symbol?: string | null; decimals?: number | null }\n collateralAsset: { address?: string; symbol?: string | null; decimals?: number | null }\n lltv: string\n oracle: { address: string }\n irmAddress: string\n morphoBlue: { address: string }\n state?: { borrowApy?: number | null; supplyApy?: number | null; borrowAssetsUsd?: number | null } | null\n }\n state?: {\n collateral?: string | null\n borrowAssets?: string | null\n } | null\n }[]\n } | null\n }>(\n `\n query MorphoUserBluePositions($address: String!, $chainId: Int!) {\n userByAddress(address: $address, chainId: $chainId) {\n marketPositions {\n healthFactor\n market {\n marketId\n loanAsset { address symbol decimals }\n collateralAsset { address symbol decimals }\n lltv\n oracle { address }\n irmAddress\n morphoBlue { address }\n state { borrowApy supplyApy borrowAssetsUsd }\n }\n state { collateral borrowAssets }\n }\n }\n }\n `,\n { address: getAddress(user), chainId: args.chainId },\n )\n const out: MorphoBluePositionRow[] = []\n for (const p of d.userByAddress?.marketPositions ?? []) {\n const borrow = (p.state?.borrowAssets ?? '0').trim()\n const collateral = (p.state?.collateral ?? '0').trim()\n if ((borrow === '0' || borrow === '0.0') && (collateral === '0' || collateral === '0.0')) continue\n const borrowMarket = morphoMarketToBorrowRow(p.market)\n if (!borrowMarket) continue\n const hf = p.healthFactor\n out.push({\n marketId: p.market.marketId,\n marketLabel: borrowMarket.marketLabel,\n loanAssetSymbol: borrowMarket.loanAssetSymbol,\n collateralAssetSymbol: borrowMarket.collateralAssetSymbol,\n collateralHuman: collateral || '0',\n borrowHuman: borrow || '0',\n healthFactorLabel: hf != null && Number.isFinite(hf) ? hf.toFixed(2) : '—',\n borrowMarket,\n })\n }\n return out\n}\n\nexport async function fetchMorphoUserPortfolioUsd(args: {\n user: string\n chainId: number\n}): Promise<{ vaultUsd: number; borrowCollateralUsd: number; totalUsd: number }> {\n const user = args.user.trim()\n if (!isAddress(user)) return { vaultUsd: 0, borrowCollateralUsd: 0, totalUsd: 0 }\n const d = await morphoGql<{\n userByAddress: {\n vaultPositions: { state?: { assetsUsd?: number | null } | null }[]\n vaultV2Positions: { assetsUsd?: number | null }[]\n marketPositions: { state?: { collateralUsd?: number | null; borrowAssetsUsd?: number | null } | null }[]\n } | null\n }>(\n `\n query MorphoUserPortfolio($address: String!, $chainId: Int!) {\n userByAddress(address: $address, chainId: $chainId) {\n vaultPositions { state { assetsUsd } }\n vaultV2Positions { assetsUsd }\n marketPositions { state { collateralUsd borrowAssetsUsd } }\n }\n }\n `,\n { address: getAddress(user), chainId: args.chainId },\n )\n let vaultUsd = 0\n let borrowCollateralUsd = 0\n for (const v of d.userByAddress?.vaultPositions ?? []) {\n const n = v.state?.assetsUsd\n if (n != null && Number.isFinite(n)) vaultUsd += n\n }\n for (const v of d.userByAddress?.vaultV2Positions ?? []) {\n const n = v.assetsUsd\n if (n != null && Number.isFinite(n)) vaultUsd += n\n }\n for (const m of d.userByAddress?.marketPositions ?? []) {\n const n = m.state?.collateralUsd\n if (n != null && Number.isFinite(n)) borrowCollateralUsd += n\n }\n return { vaultUsd, borrowCollateralUsd, totalUsd: vaultUsd + borrowCollateralUsd }\n}\n\nexport function formatMorphoMarketApySummary(apy: number | null | undefined): string {\n return formatMorphoApyPct(apy)\n}\n","/**\n * Morpho Midnight (fixed-rate, fixed-term) — scaffold types until mainnet contracts/API are live.\n * @see https://morpho.org/blog/morpho-v2-liberating-the-potential-of-onchain-loans\n */\n\nexport type MorphoMidnightLoanIntentStatus = 'coming_soon' | 'open' | 'matched' | 'active' | 'repaid' | 'cancelled'\n\nexport type MorphoMidnightLoanIntent = {\n id: string\n status: MorphoMidnightLoanIntentStatus\n chainId: number\n /** Fixed annual rate (wad or human — TBD when API ships). */\n fixedRate?: string | null\n /** Loan term in seconds. */\n durationSeconds?: number | null\n loanAssetSymbol?: string | null\n collateralAssetSymbol?: string | null\n amountHuman?: string | null\n}\n\nexport const MORPHO_MIDNIGHT_UNAVAILABLE_MESSAGE =\n 'Morpho Midnight fixed-rate lending is not yet available on mainnet. This tab will activate after the progressive mainnet rollout.'\n\n/** Placeholder until Morpho exposes Midnight GraphQL queries. */\nexport async function fetchMorphoMidnightIntents(_args: {\n chainId: number\n user?: string\n}): Promise<readonly MorphoMidnightLoanIntent[]> {\n return []\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\n\nconst erc4626Abi = parseAbi([\n 'function asset() view returns (address)',\n 'function decimals() view returns (uint8)',\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function maxWithdraw(address owner) view returns (uint256)',\n])\n\nexport async function fetchMorphoVaultAssetDecimals(args: {\n rpcUrl: string\n chainId: number\n vault: Address\n}): Promise<number> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoVault',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const vault = getAddress(args.vault)\n const assetAddr = await publicClient.readContract({\n address: vault,\n abi: erc4626Abi,\n functionName: 'asset',\n })\n const d = await publicClient.readContract({\n address: getAddress(assetAddr),\n abi: parseAbi(['function decimals() view returns (uint8)']),\n functionName: 'decimals',\n })\n const n = typeof d === 'bigint' ? Number(d) : Number(d)\n return !Number.isFinite(n) || n < 0 || n > 36 ? 18 : n\n}\n\nexport async function fetchMorphoVaultMaxWithdrawWei(args: {\n rpcUrl: string\n chainId: number\n vault: Address\n owner: Address\n}): Promise<bigint> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoVault',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n return publicClient.readContract({\n address: getAddress(args.vault),\n abi: erc4626Abi,\n functionName: 'maxWithdraw',\n args: [getAddress(args.owner)],\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\nconst morphoBlueAbi = parseAbi([\n 'function position(bytes32 id, address user) view returns (uint256 supplyShares, uint128 borrowShares, uint128 collateral)',\n 'function market(bytes32 id) view returns (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee)',\n 'function idToMarketParams(bytes32 id) view returns (address loanToken, address collateralToken, address oracle, address irm, uint256 lltv)',\n])\n\nconst oracleAbi = parseAbi(['function price() view returns (uint256)'])\n\nconst WAD = 10n ** 18n\nconst ORACLE_PRICE_SCALE = 10n ** 36n\n\nexport async function previewMorphoBlueHealthAfterCollateralWithdraw(args: {\n rpcUrl: string\n chainId: number\n morphoBlue: Address\n marketId: `0x${string}`\n user: Address\n withdrawCollateralWei: bigint\n}): Promise<{ healthy: boolean; healthFactor: number | null }> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoBlue',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const morpho = getAddress(args.morphoBlue)\n const user = getAddress(args.user)\n const id = args.marketId\n\n const [pos, mkt, params] = await Promise.all([\n publicClient.readContract({\n address: morpho,\n abi: morphoBlueAbi,\n functionName: 'position',\n args: [id, user],\n }),\n publicClient.readContract({\n address: morpho,\n abi: morphoBlueAbi,\n functionName: 'market',\n args: [id],\n }),\n publicClient.readContract({\n address: morpho,\n abi: morphoBlueAbi,\n functionName: 'idToMarketParams',\n args: [id],\n }),\n ])\n\n const borrowShares = BigInt(pos[1])\n if (borrowShares === 0n) return { healthy: true, healthFactor: null }\n\n const collateral = BigInt(pos[2]) - args.withdrawCollateralWei\n const oracle = getAddress(params[2])\n const lltv = BigInt(params[4])\n const price = await publicClient.readContract({\n address: oracle,\n abi: oracleAbi,\n functionName: 'price',\n })\n\n const totalBorrowAssets = BigInt(mkt[2])\n const totalBorrowShares = BigInt(mkt[3])\n if (totalBorrowShares === 0n) return { healthy: true, healthFactor: null }\n\n const borrowed = (borrowShares * totalBorrowAssets + totalBorrowShares - 1n) / totalBorrowShares\n const maxBorrow = (collateral * price / ORACLE_PRICE_SCALE) * lltv / WAD\n const healthy = maxBorrow >= borrowed\n const hf = borrowed === 0n ? null : Number((maxBorrow * WAD) / borrowed) / Number(WAD)\n return { healthy, healthFactor: hf != null && Number.isFinite(hf) ? hf : null }\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { fetchMorphoVaultAssetDecimals } from './vaultSharesOnChain.js'\n\nexport const MORPHO_VAULT_DEPOSIT_FALLBACK_GAS = 950_000n\nconst MORPHO_ERC20_APPROVE_FALLBACK = 100_000n\nconst MORPHO_WETH_DEPOSIT_FALLBACK = 120_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\nconst vaultDepositAbi = parseAbi([\n 'function deposit(uint256 assets, address onBehalf) returns (uint256 shares)',\n])\n\ntype BuildStep = { kind: 'weth_deposit' | 'approve' | 'vault_deposit'; to: Address; data: `0x${string}`; value: bigint }\n\n/**\n * Morpho Vault V2: optional WETH wrap, ERC-20 approve, then `deposit(assets, onBehalf)`.\n */\nexport async function buildEvmMultisignBodyMorphoVaultDepositBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n vault: Address\n underlying: Address\n isNativeIn: boolean\n nativeWrapped: Address\n amountHuman: string\n onBehalf: Address\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const asset = getAddress(args.underlying)\n const vault = getAddress(args.vault)\n const weth = getAddress(args.nativeWrapped)\n const executor = getAddress(args.executorAddress)\n const onBehalf = getAddress(args.onBehalf)\n if (args.isNativeIn && asset.toLowerCase() !== weth.toLowerCase()) {\n throw new Error('Native deposit path: underlying asset must match the chain wrapped native token.')\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoVaultDeposit',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const dec = await fetchMorphoVaultAssetDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, vault })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Deposit amount is zero after converting with token decimals.')\n\n const steps: BuildStep[] = []\n if (args.isNativeIn) {\n const wethData = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' })\n steps.push({ kind: 'weth_deposit', to: weth, data: wethData, value: amountWei })\n }\n\n const spendToken = args.isNativeIn ? weth : asset\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, vault],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [vault, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [vault, amountWei] }),\n value: 0n,\n })\n }\n\n const depositData = encodeFunctionData({\n abi: vaultDepositAbi,\n functionName: 'deposit',\n args: [amountWei, onBehalf],\n })\n steps.push({ kind: 'vault_deposit', to: vault, data: depositData, value: 0n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Morpho vault'\n const purposeSuffix = `Morpho: ${steps.length}-tx — VaultV2.deposit (${args.amountHuman} underlying) into \"${vaultLabel}\".`\n\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit'\n ? MORPHO_WETH_DEPOSIT_FALLBACK\n : s.kind === 'approve'\n ? MORPHO_ERC20_APPROVE_FALLBACK\n : MORPHO_VAULT_DEPOSIT_FALLBACK_GAS,\n }))\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: vault,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'Morpho',\n name: 'VaultV2.deposit',\n vault,\n onBehalf,\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_vault_deposit', version: 1, chainId: String(args.chainId) },\n morpho: {\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n vault,\n onBehalf,\n gasBuildDeposit: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n","import {\n type Address,\n encodeFunctionData,\n getAddress,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { fetchMorphoVaultAssetDecimals, fetchMorphoVaultMaxWithdrawWei } from './vaultSharesOnChain.js'\n\nexport const MORPHO_VAULT_WITHDRAW_FALLBACK_GAS = 900_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst vaultWithdrawAbi = parseAbi([\n 'function withdraw(uint256 assets, address receiver, address onBehalf) returns (uint256 shares)',\n])\n\nexport async function buildEvmMultisignBodyMorphoVaultWithdraw(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n vault: Address\n amountHuman: string\n receiver: Address\n vaultShareOwner?: Address\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const vault = getAddress(args.vault)\n const receiver = getAddress(args.receiver)\n const shareOwner = getAddress(args.vaultShareOwner ?? args.receiver)\n const executor = getAddress(args.executorAddress)\n\n const dec = await fetchMorphoVaultAssetDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, vault })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Withdraw amount is zero after converting with token decimals.')\n\n const maxW = await fetchMorphoVaultMaxWithdrawWei({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n vault,\n owner: shareOwner,\n })\n if (amountWei > maxW) {\n throw new Error('Withdraw amount exceeds maxWithdraw for this vault. Try a smaller amount.')\n }\n\n const withdrawData = encodeFunctionData({\n abi: vaultWithdrawAbi,\n functionName: 'withdraw',\n args: [amountWei, receiver, shareOwner],\n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Morpho vault'\n const purposeSuffix = `Morpho: 1-tx — VaultV2.withdraw (${args.amountHuman} underlying) from \"${vaultLabel}\".`\n\n const evmSteps: EvmTxStep[] = [\n { to: vault, data: withdrawData, value: 0n, fallbackGas: MORPHO_VAULT_WITHDRAW_FALLBACK_GAS },\n ]\n const firstDataNo0x = withdrawData.startsWith('0x') ? withdrawData.slice(2) : withdrawData\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: vault,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'Morpho',\n name: 'VaultV2.withdraw',\n vault,\n receiver,\n owner: shareOwner,\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_vault_withdraw', version: 1, chainId: String(args.chainId) },\n morpho: {\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n vault,\n owner: shareOwner,\n gasBuildWithdraw: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport type { MorphoMarketParams } from './marketParams.js'\n\nexport const MORPHO_BLUE_COLLATERAL_DEPOSIT_FALLBACK_GAS = 1_200_000n\nexport const MORPHO_BLUE_BORROW_FALLBACK_GAS = 1_100_000n\nexport const MORPHO_BLUE_REPAY_FALLBACK_GAS = 1_000_000n\nexport const MORPHO_BLUE_COLLATERAL_WITHDRAW_FALLBACK_GAS = 900_000n\nconst MORPHO_ERC20_APPROVE_FALLBACK = 100_000n\nconst MORPHO_WETH_DEPOSIT_FALLBACK = 120_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\nconst morphoBlueAbi = parseAbi([\n 'function supplyCollateral((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, address onBehalf, bytes data)',\n 'function borrow((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, address receiver)',\n 'function repay((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, bytes data)',\n 'function withdrawCollateral((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, address onBehalf, address receiver)',\n])\n\nfunction marketParamsTuple(p: MorphoMarketParams) {\n return {\n loanToken: p.loanToken,\n collateralToken: p.collateralToken,\n oracle: p.oracle,\n irm: p.irm,\n lltv: p.lltv,\n }\n}\n\nasync function readTokenDecimals(args: {\n rpcUrl: string\n chainId: number\n token: Address\n}): Promise<number> {\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoToken',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const d = await publicClient.readContract({\n address: args.token,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const n = typeof d === 'bigint' ? Number(d) : Number(d)\n return !Number.isFinite(n) || n < 0 || n > 36 ? 18 : n\n}\n\ntype ApproveStep = { kind: 'weth_deposit' | 'approve'; to: Address; data: `0x${string}`; value: bigint }\n\nasync function buildApproveSteps(args: {\n rpcUrl: string\n chainId: number\n token: Address\n spender: Address\n amountWei: bigint\n executor: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n}): Promise<ApproveStep[]> {\n const steps: ApproveStep[] = []\n let spendToken = args.token\n if (args.isNativeIn && args.nativeWrapped) {\n const weth = getAddress(args.nativeWrapped)\n if (spendToken.toLowerCase() !== weth.toLowerCase()) {\n throw new Error('Native collateral path: token must match wrapped native.')\n }\n const wethData = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' })\n steps.push({ kind: 'weth_deposit', to: weth, data: wethData, value: args.amountWei })\n spendToken = weth\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'MorphoApprove',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [args.executor, args.spender],\n })\n if (currentAllowance < args.amountWei) {\n if (currentAllowance > 0n) {\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [args.spender, args.amountWei] }),\n value: 0n,\n })\n }\n return steps\n}\n\nfunction stepsToEvm(steps: readonly ApproveStep[], final: EvmTxStep): EvmTxStep[] {\n return [\n ...steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'weth_deposit' ? MORPHO_WETH_DEPOSIT_FALLBACK : MORPHO_ERC20_APPROVE_FALLBACK,\n })),\n final,\n ]\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueSupplyCollateralBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n collateralToken: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n amountHuman: string\n onBehalf: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const executor = getAddress(args.executorAddress)\n const collateral = getAddress(args.collateralToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: collateral })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Collateral amount is zero.')\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: collateral,\n spender: morphoBlue,\n amountWei,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n })\n\n const supplyData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'supplyCollateral',\n args: [marketParamsTuple(args.marketParams), amountWei, onBehalf, '0x'],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps = stepsToEvm(approveSteps, {\n to: morphoBlue,\n data: supplyData,\n value: 0n,\n fallbackGas: MORPHO_BLUE_COLLATERAL_DEPOSIT_FALLBACK_GAS,\n })\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: supplyCollateral (${args.amountHuman}) for \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'supplyCollateral', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_supply_collateral', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueBorrowBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n loanToken: Address\n amountHuman: string\n onBehalf: Address\n receiver: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const receiver = getAddress(args.receiver)\n const executor = getAddress(args.executorAddress)\n const loan = getAddress(args.loanToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loan })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Borrow amount is zero.')\n\n const borrowData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'borrow',\n args: [marketParamsTuple(args.marketParams), amountWei, 0n, onBehalf, receiver],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps: EvmTxStep[] = [\n { to: morphoBlue, data: borrowData, value: 0n, fallbackGas: MORPHO_BLUE_BORROW_FALLBACK_GAS },\n ]\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: borrow (${args.amountHuman}) from \"${marketLabel}\".`,\n firstMsgRawNo0x: borrowData.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'borrow', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_borrow', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueRepayBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n loanToken: Address\n amountHuman: string\n onBehalf: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const executor = getAddress(args.executorAddress)\n const loan = getAddress(args.loanToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loan })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Repay amount is zero.')\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loan,\n spender: morphoBlue,\n amountWei,\n executor,\n })\n\n const repayData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'repay',\n args: [marketParamsTuple(args.marketParams), amountWei, 0n, onBehalf, '0x'],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps = stepsToEvm(approveSteps, {\n to: morphoBlue,\n data: repayData,\n value: 0n,\n fallbackGas: MORPHO_BLUE_REPAY_FALLBACK_GAS,\n })\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: repay (${args.amountHuman}) for \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'repay', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_repay', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoBlueWithdrawCollateralBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n morphoBlue: Address\n marketParams: MorphoMarketParams\n amountHuman: string\n collateralDecimals: number\n onBehalf: Address\n receiver: Address\n executorAddress: Address\n purposeText: string\n marketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const morphoBlue = getAddress(args.morphoBlue)\n const onBehalf = getAddress(args.onBehalf)\n const receiver = getAddress(args.receiver)\n const executor = getAddress(args.executorAddress)\n const amountWei = parseUnits(args.amountHuman, args.collateralDecimals)\n if (amountWei === 0n) throw new Error('Collateral withdraw amount is zero.')\n\n const withdrawData = encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'withdrawCollateral',\n args: [marketParamsTuple(args.marketParams), amountWei, onBehalf, receiver],\n })\n const marketLabel = (args.marketLabel ?? '').trim() || 'Morpho Blue market'\n const evmSteps: EvmTxStep[] = [\n { to: morphoBlue, data: withdrawData, value: 0n, fallbackGas: MORPHO_BLUE_COLLATERAL_WITHDRAW_FALLBACK_GAS },\n ]\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: `Morpho Blue: withdrawCollateral (${args.amountHuman}) from \"${marketLabel}\".`,\n firstMsgRawNo0x: withdrawData.slice(2),\n destinationAddress: morphoBlue,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoBlue', name: 'withdrawCollateral', marketLabel, amountHuman: args.amountHuman }),\n evm: { type: 'morpho_blue_withdraw_collateral', version: 1, chainId: String(args.chainId) },\n morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n","import { getAddress, type Address } from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\n\nconst MORPHO_MERKL_CLAIM_FALLBACK_GAS = 500_000n\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\n/** Merkl `Distributor.claim` — same calldata pattern as Euler v2 / Aave. */\nexport async function buildEvmMultisignBodyMorphoMerklDistributorClaim(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n to: Address\n data: `0x${string}`\n valueWei: bigint\n claimLeafCount: number\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n const firstDataNo0x = args.data.startsWith('0x') ? args.data.slice(2) : args.data\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: [{ to, data: args.data, value: args.valueWei, fallbackGas: MORPHO_MERKL_CLAIM_FALLBACK_GAS }],\n purposeSuffix: `Morpho: 1-tx — Merkl distributor claim (${args.claimLeafCount} reward(s)).`,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: to,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'Morpho',\n name: 'Merkl Distributor claim',\n claimLeafCount: args.claimLeafCount,\n chainId: args.chainId,\n }),\n evm: { type: 'morpho_merkl_distributor_claim', version: 1, chainId: String(args.chainId) },\n morpho: { step: 'merkl_distributor_claim', claimLeafCount: args.claimLeafCount, gasBuildClaim: { baseGasUnits: gasLimit.toString() } },\n }),\n })\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 './blueDiscovery.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"]}