@continuumdao/ctm-mpc-defi 0.2.40 → 0.2.41

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 (36) hide show
  1. package/dist/agent/catalog.cjs +38 -5
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.js +38 -5
  4. package/dist/agent/catalog.js.map +1 -1
  5. package/dist/agent/skills/aave-v4/SKILL.md +1 -1
  6. package/dist/agent/skills/circle-cctp/SKILL.md +1 -0
  7. package/dist/agent/skills/morpho/SKILL.md +11 -0
  8. package/dist/agent/skills/uniswap-v4/SKILL.md +1 -1
  9. package/dist/chains/evm/index.cjs +1 -0
  10. package/dist/chains/evm/index.cjs.map +1 -1
  11. package/dist/chains/evm/index.js +1 -0
  12. package/dist/chains/evm/index.js.map +1 -1
  13. package/dist/index.cjs +7 -2
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.js +7 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/protocols/evm/circle-cctp/index.cjs +16 -0
  18. package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
  19. package/dist/protocols/evm/circle-cctp/index.js +16 -0
  20. package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
  21. package/dist/protocols/evm/euler-v2/index.cjs +1 -0
  22. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  23. package/dist/protocols/evm/euler-v2/index.js +1 -0
  24. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  25. package/dist/protocols/evm/morpho/index.cjs +21 -2
  26. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  27. package/dist/protocols/evm/morpho/index.d.ts +12 -1
  28. package/dist/protocols/evm/morpho/index.js +17 -3
  29. package/dist/protocols/evm/morpho/index.js.map +1 -1
  30. package/dist/protocols/evm/permit2/index.cjs.map +1 -1
  31. package/dist/protocols/evm/permit2/index.js.map +1 -1
  32. package/dist/protocols/evm/uniswap-v4/index.cjs +6 -2
  33. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  34. package/dist/protocols/evm/uniswap-v4/index.js +6 -2
  35. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  36. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/morpho/midnightConstants.ts","../../../../src/protocols/evm/morpho/midnightApi.ts","../../../../src/core/registry.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/robinhoodEarn.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/index.ts","../../../../src/protocols/evm/morpho/midnightMath.ts","../../../../src/protocols/evm/morpho/midnightDiscovery.ts","../../../../src/protocols/evm/morpho/midnightQuote.ts","../../../../src/protocols/evm/morpho/midnightPositions.ts","../../../../src/protocols/evm/morpho/midnightOffers.ts","../../../../src/protocols/evm/morpho/midnightBluePark.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/morpho/midnightMultisign.ts","../../../../src/protocols/evm/morpho/midnightOfferMultisign.ts","../../../../src/protocols/evm/morpho/vaultSharesOnChain.ts","../../../../src/protocols/evm/morpho/blueRiskOnChain.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"],"names":["isAddress","getAddress","light","exposure","detail","fetchMorphoMidnightBooks","MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT","asLoan","byId","maturityIso","gasLimitFromEstimateAndChainConfig","keccak256","defineChain","createPublicClient","http","wethDepositAbi","parseAbi","erc20Abi","publicClientFor","readTokenDecimals","buildApproveSteps","encodeFunctionData","approveStepsToEvm","midnightAbi","parseUnits","zeroAddress","maxUint256","encodeAbiParameters","morphoBlueAbi","WAD","MORPHO_ERC20_APPROVE_FALLBACK","MORPHO_WETH_DEPOSIT_FALLBACK","erc20AllowanceAbi","erc20ApproveAbi"],"mappings":"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","file":"index.js","sourcesContent":["/**\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\n/** Browser → Next.js base path for Euler V3 REST (`/v3/evk/vaults`, …). */\nlet eulerV3ApiProxyBase: string | undefined\n\nexport function setEulerV3ApiProxyBase(url: string | undefined): void {\n eulerV3ApiProxyBase = url?.trim().replace(/\\/$/, '') || undefined\n}\n\nexport function getEulerV3ApiProxyBase(): string | undefined {\n return eulerV3ApiProxyBase\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\n/** Browser → Next.js base path for Morpho Midnight REST (replaces api.morpho.org/v0/midnight). */\nlet morphoMidnightRestProxyUrl: string | undefined\n\nexport function setMorphoMidnightRestProxyUrl(url: string | undefined): void {\n morphoMidnightRestProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoMidnightRestProxyUrl(): string | undefined {\n return morphoMidnightRestProxyUrl\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\nexport async function getJsonViaOptionalProxy<T>(args: {\n directUrl: string\n /** When set, GET this URL instead of directUrl (same path semantics as caller built). */\n proxyUrl?: string\n}): Promise<T> {\n const url = args.proxyUrl?.trim() || args.directUrl\n const r = await fetch(url, { method: 'GET', headers: { accept: 'application/json' } })\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 { keccak256, toBytes, type Address, type Hex } from 'viem'\n\n/** Morpho Midnight REST API base (no trailing slash). */\nexport const MORPHO_MIDNIGHT_REST_BASE = 'https://api.morpho.org/v0/midnight'\n\n/** Upstream `GET /books` rejects limit > 20 (`VALIDATION_ERROR`). */\nexport const MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT = 20\n\nexport const MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT = '0.5'\nexport const MORPHO_MIDNIGHT_DEFAULT_DEADLINE_SECONDS = 3600\n/** Default maker-offer lifetime when the user does not pass expiry. */\nexport const MORPHO_MIDNIGHT_DEFAULT_OFFER_TTL_SECONDS = 7 * 24 * 3600\n\nexport const MORPHO_MIDNIGHT_BASE_CHAIN_ID = 8453\nexport const MORPHO_MIDNIGHT_ETHEREUM_CHAIN_ID = 1\n\n/** Canonical Morpho Blue singleton (Ethereum + Base). */\nexport const MORPHO_BLUE_CANONICAL = '0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb' as Address\n\n/**\n * CREATE2 salt for Continuum's per-owner BlueBuyCallback.\n * One callback per owner so unused parked supply can be reused across offers.\n */\nexport const MORPHO_MIDNIGHT_CALLBACK_SALT = keccak256(toBytes('continuum-midnight-lend-v1')) as Hex\n\nexport type MorphoMidnightChainAddresses = {\n midnight: Address\n bundles: Address\n mempool: Address\n setterRatifier: Address\n ecrecoverRatifier: Address\n blueBuyCallbackFactory: Address\n morphoBlue: Address\n}\n\n/**\n * Official Morpho deployments (docs.morpho.org/developers/contracts/addresses).\n * Base MidnightBundlesV1 is `0x091183…` — not the older `0x6688dE…` helper.\n */\nexport const MORPHO_MIDNIGHT_ADDRESSES: Record<number, MorphoMidnightChainAddresses> = {\n [MORPHO_MIDNIGHT_ETHEREUM_CHAIN_ID]: {\n midnight: '0x471686c42792F93528B000beF54bC10E3aa2045f',\n bundles: '0x7c00dBB2b6b6b9B28745332e550dC8782Fcf77EC',\n mempool: '0xde2d62449301a09A51EbF9326EA60d2e8BF4A8F7',\n setterRatifier: '0xb72c416382c8A6399D0765CebfB032F040B00B3c',\n ecrecoverRatifier: '0xAC439c81CAA6ef4C7B7E8F0110F8CE63A4b6D43e',\n blueBuyCallbackFactory: '0x172d1FdC5f79bFe1ED46448f18541E591E5c93a7',\n morphoBlue: MORPHO_BLUE_CANONICAL,\n },\n [MORPHO_MIDNIGHT_BASE_CHAIN_ID]: {\n midnight: '0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A',\n bundles: '0x091183d729BE9f808c212b475E387A12E67850A7',\n mempool: '0xdD6DCE32e21f7b020898a8258dA37355b4017993',\n setterRatifier: '0x800B5F12A61B8198a5a6EfD794Cac6699B294d63',\n ecrecoverRatifier: '0xd6e70365C8E8DDa9a4ca662C07bbE663b017755E',\n blueBuyCallbackFactory: '0x7337f119Eca028bD39E0e543cEf71631D2333425',\n morphoBlue: MORPHO_BLUE_CANONICAL,\n },\n}\n\nexport function morphoMidnightAddressesForChain(chainId: number): MorphoMidnightChainAddresses | null {\n return MORPHO_MIDNIGHT_ADDRESSES[chainId] ?? null\n}\n\nexport const TOKEN_PERMIT_NONE = { kind: 0, data: '0x' as const } as const\n\nexport const MORPHO_MIDNIGHT_LEND_FALLBACK_GAS = 2_500_000n\nexport const MORPHO_MIDNIGHT_BORROW_FALLBACK_GAS = 3_000_000n\nexport const MORPHO_MIDNIGHT_REPAY_FALLBACK_GAS = 2_200_000n\nexport const MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS = 80_000n\nexport const MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK = 100_000n\nexport const MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK = 120_000n\nexport const MORPHO_MIDNIGHT_CREATE_CALLBACK_FALLBACK_GAS = 1_200_000n\nexport const MORPHO_MIDNIGHT_BLUE_SUPPLY_FALLBACK_GAS = 400_000n\nexport const MORPHO_MIDNIGHT_BLUE_WITHDRAW_FALLBACK_GAS = 350_000n\nexport const MORPHO_MIDNIGHT_SET_ROOT_FALLBACK_GAS = 80_000n\nexport const MORPHO_MIDNIGHT_MEMPOOL_PUBLISH_FALLBACK_GAS = 250_000n\nexport const MORPHO_MIDNIGHT_SET_CONSUMED_FALLBACK_GAS = 80_000n\n","import type { Address, Hex } from 'viem'\nimport { getAddress, isAddress } from 'viem'\nimport { MidnightApi } from '@morpho-org/midnight-sdk/api'\nimport type { MidnightApiBookMarket, MidnightApiTake } from '@morpho-org/midnight-sdk/api'\nimport { getJsonViaOptionalProxy, getMorphoMidnightRestProxyUrl } from '../../../core/defiProxy.js'\nimport { MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT, MORPHO_MIDNIGHT_REST_BASE } from './midnightConstants.js'\n\nexport type MorphoMidnightBookSide = 'asks' | 'bids'\n\nexport type MorphoMidnightMarketParams = {\n chainId: bigint\n midnight: Address\n loanToken: Address\n collateralParams: readonly {\n token: Address\n lltv: bigint\n liquidationCursor: bigint\n oracle: Address\n }[]\n maturity: bigint\n rcfThreshold: bigint\n enterGate: Address\n liquidatorGate: Address\n}\n\nexport type MorphoMidnightApiMarketRow = {\n chainId: number\n marketId: Hex\n midnight: Address\n loanToken: Address\n maturity: number\n rcfThreshold: string\n enterGate: Address\n liquidatorGate: Address\n collaterals: readonly {\n token: Address\n lltv: string\n liquidationCursor: string\n oracle: Address\n }[]\n}\n\nexport type MorphoMidnightApiPositionRow = {\n marketId: Hex\n type: 'lend' | 'borrow' | 'collateral_only' | string\n credit: string\n debt: string\n pendingFee: string\n lossFactor: string\n costBasis?: string | null\n effectiveRateWad?: string | null\n maturity?: number | null\n loanToken?: Address | null\n collaterals: readonly { token: Address; amount: string }[]\n}\n\n/** Effective Midnight REST base — browser proxy when configured. */\nexport function morphoMidnightApiBaseUrl(): string {\n const proxy = getMorphoMidnightRestProxyUrl()?.replace(/\\/$/, '')\n return proxy || MORPHO_MIDNIGHT_REST_BASE\n}\n\nfunction midnightApiConfig() {\n return { baseUrl: morphoMidnightApiBaseUrl() }\n}\n\nasync function midnightGetJson<T>(pathAndQuery: string): Promise<T> {\n const path = pathAndQuery.startsWith('/') ? pathAndQuery : `/${pathAndQuery}`\n const directUrl = `${MORPHO_MIDNIGHT_REST_BASE}${path}`\n const proxyBase = getMorphoMidnightRestProxyUrl()?.replace(/\\/$/, '')\n const proxyUrl = proxyBase ? `${proxyBase}${path}` : undefined\n return getJsonViaOptionalProxy<T>({ directUrl, proxyUrl })\n}\n\nexport async function fetchMorphoMidnightBooks(args: {\n chainId: number\n loanTokens?: readonly string[]\n collateralTokens?: readonly string[]\n sort?: 'maturity' | 'ask' | 'bid' | 'id' | '-maturity' | '-ask' | '-bid' | '-id'\n limit?: number\n cursor?: string\n}): Promise<{ data: MidnightApiBookMarket[]; cursor: string | null }> {\n const limit =\n args.limit == null\n ? undefined\n : Math.min(Math.max(Math.floor(args.limit), 1), MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT)\n const result = await MidnightApi.fetchBooks({\n ...midnightApiConfig(),\n chainIds: [args.chainId],\n loanTokens: args.loanTokens?.filter((a) => isAddress(a)).map((a) => getAddress(a)),\n collateralTokens: args.collateralTokens?.filter((a) => isAddress(a)).map((a) => getAddress(a)),\n sort: args.sort ? [args.sort] : ['maturity'],\n limit,\n cursor: args.cursor,\n })\n return { data: [...result.data], cursor: result.cursor ?? null }\n}\n\nexport async function fetchMorphoMidnightBook(marketId: string): Promise<MidnightApiBookMarket | null> {\n const id = marketId.trim()\n if (!id) return null\n try {\n const result = await MidnightApi.fetchBook({\n ...midnightApiConfig(),\n marketId: id as Hex,\n })\n return result.data\n } catch {\n return null\n }\n}\n\nexport async function fetchMorphoMidnightBookQuote(args: {\n marketId: string\n side: MorphoMidnightBookSide\n assets: bigint\n slippage?: string\n}): Promise<{\n averageBestPrice: string\n averageWorstPrice: string\n availableAssets: string\n availableUnits: string\n takeableOffers: readonly MidnightApiTake[]\n}> {\n const quote = await MidnightApi.fetchBookQuote({\n ...midnightApiConfig(),\n marketId: args.marketId.trim() as Hex,\n side: args.side,\n assets: args.assets,\n slippage: (args.slippage?.trim() || '0.5') as `${number}`,\n })\n return quote.data\n}\n\ntype ApiMarketEnvelope = {\n data?: {\n chain_id?: number\n market_id?: string\n midnight?: string\n loan_token?: string\n maturity?: string | number\n rcf_threshold?: string\n enter_gate?: string\n liquidator_gate?: string\n collaterals?: {\n token?: string\n lltv?: string\n liquidation_cursor?: string\n oracle?: string\n }[]\n }\n}\n\nexport async function fetchMorphoMidnightMarketById(marketId: string): Promise<MorphoMidnightApiMarketRow | null> {\n const id = marketId.trim()\n if (!id) return null\n const j = await midnightGetJson<ApiMarketEnvelope>(`/markets/${encodeURIComponent(id)}`)\n const d = j.data\n if (!d?.market_id || !d.loan_token || !isAddress(d.loan_token)) return null\n const midnight =\n d.midnight && isAddress(d.midnight)\n ? getAddress(d.midnight)\n : ('0x0000000000000000000000000000000000000000' as Address)\n const collaterals = (d.collaterals ?? [])\n .filter((c) => c.token && isAddress(c.token) && c.oracle && isAddress(c.oracle))\n .map((c) => ({\n token: getAddress(c.token!),\n lltv: String(c.lltv ?? '0'),\n liquidationCursor: String(c.liquidation_cursor ?? '0'),\n oracle: getAddress(c.oracle!),\n }))\n return {\n chainId: Number(d.chain_id ?? 0),\n marketId: d.market_id as Hex,\n midnight,\n loanToken: getAddress(d.loan_token),\n maturity: Number(d.maturity ?? 0),\n rcfThreshold: String(d.rcf_threshold ?? '0'),\n enterGate: d.enter_gate && isAddress(d.enter_gate) ? getAddress(d.enter_gate) : getAddress('0x0000000000000000000000000000000000000000'),\n liquidatorGate:\n d.liquidator_gate && isAddress(d.liquidator_gate)\n ? getAddress(d.liquidator_gate)\n : getAddress('0x0000000000000000000000000000000000000000'),\n collaterals,\n }\n}\n\nexport function morphoMidnightMarketToParams(row: MorphoMidnightApiMarketRow): MorphoMidnightMarketParams {\n return {\n chainId: BigInt(row.chainId),\n midnight: row.midnight,\n loanToken: row.loanToken,\n collateralParams: row.collaterals.map((c) => ({\n token: c.token,\n lltv: BigInt(c.lltv),\n liquidationCursor: BigInt(c.liquidationCursor),\n oracle: c.oracle,\n })),\n maturity: BigInt(row.maturity),\n rcfThreshold: BigInt(row.rcfThreshold),\n enterGate: row.enterGate,\n liquidatorGate: row.liquidatorGate,\n }\n}\n\nexport function morphoMidnightBookToMarketParams(book: MidnightApiBookMarket): MorphoMidnightMarketParams {\n return {\n chainId: BigInt(book.chainId),\n midnight: getAddress(book.midnight),\n loanToken: getAddress(book.loanToken),\n collateralParams: book.collaterals.map((c) => ({\n token: getAddress(c.token),\n lltv: BigInt(c.lltv),\n liquidationCursor: BigInt(c.liquidationCursor),\n oracle: getAddress(c.oracle),\n })),\n maturity: BigInt(book.maturity),\n rcfThreshold: BigInt(book.rcfThreshold),\n enterGate: getAddress(book.enterGate),\n liquidatorGate: getAddress(book.liquidatorGate),\n }\n}\n\ntype ApiPositionsEnvelope = {\n data?: {\n market_id?: string\n type?: string\n credit?: string\n debt?: string\n pending_fee?: string\n loss_factor?: string\n cost_basis?: string\n effective_rate_wad?: string\n maturity?: string | number\n loan_token?: string\n collaterals?: { token?: string; amount?: string }[]\n }[]\n}\n\nexport async function fetchMorphoMidnightUserPositions(args: {\n user: string\n types?: 'lend' | 'borrow' | 'collateral_only'\n activeOnly?: boolean\n}): Promise<MorphoMidnightApiPositionRow[]> {\n const user = args.user.trim()\n if (!isAddress(user)) return []\n const qs = new URLSearchParams()\n if (args.types) qs.set('types', args.types)\n if (args.activeOnly) qs.set('active_only', 'true')\n const q = qs.toString()\n const path = `/users/${encodeURIComponent(getAddress(user))}/positions${q ? `?${q}` : ''}`\n const j = await midnightGetJson<ApiPositionsEnvelope>(path)\n const rows: MorphoMidnightApiPositionRow[] = []\n for (const p of j.data ?? []) {\n if (!p.market_id) continue\n rows.push({\n marketId: p.market_id as Hex,\n type: p.type ?? 'lend',\n credit: String(p.credit ?? '0'),\n debt: String(p.debt ?? '0'),\n pendingFee: String(p.pending_fee ?? '0'),\n lossFactor: String(p.loss_factor ?? '0'),\n costBasis: p.cost_basis ?? null,\n effectiveRateWad: p.effective_rate_wad ?? null,\n maturity: p.maturity != null ? Number(p.maturity) : null,\n loanToken: p.loan_token && isAddress(p.loan_token) ? getAddress(p.loan_token) : null,\n collaterals: (p.collaterals ?? [])\n .filter((c) => c.token && isAddress(c.token))\n .map((c) => ({ token: getAddress(c.token!), amount: String(c.amount ?? '0') })),\n })\n }\n return rows\n}\n\ntype ApiPositionDetailEnvelope = {\n data?: {\n type?: string\n credit?: string\n debt?: string\n pending_fee?: string\n loss_factor?: string\n loan_token?: string\n maturity?: string | number\n collaterals?: { token?: string; amount?: string }[]\n }\n}\n\ntype ApiTakeableOffer = {\n market_id?: string\n units?: string\n offer?: {\n market?: {\n chain_id?: number\n midnight?: string\n loan_token?: string\n maturity?: string | number\n }\n buy?: boolean\n maker?: string\n tick?: string | number\n max_assets?: string\n max_units?: string\n expiry?: string | number\n group?: string\n callback?: string\n callback_data?: string\n }\n}\n\ntype ApiTakeableOffersEnvelope = {\n data?: ApiTakeableOffer[]\n cursor?: string | null\n}\n\nexport type MorphoMidnightApiMakerOffer = {\n marketId: string\n chainId: number\n midnight: Address\n loanToken: Address\n maker: Address\n buy: boolean\n tick: string\n maxAssets: string\n maxUnits: string\n expiry: number\n group: Hex\n callback: Address\n callbackData: Hex\n units: string\n maturity: number | null\n}\n\nexport async function fetchMorphoMidnightMakerOffers(args: {\n maker: Address\n chainId?: number\n}): Promise<MorphoMidnightApiMakerOffer[]> {\n const qs = new URLSearchParams()\n qs.set('maker', getAddress(args.maker))\n if (args.chainId != null) qs.set('chain_ids', String(args.chainId))\n const j = await midnightGetJson<ApiTakeableOffersEnvelope>(`/takeable-offers?${qs}`)\n const out: MorphoMidnightApiMakerOffer[] = []\n for (const row of j.data ?? []) {\n const o = row.offer\n if (!o?.maker || !isAddress(o.maker) || !o.market?.loan_token || !isAddress(o.market.loan_token)) continue\n if (!o.market.midnight || !isAddress(o.market.midnight)) continue\n const group = (o.group ?? '').trim()\n if (!group.startsWith('0x') || group.length !== 66) continue\n const callback = o.callback && isAddress(o.callback) ? getAddress(o.callback) : ('0x0000000000000000000000000000000000000000' as Address)\n out.push({\n marketId: String(row.market_id ?? ''),\n chainId: Number(o.market.chain_id ?? args.chainId ?? 0),\n midnight: getAddress(o.market.midnight),\n loanToken: getAddress(o.market.loan_token),\n maker: getAddress(o.maker),\n buy: o.buy === true,\n tick: String(o.tick ?? '0'),\n maxAssets: String(o.max_assets ?? '0'),\n maxUnits: String(o.max_units ?? '0'),\n expiry: Number(o.expiry ?? 0),\n group: group as Hex,\n callback,\n callbackData: ((o.callback_data ?? '0x') as Hex),\n units: String(row.units ?? '0'),\n maturity: o.market.maturity != null ? Number(o.market.maturity) : null,\n })\n }\n return out\n}\n\nexport async function fetchMorphoMidnightUserMarketPosition(args: {\n marketId: string\n user: string\n}): Promise<MorphoMidnightApiPositionRow | null> {\n const marketId = args.marketId.trim()\n const user = args.user.trim()\n if (!marketId || !isAddress(user)) return null\n const path = `/markets/${encodeURIComponent(marketId)}/users/${encodeURIComponent(getAddress(user))}/position`\n const j = await midnightGetJson<ApiPositionDetailEnvelope>(path)\n const p = j.data\n if (!p) return null\n return {\n marketId: marketId as Hex,\n type: p.type ?? 'borrow',\n credit: String(p.credit ?? '0'),\n debt: String(p.debt ?? '0'),\n pendingFee: String(p.pending_fee ?? '0'),\n lossFactor: String(p.loss_factor ?? '0'),\n maturity: p.maturity != null ? Number(p.maturity) : null,\n loanToken: p.loan_token && isAddress(p.loan_token) ? getAddress(p.loan_token) : null,\n collaterals: (p.collaterals ?? [])\n .filter((c) => c.token && isAddress(c.token))\n .map((c) => ({ token: getAddress(c.token!), amount: String(c.amount ?? '0') })),\n }\n}\n","import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","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 rewards: MorphoIncentiveRewardRow[]\n}\n\nexport type MorphoEarnVaultExposureRow = {\n label: string\n allocatedUsdLabel: string\n allocationPercentLabel: string\n}\n\nexport type MorphoIncentiveRewardRow = {\n symbol: string\n supplyAprLabel: string\n}\n\nexport function mapMorphoIncentiveRewards(\n rows:\n | readonly { asset?: { symbol?: string | null } | null; supplyApr?: number | null }[]\n | null\n | undefined,\n): MorphoIncentiveRewardRow[] {\n if (!rows?.length) return []\n const out: MorphoIncentiveRewardRow[] = []\n for (const r of rows) {\n const symbol = (r.asset?.symbol ?? '').trim()\n if (!symbol && r.supplyApr == null) continue\n out.push({\n symbol: symbol || 'REWARD',\n supplyAprLabel: formatMorphoApyPct(r.supplyApr),\n })\n }\n return out\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 rewards: MorphoIncentiveRewardRow[]\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 rewards: row.rewards,\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 rewards: mapMorphoIncentiveRewards(v.state?.allRewards),\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 rewards: mapMorphoIncentiveRewards(v.rewards),\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 rewards?: MorphoIncentiveRewardRow[]\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 rewards: args.rewards ?? [],\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 rewards: mapMorphoIncentiveRewards(v.state?.allRewards),\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 rewards: mapMorphoIncentiveRewards(v.rewards),\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 // Midnight books: loan tokens enable borrow/lend modes; collaterals enable collateral mode.\n try {\n const { fetchMorphoMidnightBooks } = await import('./midnightApi.js')\n const { MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT } = await import('./midnightConstants.js')\n const { data: books } = await fetchMorphoMidnightBooks({\n chainId,\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n for (const book of books) {\n const loanAddr = (book.loanToken ?? '').toString().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 for (const c of book.collaterals ?? []) {\n const colAddr = (c.token ?? '').toString().trim()\n if (!isAddress(colAddr)) continue\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 } catch {\n // Midnight API optional — Blue/vault modes still apply.\n }\n\n const cache: ChainAssetCache = { modesByUnderlying: modes, nativeWrapped: null }\n chainAssetCache.set(chainId, cache)\n return cache\n}\n","/** Robinhood Earn on Robinhood Chain — Morpho Vault V2 curated by Steakhouse. */\nexport const ROBINHOOD_CHAIN_ID = 4663\n\nexport const ROBINHOOD_EARN_VAULT_ADDRESS = '0xBeEff033F34C046626B8D0A041844C5d1A5409dd' as const\nexport const ROBINHOOD_EARN_VAULT_SYMBOL = 'steakUSDG' as const\nexport const ROBINHOOD_EARN_VAULT_NAME = 'Steakhouse USDG' as const\nexport const ROBINHOOD_EARN_USDG_ADDRESS = '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168' as const\n\nconst ROBINHOOD_EARN_QUERY_ALIASES = [\n 'robinhood earn',\n 'robinhood-earn',\n 'robinhood',\n 'earn usdg',\n 'steakhouse usdg',\n 'steakusd g',\n] as const\n\nfunction normalizeRobinhoodEarnQuery(query: string): string {\n return query.trim().toLowerCase().replace(/\\s+/g, ' ')\n}\n\n/** True when the user/agent is asking for Robinhood Earn rather than a generic Morpho vault search. */\nexport function isRobinhoodEarnQuery(query: string | undefined): boolean {\n if (!query?.trim()) return false\n const q = normalizeRobinhoodEarnQuery(query)\n if (q === ROBINHOOD_EARN_VAULT_ADDRESS.toLowerCase()) return true\n return ROBINHOOD_EARN_QUERY_ALIASES.some((alias) => q === alias || q.includes(alias))\n}\n\nexport function isRobinhoodEarnProductFlag(raw: unknown): boolean {\n if (raw === true || raw === 'true') return true\n if (typeof raw !== 'string') return false\n const v = raw.trim().toLowerCase()\n return v === 'robinhood-earn' || v === 'robinhood_earn' || v === 'robinhood earn'\n}\n\n/** Map Robinhood Earn aliases to the listed Steakhouse USDG vault on chain 4663. */\nexport function resolveRobinhoodEarnFetchQuery(args: {\n chainId: number\n query?: string\n underlying?: string\n}): { query?: string; underlying?: string } {\n if (args.chainId !== ROBINHOOD_CHAIN_ID) {\n return { query: args.query?.trim() || undefined, underlying: args.underlying?.trim() || undefined }\n }\n if (!isRobinhoodEarnQuery(args.query)) {\n return { query: args.query?.trim() || undefined, underlying: args.underlying?.trim() || undefined }\n }\n return {\n query: ROBINHOOD_EARN_VAULT_SYMBOL,\n underlying: args.underlying?.trim() || 'USDG',\n }\n}\n\n/** Pre-fill Robinhood Earn vault addresses for multisign deposit/withdraw builders. */\nexport function applyRobinhoodEarnMultisignDefaults(o: Record<string, unknown>): void {\n const flagged =\n o.robinhoodEarn === true ||\n isRobinhoodEarnProductFlag(o.robinhoodEarn) ||\n isRobinhoodEarnProductFlag(o.product) ||\n isRobinhoodEarnQuery(String(o.query ?? o.vaultName ?? ''))\n\n if (!flagged) return\n\n const chainRaw = o.chainId\n const chainId =\n chainRaw == null || chainRaw === ''\n ? ROBINHOOD_CHAIN_ID\n : typeof chainRaw === 'number'\n ? chainRaw\n : Number.parseInt(String(chainRaw), chainRaw.toString().startsWith('0x') ? 16 : 10)\n\n if (!Number.isFinite(chainId) || chainId !== ROBINHOOD_CHAIN_ID) return\n\n if (chainRaw == null || chainRaw === '') o.chainId = ROBINHOOD_CHAIN_ID\n\n const vaultAddr = o.vaultAddress ?? o.vault ?? ROBINHOOD_EARN_VAULT_ADDRESS\n o.vaultAddress = vaultAddr\n o.vault = vaultAddr\n\n const underlyingAddr = o.underlyingAddress ?? o.underlying ?? ROBINHOOD_EARN_USDG_ADDRESS\n o.underlyingAddress = underlyingAddr\n o.underlying = underlyingAddr\n\n o.vaultName = o.vaultName ?? ROBINHOOD_EARN_VAULT_NAME\n o.vaultSymbol = o.vaultSymbol ?? ROBINHOOD_EARN_VAULT_SYMBOL\n}\n","import { getAddress, isAddress } from 'viem'\nimport { resolveRobinhoodEarnFetchQuery } from './robinhoodEarn.js'\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 resolved = resolveRobinhoodEarnFetchQuery({\n chainId: args.chainId,\n query: args.query,\n underlying: args.underlying,\n })\n const vaults = await searchMorphoListedEarnVaults({\n chainId: args.chainId,\n underlying: resolved.underlying,\n query: resolved.query,\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 netSupplyApyLabel: string\n rewards: Array<{ symbol: string; supplyAprLabel: 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 netSupplyApyLabel: formatMorphoApyPct(m.state?.netSupplyApy),\n rewards: (m.state?.rewards ?? [])\n .map((r) => ({\n symbol: (r.asset?.symbol ?? '').trim() || 'REWARD',\n supplyAprLabel: formatMorphoApyPct(r.supplyApr),\n }))\n .filter((r) => r.supplyAprLabel !== '—'),\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 netSupplyApyLabel: string\n rewards: Array<{ symbol: string; supplyAprLabel: 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 netSupplyApyLabel: row.netSupplyApyLabel,\n rewards: row.rewards,\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) — legacy type aliases.\n * Prefer midnightDiscovery / midnightPositions / midnightMultisign.\n * @see https://docs.morpho.org/developers/midnight/resources/all/\n */\n\nexport type MorphoMidnightLoanIntentStatus =\n | 'coming_soon'\n | 'open'\n | 'matched'\n | 'active'\n | 'repaid'\n | 'cancelled'\n\n/** @deprecated Use MorphoMidnightBookDiscoveryRow / position rows instead. */\nexport type MorphoMidnightLoanIntent = {\n id: string\n status: MorphoMidnightLoanIntentStatus\n chainId: number\n fixedRate?: string | null\n durationSeconds?: number | null\n loanAssetSymbol?: string | null\n collateralAssetSymbol?: string | null\n amountHuman?: string | null\n}\n\n/** @deprecated Midnight is live; UI should use live book fetchers. */\nexport const MORPHO_MIDNIGHT_UNAVAILABLE_MESSAGE =\n 'Morpho Midnight fixed-rate markets are available on supported chains (starting with Base). Open the Midnight tab to browse books.'\n\n/** @deprecated Use morphoFetchMidnightBooksSummary / morphoFetchMidnightPositionsSummary. */\nexport async function fetchMorphoMidnightIntents(_args: {\n chainId: number\n user?: string\n}): Promise<readonly MorphoMidnightLoanIntent[]> {\n return []\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 './midnightConstants.js'\nexport * from './midnightApi.js'\nexport * from './midnightMath.js'\nexport * from './midnightDiscovery.js'\nexport * from './midnightQuote.js'\nexport * from './midnightPositions.js'\nexport * from './midnightOffers.js'\nexport * from './midnightBluePark.js'\nexport * from './midnightMultisign.js'\nexport * from './midnightOfferMultisign.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 * from './robinhoodEarn.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.fetch-midnight-books', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'List Morpho Midnight fixed-rate books', commonParams: [], params: {} },\n { id: 'morpho.fetch-midnight-quote', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Quote Morpho Midnight lend/borrow fill', commonParams: [], params: {} },\n { id: 'morpho.fetch-midnight-positions', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'List Morpho Midnight user positions', commonParams: [], params: {} },\n { id: 'morpho.midnight-lend', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight fixed-rate lend (take asks)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-lend-offer', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight lend limit offer parked in Blue until filled', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-cancel-lend-offer', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Cancel a Morpho Midnight lend offer and withdraw unused Blue park', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-borrow', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight fixed-rate borrow (supply collateral + take bids)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-repay', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight repay debt and withdraw collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(morphoProtocolModule)\n","import { DEFAULT_TICK_SPACING, TickLib } from '@morpho-org/midnight-sdk'\n\nconst WAD = 10n ** 18n\nconst SECONDS_PER_YEAR = 365 * 86400\n\nexport type MorphoMidnightBookLevelLike = {\n tick?: string | number | bigint\n price?: string | number | bigint\n}\n\nexport function parseMorphoMidnightPriceWad(priceWad: string | number | bigint | null | undefined): bigint | null {\n if (priceWad == null) return null\n try {\n if (typeof priceWad === 'bigint') return priceWad > 0n ? priceWad : null\n if (typeof priceWad === 'number') {\n if (!Number.isFinite(priceWad) || priceWad <= 0) return null\n return BigInt(Math.round(priceWad))\n }\n const raw = BigInt(String(priceWad).split('.')[0] || '0')\n return raw > 0n ? raw : null\n } catch {\n return null\n }\n}\n\n/** Fixed APR from WAD-scaled unit price and time-to-maturity (seconds). Morpho docs formula. */\nexport function morphoMidnightAprFromPriceWad(\n priceWad: string | number | bigint,\n ttmSeconds: number,\n): number | null {\n const raw = parseMorphoMidnightPriceWad(priceWad)\n if (raw == null || !Number.isFinite(ttmSeconds) || ttmSeconds <= 0) return null\n const p = Number(raw) / 1e18\n if (!Number.isFinite(p) || p <= 0) return null\n const apr = (1 / p - 1) * (SECONDS_PER_YEAR / ttmSeconds)\n return Number.isFinite(apr) ? apr : null\n}\n\n/** Prefer tick (SDK annualization); fall back to WAD price. */\nexport function morphoMidnightAprFromBookLevel(\n level: MorphoMidnightBookLevelLike | null | undefined,\n ttmSeconds: number,\n): number | null {\n if (!level || !Number.isFinite(ttmSeconds) || ttmSeconds <= 0) return null\n if (level.tick != null && String(level.tick).trim() !== '') {\n try {\n const fromTick = morphoMidnightAprFromTick(BigInt(level.tick), ttmSeconds)\n if (fromTick != null) return fromTick\n } catch {\n // tick out of range — try price\n }\n }\n return level.price != null ? morphoMidnightAprFromPriceWad(level.price, ttmSeconds) : null\n}\n\nexport function formatMorphoMidnightAprPct(apr: number | null, digits = 2, empty = '—'): string {\n if (apr == null || !Number.isFinite(apr)) return empty\n return `${(apr * 100).toFixed(digits)}%`\n}\n\nexport function morphoMidnightTtmSeconds(maturityUnix: number, nowMs = Date.now()): number {\n return Math.max(0, maturityUnix - nowMs / 1000)\n}\n\n/** Unit cap from assets and WAD price: ceil(assets * 1e18 / price). */\nexport function morphoMidnightUnitsFromAssets(targetAssets: bigint, priceWad: bigint): bigint {\n if (priceWad <= 0n || targetAssets <= 0n) return 0n\n return (targetAssets * 10n ** 18n + priceWad - 1n) / priceWad\n}\n\n/** Human percent string (\"5.2\") or decimal (\"0.052\") → APR fraction. */\nexport function parseMorphoMidnightAprInput(raw: string): number | null {\n const t = raw.trim().replace(/%/g, '')\n if (!t || !/^\\d*\\.?\\d+$/.test(t)) return null\n const n = Number(t)\n if (!Number.isFinite(n) || n <= 0) return null\n return n > 1 ? n / 100 : n\n}\n\n/** WAD price from simple APR and time-to-maturity. */\nexport function morphoMidnightPriceWadFromApr(apr: number, ttmSeconds: number): bigint | null {\n if (!Number.isFinite(apr) || apr <= 0 || !Number.isFinite(ttmSeconds) || ttmSeconds <= 0) return null\n const price = 1 / (1 + apr * (ttmSeconds / SECONDS_PER_YEAR))\n if (!Number.isFinite(price) || price <= 0 || price > 1) return null\n return BigInt(Math.round(price * 1e18))\n}\n\nexport function morphoMidnightTickFromPriceWad(priceWad: bigint, spacing = DEFAULT_TICK_SPACING): bigint {\n return TickLib.priceToTick(priceWad, spacing)\n}\n\nexport function morphoMidnightTickFromApr(\n apr: number,\n ttmSeconds: number,\n spacing = DEFAULT_TICK_SPACING,\n): bigint | null {\n const priceWad = morphoMidnightPriceWadFromApr(apr, ttmSeconds)\n if (priceWad == null) return null\n return morphoMidnightTickFromPriceWad(priceWad, spacing)\n}\n\nexport function morphoMidnightAprFromTick(tick: bigint, ttmSeconds: number): number | null {\n if (ttmSeconds <= 0) return null\n try {\n const aprWad = TickLib.tickToApr(tick, BigInt(Math.floor(ttmSeconds)))\n const n = Number(aprWad) / Number(WAD)\n return Number.isFinite(n) ? n : null\n } catch {\n return morphoMidnightAprFromPriceWad(TickLib.tickToPrice(tick), ttmSeconds)\n }\n}\n","import { getAddress, isAddress } from 'viem'\nimport type { MidnightApiBookMarket } from '@morpho-org/midnight-sdk/api'\nimport { fetchMorphoMidnightBooks } from './midnightApi.js'\nimport { MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT } from './midnightConstants.js'\nimport {\n formatMorphoMidnightAprPct,\n morphoMidnightAprFromBookLevel,\n morphoMidnightTtmSeconds,\n} from './midnightMath.js'\n\nexport type MorphoMidnightBookDiscoveryRow = {\n marketId: string\n chainId: number\n midnightAddress: string\n loanTokenAddress: string\n maturity: number\n maturityIso: string\n collateralTokenAddresses: string[]\n primaryCollateralTokenAddress: string | null\n primaryCollateralLltv: string | null\n bestAskPriceWad: string | null\n bestBidPriceWad: string | null\n bestAskAssets: string | null\n bestBidAssets: string | null\n lendApr: string\n borrowApr: string\n lendAprNumeric: number | null\n borrowAprNumeric: number | null\n marketLabel: string\n}\n\nfunction shortAddr(a: string): string {\n return a.length > 10 ? `${a.slice(0, 6)}…${a.slice(-4)}` : a\n}\n\nfunction maturityIso(maturity: number): string {\n if (!maturity || maturity <= 0) return '—'\n try {\n return new Date(maturity * 1000).toISOString().slice(0, 10)\n } catch {\n return '—'\n }\n}\n\nexport function morphoMidnightBookToDiscoveryRow(book: MidnightApiBookMarket): MorphoMidnightBookDiscoveryRow {\n const ttm = morphoMidnightTtmSeconds(book.maturity)\n const bestAsk = book.asks?.[0]\n const bestBid = book.bids?.[0]\n const lendAprN = morphoMidnightAprFromBookLevel(bestAsk, ttm)\n const borrowAprN = morphoMidnightAprFromBookLevel(bestBid, ttm)\n const loan = getAddress(book.loanToken)\n const collaterals = book.collaterals.map((c) => getAddress(c.token))\n const primary = book.collaterals[0]\n const primaryAddr = primary ? getAddress(primary.token) : null\n const marketLabel = `${shortAddr(primaryAddr ?? '—')}/${shortAddr(loan)} · ${maturityIso(book.maturity)}`\n return {\n marketId: book.marketId,\n chainId: book.chainId,\n midnightAddress: getAddress(book.midnight),\n loanTokenAddress: loan,\n maturity: book.maturity,\n maturityIso: maturityIso(book.maturity),\n collateralTokenAddresses: collaterals,\n primaryCollateralTokenAddress: primaryAddr,\n primaryCollateralLltv: primary?.lltv ?? null,\n bestAskPriceWad: bestAsk?.price ?? null,\n bestBidPriceWad: bestBid?.price ?? null,\n bestAskAssets: bestAsk?.assets ?? null,\n bestBidAssets: bestBid?.assets ?? null,\n lendApr: formatMorphoMidnightAprPct(lendAprN, 2, 'No asks'),\n borrowApr: formatMorphoMidnightAprPct(borrowAprN, 2, 'No bids'),\n lendAprNumeric: lendAprN,\n borrowAprNumeric: borrowAprN,\n marketLabel,\n }\n}\n\n/** MCP/UI: list Midnight books with implied fixed lend/borrow APR. */\nexport async function morphoFetchMidnightBooksSummary(args: {\n chainId: number\n /** Loan asset address (or leave empty). */\n loan?: string\n /** Collateral asset address — filters books that include this collateral. */\n collateral?: string\n /** Case-insensitive filter on marketId / addresses. */\n query?: string\n /** Prefer books with bid depth (borrow) or ask depth (lend). */\n side?: 'bids' | 'asks' | 'either'\n limit?: number\n}): Promise<{ books: MorphoMidnightBookDiscoveryRow[] }> {\n const limit = Math.min(Math.max(args.limit ?? MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT, 1), MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT)\n const loan = args.loan?.trim()\n const collateral = args.collateral?.trim()\n const loanTokens = loan && isAddress(loan) ? [getAddress(loan)] : undefined\n const collateralTokens = collateral && isAddress(collateral) ? [getAddress(collateral)] : undefined\n\n const { data } = await fetchMorphoMidnightBooks({\n chainId: args.chainId,\n loanTokens,\n collateralTokens,\n sort: 'maturity',\n limit,\n })\n\n let rows = data.map(morphoMidnightBookToDiscoveryRow)\n\n if (collateral && isAddress(collateral)) {\n const col = getAddress(collateral).toLowerCase()\n rows = rows.filter((r) => r.collateralTokenAddresses.some((a) => a.toLowerCase() === col))\n }\n\n const side = args.side ?? 'either'\n if (side === 'bids') {\n rows = rows.filter((r) => r.bestBidPriceWad != null)\n } else if (side === 'asks') {\n rows = rows.filter((r) => r.bestAskPriceWad != null)\n }\n\n const q = (args.query ?? '').trim().toLowerCase()\n if (q) {\n rows = rows.filter((r) => {\n const hay = [\n r.marketId,\n r.marketLabel,\n r.loanTokenAddress,\n r.primaryCollateralTokenAddress ?? '',\n ...r.collateralTokenAddresses,\n ]\n .join(' ')\n .toLowerCase()\n return hay.includes(q)\n })\n }\n\n return { books: rows.slice(0, limit) }\n}\n\n/** UI helper: books where `asset` is accepted collateral (borrow) or is the loan token. */\nexport async function fetchMorphoMidnightBooksForAsset(args: {\n chainId: number\n assetAddress: string\n mode?: 'borrow' | 'lend' | 'any'\n}): Promise<MorphoMidnightBookDiscoveryRow[]> {\n const asset = args.assetAddress.trim()\n if (!isAddress(asset)) return []\n const mode = args.mode ?? 'any'\n if (mode === 'lend') {\n const { books } = await morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n loan: asset,\n side: 'asks',\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n return books\n }\n if (mode === 'borrow') {\n const asCollateral = await morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n collateral: asset,\n side: 'bids',\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n const asLoan = await morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n loan: asset,\n side: 'bids',\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n const byId = new Map<string, MorphoMidnightBookDiscoveryRow>()\n for (const b of [...asCollateral.books, ...asLoan.books]) byId.set(b.marketId.toLowerCase(), b)\n return [...byId.values()]\n }\n const [asLoan, asCol] = await Promise.all([\n morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n loan: asset,\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n }),\n morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n collateral: asset,\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n }),\n ])\n const byId = new Map<string, MorphoMidnightBookDiscoveryRow>()\n for (const b of [...asLoan.books, ...asCol.books]) byId.set(b.marketId.toLowerCase(), b)\n return [...byId.values()]\n}\n","import type { MidnightApiTake } from '@morpho-org/midnight-sdk/api'\nimport { fetchMorphoMidnightBook, fetchMorphoMidnightBookQuote } from './midnightApi.js'\nimport { MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT } from './midnightConstants.js'\nimport {\n formatMorphoMidnightAprPct,\n morphoMidnightAprFromPriceWad,\n morphoMidnightTtmSeconds,\n} from './midnightMath.js'\n\nexport type MorphoMidnightQuoteSummary = {\n marketId: string\n side: 'asks' | 'bids'\n averageBestPriceWad: string\n averageWorstPriceWad: string\n availableAssets: string\n availableUnits: string\n impliedApr: string\n impliedAprNumeric: number | null\n maturity: number | null\n takeableOfferCount: number\n takeableOffers: readonly MidnightApiTake[]\n}\n\n/** Quote a Midnight book side for a target asset amount (raw token units). */\nexport async function morphoFetchMidnightQuote(args: {\n marketId: string\n /** asks = lend (take asks); bids = borrow (take bids). */\n side: 'asks' | 'bids'\n /** Target loan-token assets in raw units (string or bigint). */\n assets: string | bigint\n slippagePct?: string\n}): Promise<MorphoMidnightQuoteSummary> {\n const assets = typeof args.assets === 'bigint' ? args.assets : BigInt(String(args.assets).split('.')[0] || '0')\n if (assets <= 0n) throw new Error('Quote assets must be > 0.')\n const slippage = (args.slippagePct ?? MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT).trim() || MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT\n\n const [quote, book] = await Promise.all([\n fetchMorphoMidnightBookQuote({\n marketId: args.marketId,\n side: args.side,\n assets,\n slippage,\n }),\n fetchMorphoMidnightBook(args.marketId),\n ])\n\n const maturity = book?.maturity ?? null\n const ttm = maturity != null ? morphoMidnightTtmSeconds(maturity) : 0\n const aprN = morphoMidnightAprFromPriceWad(quote.averageBestPrice, ttm)\n\n return {\n marketId: args.marketId.trim(),\n side: args.side,\n averageBestPriceWad: quote.averageBestPrice,\n averageWorstPriceWad: quote.averageWorstPrice,\n availableAssets: quote.availableAssets,\n availableUnits: quote.availableUnits,\n impliedApr: formatMorphoMidnightAprPct(aprN),\n impliedAprNumeric: aprN,\n maturity,\n takeableOfferCount: quote.takeableOffers.length,\n takeableOffers: quote.takeableOffers,\n }\n}\n\n/** MCP-facing quote (omits ABI take payloads). */\nexport async function morphoFetchMidnightQuoteSummary(\n args: Parameters<typeof morphoFetchMidnightQuote>[0],\n): Promise<Omit<MorphoMidnightQuoteSummary, 'takeableOffers'>> {\n const { takeableOffers: _takes, ...rest } = await morphoFetchMidnightQuote(args)\n return rest\n}\n","import { getAddress, isAddress } from 'viem'\nimport { fetchMorphoMidnightUserPositions, type MorphoMidnightApiPositionRow } from './midnightApi.js'\nimport { formatMorphoMidnightAprPct } from './midnightMath.js'\n\nexport type MorphoMidnightPositionDiscoveryRow = {\n marketId: string\n type: string\n credit: string\n debt: string\n pendingFee: string\n repayAssets: string\n maturity: number | null\n maturityIso: string\n loanTokenAddress: string | null\n collateralTokenAddresses: string[]\n collateralAmounts: { token: string; amount: string }[]\n effectiveRate: string\n costBasis: string | null\n}\n\nfunction maturityIso(maturity: number | null): string {\n if (maturity == null || maturity <= 0) return '—'\n try {\n return new Date(maturity * 1000).toISOString().slice(0, 10)\n } catch {\n return '—'\n }\n}\n\nfunction effectiveRateLabel(wad: string | null | undefined): string {\n if (!wad) return '—'\n try {\n const n = Number(BigInt(wad.split('.')[0] || '0')) / 1e18\n return formatMorphoMidnightAprPct(Number.isFinite(n) ? n : null)\n } catch {\n return '—'\n }\n}\n\nexport function morphoMidnightPositionToDiscoveryRow(\n p: MorphoMidnightApiPositionRow,\n): MorphoMidnightPositionDiscoveryRow {\n const debt = BigInt(p.debt || '0')\n const fee = BigInt(p.pendingFee || '0')\n return {\n marketId: p.marketId,\n type: p.type,\n credit: p.credit,\n debt: p.debt,\n pendingFee: p.pendingFee,\n repayAssets: (debt + fee).toString(),\n maturity: p.maturity ?? null,\n maturityIso: maturityIso(p.maturity ?? null),\n loanTokenAddress: p.loanToken ?? null,\n collateralTokenAddresses: p.collaterals.map((c) => c.token),\n collateralAmounts: p.collaterals.map((c) => ({ token: c.token, amount: c.amount })),\n effectiveRate: effectiveRateLabel(p.effectiveRateWad),\n costBasis: p.costBasis ?? null,\n }\n}\n\n/** MCP/UI: Midnight positions for a user. */\nexport async function morphoFetchMidnightPositionsSummary(args: {\n user: string\n types?: 'lend' | 'borrow' | 'collateral_only'\n activeOnly?: boolean\n}): Promise<{ positions: MorphoMidnightPositionDiscoveryRow[] }> {\n if (!isAddress(args.user)) {\n throw new Error('user must be a valid EVM address.')\n }\n const rows = await fetchMorphoMidnightUserPositions({\n user: getAddress(args.user),\n types: args.types,\n activeOnly: args.activeOnly,\n })\n return { positions: rows.map(morphoMidnightPositionToDiscoveryRow) }\n}\n","import { getAddress, isAddress } from 'viem'\nimport { fetchMorphoMidnightMakerOffers } from './midnightApi.js'\nimport {\n formatMorphoMidnightAprPct,\n morphoMidnightAprFromTick,\n morphoMidnightTtmSeconds,\n} from './midnightMath.js'\n\nexport type MorphoMidnightMakerOfferRow = {\n marketId: string\n chainId: number\n midnightAddress: string\n loanTokenAddress: string\n maker: string\n group: string\n callback: string\n callbackData: string\n tick: string\n maxAssets: string\n remainingUnits: string\n expiry: number\n expiryIso: string\n maturity: number | null\n maturityIso: string\n lendApr: string\n lendAprNumeric: number | null\n marketLabel: string\n}\n\nfunction isoFromUnix(sec: number | null | undefined): string {\n if (sec == null || sec <= 0) return '—'\n try {\n return new Date(sec * 1000).toISOString().slice(0, 10)\n } catch {\n return '—'\n }\n}\n\nexport async function morphoFetchMidnightMakerOffersSummary(args: {\n user: string\n chainId?: number\n}): Promise<{ offers: MorphoMidnightMakerOfferRow[] }> {\n if (!isAddress(args.user)) {\n throw new Error('user must be a valid EVM address.')\n }\n const rows = await fetchMorphoMidnightMakerOffers({\n maker: getAddress(args.user),\n chainId: args.chainId,\n })\n const offers: MorphoMidnightMakerOfferRow[] = []\n for (const r of rows) {\n if (!r.buy) continue\n const ttm = r.maturity != null ? morphoMidnightTtmSeconds(r.maturity) : 0\n let tick = 0n\n try {\n tick = BigInt(r.tick)\n } catch {\n tick = 0n\n }\n const apr = ttm > 0 && tick > 0n ? morphoMidnightAprFromTick(tick, ttm) : null\n offers.push({\n marketId: r.marketId,\n chainId: r.chainId,\n midnightAddress: r.midnight,\n loanTokenAddress: r.loanToken,\n maker: r.maker,\n group: r.group,\n callback: r.callback,\n callbackData: r.callbackData,\n tick: r.tick,\n maxAssets: r.maxAssets,\n remainingUnits: r.units,\n expiry: r.expiry,\n expiryIso: isoFromUnix(r.expiry),\n maturity: r.maturity,\n maturityIso: isoFromUnix(r.maturity),\n lendApr: formatMorphoMidnightAprPct(apr),\n lendAprNumeric: apr,\n marketLabel: `Offer · ${isoFromUnix(r.maturity)} · ${formatMorphoMidnightAprPct(apr)}`,\n })\n }\n return { offers }\n}\n","import { encodeAbiParameters, getAddress, type Address, type Hex } from 'viem'\nimport { morphoGql, type MorphoMarketApiRow } from './api.js'\nimport { marketParamsFromApiRow, type MorphoMarketParams, type ResolvedMorphoMarket } from './marketParams.js'\n\nconst BLUE_MARKET_PARAMS_ABI = [\n {\n type: 'tuple',\n components: [\n { name: 'loanToken', type: 'address' },\n { name: 'collateralToken', type: 'address' },\n { name: 'oracle', type: 'address' },\n { name: 'irm', type: 'address' },\n { name: 'lltv', type: 'uint256' },\n ],\n },\n] as const\n\nexport function encodeMorphoBlueMarketParamsCallbackData(params: MorphoMarketParams): Hex {\n return encodeAbiParameters(BLUE_MARKET_PARAMS_ABI, [\n {\n loanToken: params.loanToken,\n collateralToken: params.collateralToken,\n oracle: params.oracle,\n irm: params.irm,\n lltv: params.lltv,\n },\n ])\n}\n\n/** Highest-TVL Morpho Blue market whose loan token matches `loanToken` (variable-yield park). */\nexport async function pickBestBlueSupplyMarketForLoan(args: {\n chainId: number\n loanToken: Address\n}): Promise<ResolvedMorphoMarket | null> {\n const loan = getAddress(args.loanToken).toLowerCase()\n const d = await morphoGql<{ markets: { items: MorphoMarketApiRow[] } }>(\n `\n query MorphoBlueParkMarkets($chainId: Int!) {\n markets(first: 200, where: { chainId_in: [$chainId] }, orderBy: SupplyAssetsUsd, 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: args.chainId },\n )\n for (const row of d.markets?.items ?? []) {\n const loanAddr = (row.loanAsset?.address ?? '').trim().toLowerCase()\n if (loanAddr !== loan || !row.morphoBlue?.address) continue\n try {\n return {\n ...row,\n morphoBlueAddress: getAddress(row.morphoBlue.address),\n marketParams: marketParamsFromApiRow(row),\n }\n } catch {\n continue\n }\n }\n return 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 /** Unix seconds (UTC) for mpc-auth multiSignRequest expiryDate. */\n expiryDate?: number\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, (_, v) => (typeof v === 'bigint' ? v.toString() : v))\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 if (input.expiryDate != null && input.expiryDate > 0) {\n bodyForSign.expiryDate = Math.floor(input.expiryDate)\n }\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 expiryDate: context.expiryDate,\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 type Hex,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n maxUint256,\n parseAbi,\n parseUnits,\n zeroAddress,\n} from 'viem'\nimport { midnightAbi, midnightBundlesAbi } from '@morpho-org/midnight-sdk'\nimport type { MidnightApiTake } from '@morpho-org/midnight-sdk/api'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport {\n MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n MORPHO_MIDNIGHT_BORROW_FALLBACK_GAS,\n MORPHO_MIDNIGHT_DEFAULT_DEADLINE_SECONDS,\n MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT,\n MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n MORPHO_MIDNIGHT_LEND_FALLBACK_GAS,\n MORPHO_MIDNIGHT_REPAY_FALLBACK_GAS,\n MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK,\n TOKEN_PERMIT_NONE,\n morphoMidnightAddressesForChain,\n} from './midnightConstants.js'\nimport {\n fetchMorphoMidnightBook,\n fetchMorphoMidnightBookQuote,\n fetchMorphoMidnightMarketById,\n fetchMorphoMidnightUserMarketPosition,\n morphoMidnightBookToMarketParams,\n morphoMidnightMarketToParams,\n type MorphoMidnightMarketParams,\n} from './midnightApi.js'\nimport { morphoMidnightUnitsFromAssets } from './midnightMath.js'\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 erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\n\ntype ApproveStep = { kind: 'weth_deposit' | 'approve'; to: Address; data: `0x${string}`; value: bigint }\n\nfunction publicClientFor(rpcUrl: string, chainId: number) {\n const ch = defineChain({\n id: chainId,\n name: 'MorphoMidnight',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain: ch, transport: http(rpcUrl) })\n}\n\nasync function readTokenDecimals(args: {\n rpcUrl: string\n chainId: number\n token: Address\n}): Promise<number> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const d = await publicClient.readContract({\n address: args.token,\n abi: erc20Abi,\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\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 path: token must match wrapped native.')\n }\n steps.push({\n kind: 'weth_deposit',\n to: weth,\n data: encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' }),\n value: args.amountWei,\n })\n spendToken = weth\n }\n\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20Abi,\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: erc20Abi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [args.spender, args.amountWei],\n }),\n value: 0n,\n })\n }\n return steps\n}\n\nasync function ensureBundlesAuthorizedSteps(args: {\n rpcUrl: string\n chainId: number\n midnight: Address\n bundles: Address\n onBehalf: Address\n}): Promise<EvmTxStep[]> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const authorized = await publicClient.readContract({\n address: args.midnight,\n abi: midnightAbi,\n functionName: 'isAuthorized',\n args: [args.onBehalf, args.bundles],\n })\n if (authorized) return []\n return [\n {\n to: args.midnight,\n data: encodeFunctionData({\n abi: midnightAbi,\n functionName: 'setIsAuthorized',\n args: [args.bundles, true, args.onBehalf],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n },\n ]\n}\n\nfunction approveStepsToEvm(steps: readonly ApproveStep[]): EvmTxStep[] {\n return steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit' ? MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK : MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n }))\n}\n\nfunction offerFillsFromTakes(takes: readonly MidnightApiTake[]) {\n return takes.map((t) => ({\n offer: t.offer,\n ratifierData: t.ratifierData,\n units: t.units,\n }))\n}\n\nfunction resolveAddresses(args: {\n chainId: number\n midnight?: Address\n bundles?: Address\n marketMidnight?: Address\n}): { midnight: Address; bundles: Address } {\n const known = morphoMidnightAddressesForChain(args.chainId)\n const midnight = args.midnight\n ? getAddress(args.midnight)\n : args.marketMidnight\n ? getAddress(args.marketMidnight)\n : known?.midnight\n const bundles = args.bundles ? getAddress(args.bundles) : known?.bundles\n if (!midnight || !bundles) {\n throw new Error(\n `Morpho Midnight addresses unknown for chain ${args.chainId}. Pass midnight/bundles or use a supported chain.`,\n )\n }\n return { midnight, bundles }\n}\n\nfunction deadlineFromNow(seconds?: number): bigint {\n const s = seconds && seconds > 0 ? seconds : MORPHO_MIDNIGHT_DEFAULT_DEADLINE_SECONDS\n return BigInt(Math.floor(Date.now() / 1000) + s)\n}\n\nfunction collateralIndex(market: MorphoMidnightMarketParams, collateralToken: Address): bigint {\n const idx = market.collateralParams.findIndex(\n (c) => c.token.toLowerCase() === collateralToken.toLowerCase(),\n )\n if (idx < 0) {\n throw new Error(`Collateral ${collateralToken} is not in market collateralParams.`)\n }\n return BigInt(idx)\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightLendBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n amountHuman: string\n loanToken?: Address\n slippagePct?: string\n deadlineSeconds?: number\n midnight?: Address\n bundles?: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n taker: Address\n receiver?: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const taker = getAddress(args.taker)\n const executor = getAddress(args.executorAddress)\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (!book) throw new Error(`Midnight book not found: ${args.marketId}`)\n const market = morphoMidnightBookToMarketParams(book)\n const { midnight, bundles } = resolveAddresses({\n chainId: args.chainId,\n midnight: args.midnight,\n bundles: args.bundles,\n marketMidnight: market.midnight,\n })\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(market.loanToken)\n if (loanToken.toLowerCase() !== market.loanToken.toLowerCase()) {\n throw new Error('loanToken does not match Midnight market loan token.')\n }\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const targetBuyerAssets = parseUnits(args.amountHuman, dec)\n if (targetBuyerAssets === 0n) throw new Error('Lend amount is zero.')\n\n const slippage = (args.slippagePct ?? MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT).trim()\n const quote = await fetchMorphoMidnightBookQuote({\n marketId: args.marketId,\n side: 'asks',\n assets: targetBuyerAssets,\n slippage,\n })\n if (!quote.takeableOffers.length) {\n throw new Error('No takeable Midnight asks for this size. Try a smaller amount or another maturity.')\n }\n const worst = BigInt(quote.averageWorstPrice.split('.')[0] || '0')\n const minUnits = morphoMidnightUnitsFromAssets(targetBuyerAssets, worst)\n const deadline = deadlineFromNow(args.deadlineSeconds)\n const offerFills = offerFillsFromTakes(quote.takeableOffers)\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loanToken,\n spender: bundles,\n amountWei: targetBuyerAssets,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n })\n const authSteps = await ensureBundlesAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n bundles,\n onBehalf: taker,\n })\n\n const lendData = encodeFunctionData({\n abi: midnightBundlesAbi,\n functionName: 'midnightBundlesV1BuyWithAssetsTargetAndWithdrawCollateral',\n args: [\n targetBuyerAssets,\n minUnits,\n taker,\n false,\n TOKEN_PERMIT_NONE,\n offerFills,\n [],\n taker,\n 0n,\n zeroAddress,\n maxUint256,\n deadline,\n ],\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\n const evmSteps: EvmTxStep[] = [\n ...approveStepsToEvm(approveSteps),\n ...authSteps,\n { to: bundles, data: lendData, value: 0n, fallbackGas: MORPHO_MIDNIGHT_LEND_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 Midnight: lend (${args.amountHuman}) on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: bundles,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MorphoMidnight',\n name: 'lend',\n marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_midnight_lend', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n amountHuman: args.amountHuman,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightBorrowBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n borrowAmountHuman: string\n collateralAmountHuman: string\n collateralToken: Address\n loanToken?: Address\n collateralIndex?: number\n slippagePct?: string\n deadlineSeconds?: number\n midnight?: Address\n bundles?: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n taker: Address\n receiver?: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const taker = getAddress(args.taker)\n const receiver = getAddress(args.receiver ?? args.taker)\n const executor = getAddress(args.executorAddress)\n const collateralToken = getAddress(args.collateralToken)\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (!book) throw new Error(`Midnight book not found: ${args.marketId}`)\n const market = morphoMidnightBookToMarketParams(book)\n const { midnight, bundles } = resolveAddresses({\n chainId: args.chainId,\n midnight: args.midnight,\n bundles: args.bundles,\n marketMidnight: market.midnight,\n })\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(market.loanToken)\n\n const loanDec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const colDec = await readTokenDecimals({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: collateralToken,\n })\n const targetSellerAssets = parseUnits(args.borrowAmountHuman, loanDec)\n const collateralAmount = parseUnits(args.collateralAmountHuman, colDec)\n if (targetSellerAssets === 0n) throw new Error('Borrow amount is zero.')\n if (collateralAmount === 0n) throw new Error('Collateral amount is zero.')\n\n const colIdx =\n args.collateralIndex != null && args.collateralIndex >= 0\n ? BigInt(args.collateralIndex)\n : collateralIndex(market, collateralToken)\n\n const slippage = (args.slippagePct ?? MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT).trim()\n const quote = await fetchMorphoMidnightBookQuote({\n marketId: args.marketId,\n side: 'bids',\n assets: targetSellerAssets,\n slippage,\n })\n if (!quote.takeableOffers.length) {\n throw new Error('No takeable Midnight bids for this size. Try a smaller amount or another maturity.')\n }\n const worst = BigInt(quote.averageWorstPrice.split('.')[0] || '0')\n const maxUnits = morphoMidnightUnitsFromAssets(targetSellerAssets, worst)\n const deadline = deadlineFromNow(args.deadlineSeconds)\n const offerFills = offerFillsFromTakes(quote.takeableOffers)\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: collateralToken,\n spender: bundles,\n amountWei: collateralAmount,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n })\n const authSteps = await ensureBundlesAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n bundles,\n onBehalf: taker,\n })\n\n const borrowData = encodeFunctionData({\n abi: midnightBundlesAbi,\n functionName: 'midnightBundlesV1SupplyCollateralAndSellWithAssetsTarget',\n args: [\n targetSellerAssets,\n maxUnits,\n taker,\n false,\n receiver,\n [{ collateralIndex: colIdx, assets: collateralAmount, permit: TOKEN_PERMIT_NONE }],\n offerFills,\n 0n,\n zeroAddress,\n maxUint256,\n deadline,\n ],\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\n const evmSteps: EvmTxStep[] = [\n ...approveStepsToEvm(approveSteps),\n ...authSteps,\n { to: bundles, data: borrowData, value: 0n, fallbackGas: MORPHO_MIDNIGHT_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 Midnight: borrow (${args.borrowAmountHuman}) on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: bundles,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MorphoMidnight',\n name: 'borrow',\n marketLabel,\n borrowAmountHuman: args.borrowAmountHuman,\n collateralAmountHuman: args.collateralAmountHuman,\n }),\n evm: { type: 'morpho_midnight_borrow', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n amountHuman: args.borrowAmountHuman,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightRepayBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n /** Optional override; default = debt + pendingFee + 1 unit buffer in loan decimals. */\n repayAmountHuman?: string\n loanToken?: Address\n withdrawAllCollateral?: boolean\n deadlineSeconds?: number\n midnight?: Address\n bundles?: Address\n onBehalf: Address\n collateralReceiver?: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const onBehalf = getAddress(args.onBehalf)\n const collateralReceiver = getAddress(args.collateralReceiver ?? args.onBehalf)\n const executor = getAddress(args.executorAddress)\n\n const [marketRow, position] = await Promise.all([\n fetchMorphoMidnightMarketById(args.marketId),\n fetchMorphoMidnightUserMarketPosition({ marketId: args.marketId, user: onBehalf }),\n ])\n if (!marketRow) throw new Error(`Midnight market not found: ${args.marketId}`)\n if (!position) throw new Error(`No Midnight position for ${onBehalf} in ${args.marketId}`)\n\n const baseMarket = morphoMidnightMarketToParams(marketRow)\n // Prefer midnight from book/live if market detail omitted it\n let midnightAddr = baseMarket.midnight\n if (midnightAddr === zeroAddress) {\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (book) midnightAddr = getAddress(book.midnight)\n }\n const { midnight, bundles } = resolveAddresses({\n chainId: args.chainId,\n midnight: args.midnight ?? (midnightAddr !== zeroAddress ? midnightAddr : undefined),\n bundles: args.bundles,\n marketMidnight: midnightAddr !== zeroAddress ? midnightAddr : undefined,\n })\n const market = { ...baseMarket, midnight }\n\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(market.loanToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const debt = BigInt(position.debt || '0')\n const fee = BigInt(position.pendingFee || '0')\n const buffer = parseUnits('1', Math.min(dec, 6))\n let repayAssets: bigint\n if (args.repayAmountHuman?.trim()) {\n repayAssets = parseUnits(args.repayAmountHuman.trim(), dec)\n } else {\n repayAssets = debt + fee + buffer\n }\n if (repayAssets === 0n) throw new Error('Repay amount is zero.')\n\n const withdrawAll = args.withdrawAllCollateral !== false\n const collateralWithdrawals = withdrawAll\n ? position.collaterals.map((c) => {\n const idx = market.collateralParams.findIndex(\n (cp) => cp.token.toLowerCase() === c.token.toLowerCase(),\n )\n if (idx < 0) throw new Error(`Collateral ${c.token} missing from market params.`)\n return { collateralIndex: BigInt(idx), assets: BigInt(c.amount || '0') }\n })\n : []\n\n const deadline = deadlineFromNow(args.deadlineSeconds)\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loanToken,\n spender: bundles,\n amountWei: repayAssets,\n executor,\n })\n const authSteps = await ensureBundlesAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n bundles,\n onBehalf,\n })\n\n const repayData = encodeFunctionData({\n abi: midnightBundlesAbi,\n functionName: 'midnightBundlesV1RepayAndWithdrawCollateral',\n args: [\n market,\n repayAssets,\n onBehalf,\n TOKEN_PERMIT_NONE,\n collateralWithdrawals,\n collateralReceiver,\n 0n,\n zeroAddress,\n deadline,\n ],\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\n const evmSteps: EvmTxStep[] = [\n ...approveStepsToEvm(approveSteps),\n ...authSteps,\n { to: bundles, data: repayData as Hex, value: 0n, fallbackGas: MORPHO_MIDNIGHT_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 Midnight: repay + withdraw on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: bundles,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoMidnight', name: 'repay', marketLabel }),\n evm: { type: 'morpho_midnight_repay', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n","import {\n type Address,\n type Hex,\n createPublicClient,\n decodeAbiParameters,\n defineChain,\n encodeAbiParameters,\n encodeFunctionData,\n getAddress,\n http,\n keccak256,\n maxUint256,\n parseAbi,\n parseUnits,\n zeroAddress,\n} from 'viem'\nimport { Offer, Payload, SetterRatifierUtils, Tree, midnightAbi } from '@morpho-org/midnight-sdk'\nimport type { MidnightApiBookMarket } from '@morpho-org/midnight-sdk/api'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport {\n MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n MORPHO_MIDNIGHT_BLUE_SUPPLY_FALLBACK_GAS,\n MORPHO_MIDNIGHT_BLUE_WITHDRAW_FALLBACK_GAS,\n MORPHO_MIDNIGHT_CALLBACK_SALT,\n MORPHO_MIDNIGHT_CREATE_CALLBACK_FALLBACK_GAS,\n MORPHO_MIDNIGHT_DEFAULT_OFFER_TTL_SECONDS,\n MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n MORPHO_MIDNIGHT_MEMPOOL_PUBLISH_FALLBACK_GAS,\n MORPHO_MIDNIGHT_SET_CONSUMED_FALLBACK_GAS,\n MORPHO_MIDNIGHT_SET_ROOT_FALLBACK_GAS,\n MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK,\n morphoMidnightAddressesForChain,\n} from './midnightConstants.js'\nimport {\n fetchMorphoMidnightBook,\n morphoMidnightApiBaseUrl,\n morphoMidnightBookToMarketParams,\n} from './midnightApi.js'\nimport { fetchMorphoMarketById, type MorphoMarketParams } from './marketParams.js'\nimport {\n encodeMorphoBlueMarketParamsCallbackData,\n pickBestBlueSupplyMarketForLoan,\n} from './midnightBluePark.js'\nimport {\n morphoMidnightTickFromApr,\n morphoMidnightTickFromPriceWad,\n morphoMidnightTtmSeconds,\n parseMorphoMidnightAprInput,\n} from './midnightMath.js'\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 erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\nconst factoryAbi = parseAbi([\n 'function callbackOf(address owner, bytes32 salt) view returns (address)',\n 'function createBlueBuyCallback(address owner, bytes32 salt) returns (address)',\n])\nconst setterAbi = parseAbi([\n 'function isRootRatified(address maker, bytes32 root) view returns (bool)',\n 'function setIsRootRatified(address maker, bytes32 root, bool newIsRatified)',\n])\nconst morphoBlueAbi = parseAbi([\n 'function supply((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, bytes data)',\n 'function withdraw((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, address receiver)',\n 'function position(bytes32 id, address user) view returns (uint256 supplyShares, uint128 borrowShares, uint128 collateral)',\n])\nconst blueMarketParamsAbi = [\n {\n type: 'tuple',\n components: [\n { name: 'loanToken', type: 'address' },\n { name: 'collateralToken', type: 'address' },\n { name: 'oracle', type: 'address' },\n { name: 'irm', type: 'address' },\n { name: 'lltv', type: 'uint256' },\n ],\n },\n] as const\n\nfunction publicClientFor(rpcUrl: string, chainId: number) {\n const ch = defineChain({\n id: chainId,\n name: 'MorphoMidnight',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain: ch, transport: http(rpcUrl) })\n}\n\nasync function readTokenDecimals(args: { rpcUrl: string; chainId: number; token: Address }): Promise<number> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const d = await publicClient.readContract({\n address: args.token,\n abi: erc20Abi,\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 path: token must match wrapped native.')\n }\n steps.push({\n kind: 'weth_deposit',\n to: weth,\n data: encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' }),\n value: args.amountWei,\n })\n spendToken = weth\n }\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20Abi,\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: erc20Abi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [args.spender, args.amountWei],\n }),\n value: 0n,\n })\n }\n return steps\n}\n\nfunction approveStepsToEvm(steps: readonly ApproveStep[]): EvmTxStep[] {\n return steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit' ? MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK : MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n }))\n}\n\nasync function ensureAuthorizedSteps(args: {\n rpcUrl: string\n chainId: number\n midnight: Address\n authorized: Address\n onBehalf: Address\n}): Promise<EvmTxStep[]> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const authorized = await publicClient.readContract({\n address: args.midnight,\n abi: midnightAbi,\n functionName: 'isAuthorized',\n args: [args.onBehalf, args.authorized],\n })\n if (authorized) return []\n return [\n {\n to: args.midnight,\n data: encodeFunctionData({\n abi: midnightAbi,\n functionName: 'setIsAuthorized',\n args: [args.authorized, true, args.onBehalf],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n },\n ]\n}\n\nfunction bookLevelTick(level: { tick?: string | number | bigint; price?: string } | undefined): bigint | null {\n if (!level) return null\n if (level.tick != null && String(level.tick).trim() !== '') {\n try {\n return BigInt(level.tick)\n } catch {\n return null\n }\n }\n if (!level.price) return null\n try {\n return morphoMidnightTickFromPriceWad(BigInt(String(level.price).split('.')[0] || '0'))\n } catch {\n return null\n }\n}\n\nfunction resolveOfferTick(args: {\n book: MidnightApiBookMarket\n lendAprPct?: string\n tick?: string\n}): bigint {\n if (args.tick?.trim()) {\n try {\n const t = BigInt(args.tick.trim())\n if (t > 0n) return t\n } catch {\n throw new Error(`Invalid Midnight offer tick: ${args.tick}`)\n }\n }\n const ttm = morphoMidnightTtmSeconds(args.book.maturity)\n if (args.lendAprPct?.trim()) {\n const apr = parseMorphoMidnightAprInput(args.lendAprPct)\n if (apr == null) throw new Error('lendAprPct must be a positive percent (e.g. 5.2).')\n const tick = morphoMidnightTickFromApr(apr, ttm)\n if (tick == null) throw new Error('Could not convert lendAprPct to a Midnight tick.')\n return tick\n }\n const bidTick = bookLevelTick(args.book.bids?.[0] as { tick?: string | number | bigint; price?: string } | undefined)\n if (bidTick != null && bidTick > 0n) return bidTick\n const askTick = bookLevelTick(args.book.asks?.[0] as { tick?: string | number | bigint; price?: string } | undefined)\n if (askTick != null && askTick > 0n) return askTick\n throw new Error('No book tick available. Pass lendAprPct (e.g. 5.2) or tick.')\n}\n\nfunction offerExpiryUnix(maturity: number, ttlSeconds?: number): bigint {\n const now = Math.floor(Date.now() / 1000)\n const ttl = ttlSeconds && ttlSeconds > 0 ? ttlSeconds : MORPHO_MIDNIGHT_DEFAULT_OFFER_TTL_SECONDS\n const byTtl = now + ttl\n const byMaturity = maturity > 60 ? maturity - 60 : maturity\n return BigInt(Math.max(now + 60, Math.min(byTtl, byMaturity)))\n}\n\nfunction decodeBlueMarketParams(data: Hex): MorphoMarketParams {\n const [decoded] = decodeAbiParameters(blueMarketParamsAbi, data)\n return {\n loanToken: getAddress(decoded.loanToken),\n collateralToken: getAddress(decoded.collateralToken),\n oracle: getAddress(decoded.oracle),\n irm: getAddress(decoded.irm),\n lltv: decoded.lltv,\n }\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightLendOfferBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n amountHuman: string\n loanToken?: Address\n /** Human percent, e.g. \"5.2\". Defaults to the book's best bid (else best ask). */\n lendAprPct?: string\n tick?: string\n blueMarketId?: string\n expirySeconds?: number\n midnight?: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n maker: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const maker = getAddress(args.maker)\n const executor = getAddress(args.executorAddress)\n const known = morphoMidnightAddressesForChain(args.chainId)\n if (!known) {\n throw new Error(`Morpho Midnight addresses unknown for chain ${args.chainId}.`)\n }\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (!book) throw new Error(`Midnight book not found: ${args.marketId}`)\n const marketParams = morphoMidnightBookToMarketParams(book)\n const midnight = args.midnight ? getAddress(args.midnight) : getAddress(book.midnight || known.midnight)\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(marketParams.loanToken)\n if (loanToken.toLowerCase() !== marketParams.loanToken.toLowerCase()) {\n throw new Error('loanToken does not match Midnight market loan token.')\n }\n\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const maxAssets = parseUnits(args.amountHuman, dec)\n if (maxAssets === 0n) throw new Error('Lend offer amount is zero.')\n\n const blueRow = args.blueMarketId?.trim()\n ? await fetchMorphoMarketById({ chainId: args.chainId, marketId: args.blueMarketId.trim() })\n : await pickBestBlueSupplyMarketForLoan({ chainId: args.chainId, loanToken })\n if (!blueRow) {\n throw new Error(\n `No Morpho Blue market found to park ${loanToken} while the Midnight offer waits. Pass blueMarketId.`,\n )\n }\n if (blueRow.marketParams.loanToken.toLowerCase() !== loanToken.toLowerCase()) {\n throw new Error('blueMarketId loan token must match the Midnight loan token.')\n }\n const morphoBlue = getAddress(blueRow.morphoBlueAddress)\n const callbackData = encodeMorphoBlueMarketParamsCallbackData(blueRow.marketParams)\n const tick = resolveOfferTick({ book, lendAprPct: args.lendAprPct, tick: args.tick })\n const expiry = offerExpiryUnix(book.maturity, args.expirySeconds)\n\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n let callback = await publicClient.readContract({\n address: known.blueBuyCallbackFactory,\n abi: factoryAbi,\n functionName: 'callbackOf',\n args: [maker, MORPHO_MIDNIGHT_CALLBACK_SALT],\n })\n const evmSteps: EvmTxStep[] = []\n if (callback === zeroAddress) {\n const sim = await publicClient.simulateContract({\n address: known.blueBuyCallbackFactory,\n abi: factoryAbi,\n functionName: 'createBlueBuyCallback',\n args: [maker, MORPHO_MIDNIGHT_CALLBACK_SALT],\n account: executor,\n })\n callback = sim.result\n evmSteps.push({\n to: known.blueBuyCallbackFactory,\n data: encodeFunctionData({\n abi: factoryAbi,\n functionName: 'createBlueBuyCallback',\n args: [maker, MORPHO_MIDNIGHT_CALLBACK_SALT],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_CREATE_CALLBACK_FALLBACK_GAS,\n })\n }\n if (callback === zeroAddress) {\n throw new Error('Could not resolve BlueBuyCallback address for this owner.')\n }\n\n const offer = Offer.create({\n market: {\n chainId: args.chainId,\n midnight,\n loanToken,\n collateralParams: marketParams.collateralParams.map((c) => ({\n token: c.token,\n lltv: c.lltv,\n liquidationCursor: c.liquidationCursor,\n oracle: c.oracle,\n })),\n maturity: marketParams.maturity,\n rcfThreshold: marketParams.rcfThreshold,\n enterGate: marketParams.enterGate,\n liquidatorGate: marketParams.liquidatorGate,\n },\n buy: true,\n maker,\n tick,\n maxAssets,\n expiry,\n ratifier: known.setterRatifier,\n callback,\n callbackData,\n })\n const tree = Tree.create([offer])\n await tree.mempoolValidate({ chainId: args.chainId, apiUrl: morphoMidnightApiBaseUrl() })\n const items = SetterRatifierUtils.ratify({ tree })\n const payload = await Payload.encode(items)\n\n evmSteps.push(\n ...approveStepsToEvm(\n await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loanToken,\n spender: morphoBlue,\n amountWei: maxAssets,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n }),\n ),\n )\n evmSteps.push({\n to: morphoBlue,\n data: encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'supply',\n args: [blueRow.marketParams, maxAssets, 0n, callback, '0x'],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_BLUE_SUPPLY_FALLBACK_GAS,\n })\n evmSteps.push(\n ...(await ensureAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n authorized: known.setterRatifier,\n onBehalf: maker,\n })),\n )\n evmSteps.push({\n to: known.setterRatifier,\n data: encodeFunctionData({\n abi: setterAbi,\n functionName: 'setIsRootRatified',\n args: [maker, tree.root, true],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_SET_ROOT_FALLBACK_GAS,\n })\n evmSteps.push({\n to: known.mempool,\n data: payload,\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_MEMPOOL_PUBLISH_FALLBACK_GAS,\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\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 Midnight: lend offer (${args.amountHuman}) on \"${marketLabel}\" (variable yield until filled).`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: known.mempool,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MorphoMidnight',\n name: 'lend_offer',\n marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_midnight_lend_offer', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n amountHuman: args.amountHuman,\n tick: tick.toString(),\n blueMarketId: blueRow.marketId,\n callback,\n treeRoot: tree.root,\n group: offer.group,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightCancelLendOfferBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n group: Hex\n callback?: Address\n callbackData?: Hex\n midnight?: Address\n withdrawRemaining?: boolean\n maker: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const maker = getAddress(args.maker)\n const executor = getAddress(args.executorAddress)\n const known = morphoMidnightAddressesForChain(args.chainId)\n if (!known) {\n throw new Error(`Morpho Midnight addresses unknown for chain ${args.chainId}.`)\n }\n const midnight = args.midnight ? getAddress(args.midnight) : known.midnight\n const group = args.group.trim() as Hex\n if (!group.startsWith('0x') || group.length !== 66) {\n throw new Error('group must be a bytes32 hex id from ctm_morpho_fetch_midnight_offers.')\n }\n\n const evmSteps: EvmTxStep[] = [\n {\n to: midnight,\n data: encodeFunctionData({\n abi: midnightAbi,\n functionName: 'setConsumed',\n args: [group, maxUint256, maker],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_SET_CONSUMED_FALLBACK_GAS,\n },\n ]\n\n const withdrawRemaining = args.withdrawRemaining !== false\n const callback = args.callback && args.callback !== zeroAddress ? getAddress(args.callback) : null\n const callbackData = (args.callbackData ?? '0x') as Hex\n if (withdrawRemaining && callback && callbackData !== '0x') {\n const params = decodeBlueMarketParams(callbackData)\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const marketId = keccak256(\n encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'address' },\n { type: 'address' },\n { type: 'uint256' },\n ],\n [params.loanToken, params.collateralToken, params.oracle, params.irm, params.lltv],\n ),\n )\n const pos = await publicClient.readContract({\n address: known.morphoBlue,\n abi: morphoBlueAbi,\n functionName: 'position',\n args: [marketId, callback],\n })\n const supplyShares = pos[0]\n if (supplyShares > 0n) {\n evmSteps.push({\n to: known.morphoBlue,\n data: encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'withdraw',\n args: [params, 0n, supplyShares, callback, maker],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_BLUE_WITHDRAW_FALLBACK_GAS,\n })\n }\n }\n\n const marketLabel = (args.marketLabel ?? '').trim() || 'Midnight lend offer'\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 Midnight: cancel lend offer on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: midnight,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoMidnight', name: 'cancel_lend_offer', marketLabel }),\n evm: { type: 'morpho_midnight_cancel_lend_offer', version: 1, chainId: String(args.chainId) },\n morpho: {\n group,\n marketLabel,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\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","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"]}
1
+ {"version":3,"sources":["../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/morpho/midnightConstants.ts","../../../../src/protocols/evm/morpho/midnightApi.ts","../../../../src/core/registry.ts","../../../../src/protocols/evm/morpho/api.ts","../../../../src/protocols/evm/morpho/support.ts","../../../../src/protocols/evm/morpho/marketParams.ts","../../../../src/protocols/evm/morpho/vaultEarnDetails.ts","../../../../src/protocols/evm/morpho/vaultMarkets.ts","../../../../src/protocols/evm/morpho/robinhoodEarn.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/index.ts","../../../../src/protocols/evm/morpho/midnightMath.ts","../../../../src/protocols/evm/morpho/midnightDiscovery.ts","../../../../src/protocols/evm/morpho/midnightQuote.ts","../../../../src/protocols/evm/morpho/midnightPositions.ts","../../../../src/protocols/evm/morpho/midnightOffers.ts","../../../../src/protocols/evm/morpho/midnightBluePark.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/morpho/midnightMultisign.ts","../../../../src/protocols/evm/morpho/midnightOfferMultisign.ts","../../../../src/protocols/evm/morpho/vaultSharesOnChain.ts","../../../../src/protocols/evm/morpho/blueRiskOnChain.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"],"names":["isAddress","getAddress","light","exposure","detail","fetchMorphoMidnightBooks","MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT","asLoan","byId","maturityIso","gasLimitFromEstimateAndChainConfig","keccak256","defineChain","createPublicClient","http","wethDepositAbi","parseAbi","erc20Abi","publicClientFor","readTokenDecimals","buildApproveSteps","encodeFunctionData","approveStepsToEvm","midnightAbi","parseUnits","zeroAddress","maxUint256","encodeAbiParameters","morphoBlueAbi","WAD","MORPHO_ERC20_APPROVE_FALLBACK","MORPHO_WETH_DEPOSIT_FALLBACK","erc20AllowanceAbi","erc20ApproveAbi"],"mappings":"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","file":"index.js","sourcesContent":["/**\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\n/** Browser → Next.js base path for Euler V3 REST (`/v3/evk/vaults`, …). */\nlet eulerV3ApiProxyBase: string | undefined\n\nexport function setEulerV3ApiProxyBase(url: string | undefined): void {\n eulerV3ApiProxyBase = url?.trim().replace(/\\/$/, '') || undefined\n}\n\nexport function getEulerV3ApiProxyBase(): string | undefined {\n return eulerV3ApiProxyBase\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\n/** Browser → Next.js base path for Morpho Midnight REST (replaces api.morpho.org/v0/midnight). */\nlet morphoMidnightRestProxyUrl: string | undefined\n\nexport function setMorphoMidnightRestProxyUrl(url: string | undefined): void {\n morphoMidnightRestProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoMidnightRestProxyUrl(): string | undefined {\n return morphoMidnightRestProxyUrl\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\nexport async function getJsonViaOptionalProxy<T>(args: {\n directUrl: string\n /** When set, GET this URL instead of directUrl (same path semantics as caller built). */\n proxyUrl?: string\n}): Promise<T> {\n const url = args.proxyUrl?.trim() || args.directUrl\n const r = await fetch(url, { method: 'GET', headers: { accept: 'application/json' } })\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 { keccak256, toBytes, type Address, type Hex } from 'viem'\n\n/** Morpho Midnight REST API base (no trailing slash). */\nexport const MORPHO_MIDNIGHT_REST_BASE = 'https://api.morpho.org/v0/midnight'\n\n/** Upstream `GET /books` rejects limit > 20 (`VALIDATION_ERROR`). */\nexport const MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT = 20\n\nexport const MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT = '0.5'\nexport const MORPHO_MIDNIGHT_DEFAULT_DEADLINE_SECONDS = 3600\n/** Default maker-offer lifetime when the user does not pass expiry. */\nexport const MORPHO_MIDNIGHT_DEFAULT_OFFER_TTL_SECONDS = 7 * 24 * 3600\n\nexport const MORPHO_MIDNIGHT_BASE_CHAIN_ID = 8453\nexport const MORPHO_MIDNIGHT_ETHEREUM_CHAIN_ID = 1\n\n/** Canonical Morpho Blue singleton (Ethereum + Base). */\nexport const MORPHO_BLUE_CANONICAL = '0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb' as Address\n\n/**\n * CREATE2 salt for Continuum's per-owner BlueBuyCallback.\n * One callback per owner so unused parked supply can be reused across offers.\n */\nexport const MORPHO_MIDNIGHT_CALLBACK_SALT = keccak256(toBytes('continuum-midnight-lend-v1')) as Hex\n\nexport type MorphoMidnightChainAddresses = {\n midnight: Address\n bundles: Address\n mempool: Address\n setterRatifier: Address\n ecrecoverRatifier: Address\n blueBuyCallbackFactory: Address\n morphoBlue: Address\n}\n\n/**\n * Official Morpho deployments (docs.morpho.org/developers/contracts/addresses).\n * Base MidnightBundlesV1 is `0x091183…` — not the older `0x6688dE…` helper.\n */\nexport const MORPHO_MIDNIGHT_ADDRESSES: Record<number, MorphoMidnightChainAddresses> = {\n [MORPHO_MIDNIGHT_ETHEREUM_CHAIN_ID]: {\n midnight: '0x471686c42792F93528B000beF54bC10E3aa2045f',\n bundles: '0x7c00dBB2b6b6b9B28745332e550dC8782Fcf77EC',\n mempool: '0xde2d62449301a09A51EbF9326EA60d2e8BF4A8F7',\n setterRatifier: '0xb72c416382c8A6399D0765CebfB032F040B00B3c',\n ecrecoverRatifier: '0xAC439c81CAA6ef4C7B7E8F0110F8CE63A4b6D43e',\n blueBuyCallbackFactory: '0x172d1FdC5f79bFe1ED46448f18541E591E5c93a7',\n morphoBlue: MORPHO_BLUE_CANONICAL,\n },\n [MORPHO_MIDNIGHT_BASE_CHAIN_ID]: {\n midnight: '0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A',\n bundles: '0x091183d729BE9f808c212b475E387A12E67850A7',\n mempool: '0xdD6DCE32e21f7b020898a8258dA37355b4017993',\n setterRatifier: '0x800B5F12A61B8198a5a6EfD794Cac6699B294d63',\n ecrecoverRatifier: '0xd6e70365C8E8DDa9a4ca662C07bbE663b017755E',\n blueBuyCallbackFactory: '0x7337f119Eca028bD39E0e543cEf71631D2333425',\n morphoBlue: MORPHO_BLUE_CANONICAL,\n },\n}\n\nexport function morphoMidnightAddressesForChain(chainId: number): MorphoMidnightChainAddresses | null {\n return MORPHO_MIDNIGHT_ADDRESSES[chainId] ?? null\n}\n\nexport const TOKEN_PERMIT_NONE = { kind: 0, data: '0x' as const } as const\n\nexport const MORPHO_MIDNIGHT_LEND_FALLBACK_GAS = 2_500_000n\nexport const MORPHO_MIDNIGHT_BORROW_FALLBACK_GAS = 3_000_000n\nexport const MORPHO_MIDNIGHT_REPAY_FALLBACK_GAS = 2_200_000n\nexport const MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS = 80_000n\nexport const MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK = 100_000n\nexport const MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK = 120_000n\nexport const MORPHO_MIDNIGHT_CREATE_CALLBACK_FALLBACK_GAS = 1_200_000n\nexport const MORPHO_MIDNIGHT_BLUE_SUPPLY_FALLBACK_GAS = 400_000n\nexport const MORPHO_MIDNIGHT_BLUE_WITHDRAW_FALLBACK_GAS = 350_000n\nexport const MORPHO_MIDNIGHT_SET_ROOT_FALLBACK_GAS = 80_000n\nexport const MORPHO_MIDNIGHT_MEMPOOL_PUBLISH_FALLBACK_GAS = 250_000n\nexport const MORPHO_MIDNIGHT_SET_CONSUMED_FALLBACK_GAS = 80_000n\n","import type { Address, Hex } from 'viem'\nimport { getAddress, isAddress } from 'viem'\nimport { MidnightApi } from '@morpho-org/midnight-sdk/api'\nimport type { MidnightApiBookMarket, MidnightApiTake } from '@morpho-org/midnight-sdk/api'\nimport { getJsonViaOptionalProxy, getMorphoMidnightRestProxyUrl } from '../../../core/defiProxy.js'\nimport { MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT, MORPHO_MIDNIGHT_REST_BASE } from './midnightConstants.js'\n\nexport type MorphoMidnightBookSide = 'asks' | 'bids'\n\nexport type MorphoMidnightMarketParams = {\n chainId: bigint\n midnight: Address\n loanToken: Address\n collateralParams: readonly {\n token: Address\n lltv: bigint\n liquidationCursor: bigint\n oracle: Address\n }[]\n maturity: bigint\n rcfThreshold: bigint\n enterGate: Address\n liquidatorGate: Address\n}\n\nexport type MorphoMidnightApiMarketRow = {\n chainId: number\n marketId: Hex\n midnight: Address\n loanToken: Address\n maturity: number\n rcfThreshold: string\n enterGate: Address\n liquidatorGate: Address\n collaterals: readonly {\n token: Address\n lltv: string\n liquidationCursor: string\n oracle: Address\n }[]\n}\n\nexport type MorphoMidnightApiPositionRow = {\n marketId: Hex\n type: 'lend' | 'borrow' | 'collateral_only' | string\n credit: string\n debt: string\n pendingFee: string\n lossFactor: string\n costBasis?: string | null\n effectiveRateWad?: string | null\n maturity?: number | null\n loanToken?: Address | null\n collaterals: readonly { token: Address; amount: string }[]\n}\n\n/** Effective Midnight REST base — browser proxy when configured. */\nexport function morphoMidnightApiBaseUrl(): string {\n const proxy = getMorphoMidnightRestProxyUrl()?.replace(/\\/$/, '')\n return proxy || MORPHO_MIDNIGHT_REST_BASE\n}\n\nfunction midnightApiConfig() {\n return { baseUrl: morphoMidnightApiBaseUrl() }\n}\n\nasync function midnightGetJson<T>(pathAndQuery: string): Promise<T> {\n const path = pathAndQuery.startsWith('/') ? pathAndQuery : `/${pathAndQuery}`\n const directUrl = `${MORPHO_MIDNIGHT_REST_BASE}${path}`\n const proxyBase = getMorphoMidnightRestProxyUrl()?.replace(/\\/$/, '')\n const proxyUrl = proxyBase ? `${proxyBase}${path}` : undefined\n return getJsonViaOptionalProxy<T>({ directUrl, proxyUrl })\n}\n\nexport async function fetchMorphoMidnightBooks(args: {\n chainId: number\n loanTokens?: readonly string[]\n collateralTokens?: readonly string[]\n sort?: 'maturity' | 'ask' | 'bid' | 'id' | '-maturity' | '-ask' | '-bid' | '-id'\n limit?: number\n cursor?: string\n}): Promise<{ data: MidnightApiBookMarket[]; cursor: string | null }> {\n const limit =\n args.limit == null\n ? undefined\n : Math.min(Math.max(Math.floor(args.limit), 1), MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT)\n const result = await MidnightApi.fetchBooks({\n ...midnightApiConfig(),\n chainIds: [args.chainId],\n loanTokens: args.loanTokens?.filter((a) => isAddress(a)).map((a) => getAddress(a)),\n collateralTokens: args.collateralTokens?.filter((a) => isAddress(a)).map((a) => getAddress(a)),\n sort: args.sort ? [args.sort] : ['maturity'],\n limit,\n cursor: args.cursor,\n })\n return { data: [...result.data], cursor: result.cursor ?? null }\n}\n\nexport async function fetchMorphoMidnightBook(marketId: string): Promise<MidnightApiBookMarket | null> {\n const id = marketId.trim()\n if (!id) return null\n try {\n const result = await MidnightApi.fetchBook({\n ...midnightApiConfig(),\n marketId: id as Hex,\n })\n return result.data\n } catch {\n return null\n }\n}\n\nexport async function fetchMorphoMidnightBookQuote(args: {\n marketId: string\n side: MorphoMidnightBookSide\n assets: bigint\n slippage?: string\n}): Promise<{\n averageBestPrice: string\n averageWorstPrice: string\n availableAssets: string\n availableUnits: string\n takeableOffers: readonly MidnightApiTake[]\n}> {\n const quote = await MidnightApi.fetchBookQuote({\n ...midnightApiConfig(),\n marketId: args.marketId.trim() as Hex,\n side: args.side,\n assets: args.assets,\n slippage: (args.slippage?.trim() || '0.5') as `${number}`,\n })\n return quote.data\n}\n\ntype ApiMarketEnvelope = {\n data?: {\n chain_id?: number\n market_id?: string\n midnight?: string\n loan_token?: string\n maturity?: string | number\n rcf_threshold?: string\n enter_gate?: string\n liquidator_gate?: string\n collaterals?: {\n token?: string\n lltv?: string\n liquidation_cursor?: string\n oracle?: string\n }[]\n }\n}\n\nexport async function fetchMorphoMidnightMarketById(marketId: string): Promise<MorphoMidnightApiMarketRow | null> {\n const id = marketId.trim()\n if (!id) return null\n const j = await midnightGetJson<ApiMarketEnvelope>(`/markets/${encodeURIComponent(id)}`)\n const d = j.data\n if (!d?.market_id || !d.loan_token || !isAddress(d.loan_token)) return null\n const midnight =\n d.midnight && isAddress(d.midnight)\n ? getAddress(d.midnight)\n : ('0x0000000000000000000000000000000000000000' as Address)\n const collaterals = (d.collaterals ?? [])\n .filter((c) => c.token && isAddress(c.token) && c.oracle && isAddress(c.oracle))\n .map((c) => ({\n token: getAddress(c.token!),\n lltv: String(c.lltv ?? '0'),\n liquidationCursor: String(c.liquidation_cursor ?? '0'),\n oracle: getAddress(c.oracle!),\n }))\n return {\n chainId: Number(d.chain_id ?? 0),\n marketId: d.market_id as Hex,\n midnight,\n loanToken: getAddress(d.loan_token),\n maturity: Number(d.maturity ?? 0),\n rcfThreshold: String(d.rcf_threshold ?? '0'),\n enterGate: d.enter_gate && isAddress(d.enter_gate) ? getAddress(d.enter_gate) : getAddress('0x0000000000000000000000000000000000000000'),\n liquidatorGate:\n d.liquidator_gate && isAddress(d.liquidator_gate)\n ? getAddress(d.liquidator_gate)\n : getAddress('0x0000000000000000000000000000000000000000'),\n collaterals,\n }\n}\n\nexport function morphoMidnightMarketToParams(row: MorphoMidnightApiMarketRow): MorphoMidnightMarketParams {\n return {\n chainId: BigInt(row.chainId),\n midnight: row.midnight,\n loanToken: row.loanToken,\n collateralParams: row.collaterals.map((c) => ({\n token: c.token,\n lltv: BigInt(c.lltv),\n liquidationCursor: BigInt(c.liquidationCursor),\n oracle: c.oracle,\n })),\n maturity: BigInt(row.maturity),\n rcfThreshold: BigInt(row.rcfThreshold),\n enterGate: row.enterGate,\n liquidatorGate: row.liquidatorGate,\n }\n}\n\nexport function morphoMidnightBookToMarketParams(book: MidnightApiBookMarket): MorphoMidnightMarketParams {\n return {\n chainId: BigInt(book.chainId),\n midnight: getAddress(book.midnight),\n loanToken: getAddress(book.loanToken),\n collateralParams: book.collaterals.map((c) => ({\n token: getAddress(c.token),\n lltv: BigInt(c.lltv),\n liquidationCursor: BigInt(c.liquidationCursor),\n oracle: getAddress(c.oracle),\n })),\n maturity: BigInt(book.maturity),\n rcfThreshold: BigInt(book.rcfThreshold),\n enterGate: getAddress(book.enterGate),\n liquidatorGate: getAddress(book.liquidatorGate),\n }\n}\n\ntype ApiPositionsEnvelope = {\n data?: {\n market_id?: string\n type?: string\n credit?: string\n debt?: string\n pending_fee?: string\n loss_factor?: string\n cost_basis?: string\n effective_rate_wad?: string\n maturity?: string | number\n loan_token?: string\n collaterals?: { token?: string; amount?: string }[]\n }[]\n}\n\nexport async function fetchMorphoMidnightUserPositions(args: {\n user: string\n types?: 'lend' | 'borrow' | 'collateral_only'\n activeOnly?: boolean\n}): Promise<MorphoMidnightApiPositionRow[]> {\n const user = args.user.trim()\n if (!isAddress(user)) return []\n const qs = new URLSearchParams()\n if (args.types) qs.set('types', args.types)\n if (args.activeOnly) qs.set('active_only', 'true')\n const q = qs.toString()\n const path = `/users/${encodeURIComponent(getAddress(user))}/positions${q ? `?${q}` : ''}`\n const j = await midnightGetJson<ApiPositionsEnvelope>(path)\n const rows: MorphoMidnightApiPositionRow[] = []\n for (const p of j.data ?? []) {\n if (!p.market_id) continue\n rows.push({\n marketId: p.market_id as Hex,\n type: p.type ?? 'lend',\n credit: String(p.credit ?? '0'),\n debt: String(p.debt ?? '0'),\n pendingFee: String(p.pending_fee ?? '0'),\n lossFactor: String(p.loss_factor ?? '0'),\n costBasis: p.cost_basis ?? null,\n effectiveRateWad: p.effective_rate_wad ?? null,\n maturity: p.maturity != null ? Number(p.maturity) : null,\n loanToken: p.loan_token && isAddress(p.loan_token) ? getAddress(p.loan_token) : null,\n collaterals: (p.collaterals ?? [])\n .filter((c) => c.token && isAddress(c.token))\n .map((c) => ({ token: getAddress(c.token!), amount: String(c.amount ?? '0') })),\n })\n }\n return rows\n}\n\ntype ApiPositionDetailEnvelope = {\n data?: {\n type?: string\n credit?: string\n debt?: string\n pending_fee?: string\n loss_factor?: string\n loan_token?: string\n maturity?: string | number\n collaterals?: { token?: string; amount?: string }[]\n }\n}\n\ntype ApiTakeableOffer = {\n market_id?: string\n units?: string\n offer?: {\n market?: {\n chain_id?: number\n midnight?: string\n loan_token?: string\n maturity?: string | number\n }\n buy?: boolean\n maker?: string\n tick?: string | number\n max_assets?: string\n max_units?: string\n expiry?: string | number\n group?: string\n callback?: string\n callback_data?: string\n }\n}\n\ntype ApiTakeableOffersEnvelope = {\n data?: ApiTakeableOffer[]\n cursor?: string | null\n}\n\nexport type MorphoMidnightApiMakerOffer = {\n marketId: string\n chainId: number\n midnight: Address\n loanToken: Address\n maker: Address\n buy: boolean\n tick: string\n maxAssets: string\n maxUnits: string\n expiry: number\n group: Hex\n callback: Address\n callbackData: Hex\n units: string\n maturity: number | null\n}\n\nexport async function fetchMorphoMidnightMakerOffers(args: {\n maker: Address\n chainId?: number\n}): Promise<MorphoMidnightApiMakerOffer[]> {\n const qs = new URLSearchParams()\n qs.set('maker', getAddress(args.maker))\n if (args.chainId != null) qs.set('chain_ids', String(args.chainId))\n const j = await midnightGetJson<ApiTakeableOffersEnvelope>(`/takeable-offers?${qs}`)\n const out: MorphoMidnightApiMakerOffer[] = []\n for (const row of j.data ?? []) {\n const o = row.offer\n if (!o?.maker || !isAddress(o.maker) || !o.market?.loan_token || !isAddress(o.market.loan_token)) continue\n if (!o.market.midnight || !isAddress(o.market.midnight)) continue\n const group = (o.group ?? '').trim()\n if (!group.startsWith('0x') || group.length !== 66) continue\n const callback = o.callback && isAddress(o.callback) ? getAddress(o.callback) : ('0x0000000000000000000000000000000000000000' as Address)\n out.push({\n marketId: String(row.market_id ?? ''),\n chainId: Number(o.market.chain_id ?? args.chainId ?? 0),\n midnight: getAddress(o.market.midnight),\n loanToken: getAddress(o.market.loan_token),\n maker: getAddress(o.maker),\n buy: o.buy === true,\n tick: String(o.tick ?? '0'),\n maxAssets: String(o.max_assets ?? '0'),\n maxUnits: String(o.max_units ?? '0'),\n expiry: Number(o.expiry ?? 0),\n group: group as Hex,\n callback,\n callbackData: ((o.callback_data ?? '0x') as Hex),\n units: String(row.units ?? '0'),\n maturity: o.market.maturity != null ? Number(o.market.maturity) : null,\n })\n }\n return out\n}\n\nexport async function fetchMorphoMidnightUserMarketPosition(args: {\n marketId: string\n user: string\n}): Promise<MorphoMidnightApiPositionRow | null> {\n const marketId = args.marketId.trim()\n const user = args.user.trim()\n if (!marketId || !isAddress(user)) return null\n const path = `/markets/${encodeURIComponent(marketId)}/users/${encodeURIComponent(getAddress(user))}/position`\n const j = await midnightGetJson<ApiPositionDetailEnvelope>(path)\n const p = j.data\n if (!p) return null\n return {\n marketId: marketId as Hex,\n type: p.type ?? 'borrow',\n credit: String(p.credit ?? '0'),\n debt: String(p.debt ?? '0'),\n pendingFee: String(p.pending_fee ?? '0'),\n lossFactor: String(p.loss_factor ?? '0'),\n maturity: p.maturity != null ? Number(p.maturity) : null,\n loanToken: p.loan_token && isAddress(p.loan_token) ? getAddress(p.loan_token) : null,\n collaterals: (p.collaterals ?? [])\n .filter((c) => c.token && isAddress(c.token))\n .map((c) => ({ token: getAddress(c.token!), amount: String(c.amount ?? '0') })),\n }\n}\n","import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","import { getAddress, isAddress } from 'viem'\nimport { getMorphoGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\nimport { MORPHO_EXTRA_SUPPORTED_CHAIN_IDS } from './support.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 function mergeMorphoSupportedChainIds(rows: readonly MorphoChainRow[]): Set<number> {\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 for (const id of MORPHO_EXTRA_SUPPORTED_CHAIN_IDS) s.add(id)\n return s\n}\n\nexport async function loadMorphoSupportedChainIds(): Promise<ReadonlySet<number>> {\n const rows = await fetchMorphoChains()\n return mergeMorphoSupportedChainIds(rows)\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","/** Circle Arc — Morpho Blue / vaults on api.morpho.org (mainnet listed; testnet extra). */\nexport const ARC_MAINNET_CHAIN_ID = 5042\nexport const ARC_TESTNET_CHAIN_ID = 5042002\n\n/**\n * Always treat Arc as Morpho-supported even if GraphQL `chains` lags\n * (mainnet 5042 is listed; testnet 5042002 is not yet).\n */\nexport const MORPHO_EXTRA_SUPPORTED_CHAIN_IDS = [ARC_MAINNET_CHAIN_ID, ARC_TESTNET_CHAIN_ID] as const\n\nexport function isMorphoArcChainId(chainId: number): boolean {\n return chainId === ARC_MAINNET_CHAIN_ID || chainId === ARC_TESTNET_CHAIN_ID\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 rewards: MorphoIncentiveRewardRow[]\n}\n\nexport type MorphoEarnVaultExposureRow = {\n label: string\n allocatedUsdLabel: string\n allocationPercentLabel: string\n}\n\nexport type MorphoIncentiveRewardRow = {\n symbol: string\n supplyAprLabel: string\n}\n\nexport function mapMorphoIncentiveRewards(\n rows:\n | readonly { asset?: { symbol?: string | null } | null; supplyApr?: number | null }[]\n | null\n | undefined,\n): MorphoIncentiveRewardRow[] {\n if (!rows?.length) return []\n const out: MorphoIncentiveRewardRow[] = []\n for (const r of rows) {\n const symbol = (r.asset?.symbol ?? '').trim()\n if (!symbol && r.supplyApr == null) continue\n out.push({\n symbol: symbol || 'REWARD',\n supplyAprLabel: formatMorphoApyPct(r.supplyApr),\n })\n }\n return out\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 rewards: MorphoIncentiveRewardRow[]\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 rewards: row.rewards,\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 rewards: mapMorphoIncentiveRewards(v.state?.allRewards),\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 rewards: mapMorphoIncentiveRewards(v.rewards),\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 rewards?: MorphoIncentiveRewardRow[]\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 rewards: args.rewards ?? [],\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 rewards: mapMorphoIncentiveRewards(v.state?.allRewards),\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 rewards: mapMorphoIncentiveRewards(v.rewards),\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 // Midnight books: loan tokens enable borrow/lend modes; collaterals enable collateral mode.\n try {\n const { fetchMorphoMidnightBooks } = await import('./midnightApi.js')\n const { MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT } = await import('./midnightConstants.js')\n const { data: books } = await fetchMorphoMidnightBooks({\n chainId,\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n for (const book of books) {\n const loanAddr = (book.loanToken ?? '').toString().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 for (const c of book.collaterals ?? []) {\n const colAddr = (c.token ?? '').toString().trim()\n if (!isAddress(colAddr)) continue\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 } catch {\n // Midnight API optional — Blue/vault modes still apply.\n }\n\n const cache: ChainAssetCache = { modesByUnderlying: modes, nativeWrapped: null }\n chainAssetCache.set(chainId, cache)\n return cache\n}\n","/** Robinhood Earn on Robinhood Chain — Morpho Vault V2 curated by Steakhouse. */\nexport const ROBINHOOD_CHAIN_ID = 4663\n\nexport const ROBINHOOD_EARN_VAULT_ADDRESS = '0xBeEff033F34C046626B8D0A041844C5d1A5409dd' as const\nexport const ROBINHOOD_EARN_VAULT_SYMBOL = 'steakUSDG' as const\nexport const ROBINHOOD_EARN_VAULT_NAME = 'Steakhouse USDG' as const\nexport const ROBINHOOD_EARN_USDG_ADDRESS = '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168' as const\n\nconst ROBINHOOD_EARN_QUERY_ALIASES = [\n 'robinhood earn',\n 'robinhood-earn',\n 'robinhood',\n 'earn usdg',\n 'steakhouse usdg',\n 'steakusd g',\n] as const\n\nfunction normalizeRobinhoodEarnQuery(query: string): string {\n return query.trim().toLowerCase().replace(/\\s+/g, ' ')\n}\n\n/** True when the user/agent is asking for Robinhood Earn rather than a generic Morpho vault search. */\nexport function isRobinhoodEarnQuery(query: string | undefined): boolean {\n if (!query?.trim()) return false\n const q = normalizeRobinhoodEarnQuery(query)\n if (q === ROBINHOOD_EARN_VAULT_ADDRESS.toLowerCase()) return true\n return ROBINHOOD_EARN_QUERY_ALIASES.some((alias) => q === alias || q.includes(alias))\n}\n\nexport function isRobinhoodEarnProductFlag(raw: unknown): boolean {\n if (raw === true || raw === 'true') return true\n if (typeof raw !== 'string') return false\n const v = raw.trim().toLowerCase()\n return v === 'robinhood-earn' || v === 'robinhood_earn' || v === 'robinhood earn'\n}\n\n/** Map Robinhood Earn aliases to the listed Steakhouse USDG vault on chain 4663. */\nexport function resolveRobinhoodEarnFetchQuery(args: {\n chainId: number\n query?: string\n underlying?: string\n}): { query?: string; underlying?: string } {\n if (args.chainId !== ROBINHOOD_CHAIN_ID) {\n return { query: args.query?.trim() || undefined, underlying: args.underlying?.trim() || undefined }\n }\n if (!isRobinhoodEarnQuery(args.query)) {\n return { query: args.query?.trim() || undefined, underlying: args.underlying?.trim() || undefined }\n }\n return {\n query: ROBINHOOD_EARN_VAULT_SYMBOL,\n underlying: args.underlying?.trim() || 'USDG',\n }\n}\n\n/** Pre-fill Robinhood Earn vault addresses for multisign deposit/withdraw builders. */\nexport function applyRobinhoodEarnMultisignDefaults(o: Record<string, unknown>): void {\n const flagged =\n o.robinhoodEarn === true ||\n isRobinhoodEarnProductFlag(o.robinhoodEarn) ||\n isRobinhoodEarnProductFlag(o.product) ||\n isRobinhoodEarnQuery(String(o.query ?? o.vaultName ?? ''))\n\n if (!flagged) return\n\n const chainRaw = o.chainId\n const chainId =\n chainRaw == null || chainRaw === ''\n ? ROBINHOOD_CHAIN_ID\n : typeof chainRaw === 'number'\n ? chainRaw\n : Number.parseInt(String(chainRaw), chainRaw.toString().startsWith('0x') ? 16 : 10)\n\n if (!Number.isFinite(chainId) || chainId !== ROBINHOOD_CHAIN_ID) return\n\n if (chainRaw == null || chainRaw === '') o.chainId = ROBINHOOD_CHAIN_ID\n\n const vaultAddr = o.vaultAddress ?? o.vault ?? ROBINHOOD_EARN_VAULT_ADDRESS\n o.vaultAddress = vaultAddr\n o.vault = vaultAddr\n\n const underlyingAddr = o.underlyingAddress ?? o.underlying ?? ROBINHOOD_EARN_USDG_ADDRESS\n o.underlyingAddress = underlyingAddr\n o.underlying = underlyingAddr\n\n o.vaultName = o.vaultName ?? ROBINHOOD_EARN_VAULT_NAME\n o.vaultSymbol = o.vaultSymbol ?? ROBINHOOD_EARN_VAULT_SYMBOL\n}\n","import { getAddress, isAddress } from 'viem'\nimport { resolveRobinhoodEarnFetchQuery } from './robinhoodEarn.js'\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 resolved = resolveRobinhoodEarnFetchQuery({\n chainId: args.chainId,\n query: args.query,\n underlying: args.underlying,\n })\n const vaults = await searchMorphoListedEarnVaults({\n chainId: args.chainId,\n underlying: resolved.underlying,\n query: resolved.query,\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 netSupplyApyLabel: string\n rewards: Array<{ symbol: string; supplyAprLabel: 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 netSupplyApyLabel: formatMorphoApyPct(m.state?.netSupplyApy),\n rewards: (m.state?.rewards ?? [])\n .map((r) => ({\n symbol: (r.asset?.symbol ?? '').trim() || 'REWARD',\n supplyAprLabel: formatMorphoApyPct(r.supplyApr),\n }))\n .filter((r) => r.supplyAprLabel !== '—'),\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 netSupplyApyLabel: string\n rewards: Array<{ symbol: string; supplyAprLabel: 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 netSupplyApyLabel: row.netSupplyApyLabel,\n rewards: row.rewards,\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) — legacy type aliases.\n * Prefer midnightDiscovery / midnightPositions / midnightMultisign.\n * @see https://docs.morpho.org/developers/midnight/resources/all/\n */\n\nexport type MorphoMidnightLoanIntentStatus =\n | 'coming_soon'\n | 'open'\n | 'matched'\n | 'active'\n | 'repaid'\n | 'cancelled'\n\n/** @deprecated Use MorphoMidnightBookDiscoveryRow / position rows instead. */\nexport type MorphoMidnightLoanIntent = {\n id: string\n status: MorphoMidnightLoanIntentStatus\n chainId: number\n fixedRate?: string | null\n durationSeconds?: number | null\n loanAssetSymbol?: string | null\n collateralAssetSymbol?: string | null\n amountHuman?: string | null\n}\n\n/** @deprecated Midnight is live; UI should use live book fetchers. */\nexport const MORPHO_MIDNIGHT_UNAVAILABLE_MESSAGE =\n 'Morpho Midnight fixed-rate markets are available on supported chains (starting with Base). Open the Midnight tab to browse books.'\n\n/** @deprecated Use morphoFetchMidnightBooksSummary / morphoFetchMidnightPositionsSummary. */\nexport async function fetchMorphoMidnightIntents(_args: {\n chainId: number\n user?: string\n}): Promise<readonly MorphoMidnightLoanIntent[]> {\n return []\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 './midnightConstants.js'\nexport * from './midnightApi.js'\nexport * from './midnightMath.js'\nexport * from './midnightDiscovery.js'\nexport * from './midnightQuote.js'\nexport * from './midnightPositions.js'\nexport * from './midnightOffers.js'\nexport * from './midnightBluePark.js'\nexport * from './midnightMultisign.js'\nexport * from './midnightOfferMultisign.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 * from './robinhoodEarn.js'\nexport * from './support.js'\nexport { loadMorphoSupportedChainIds, mergeMorphoSupportedChainIds } 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.fetch-midnight-books', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'List Morpho Midnight fixed-rate books', commonParams: [], params: {} },\n { id: 'morpho.fetch-midnight-quote', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Quote Morpho Midnight lend/borrow fill', commonParams: [], params: {} },\n { id: 'morpho.fetch-midnight-positions', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'List Morpho Midnight user positions', commonParams: [], params: {} },\n { id: 'morpho.midnight-lend', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight fixed-rate lend (take asks)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-lend-offer', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight lend limit offer parked in Blue until filled', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-cancel-lend-offer', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Cancel a Morpho Midnight lend offer and withdraw unused Blue park', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-borrow', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight fixed-rate borrow (supply collateral + take bids)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'morpho.midnight-repay', protocolId: MORPHO_PROTOCOL_ID, chainCategory: 'evm', description: 'Morpho Midnight repay debt and withdraw collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(morphoProtocolModule)\n","import { DEFAULT_TICK_SPACING, TickLib } from '@morpho-org/midnight-sdk'\n\nconst WAD = 10n ** 18n\nconst SECONDS_PER_YEAR = 365 * 86400\n\nexport type MorphoMidnightBookLevelLike = {\n tick?: string | number | bigint\n price?: string | number | bigint\n}\n\nexport function parseMorphoMidnightPriceWad(priceWad: string | number | bigint | null | undefined): bigint | null {\n if (priceWad == null) return null\n try {\n if (typeof priceWad === 'bigint') return priceWad > 0n ? priceWad : null\n if (typeof priceWad === 'number') {\n if (!Number.isFinite(priceWad) || priceWad <= 0) return null\n return BigInt(Math.round(priceWad))\n }\n const raw = BigInt(String(priceWad).split('.')[0] || '0')\n return raw > 0n ? raw : null\n } catch {\n return null\n }\n}\n\n/** Fixed APR from WAD-scaled unit price and time-to-maturity (seconds). Morpho docs formula. */\nexport function morphoMidnightAprFromPriceWad(\n priceWad: string | number | bigint,\n ttmSeconds: number,\n): number | null {\n const raw = parseMorphoMidnightPriceWad(priceWad)\n if (raw == null || !Number.isFinite(ttmSeconds) || ttmSeconds <= 0) return null\n const p = Number(raw) / 1e18\n if (!Number.isFinite(p) || p <= 0) return null\n const apr = (1 / p - 1) * (SECONDS_PER_YEAR / ttmSeconds)\n return Number.isFinite(apr) ? apr : null\n}\n\n/** Prefer tick (SDK annualization); fall back to WAD price. */\nexport function morphoMidnightAprFromBookLevel(\n level: MorphoMidnightBookLevelLike | null | undefined,\n ttmSeconds: number,\n): number | null {\n if (!level || !Number.isFinite(ttmSeconds) || ttmSeconds <= 0) return null\n if (level.tick != null && String(level.tick).trim() !== '') {\n try {\n const fromTick = morphoMidnightAprFromTick(BigInt(level.tick), ttmSeconds)\n if (fromTick != null) return fromTick\n } catch {\n // tick out of range — try price\n }\n }\n return level.price != null ? morphoMidnightAprFromPriceWad(level.price, ttmSeconds) : null\n}\n\nexport function formatMorphoMidnightAprPct(apr: number | null, digits = 2, empty = '—'): string {\n if (apr == null || !Number.isFinite(apr)) return empty\n return `${(apr * 100).toFixed(digits)}%`\n}\n\nexport function morphoMidnightTtmSeconds(maturityUnix: number, nowMs = Date.now()): number {\n return Math.max(0, maturityUnix - nowMs / 1000)\n}\n\n/** Unit cap from assets and WAD price: ceil(assets * 1e18 / price). */\nexport function morphoMidnightUnitsFromAssets(targetAssets: bigint, priceWad: bigint): bigint {\n if (priceWad <= 0n || targetAssets <= 0n) return 0n\n return (targetAssets * 10n ** 18n + priceWad - 1n) / priceWad\n}\n\n/** Human percent string (\"5.2\") or decimal (\"0.052\") → APR fraction. */\nexport function parseMorphoMidnightAprInput(raw: string): number | null {\n const t = raw.trim().replace(/%/g, '')\n if (!t || !/^\\d*\\.?\\d+$/.test(t)) return null\n const n = Number(t)\n if (!Number.isFinite(n) || n <= 0) return null\n return n > 1 ? n / 100 : n\n}\n\n/** WAD price from simple APR and time-to-maturity. */\nexport function morphoMidnightPriceWadFromApr(apr: number, ttmSeconds: number): bigint | null {\n if (!Number.isFinite(apr) || apr <= 0 || !Number.isFinite(ttmSeconds) || ttmSeconds <= 0) return null\n const price = 1 / (1 + apr * (ttmSeconds / SECONDS_PER_YEAR))\n if (!Number.isFinite(price) || price <= 0 || price > 1) return null\n return BigInt(Math.round(price * 1e18))\n}\n\nexport function morphoMidnightTickFromPriceWad(priceWad: bigint, spacing = DEFAULT_TICK_SPACING): bigint {\n return TickLib.priceToTick(priceWad, spacing)\n}\n\nexport function morphoMidnightTickFromApr(\n apr: number,\n ttmSeconds: number,\n spacing = DEFAULT_TICK_SPACING,\n): bigint | null {\n const priceWad = morphoMidnightPriceWadFromApr(apr, ttmSeconds)\n if (priceWad == null) return null\n return morphoMidnightTickFromPriceWad(priceWad, spacing)\n}\n\nexport function morphoMidnightAprFromTick(tick: bigint, ttmSeconds: number): number | null {\n if (ttmSeconds <= 0) return null\n try {\n const aprWad = TickLib.tickToApr(tick, BigInt(Math.floor(ttmSeconds)))\n const n = Number(aprWad) / Number(WAD)\n return Number.isFinite(n) ? n : null\n } catch {\n return morphoMidnightAprFromPriceWad(TickLib.tickToPrice(tick), ttmSeconds)\n }\n}\n","import { getAddress, isAddress } from 'viem'\nimport type { MidnightApiBookMarket } from '@morpho-org/midnight-sdk/api'\nimport { fetchMorphoMidnightBooks } from './midnightApi.js'\nimport { MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT } from './midnightConstants.js'\nimport {\n formatMorphoMidnightAprPct,\n morphoMidnightAprFromBookLevel,\n morphoMidnightTtmSeconds,\n} from './midnightMath.js'\n\nexport type MorphoMidnightBookDiscoveryRow = {\n marketId: string\n chainId: number\n midnightAddress: string\n loanTokenAddress: string\n maturity: number\n maturityIso: string\n collateralTokenAddresses: string[]\n primaryCollateralTokenAddress: string | null\n primaryCollateralLltv: string | null\n bestAskPriceWad: string | null\n bestBidPriceWad: string | null\n bestAskAssets: string | null\n bestBidAssets: string | null\n lendApr: string\n borrowApr: string\n lendAprNumeric: number | null\n borrowAprNumeric: number | null\n marketLabel: string\n}\n\nfunction shortAddr(a: string): string {\n return a.length > 10 ? `${a.slice(0, 6)}…${a.slice(-4)}` : a\n}\n\nfunction maturityIso(maturity: number): string {\n if (!maturity || maturity <= 0) return '—'\n try {\n return new Date(maturity * 1000).toISOString().slice(0, 10)\n } catch {\n return '—'\n }\n}\n\nexport function morphoMidnightBookToDiscoveryRow(book: MidnightApiBookMarket): MorphoMidnightBookDiscoveryRow {\n const ttm = morphoMidnightTtmSeconds(book.maturity)\n const bestAsk = book.asks?.[0]\n const bestBid = book.bids?.[0]\n const lendAprN = morphoMidnightAprFromBookLevel(bestAsk, ttm)\n const borrowAprN = morphoMidnightAprFromBookLevel(bestBid, ttm)\n const loan = getAddress(book.loanToken)\n const collaterals = book.collaterals.map((c) => getAddress(c.token))\n const primary = book.collaterals[0]\n const primaryAddr = primary ? getAddress(primary.token) : null\n const marketLabel = `${shortAddr(primaryAddr ?? '—')}/${shortAddr(loan)} · ${maturityIso(book.maturity)}`\n return {\n marketId: book.marketId,\n chainId: book.chainId,\n midnightAddress: getAddress(book.midnight),\n loanTokenAddress: loan,\n maturity: book.maturity,\n maturityIso: maturityIso(book.maturity),\n collateralTokenAddresses: collaterals,\n primaryCollateralTokenAddress: primaryAddr,\n primaryCollateralLltv: primary?.lltv ?? null,\n bestAskPriceWad: bestAsk?.price ?? null,\n bestBidPriceWad: bestBid?.price ?? null,\n bestAskAssets: bestAsk?.assets ?? null,\n bestBidAssets: bestBid?.assets ?? null,\n lendApr: formatMorphoMidnightAprPct(lendAprN, 2, 'No asks'),\n borrowApr: formatMorphoMidnightAprPct(borrowAprN, 2, 'No bids'),\n lendAprNumeric: lendAprN,\n borrowAprNumeric: borrowAprN,\n marketLabel,\n }\n}\n\n/** MCP/UI: list Midnight books with implied fixed lend/borrow APR. */\nexport async function morphoFetchMidnightBooksSummary(args: {\n chainId: number\n /** Loan asset address (or leave empty). */\n loan?: string\n /** Collateral asset address — filters books that include this collateral. */\n collateral?: string\n /** Case-insensitive filter on marketId / addresses. */\n query?: string\n /** Prefer books with bid depth (borrow) or ask depth (lend). */\n side?: 'bids' | 'asks' | 'either'\n limit?: number\n}): Promise<{ books: MorphoMidnightBookDiscoveryRow[] }> {\n const limit = Math.min(Math.max(args.limit ?? MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT, 1), MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT)\n const loan = args.loan?.trim()\n const collateral = args.collateral?.trim()\n const loanTokens = loan && isAddress(loan) ? [getAddress(loan)] : undefined\n const collateralTokens = collateral && isAddress(collateral) ? [getAddress(collateral)] : undefined\n\n const { data } = await fetchMorphoMidnightBooks({\n chainId: args.chainId,\n loanTokens,\n collateralTokens,\n sort: 'maturity',\n limit,\n })\n\n let rows = data.map(morphoMidnightBookToDiscoveryRow)\n\n if (collateral && isAddress(collateral)) {\n const col = getAddress(collateral).toLowerCase()\n rows = rows.filter((r) => r.collateralTokenAddresses.some((a) => a.toLowerCase() === col))\n }\n\n const side = args.side ?? 'either'\n if (side === 'bids') {\n rows = rows.filter((r) => r.bestBidPriceWad != null)\n } else if (side === 'asks') {\n rows = rows.filter((r) => r.bestAskPriceWad != null)\n }\n\n const q = (args.query ?? '').trim().toLowerCase()\n if (q) {\n rows = rows.filter((r) => {\n const hay = [\n r.marketId,\n r.marketLabel,\n r.loanTokenAddress,\n r.primaryCollateralTokenAddress ?? '',\n ...r.collateralTokenAddresses,\n ]\n .join(' ')\n .toLowerCase()\n return hay.includes(q)\n })\n }\n\n return { books: rows.slice(0, limit) }\n}\n\n/** UI helper: books where `asset` is accepted collateral (borrow) or is the loan token. */\nexport async function fetchMorphoMidnightBooksForAsset(args: {\n chainId: number\n assetAddress: string\n mode?: 'borrow' | 'lend' | 'any'\n}): Promise<MorphoMidnightBookDiscoveryRow[]> {\n const asset = args.assetAddress.trim()\n if (!isAddress(asset)) return []\n const mode = args.mode ?? 'any'\n if (mode === 'lend') {\n const { books } = await morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n loan: asset,\n side: 'asks',\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n return books\n }\n if (mode === 'borrow') {\n const asCollateral = await morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n collateral: asset,\n side: 'bids',\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n const asLoan = await morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n loan: asset,\n side: 'bids',\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n })\n const byId = new Map<string, MorphoMidnightBookDiscoveryRow>()\n for (const b of [...asCollateral.books, ...asLoan.books]) byId.set(b.marketId.toLowerCase(), b)\n return [...byId.values()]\n }\n const [asLoan, asCol] = await Promise.all([\n morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n loan: asset,\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n }),\n morphoFetchMidnightBooksSummary({\n chainId: args.chainId,\n collateral: asset,\n limit: MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT,\n }),\n ])\n const byId = new Map<string, MorphoMidnightBookDiscoveryRow>()\n for (const b of [...asLoan.books, ...asCol.books]) byId.set(b.marketId.toLowerCase(), b)\n return [...byId.values()]\n}\n","import type { MidnightApiTake } from '@morpho-org/midnight-sdk/api'\nimport { fetchMorphoMidnightBook, fetchMorphoMidnightBookQuote } from './midnightApi.js'\nimport { MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT } from './midnightConstants.js'\nimport {\n formatMorphoMidnightAprPct,\n morphoMidnightAprFromPriceWad,\n morphoMidnightTtmSeconds,\n} from './midnightMath.js'\n\nexport type MorphoMidnightQuoteSummary = {\n marketId: string\n side: 'asks' | 'bids'\n averageBestPriceWad: string\n averageWorstPriceWad: string\n availableAssets: string\n availableUnits: string\n impliedApr: string\n impliedAprNumeric: number | null\n maturity: number | null\n takeableOfferCount: number\n takeableOffers: readonly MidnightApiTake[]\n}\n\n/** Quote a Midnight book side for a target asset amount (raw token units). */\nexport async function morphoFetchMidnightQuote(args: {\n marketId: string\n /** asks = lend (take asks); bids = borrow (take bids). */\n side: 'asks' | 'bids'\n /** Target loan-token assets in raw units (string or bigint). */\n assets: string | bigint\n slippagePct?: string\n}): Promise<MorphoMidnightQuoteSummary> {\n const assets = typeof args.assets === 'bigint' ? args.assets : BigInt(String(args.assets).split('.')[0] || '0')\n if (assets <= 0n) throw new Error('Quote assets must be > 0.')\n const slippage = (args.slippagePct ?? MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT).trim() || MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT\n\n const [quote, book] = await Promise.all([\n fetchMorphoMidnightBookQuote({\n marketId: args.marketId,\n side: args.side,\n assets,\n slippage,\n }),\n fetchMorphoMidnightBook(args.marketId),\n ])\n\n const maturity = book?.maturity ?? null\n const ttm = maturity != null ? morphoMidnightTtmSeconds(maturity) : 0\n const aprN = morphoMidnightAprFromPriceWad(quote.averageBestPrice, ttm)\n\n return {\n marketId: args.marketId.trim(),\n side: args.side,\n averageBestPriceWad: quote.averageBestPrice,\n averageWorstPriceWad: quote.averageWorstPrice,\n availableAssets: quote.availableAssets,\n availableUnits: quote.availableUnits,\n impliedApr: formatMorphoMidnightAprPct(aprN),\n impliedAprNumeric: aprN,\n maturity,\n takeableOfferCount: quote.takeableOffers.length,\n takeableOffers: quote.takeableOffers,\n }\n}\n\n/** MCP-facing quote (omits ABI take payloads). */\nexport async function morphoFetchMidnightQuoteSummary(\n args: Parameters<typeof morphoFetchMidnightQuote>[0],\n): Promise<Omit<MorphoMidnightQuoteSummary, 'takeableOffers'>> {\n const { takeableOffers: _takes, ...rest } = await morphoFetchMidnightQuote(args)\n return rest\n}\n","import { getAddress, isAddress } from 'viem'\nimport { fetchMorphoMidnightUserPositions, type MorphoMidnightApiPositionRow } from './midnightApi.js'\nimport { formatMorphoMidnightAprPct } from './midnightMath.js'\n\nexport type MorphoMidnightPositionDiscoveryRow = {\n marketId: string\n type: string\n credit: string\n debt: string\n pendingFee: string\n repayAssets: string\n maturity: number | null\n maturityIso: string\n loanTokenAddress: string | null\n collateralTokenAddresses: string[]\n collateralAmounts: { token: string; amount: string }[]\n effectiveRate: string\n costBasis: string | null\n}\n\nfunction maturityIso(maturity: number | null): string {\n if (maturity == null || maturity <= 0) return '—'\n try {\n return new Date(maturity * 1000).toISOString().slice(0, 10)\n } catch {\n return '—'\n }\n}\n\nfunction effectiveRateLabel(wad: string | null | undefined): string {\n if (!wad) return '—'\n try {\n const n = Number(BigInt(wad.split('.')[0] || '0')) / 1e18\n return formatMorphoMidnightAprPct(Number.isFinite(n) ? n : null)\n } catch {\n return '—'\n }\n}\n\nexport function morphoMidnightPositionToDiscoveryRow(\n p: MorphoMidnightApiPositionRow,\n): MorphoMidnightPositionDiscoveryRow {\n const debt = BigInt(p.debt || '0')\n const fee = BigInt(p.pendingFee || '0')\n return {\n marketId: p.marketId,\n type: p.type,\n credit: p.credit,\n debt: p.debt,\n pendingFee: p.pendingFee,\n repayAssets: (debt + fee).toString(),\n maturity: p.maturity ?? null,\n maturityIso: maturityIso(p.maturity ?? null),\n loanTokenAddress: p.loanToken ?? null,\n collateralTokenAddresses: p.collaterals.map((c) => c.token),\n collateralAmounts: p.collaterals.map((c) => ({ token: c.token, amount: c.amount })),\n effectiveRate: effectiveRateLabel(p.effectiveRateWad),\n costBasis: p.costBasis ?? null,\n }\n}\n\n/** MCP/UI: Midnight positions for a user. */\nexport async function morphoFetchMidnightPositionsSummary(args: {\n user: string\n types?: 'lend' | 'borrow' | 'collateral_only'\n activeOnly?: boolean\n}): Promise<{ positions: MorphoMidnightPositionDiscoveryRow[] }> {\n if (!isAddress(args.user)) {\n throw new Error('user must be a valid EVM address.')\n }\n const rows = await fetchMorphoMidnightUserPositions({\n user: getAddress(args.user),\n types: args.types,\n activeOnly: args.activeOnly,\n })\n return { positions: rows.map(morphoMidnightPositionToDiscoveryRow) }\n}\n","import { getAddress, isAddress } from 'viem'\nimport { fetchMorphoMidnightMakerOffers } from './midnightApi.js'\nimport {\n formatMorphoMidnightAprPct,\n morphoMidnightAprFromTick,\n morphoMidnightTtmSeconds,\n} from './midnightMath.js'\n\nexport type MorphoMidnightMakerOfferRow = {\n marketId: string\n chainId: number\n midnightAddress: string\n loanTokenAddress: string\n maker: string\n group: string\n callback: string\n callbackData: string\n tick: string\n maxAssets: string\n remainingUnits: string\n expiry: number\n expiryIso: string\n maturity: number | null\n maturityIso: string\n lendApr: string\n lendAprNumeric: number | null\n marketLabel: string\n}\n\nfunction isoFromUnix(sec: number | null | undefined): string {\n if (sec == null || sec <= 0) return '—'\n try {\n return new Date(sec * 1000).toISOString().slice(0, 10)\n } catch {\n return '—'\n }\n}\n\nexport async function morphoFetchMidnightMakerOffersSummary(args: {\n user: string\n chainId?: number\n}): Promise<{ offers: MorphoMidnightMakerOfferRow[] }> {\n if (!isAddress(args.user)) {\n throw new Error('user must be a valid EVM address.')\n }\n const rows = await fetchMorphoMidnightMakerOffers({\n maker: getAddress(args.user),\n chainId: args.chainId,\n })\n const offers: MorphoMidnightMakerOfferRow[] = []\n for (const r of rows) {\n if (!r.buy) continue\n const ttm = r.maturity != null ? morphoMidnightTtmSeconds(r.maturity) : 0\n let tick = 0n\n try {\n tick = BigInt(r.tick)\n } catch {\n tick = 0n\n }\n const apr = ttm > 0 && tick > 0n ? morphoMidnightAprFromTick(tick, ttm) : null\n offers.push({\n marketId: r.marketId,\n chainId: r.chainId,\n midnightAddress: r.midnight,\n loanTokenAddress: r.loanToken,\n maker: r.maker,\n group: r.group,\n callback: r.callback,\n callbackData: r.callbackData,\n tick: r.tick,\n maxAssets: r.maxAssets,\n remainingUnits: r.units,\n expiry: r.expiry,\n expiryIso: isoFromUnix(r.expiry),\n maturity: r.maturity,\n maturityIso: isoFromUnix(r.maturity),\n lendApr: formatMorphoMidnightAprPct(apr),\n lendAprNumeric: apr,\n marketLabel: `Offer · ${isoFromUnix(r.maturity)} · ${formatMorphoMidnightAprPct(apr)}`,\n })\n }\n return { offers }\n}\n","import { encodeAbiParameters, getAddress, type Address, type Hex } from 'viem'\nimport { morphoGql, type MorphoMarketApiRow } from './api.js'\nimport { marketParamsFromApiRow, type MorphoMarketParams, type ResolvedMorphoMarket } from './marketParams.js'\n\nconst BLUE_MARKET_PARAMS_ABI = [\n {\n type: 'tuple',\n components: [\n { name: 'loanToken', type: 'address' },\n { name: 'collateralToken', type: 'address' },\n { name: 'oracle', type: 'address' },\n { name: 'irm', type: 'address' },\n { name: 'lltv', type: 'uint256' },\n ],\n },\n] as const\n\nexport function encodeMorphoBlueMarketParamsCallbackData(params: MorphoMarketParams): Hex {\n return encodeAbiParameters(BLUE_MARKET_PARAMS_ABI, [\n {\n loanToken: params.loanToken,\n collateralToken: params.collateralToken,\n oracle: params.oracle,\n irm: params.irm,\n lltv: params.lltv,\n },\n ])\n}\n\n/** Highest-TVL Morpho Blue market whose loan token matches `loanToken` (variable-yield park). */\nexport async function pickBestBlueSupplyMarketForLoan(args: {\n chainId: number\n loanToken: Address\n}): Promise<ResolvedMorphoMarket | null> {\n const loan = getAddress(args.loanToken).toLowerCase()\n const d = await morphoGql<{ markets: { items: MorphoMarketApiRow[] } }>(\n `\n query MorphoBlueParkMarkets($chainId: Int!) {\n markets(first: 200, where: { chainId_in: [$chainId] }, orderBy: SupplyAssetsUsd, 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: args.chainId },\n )\n for (const row of d.markets?.items ?? []) {\n const loanAddr = (row.loanAsset?.address ?? '').trim().toLowerCase()\n if (loanAddr !== loan || !row.morphoBlue?.address) continue\n try {\n return {\n ...row,\n morphoBlueAddress: getAddress(row.morphoBlue.address),\n marketParams: marketParamsFromApiRow(row),\n }\n } catch {\n continue\n }\n }\n return 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 /** Unix seconds (UTC) for mpc-auth multiSignRequest expiryDate. */\n expiryDate?: number\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, (_, v) => (typeof v === 'bigint' ? v.toString() : v))\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 if (input.expiryDate != null && input.expiryDate > 0) {\n bodyForSign.expiryDate = Math.floor(input.expiryDate)\n }\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 expiryDate: context.expiryDate,\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 type Hex,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n maxUint256,\n parseAbi,\n parseUnits,\n zeroAddress,\n} from 'viem'\nimport { midnightAbi, midnightBundlesAbi } from '@morpho-org/midnight-sdk'\nimport type { MidnightApiTake } from '@morpho-org/midnight-sdk/api'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport {\n MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n MORPHO_MIDNIGHT_BORROW_FALLBACK_GAS,\n MORPHO_MIDNIGHT_DEFAULT_DEADLINE_SECONDS,\n MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT,\n MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n MORPHO_MIDNIGHT_LEND_FALLBACK_GAS,\n MORPHO_MIDNIGHT_REPAY_FALLBACK_GAS,\n MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK,\n TOKEN_PERMIT_NONE,\n morphoMidnightAddressesForChain,\n} from './midnightConstants.js'\nimport {\n fetchMorphoMidnightBook,\n fetchMorphoMidnightBookQuote,\n fetchMorphoMidnightMarketById,\n fetchMorphoMidnightUserMarketPosition,\n morphoMidnightBookToMarketParams,\n morphoMidnightMarketToParams,\n type MorphoMidnightMarketParams,\n} from './midnightApi.js'\nimport { morphoMidnightUnitsFromAssets } from './midnightMath.js'\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 erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\n\ntype ApproveStep = { kind: 'weth_deposit' | 'approve'; to: Address; data: `0x${string}`; value: bigint }\n\nfunction publicClientFor(rpcUrl: string, chainId: number) {\n const ch = defineChain({\n id: chainId,\n name: 'MorphoMidnight',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain: ch, transport: http(rpcUrl) })\n}\n\nasync function readTokenDecimals(args: {\n rpcUrl: string\n chainId: number\n token: Address\n}): Promise<number> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const d = await publicClient.readContract({\n address: args.token,\n abi: erc20Abi,\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\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 path: token must match wrapped native.')\n }\n steps.push({\n kind: 'weth_deposit',\n to: weth,\n data: encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' }),\n value: args.amountWei,\n })\n spendToken = weth\n }\n\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20Abi,\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: erc20Abi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [args.spender, args.amountWei],\n }),\n value: 0n,\n })\n }\n return steps\n}\n\nasync function ensureBundlesAuthorizedSteps(args: {\n rpcUrl: string\n chainId: number\n midnight: Address\n bundles: Address\n onBehalf: Address\n}): Promise<EvmTxStep[]> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const authorized = await publicClient.readContract({\n address: args.midnight,\n abi: midnightAbi,\n functionName: 'isAuthorized',\n args: [args.onBehalf, args.bundles],\n })\n if (authorized) return []\n return [\n {\n to: args.midnight,\n data: encodeFunctionData({\n abi: midnightAbi,\n functionName: 'setIsAuthorized',\n args: [args.bundles, true, args.onBehalf],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n },\n ]\n}\n\nfunction approveStepsToEvm(steps: readonly ApproveStep[]): EvmTxStep[] {\n return steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit' ? MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK : MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n }))\n}\n\nfunction offerFillsFromTakes(takes: readonly MidnightApiTake[]) {\n return takes.map((t) => ({\n offer: t.offer,\n ratifierData: t.ratifierData,\n units: t.units,\n }))\n}\n\nfunction resolveAddresses(args: {\n chainId: number\n midnight?: Address\n bundles?: Address\n marketMidnight?: Address\n}): { midnight: Address; bundles: Address } {\n const known = morphoMidnightAddressesForChain(args.chainId)\n const midnight = args.midnight\n ? getAddress(args.midnight)\n : args.marketMidnight\n ? getAddress(args.marketMidnight)\n : known?.midnight\n const bundles = args.bundles ? getAddress(args.bundles) : known?.bundles\n if (!midnight || !bundles) {\n throw new Error(\n `Morpho Midnight addresses unknown for chain ${args.chainId}. Pass midnight/bundles or use a supported chain.`,\n )\n }\n return { midnight, bundles }\n}\n\nfunction deadlineFromNow(seconds?: number): bigint {\n const s = seconds && seconds > 0 ? seconds : MORPHO_MIDNIGHT_DEFAULT_DEADLINE_SECONDS\n return BigInt(Math.floor(Date.now() / 1000) + s)\n}\n\nfunction collateralIndex(market: MorphoMidnightMarketParams, collateralToken: Address): bigint {\n const idx = market.collateralParams.findIndex(\n (c) => c.token.toLowerCase() === collateralToken.toLowerCase(),\n )\n if (idx < 0) {\n throw new Error(`Collateral ${collateralToken} is not in market collateralParams.`)\n }\n return BigInt(idx)\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightLendBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n amountHuman: string\n loanToken?: Address\n slippagePct?: string\n deadlineSeconds?: number\n midnight?: Address\n bundles?: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n taker: Address\n receiver?: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const taker = getAddress(args.taker)\n const executor = getAddress(args.executorAddress)\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (!book) throw new Error(`Midnight book not found: ${args.marketId}`)\n const market = morphoMidnightBookToMarketParams(book)\n const { midnight, bundles } = resolveAddresses({\n chainId: args.chainId,\n midnight: args.midnight,\n bundles: args.bundles,\n marketMidnight: market.midnight,\n })\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(market.loanToken)\n if (loanToken.toLowerCase() !== market.loanToken.toLowerCase()) {\n throw new Error('loanToken does not match Midnight market loan token.')\n }\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const targetBuyerAssets = parseUnits(args.amountHuman, dec)\n if (targetBuyerAssets === 0n) throw new Error('Lend amount is zero.')\n\n const slippage = (args.slippagePct ?? MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT).trim()\n const quote = await fetchMorphoMidnightBookQuote({\n marketId: args.marketId,\n side: 'asks',\n assets: targetBuyerAssets,\n slippage,\n })\n if (!quote.takeableOffers.length) {\n throw new Error('No takeable Midnight asks for this size. Try a smaller amount or another maturity.')\n }\n const worst = BigInt(quote.averageWorstPrice.split('.')[0] || '0')\n const minUnits = morphoMidnightUnitsFromAssets(targetBuyerAssets, worst)\n const deadline = deadlineFromNow(args.deadlineSeconds)\n const offerFills = offerFillsFromTakes(quote.takeableOffers)\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loanToken,\n spender: bundles,\n amountWei: targetBuyerAssets,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n })\n const authSteps = await ensureBundlesAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n bundles,\n onBehalf: taker,\n })\n\n const lendData = encodeFunctionData({\n abi: midnightBundlesAbi,\n functionName: 'midnightBundlesV1BuyWithAssetsTargetAndWithdrawCollateral',\n args: [\n targetBuyerAssets,\n minUnits,\n taker,\n false,\n TOKEN_PERMIT_NONE,\n offerFills,\n [],\n taker,\n 0n,\n zeroAddress,\n maxUint256,\n deadline,\n ],\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\n const evmSteps: EvmTxStep[] = [\n ...approveStepsToEvm(approveSteps),\n ...authSteps,\n { to: bundles, data: lendData, value: 0n, fallbackGas: MORPHO_MIDNIGHT_LEND_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 Midnight: lend (${args.amountHuman}) on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: bundles,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MorphoMidnight',\n name: 'lend',\n marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_midnight_lend', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n amountHuman: args.amountHuman,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightBorrowBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n borrowAmountHuman: string\n collateralAmountHuman: string\n collateralToken: Address\n loanToken?: Address\n collateralIndex?: number\n slippagePct?: string\n deadlineSeconds?: number\n midnight?: Address\n bundles?: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n taker: Address\n receiver?: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const taker = getAddress(args.taker)\n const receiver = getAddress(args.receiver ?? args.taker)\n const executor = getAddress(args.executorAddress)\n const collateralToken = getAddress(args.collateralToken)\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (!book) throw new Error(`Midnight book not found: ${args.marketId}`)\n const market = morphoMidnightBookToMarketParams(book)\n const { midnight, bundles } = resolveAddresses({\n chainId: args.chainId,\n midnight: args.midnight,\n bundles: args.bundles,\n marketMidnight: market.midnight,\n })\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(market.loanToken)\n\n const loanDec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const colDec = await readTokenDecimals({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: collateralToken,\n })\n const targetSellerAssets = parseUnits(args.borrowAmountHuman, loanDec)\n const collateralAmount = parseUnits(args.collateralAmountHuman, colDec)\n if (targetSellerAssets === 0n) throw new Error('Borrow amount is zero.')\n if (collateralAmount === 0n) throw new Error('Collateral amount is zero.')\n\n const colIdx =\n args.collateralIndex != null && args.collateralIndex >= 0\n ? BigInt(args.collateralIndex)\n : collateralIndex(market, collateralToken)\n\n const slippage = (args.slippagePct ?? MORPHO_MIDNIGHT_DEFAULT_SLIPPAGE_PCT).trim()\n const quote = await fetchMorphoMidnightBookQuote({\n marketId: args.marketId,\n side: 'bids',\n assets: targetSellerAssets,\n slippage,\n })\n if (!quote.takeableOffers.length) {\n throw new Error('No takeable Midnight bids for this size. Try a smaller amount or another maturity.')\n }\n const worst = BigInt(quote.averageWorstPrice.split('.')[0] || '0')\n const maxUnits = morphoMidnightUnitsFromAssets(targetSellerAssets, worst)\n const deadline = deadlineFromNow(args.deadlineSeconds)\n const offerFills = offerFillsFromTakes(quote.takeableOffers)\n\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: collateralToken,\n spender: bundles,\n amountWei: collateralAmount,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n })\n const authSteps = await ensureBundlesAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n bundles,\n onBehalf: taker,\n })\n\n const borrowData = encodeFunctionData({\n abi: midnightBundlesAbi,\n functionName: 'midnightBundlesV1SupplyCollateralAndSellWithAssetsTarget',\n args: [\n targetSellerAssets,\n maxUnits,\n taker,\n false,\n receiver,\n [{ collateralIndex: colIdx, assets: collateralAmount, permit: TOKEN_PERMIT_NONE }],\n offerFills,\n 0n,\n zeroAddress,\n maxUint256,\n deadline,\n ],\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\n const evmSteps: EvmTxStep[] = [\n ...approveStepsToEvm(approveSteps),\n ...authSteps,\n { to: bundles, data: borrowData, value: 0n, fallbackGas: MORPHO_MIDNIGHT_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 Midnight: borrow (${args.borrowAmountHuman}) on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: bundles,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MorphoMidnight',\n name: 'borrow',\n marketLabel,\n borrowAmountHuman: args.borrowAmountHuman,\n collateralAmountHuman: args.collateralAmountHuman,\n }),\n evm: { type: 'morpho_midnight_borrow', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n amountHuman: args.borrowAmountHuman,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightRepayBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n /** Optional override; default = debt + pendingFee + 1 unit buffer in loan decimals. */\n repayAmountHuman?: string\n loanToken?: Address\n withdrawAllCollateral?: boolean\n deadlineSeconds?: number\n midnight?: Address\n bundles?: Address\n onBehalf: Address\n collateralReceiver?: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const onBehalf = getAddress(args.onBehalf)\n const collateralReceiver = getAddress(args.collateralReceiver ?? args.onBehalf)\n const executor = getAddress(args.executorAddress)\n\n const [marketRow, position] = await Promise.all([\n fetchMorphoMidnightMarketById(args.marketId),\n fetchMorphoMidnightUserMarketPosition({ marketId: args.marketId, user: onBehalf }),\n ])\n if (!marketRow) throw new Error(`Midnight market not found: ${args.marketId}`)\n if (!position) throw new Error(`No Midnight position for ${onBehalf} in ${args.marketId}`)\n\n const baseMarket = morphoMidnightMarketToParams(marketRow)\n // Prefer midnight from book/live if market detail omitted it\n let midnightAddr = baseMarket.midnight\n if (midnightAddr === zeroAddress) {\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (book) midnightAddr = getAddress(book.midnight)\n }\n const { midnight, bundles } = resolveAddresses({\n chainId: args.chainId,\n midnight: args.midnight ?? (midnightAddr !== zeroAddress ? midnightAddr : undefined),\n bundles: args.bundles,\n marketMidnight: midnightAddr !== zeroAddress ? midnightAddr : undefined,\n })\n const market = { ...baseMarket, midnight }\n\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(market.loanToken)\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const debt = BigInt(position.debt || '0')\n const fee = BigInt(position.pendingFee || '0')\n const buffer = parseUnits('1', Math.min(dec, 6))\n let repayAssets: bigint\n if (args.repayAmountHuman?.trim()) {\n repayAssets = parseUnits(args.repayAmountHuman.trim(), dec)\n } else {\n repayAssets = debt + fee + buffer\n }\n if (repayAssets === 0n) throw new Error('Repay amount is zero.')\n\n const withdrawAll = args.withdrawAllCollateral !== false\n const collateralWithdrawals = withdrawAll\n ? position.collaterals.map((c) => {\n const idx = market.collateralParams.findIndex(\n (cp) => cp.token.toLowerCase() === c.token.toLowerCase(),\n )\n if (idx < 0) throw new Error(`Collateral ${c.token} missing from market params.`)\n return { collateralIndex: BigInt(idx), assets: BigInt(c.amount || '0') }\n })\n : []\n\n const deadline = deadlineFromNow(args.deadlineSeconds)\n const approveSteps = await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loanToken,\n spender: bundles,\n amountWei: repayAssets,\n executor,\n })\n const authSteps = await ensureBundlesAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n bundles,\n onBehalf,\n })\n\n const repayData = encodeFunctionData({\n abi: midnightBundlesAbi,\n functionName: 'midnightBundlesV1RepayAndWithdrawCollateral',\n args: [\n market,\n repayAssets,\n onBehalf,\n TOKEN_PERMIT_NONE,\n collateralWithdrawals,\n collateralReceiver,\n 0n,\n zeroAddress,\n deadline,\n ],\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\n const evmSteps: EvmTxStep[] = [\n ...approveStepsToEvm(approveSteps),\n ...authSteps,\n { to: bundles, data: repayData as Hex, value: 0n, fallbackGas: MORPHO_MIDNIGHT_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 Midnight: repay + withdraw on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: bundles,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoMidnight', name: 'repay', marketLabel }),\n evm: { type: 'morpho_midnight_repay', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n","import {\n type Address,\n type Hex,\n createPublicClient,\n decodeAbiParameters,\n defineChain,\n encodeAbiParameters,\n encodeFunctionData,\n getAddress,\n http,\n keccak256,\n maxUint256,\n parseAbi,\n parseUnits,\n zeroAddress,\n} from 'viem'\nimport { Offer, Payload, SetterRatifierUtils, Tree, midnightAbi } from '@morpho-org/midnight-sdk'\nimport type { MidnightApiBookMarket } from '@morpho-org/midnight-sdk/api'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport {\n MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n MORPHO_MIDNIGHT_BLUE_SUPPLY_FALLBACK_GAS,\n MORPHO_MIDNIGHT_BLUE_WITHDRAW_FALLBACK_GAS,\n MORPHO_MIDNIGHT_CALLBACK_SALT,\n MORPHO_MIDNIGHT_CREATE_CALLBACK_FALLBACK_GAS,\n MORPHO_MIDNIGHT_DEFAULT_OFFER_TTL_SECONDS,\n MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n MORPHO_MIDNIGHT_MEMPOOL_PUBLISH_FALLBACK_GAS,\n MORPHO_MIDNIGHT_SET_CONSUMED_FALLBACK_GAS,\n MORPHO_MIDNIGHT_SET_ROOT_FALLBACK_GAS,\n MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK,\n morphoMidnightAddressesForChain,\n} from './midnightConstants.js'\nimport {\n fetchMorphoMidnightBook,\n morphoMidnightApiBaseUrl,\n morphoMidnightBookToMarketParams,\n} from './midnightApi.js'\nimport { fetchMorphoMarketById, type MorphoMarketParams } from './marketParams.js'\nimport {\n encodeMorphoBlueMarketParamsCallbackData,\n pickBestBlueSupplyMarketForLoan,\n} from './midnightBluePark.js'\nimport {\n morphoMidnightTickFromApr,\n morphoMidnightTickFromPriceWad,\n morphoMidnightTtmSeconds,\n parseMorphoMidnightAprInput,\n} from './midnightMath.js'\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 erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\nconst factoryAbi = parseAbi([\n 'function callbackOf(address owner, bytes32 salt) view returns (address)',\n 'function createBlueBuyCallback(address owner, bytes32 salt) returns (address)',\n])\nconst setterAbi = parseAbi([\n 'function isRootRatified(address maker, bytes32 root) view returns (bool)',\n 'function setIsRootRatified(address maker, bytes32 root, bool newIsRatified)',\n])\nconst morphoBlueAbi = parseAbi([\n 'function supply((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, bytes data)',\n 'function withdraw((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, address receiver)',\n 'function position(bytes32 id, address user) view returns (uint256 supplyShares, uint128 borrowShares, uint128 collateral)',\n])\nconst blueMarketParamsAbi = [\n {\n type: 'tuple',\n components: [\n { name: 'loanToken', type: 'address' },\n { name: 'collateralToken', type: 'address' },\n { name: 'oracle', type: 'address' },\n { name: 'irm', type: 'address' },\n { name: 'lltv', type: 'uint256' },\n ],\n },\n] as const\n\nfunction publicClientFor(rpcUrl: string, chainId: number) {\n const ch = defineChain({\n id: chainId,\n name: 'MorphoMidnight',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain: ch, transport: http(rpcUrl) })\n}\n\nasync function readTokenDecimals(args: { rpcUrl: string; chainId: number; token: Address }): Promise<number> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const d = await publicClient.readContract({\n address: args.token,\n abi: erc20Abi,\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 path: token must match wrapped native.')\n }\n steps.push({\n kind: 'weth_deposit',\n to: weth,\n data: encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit' }),\n value: args.amountWei,\n })\n spendToken = weth\n }\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const currentAllowance = await publicClient.readContract({\n address: spendToken,\n abi: erc20Abi,\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: erc20Abi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n })\n }\n steps.push({\n kind: 'approve',\n to: spendToken,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [args.spender, args.amountWei],\n }),\n value: 0n,\n })\n }\n return steps\n}\n\nfunction approveStepsToEvm(steps: readonly ApproveStep[]): EvmTxStep[] {\n return steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit' ? MORPHO_MIDNIGHT_WETH_DEPOSIT_FALLBACK : MORPHO_MIDNIGHT_ERC20_APPROVE_FALLBACK,\n }))\n}\n\nasync function ensureAuthorizedSteps(args: {\n rpcUrl: string\n chainId: number\n midnight: Address\n authorized: Address\n onBehalf: Address\n}): Promise<EvmTxStep[]> {\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const authorized = await publicClient.readContract({\n address: args.midnight,\n abi: midnightAbi,\n functionName: 'isAuthorized',\n args: [args.onBehalf, args.authorized],\n })\n if (authorized) return []\n return [\n {\n to: args.midnight,\n data: encodeFunctionData({\n abi: midnightAbi,\n functionName: 'setIsAuthorized',\n args: [args.authorized, true, args.onBehalf],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_AUTHORIZE_FALLBACK_GAS,\n },\n ]\n}\n\nfunction bookLevelTick(level: { tick?: string | number | bigint; price?: string } | undefined): bigint | null {\n if (!level) return null\n if (level.tick != null && String(level.tick).trim() !== '') {\n try {\n return BigInt(level.tick)\n } catch {\n return null\n }\n }\n if (!level.price) return null\n try {\n return morphoMidnightTickFromPriceWad(BigInt(String(level.price).split('.')[0] || '0'))\n } catch {\n return null\n }\n}\n\nfunction resolveOfferTick(args: {\n book: MidnightApiBookMarket\n lendAprPct?: string\n tick?: string\n}): bigint {\n if (args.tick?.trim()) {\n try {\n const t = BigInt(args.tick.trim())\n if (t > 0n) return t\n } catch {\n throw new Error(`Invalid Midnight offer tick: ${args.tick}`)\n }\n }\n const ttm = morphoMidnightTtmSeconds(args.book.maturity)\n if (args.lendAprPct?.trim()) {\n const apr = parseMorphoMidnightAprInput(args.lendAprPct)\n if (apr == null) throw new Error('lendAprPct must be a positive percent (e.g. 5.2).')\n const tick = morphoMidnightTickFromApr(apr, ttm)\n if (tick == null) throw new Error('Could not convert lendAprPct to a Midnight tick.')\n return tick\n }\n const bidTick = bookLevelTick(args.book.bids?.[0] as { tick?: string | number | bigint; price?: string } | undefined)\n if (bidTick != null && bidTick > 0n) return bidTick\n const askTick = bookLevelTick(args.book.asks?.[0] as { tick?: string | number | bigint; price?: string } | undefined)\n if (askTick != null && askTick > 0n) return askTick\n throw new Error('No book tick available. Pass lendAprPct (e.g. 5.2) or tick.')\n}\n\nfunction offerExpiryUnix(maturity: number, ttlSeconds?: number): bigint {\n const now = Math.floor(Date.now() / 1000)\n const ttl = ttlSeconds && ttlSeconds > 0 ? ttlSeconds : MORPHO_MIDNIGHT_DEFAULT_OFFER_TTL_SECONDS\n const byTtl = now + ttl\n const byMaturity = maturity > 60 ? maturity - 60 : maturity\n return BigInt(Math.max(now + 60, Math.min(byTtl, byMaturity)))\n}\n\nfunction decodeBlueMarketParams(data: Hex): MorphoMarketParams {\n const [decoded] = decodeAbiParameters(blueMarketParamsAbi, data)\n return {\n loanToken: getAddress(decoded.loanToken),\n collateralToken: getAddress(decoded.collateralToken),\n oracle: getAddress(decoded.oracle),\n irm: getAddress(decoded.irm),\n lltv: decoded.lltv,\n }\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightLendOfferBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketId: string\n amountHuman: string\n loanToken?: Address\n /** Human percent, e.g. \"5.2\". Defaults to the book's best bid (else best ask). */\n lendAprPct?: string\n tick?: string\n blueMarketId?: string\n expirySeconds?: number\n midnight?: Address\n isNativeIn?: boolean\n nativeWrapped?: Address\n maker: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const maker = getAddress(args.maker)\n const executor = getAddress(args.executorAddress)\n const known = morphoMidnightAddressesForChain(args.chainId)\n if (!known) {\n throw new Error(`Morpho Midnight addresses unknown for chain ${args.chainId}.`)\n }\n const book = await fetchMorphoMidnightBook(args.marketId)\n if (!book) throw new Error(`Midnight book not found: ${args.marketId}`)\n const marketParams = morphoMidnightBookToMarketParams(book)\n const midnight = args.midnight ? getAddress(args.midnight) : getAddress(book.midnight || known.midnight)\n const loanToken = args.loanToken ? getAddress(args.loanToken) : getAddress(marketParams.loanToken)\n if (loanToken.toLowerCase() !== marketParams.loanToken.toLowerCase()) {\n throw new Error('loanToken does not match Midnight market loan token.')\n }\n\n const dec = await readTokenDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loanToken })\n const maxAssets = parseUnits(args.amountHuman, dec)\n if (maxAssets === 0n) throw new Error('Lend offer amount is zero.')\n\n const blueRow = args.blueMarketId?.trim()\n ? await fetchMorphoMarketById({ chainId: args.chainId, marketId: args.blueMarketId.trim() })\n : await pickBestBlueSupplyMarketForLoan({ chainId: args.chainId, loanToken })\n if (!blueRow) {\n throw new Error(\n `No Morpho Blue market found to park ${loanToken} while the Midnight offer waits. Pass blueMarketId.`,\n )\n }\n if (blueRow.marketParams.loanToken.toLowerCase() !== loanToken.toLowerCase()) {\n throw new Error('blueMarketId loan token must match the Midnight loan token.')\n }\n const morphoBlue = getAddress(blueRow.morphoBlueAddress)\n const callbackData = encodeMorphoBlueMarketParamsCallbackData(blueRow.marketParams)\n const tick = resolveOfferTick({ book, lendAprPct: args.lendAprPct, tick: args.tick })\n const expiry = offerExpiryUnix(book.maturity, args.expirySeconds)\n\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n let callback = await publicClient.readContract({\n address: known.blueBuyCallbackFactory,\n abi: factoryAbi,\n functionName: 'callbackOf',\n args: [maker, MORPHO_MIDNIGHT_CALLBACK_SALT],\n })\n const evmSteps: EvmTxStep[] = []\n if (callback === zeroAddress) {\n const sim = await publicClient.simulateContract({\n address: known.blueBuyCallbackFactory,\n abi: factoryAbi,\n functionName: 'createBlueBuyCallback',\n args: [maker, MORPHO_MIDNIGHT_CALLBACK_SALT],\n account: executor,\n })\n callback = sim.result\n evmSteps.push({\n to: known.blueBuyCallbackFactory,\n data: encodeFunctionData({\n abi: factoryAbi,\n functionName: 'createBlueBuyCallback',\n args: [maker, MORPHO_MIDNIGHT_CALLBACK_SALT],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_CREATE_CALLBACK_FALLBACK_GAS,\n })\n }\n if (callback === zeroAddress) {\n throw new Error('Could not resolve BlueBuyCallback address for this owner.')\n }\n\n const offer = Offer.create({\n market: {\n chainId: args.chainId,\n midnight,\n loanToken,\n collateralParams: marketParams.collateralParams.map((c) => ({\n token: c.token,\n lltv: c.lltv,\n liquidationCursor: c.liquidationCursor,\n oracle: c.oracle,\n })),\n maturity: marketParams.maturity,\n rcfThreshold: marketParams.rcfThreshold,\n enterGate: marketParams.enterGate,\n liquidatorGate: marketParams.liquidatorGate,\n },\n buy: true,\n maker,\n tick,\n maxAssets,\n expiry,\n ratifier: known.setterRatifier,\n callback,\n callbackData,\n })\n const tree = Tree.create([offer])\n await tree.mempoolValidate({ chainId: args.chainId, apiUrl: morphoMidnightApiBaseUrl() })\n const items = SetterRatifierUtils.ratify({ tree })\n const payload = await Payload.encode(items)\n\n evmSteps.push(\n ...approveStepsToEvm(\n await buildApproveSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n token: loanToken,\n spender: morphoBlue,\n amountWei: maxAssets,\n executor,\n isNativeIn: args.isNativeIn,\n nativeWrapped: args.nativeWrapped,\n }),\n ),\n )\n evmSteps.push({\n to: morphoBlue,\n data: encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'supply',\n args: [blueRow.marketParams, maxAssets, 0n, callback, '0x'],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_BLUE_SUPPLY_FALLBACK_GAS,\n })\n evmSteps.push(\n ...(await ensureAuthorizedSteps({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n midnight,\n authorized: known.setterRatifier,\n onBehalf: maker,\n })),\n )\n evmSteps.push({\n to: known.setterRatifier,\n data: encodeFunctionData({\n abi: setterAbi,\n functionName: 'setIsRootRatified',\n args: [maker, tree.root, true],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_SET_ROOT_FALLBACK_GAS,\n })\n evmSteps.push({\n to: known.mempool,\n data: payload,\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_MEMPOOL_PUBLISH_FALLBACK_GAS,\n })\n\n const marketLabel = (args.marketLabel ?? '').trim() || `Midnight ${args.marketId.slice(0, 10)}…`\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 Midnight: lend offer (${args.amountHuman}) on \"${marketLabel}\" (variable yield until filled).`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: known.mempool,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MorphoMidnight',\n name: 'lend_offer',\n marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'morpho_midnight_lend_offer', version: 1, chainId: String(args.chainId) },\n morpho: {\n marketId: args.marketId,\n marketLabel,\n amountHuman: args.amountHuman,\n tick: tick.toString(),\n blueMarketId: blueRow.marketId,\n callback,\n treeRoot: tree.root,\n group: offer.group,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n\nexport async function buildEvmMultisignBodyMorphoMidnightCancelLendOfferBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n group: Hex\n callback?: Address\n callbackData?: Hex\n midnight?: Address\n withdrawRemaining?: boolean\n maker: Address\n executorAddress: Address\n purposeText: string\n marketLabel?: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const maker = getAddress(args.maker)\n const executor = getAddress(args.executorAddress)\n const known = morphoMidnightAddressesForChain(args.chainId)\n if (!known) {\n throw new Error(`Morpho Midnight addresses unknown for chain ${args.chainId}.`)\n }\n const midnight = args.midnight ? getAddress(args.midnight) : known.midnight\n const group = args.group.trim() as Hex\n if (!group.startsWith('0x') || group.length !== 66) {\n throw new Error('group must be a bytes32 hex id from ctm_morpho_fetch_midnight_offers.')\n }\n\n const evmSteps: EvmTxStep[] = [\n {\n to: midnight,\n data: encodeFunctionData({\n abi: midnightAbi,\n functionName: 'setConsumed',\n args: [group, maxUint256, maker],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_SET_CONSUMED_FALLBACK_GAS,\n },\n ]\n\n const withdrawRemaining = args.withdrawRemaining !== false\n const callback = args.callback && args.callback !== zeroAddress ? getAddress(args.callback) : null\n const callbackData = (args.callbackData ?? '0x') as Hex\n if (withdrawRemaining && callback && callbackData !== '0x') {\n const params = decodeBlueMarketParams(callbackData)\n const publicClient = publicClientFor(args.rpcUrl, args.chainId)\n const marketId = keccak256(\n encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'address' },\n { type: 'address' },\n { type: 'uint256' },\n ],\n [params.loanToken, params.collateralToken, params.oracle, params.irm, params.lltv],\n ),\n )\n const pos = await publicClient.readContract({\n address: known.morphoBlue,\n abi: morphoBlueAbi,\n functionName: 'position',\n args: [marketId, callback],\n })\n const supplyShares = pos[0]\n if (supplyShares > 0n) {\n evmSteps.push({\n to: known.morphoBlue,\n data: encodeFunctionData({\n abi: morphoBlueAbi,\n functionName: 'withdraw',\n args: [params, 0n, supplyShares, callback, maker],\n }),\n value: 0n,\n fallbackGas: MORPHO_MIDNIGHT_BLUE_WITHDRAW_FALLBACK_GAS,\n })\n }\n }\n\n const marketLabel = (args.marketLabel ?? '').trim() || 'Midnight lend offer'\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 Midnight: cancel lend offer on \"${marketLabel}\".`,\n firstMsgRawNo0x: evmSteps[0]!.data.slice(2),\n destinationAddress: midnight,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({ kind: 'MorphoMidnight', name: 'cancel_lend_offer', marketLabel }),\n evm: { type: 'morpho_midnight_cancel_lend_offer', version: 1, chainId: String(args.chainId) },\n morpho: {\n group,\n marketLabel,\n gasBuild: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\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","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"]}