@continuumdao/ctm-mpc-defi 0.2.40 → 0.2.42

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 (98) hide show
  1. package/dist/agent/catalog.cjs +50 -6
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.js +50 -6
  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 +7 -2
  10. package/dist/chains/evm/index.cjs.map +1 -1
  11. package/dist/chains/evm/index.js +8 -3
  12. package/dist/chains/evm/index.js.map +1 -1
  13. package/dist/core/index.cjs +14 -0
  14. package/dist/core/index.cjs.map +1 -1
  15. package/dist/core/index.d.ts +7 -2
  16. package/dist/core/index.js +13 -2
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/index.cjs +52 -8
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +51 -10
  22. package/dist/index.js.map +1 -1
  23. package/dist/protocols/evm/aave-v4/index.cjs +11 -7
  24. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  25. package/dist/protocols/evm/aave-v4/index.js +12 -8
  26. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  27. package/dist/protocols/evm/aerodrome/index.cjs +14 -2
  28. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  29. package/dist/protocols/evm/aerodrome/index.js +14 -2
  30. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  31. package/dist/protocols/evm/arcus/index.cjs +6 -2
  32. package/dist/protocols/evm/arcus/index.cjs.map +1 -1
  33. package/dist/protocols/evm/arcus/index.js +7 -3
  34. package/dist/protocols/evm/arcus/index.js.map +1 -1
  35. package/dist/protocols/evm/circle-cctp/index.cjs +23 -3
  36. package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
  37. package/dist/protocols/evm/circle-cctp/index.js +24 -4
  38. package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
  39. package/dist/protocols/evm/compound-v3/index.cjs +9 -3
  40. package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
  41. package/dist/protocols/evm/compound-v3/index.js +10 -4
  42. package/dist/protocols/evm/compound-v3/index.js.map +1 -1
  43. package/dist/protocols/evm/continuum-dao/index.cjs +11 -5
  44. package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
  45. package/dist/protocols/evm/continuum-dao/index.js +12 -6
  46. package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
  47. package/dist/protocols/evm/curve-dao/index.cjs +8 -4
  48. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  49. package/dist/protocols/evm/curve-dao/index.js +9 -5
  50. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  51. package/dist/protocols/evm/ethena/index.cjs +13 -9
  52. package/dist/protocols/evm/ethena/index.cjs.map +1 -1
  53. package/dist/protocols/evm/ethena/index.js +14 -10
  54. package/dist/protocols/evm/ethena/index.js.map +1 -1
  55. package/dist/protocols/evm/euler-v2/index.cjs +21 -16
  56. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  57. package/dist/protocols/evm/euler-v2/index.js +22 -17
  58. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  59. package/dist/protocols/evm/gmx/index.cjs +12 -8
  60. package/dist/protocols/evm/gmx/index.cjs.map +1 -1
  61. package/dist/protocols/evm/gmx/index.js +13 -9
  62. package/dist/protocols/evm/gmx/index.js.map +1 -1
  63. package/dist/protocols/evm/hyperliquid/index.cjs +5 -1
  64. package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
  65. package/dist/protocols/evm/hyperliquid/index.js +6 -2
  66. package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
  67. package/dist/protocols/evm/lido/index.cjs +7 -3
  68. package/dist/protocols/evm/lido/index.cjs.map +1 -1
  69. package/dist/protocols/evm/lido/index.js +8 -4
  70. package/dist/protocols/evm/lido/index.js.map +1 -1
  71. package/dist/protocols/evm/maple/index.cjs +7 -3
  72. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  73. package/dist/protocols/evm/maple/index.js +8 -4
  74. package/dist/protocols/evm/maple/index.js.map +1 -1
  75. package/dist/protocols/evm/morpho/index.cjs +34 -11
  76. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  77. package/dist/protocols/evm/morpho/index.d.ts +12 -1
  78. package/dist/protocols/evm/morpho/index.js +31 -13
  79. package/dist/protocols/evm/morpho/index.js.map +1 -1
  80. package/dist/protocols/evm/pendle/index.cjs +9 -3
  81. package/dist/protocols/evm/pendle/index.cjs.map +1 -1
  82. package/dist/protocols/evm/pendle/index.js +10 -4
  83. package/dist/protocols/evm/pendle/index.js.map +1 -1
  84. package/dist/protocols/evm/permit2/index.cjs.map +1 -1
  85. package/dist/protocols/evm/permit2/index.js.map +1 -1
  86. package/dist/protocols/evm/sky/index.cjs +17 -13
  87. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  88. package/dist/protocols/evm/sky/index.js +18 -14
  89. package/dist/protocols/evm/sky/index.js.map +1 -1
  90. package/dist/protocols/evm/uniswap-v4/index.cjs +19 -9
  91. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  92. package/dist/protocols/evm/uniswap-v4/index.js +20 -10
  93. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  94. package/dist/protocols/evm/venice/index.cjs +10 -4
  95. package/dist/protocols/evm/venice/index.cjs.map +1 -1
  96. package/dist/protocols/evm/venice/index.js +10 -4
  97. package/dist/protocols/evm/venice/index.js.map +1 -1
  98. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/agent/support/assetFilter.ts","../../../../src/protocols/evm/pendle/support.ts","../../../../src/protocols/evm/pendle/api.ts","../../../../src/protocols/evm/pendle/discover.ts","../../../../src/protocols/evm/pendle/convert.ts","../../../../src/protocols/evm/pendle/purpose.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/core/expiry.ts","../../../../src/protocols/evm/pendle/multisign.ts","../../../../src/protocols/evm/pendle/merkle.ts","../../../../src/protocols/evm/pendle/positions.ts","../../../../src/protocols/evm/pendle/redeemRewards.ts","../../../../src/protocols/evm/pendle/index.ts"],"names":["getAddress","isAddress","asRecord","asString","asNumber","defineChain","createPublicClient","http","gasLimitFromEstimateAndChainConfig","parseAbi"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","import { getAddress, isAddress } from 'viem'\n\n/** Match an optional fetch filter that is either an ERC-20 address or a ticker (USDT). */\nexport function matchesAssetFilter(opts: {\n address?: string\n symbol?: string\n filter?: string\n}): boolean {\n const f = (opts.filter ?? '').trim()\n if (!f) return true\n const addr = (opts.address ?? '').trim()\n if (isAddress(f) && isAddress(addr)) {\n return getAddress(addr) === getAddress(f)\n }\n const sym = (opts.symbol ?? '').trim()\n if (!sym) return false\n return sym.toLowerCase() === f.toLowerCase()\n}\n","export const PENDLE_PROTOCOL_ID = 'pendle'\n\nexport const PENDLE_CORE_API_BASE = 'https://api-v2.pendle.finance/core'\n\n/** Official Hosted SDK / Convert native placeholder. */\nexport const PENDLE_NATIVE_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nexport const PENDLE_LISTING_CAP = 100\n/** `/v2/markets/all` returns oldest first — scan enough pages to find live markets. */\nexport const PENDLE_LISTING_MAX_PAGES = 8\nexport const PENDLE_SEARCH_EXTRA_PAGES = 3\nexport const PENDLE_ICON_CACHE_MS = 12 * 60 * 1000\nexport const PENDLE_CHAIN_CACHE_MS = 30 * 60 * 1000\nexport const PENDLE_CONVERT_DEFAULT_GAS_UNITS = 650_000n\n\nexport function parsePendleAssetId(id: string): { chainId: number; address: string } | null {\n const raw = (id ?? '').trim()\n const dash = raw.indexOf('-')\n if (dash <= 0) return null\n const chainId = Number.parseInt(raw.slice(0, dash), 10)\n const address = raw.slice(dash + 1).trim()\n if (!Number.isFinite(chainId) || chainId <= 0 || !address) return null\n return { chainId, address }\n}\n\nexport function pendleAssetId(chainId: number, address: string): string {\n return `${chainId}-${address.trim().toLowerCase()}`\n}\n\nexport function isPendleNativeToken(token: string): boolean {\n const t = token.trim().toLowerCase()\n return (\n t === 'eth' ||\n t === 'native' ||\n t === PENDLE_NATIVE_PLACEHOLDER.toLowerCase() ||\n t === '0x0000000000000000000000000000000000000000'\n )\n}\n\nexport function normalizePendleTokenAddress(token: string): string {\n if (isPendleNativeToken(token)) return PENDLE_NATIVE_PLACEHOLDER.toLowerCase()\n return token.trim().toLowerCase()\n}\n","import { PENDLE_CORE_API_BASE } from './support.js'\n\nconst FETCH_TIMEOUT_MS = 120_000\n\nexport class PendleApiError extends Error {\n readonly status: number\n readonly path: string\n\n constructor(message: string, status: number, path: string) {\n super(message)\n this.name = 'PendleApiError'\n this.status = status\n this.path = path\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction queryString(params: Record<string, string | number | boolean | undefined>): string {\n const q = new URLSearchParams()\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === '') continue\n q.set(k, String(v))\n }\n const s = q.toString()\n return s ? `?${s}` : ''\n}\n\nexport async function pendleCoreFetch<T>(args: {\n path: string\n method?: 'GET' | 'POST'\n query?: Record<string, string | number | boolean | undefined>\n body?: unknown\n apiKey?: string\n}): Promise<T> {\n const path = args.path.startsWith('/') ? args.path : `/${args.path}`\n const url = `${PENDLE_CORE_API_BASE}${path}${queryString(args.query ?? {})}`\n const headers: Record<string, string> = { Accept: 'application/json' }\n if (args.apiKey?.trim()) headers.Authorization = `Bearer ${args.apiKey.trim()}`\n if (args.body !== undefined) headers['Content-Type'] = 'application/json'\n\n let lastError: unknown\n for (let attempt = 0; attempt < 4; attempt++) {\n const ac = new AbortController()\n const timer = setTimeout(() => ac.abort(), FETCH_TIMEOUT_MS)\n try {\n const res = await fetch(url, {\n method: args.method ?? 'GET',\n headers,\n body: args.body === undefined ? undefined : JSON.stringify(args.body),\n signal: ac.signal,\n })\n if (res.status === 429) {\n const wait = Math.min(8_000, 500 * 2 ** attempt)\n await sleep(wait)\n lastError = new PendleApiError(`Pendle API rate limited (429) on ${path}`, 429, path)\n continue\n }\n const text = await res.text()\n if (!res.ok) {\n throw new PendleApiError(\n `Pendle API ${res.status} ${path}: ${text.slice(0, 400)}`,\n res.status,\n path,\n )\n }\n if (!text.trim()) return {} as T\n return JSON.parse(text) as T\n } catch (err) {\n lastError = err\n if (err instanceof PendleApiError && err.status !== 429) throw err\n if (attempt < 3 && (err instanceof PendleApiError || (err as { name?: string })?.name === 'AbortError')) {\n await sleep(Math.min(8_000, 400 * 2 ** attempt))\n continue\n }\n throw err\n } finally {\n clearTimeout(timer)\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError))\n}\n","import { getAddress, isAddress } from 'viem'\nimport { matchesAssetFilter } from '../../../agent/support/assetFilter.js'\nimport { pendleCoreFetch } from './api.js'\nimport {\n PENDLE_CHAIN_CACHE_MS,\n PENDLE_ICON_CACHE_MS,\n PENDLE_LISTING_CAP,\n PENDLE_LISTING_MAX_PAGES,\n parsePendleAssetId,\n pendleAssetId,\n} from './support.js'\n\nexport type PendlePointCampaign = {\n name: string\n type: string | null\n pendleAsset: string | null\n value: number | null\n}\n\nexport type PendleMarketRow = {\n chainId: number\n name: string\n address: string\n expiry: string | null\n pt: string\n yt: string\n sy: string\n underlying: string\n underlyingSymbol: string | null\n ptSymbol: string | null\n ytSymbol: string | null\n impliedApy: number | null\n tvlUsd: number | null\n liquidityUsd: number | null\n points: PendlePointCampaign[]\n}\n\nexport type PendleAssetRow = {\n id: string\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n expiry: string | null\n}\n\ntype IconCache = { at: number; addresses: Set<string> }\nconst iconCacheByChain = new Map<number, IconCache>()\ntype MarketsCache = { at: number; rows: PendleMarketRow[] }\nconst marketsCacheByChain = new Map<number, MarketsCache>()\nlet chainIdsCache: { at: number; chainIds: number[] } | null = null\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nfunction asNumber(v: unknown): number | null {\n if (typeof v === 'number' && Number.isFinite(v)) return v\n if (typeof v === 'string' && v.trim()) {\n const n = Number.parseFloat(v)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\nfunction asString(v: unknown): string | null {\n if (typeof v === 'string' && v.trim()) return v.trim()\n return null\n}\n\nfunction asExpiry(v: unknown): string | null {\n const s = asString(v)\n if (s) return s\n const n = asNumber(v)\n if (n == null) return null\n const ms = n < 1e12 ? n * 1000 : n\n return new Date(ms).toISOString()\n}\n\nexport function pendleMarketExpiryMs(expiry: string | null | undefined): number | null {\n const raw = (expiry ?? '').trim()\n if (!raw) return null\n if (/^\\d+$/.test(raw)) {\n const n = Number(raw)\n return n < 1e12 ? n * 1000 : n\n }\n const t = Date.parse(raw)\n return Number.isFinite(t) ? t : null\n}\n\nexport function isPendleMarketExpired(row: { expiry: string | null }, nowMs = Date.now()): boolean {\n const t = pendleMarketExpiryMs(row.expiry)\n if (t == null) return false\n return t <= nowMs\n}\n\n/** Mint PY, YT/PT swap, and add LP revert after maturity. Redeem PT / remove LP / SY / rewards stay valid. */\nexport function pendleActionNeedsLiveMarket(\n kind: 'swap' | 'mintPy' | 'redeemPy' | 'mintSy' | 'redeemSy' | 'addLiquidity' | 'removeLiquidity' | 'redeemRewards' | string,\n): boolean {\n return kind === 'swap' || kind === 'mintPy' || kind === 'addLiquidity'\n}\n\nfunction marketMatchesPin(row: PendleMarketRow, address: string): boolean {\n const a = address.trim().toLowerCase()\n if (!a) return false\n return [row.address, row.pt, row.yt, row.sy].some((x) => x.toLowerCase() === a)\n}\n\nexport function selectPendleListingMarkets(\n rows: PendleMarketRow[],\n args: {\n nowMs?: number\n cap?: number\n query?: string\n pointsOnly?: boolean\n includeAddresses?: string[]\n includeExpired?: boolean\n } = {},\n): PendleMarketRow[] {\n const nowMs = args.nowMs ?? Date.now()\n const cap = args.cap ?? PENDLE_LISTING_CAP\n const pins = (args.includeAddresses ?? []).map((a) => a.trim().toLowerCase()).filter(Boolean)\n const q = (args.query ?? '').trim()\n let out = rows.filter((r) => {\n const pinned = pins.some((p) => marketMatchesPin(r, p))\n if (!args.includeExpired && !pinned && isPendleMarketExpired(r, nowMs)) return false\n if (args.pointsOnly && r.points.length === 0) return false\n if (q && !marketMatchesQuery(r, q)) return false\n return true\n })\n out.sort(sortPendleMarketsByTvl)\n return out.slice(0, cap)\n}\n\nfunction addressFromAssetIdOrHex(raw: unknown, fallbackChainId: number): string | null {\n if (typeof raw !== 'string' || !raw.trim()) return null\n const parsed = parsePendleAssetId(raw)\n if (parsed) {\n try {\n return getAddress(parsed.address as `0x${string}`)\n } catch {\n return parsed.address.toLowerCase()\n }\n }\n if (isAddress(raw)) return getAddress(raw)\n if (raw.startsWith(`${fallbackChainId}-`)) {\n const rest = raw.slice(String(fallbackChainId).length + 1)\n if (isAddress(rest)) return getAddress(rest)\n }\n return null\n}\n\nfunction parsePoints(raw: unknown): PendlePointCampaign[] {\n if (!Array.isArray(raw)) return []\n const out: PendlePointCampaign[] = []\n for (const item of raw) {\n const o = asRecord(item)\n if (!o) continue\n const name = asString(o.name) ?? asString(o.key) ?? asString(o.pointName)\n if (!name) continue\n out.push({\n name,\n type: asString(o.type),\n pendleAsset: asString(o.pendleAsset),\n value: asNumber(o.value),\n })\n }\n return out\n}\n\nexport function marketTvlUsd(row: PendleMarketRow): number {\n return row.tvlUsd ?? row.liquidityUsd ?? 0\n}\n\nexport function sortPendleMarketsByTvl(a: PendleMarketRow, b: PendleMarketRow): number {\n const d = marketTvlUsd(b) - marketTvlUsd(a)\n if (d !== 0) return d\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\nexport function parsePendleMarket(raw: unknown): PendleMarketRow | null {\n const o = asRecord(raw)\n if (!o) return null\n const chainId = asNumber(o.chainId)\n const address = addressFromAssetIdOrHex(o.address, chainId ?? 0)\n if (chainId == null || !address) return null\n const details = asRecord(o.details)\n const tvl =\n asNumber(o.tvl) ??\n asNumber(details?.tvl) ??\n asNumber(details?.totalTvl) ??\n asNumber(asRecord(details?.liquidity)?.usd)\n const liquidity =\n asNumber(o.liquidity) ??\n asNumber(details?.liquidity) ??\n asNumber(asRecord(details?.liquidity)?.usd)\n const impliedApy =\n asNumber(o.impliedApy) ?? asNumber(details?.impliedApy) ?? asNumber(asRecord(o.pt)?.impliedApy)\n const pt = addressFromAssetIdOrHex(o.pt ?? asRecord(o.pt)?.address ?? asRecord(o.pt)?.id, chainId)\n const yt = addressFromAssetIdOrHex(o.yt ?? asRecord(o.yt)?.address ?? asRecord(o.yt)?.id, chainId)\n const sy = addressFromAssetIdOrHex(o.sy ?? asRecord(o.sy)?.address ?? asRecord(o.sy)?.id, chainId)\n const underlying = addressFromAssetIdOrHex(\n o.underlyingAsset ?? o.underlying ?? asRecord(o.underlyingAsset)?.address,\n chainId,\n )\n if (!pt || !yt || !sy || !underlying) return null\n const expired = asExpiry(o.expiry) ?? asExpiry(details?.expiry)\n return {\n chainId,\n name: asString(o.name) ?? asString(o.proSymbol) ?? `${address.slice(0, 8)}…`,\n address,\n expiry: expired,\n pt,\n yt,\n sy,\n underlying,\n underlyingSymbol: asString(asRecord(o.underlyingAsset)?.symbol) ?? asString(o.underlyingSymbol),\n ptSymbol: asString(asRecord(o.pt)?.symbol) ?? asString(o.ptSymbol),\n ytSymbol: asString(asRecord(o.yt)?.symbol) ?? asString(o.ytSymbol),\n impliedApy,\n tvlUsd: tvl,\n liquidityUsd: liquidity,\n points: parsePoints(o.points ?? details?.points),\n }\n}\n\nexport function parsePendleAsset(raw: unknown): PendleAssetRow | null {\n const o = asRecord(raw)\n if (!o) return null\n const chainId = asNumber(o.chainId)\n const address = addressFromAssetIdOrHex(o.address ?? o.id, chainId ?? 0)\n if (chainId == null || !address) return null\n const decimals = asNumber(o.decimals)\n return {\n id: asString(o.id) ?? pendleAssetId(chainId, address),\n chainId,\n address,\n symbol: asString(o.symbol) ?? '—',\n name: asString(o.name) ?? asString(o.symbol) ?? '—',\n decimals: decimals != null && decimals >= 0 ? Math.floor(decimals) : 18,\n expiry: asString(o.expiry),\n }\n}\n\nexport async function pendleFetchSupportedChainIds(): Promise<number[]> {\n const now = Date.now()\n if (chainIdsCache && now - chainIdsCache.at < PENDLE_CHAIN_CACHE_MS) return chainIdsCache.chainIds\n const json = await pendleCoreFetch<{ chainIds?: unknown }>({ path: '/v1/chains' })\n const ids = Array.isArray(json.chainIds)\n ? json.chainIds.map((n) => Number(n)).filter((n) => Number.isFinite(n) && n > 0)\n : []\n chainIdsCache = { at: now, chainIds: ids }\n return ids\n}\n\nexport async function isPendleChainSupported(chainId: number): Promise<boolean> {\n try {\n const ids = await pendleFetchSupportedChainIds()\n if (ids.length === 0) return true\n return ids.includes(chainId)\n } catch {\n return true\n }\n}\n\nexport async function pendleFetchMarketsPage(args: {\n skip?: number\n limit?: number\n chainId?: number\n}): Promise<PendleMarketRow[]> {\n const limit = Math.min(PENDLE_LISTING_CAP, Math.max(1, args.limit ?? PENDLE_LISTING_CAP))\n const json = await pendleCoreFetch<{ markets?: unknown; results?: unknown }>({\n path: '/v2/markets/all',\n query: {\n skip: args.skip ?? 0,\n limit,\n ...(args.chainId != null ? { chainId: args.chainId } : {}),\n },\n })\n const raw = Array.isArray(json.markets) ? json.markets : Array.isArray(json.results) ? json.results : []\n const rows: PendleMarketRow[] = []\n for (const item of raw) {\n const row = parsePendleMarket(item)\n if (row) rows.push(row)\n }\n return rows\n}\n\nexport async function pendleFetchMarketsForChain(chainId: number): Promise<PendleMarketRow[]> {\n const now = Date.now()\n const cached = marketsCacheByChain.get(chainId)\n if (cached && now - cached.at < PENDLE_ICON_CACHE_MS) return cached.rows\n const rows: PendleMarketRow[] = []\n for (let page = 0; page < PENDLE_LISTING_MAX_PAGES; page++) {\n const batch = await pendleFetchMarketsPage({\n skip: page * PENDLE_LISTING_CAP,\n limit: PENDLE_LISTING_CAP,\n chainId,\n })\n const onChain = batch.filter((r) => r.chainId === chainId)\n rows.push(...onChain)\n if (batch.length < PENDLE_LISTING_CAP || onChain.length === 0) break\n }\n marketsCacheByChain.set(chainId, { at: now, rows })\n return rows\n}\n\nfunction marketMatchesQuery(row: PendleMarketRow, query: string): boolean {\n const q = query.trim()\n if (!q) return true\n if (\n matchesAssetFilter({ address: row.address, symbol: row.name, filter: q }) ||\n matchesAssetFilter({ address: row.pt, symbol: row.ptSymbol ?? undefined, filter: q }) ||\n matchesAssetFilter({ address: row.yt, symbol: row.ytSymbol ?? undefined, filter: q }) ||\n matchesAssetFilter({ address: row.sy, filter: q }) ||\n matchesAssetFilter({ address: row.underlying, symbol: row.underlyingSymbol ?? undefined, filter: q })\n ) {\n return true\n }\n const hay = `${row.name} ${row.ptSymbol ?? ''} ${row.ytSymbol ?? ''} ${row.underlyingSymbol ?? ''}`.toLowerCase()\n return hay.includes(q.toLowerCase())\n}\n\nexport async function pendleFetchMarketsSummary(args: {\n chainId: number\n query?: string\n pointsOnly?: boolean\n includeAddresses?: string[]\n}): Promise<{ chainId: number; markets: PendleMarketRow[]; notes: string }> {\n if (!(await isPendleChainSupported(args.chainId))) {\n return {\n chainId: args.chainId,\n markets: [],\n notes: `Pendle Core API does not list chain ${args.chainId}.`,\n }\n }\n const scanned = await pendleFetchMarketsForChain(args.chainId)\n const rows = selectPendleListingMarkets(scanned, {\n query: args.query,\n pointsOnly: args.pointsOnly,\n includeAddresses: args.includeAddresses,\n })\n const expiredOmitted = scanned.filter((r) => isPendleMarketExpired(r)).length\n return {\n chainId: args.chainId,\n markets: rows,\n notes:\n `Top ${rows.length} active Pendle markets on chain ${args.chainId} by TVL/liquidity ` +\n `(scanned ${scanned.length}, omitted ${expiredOmitted} matured). ` +\n `Use ctm_pendle_search_assets for long-tail or expired markets (PT redeem / remove LP). Do not web-search Pendle APYs.`,\n }\n}\n\nexport async function pendleFetchAssetsByIds(ids: string[]): Promise<PendleAssetRow[]> {\n if (ids.length === 0) return []\n const json = await pendleCoreFetch<{ assets?: unknown }>({\n path: '/v1/assets/all',\n query: { ids: ids.slice(0, 20).join(',') },\n })\n const raw = Array.isArray(json.assets) ? json.assets : []\n const out: PendleAssetRow[] = []\n for (const item of raw) {\n const row = parsePendleAsset(item)\n if (row) out.push(row)\n }\n return out\n}\n\nexport async function pendleFetchPricesSummary(args: {\n chainId: number\n ids?: string[]\n query?: string\n}): Promise<{ chainId: number; prices: { id: string; usd: number | null }[]; notes: string }> {\n let ids = (args.ids ?? []).map((s) => s.trim()).filter(Boolean)\n if (ids.length === 0) {\n const listed = await pendleFetchMarketsSummary({ chainId: args.chainId, query: args.query })\n ids = listed.markets.flatMap((m) => [\n pendleAssetId(m.chainId, m.pt),\n pendleAssetId(m.chainId, m.yt),\n pendleAssetId(m.chainId, m.sy),\n pendleAssetId(m.chainId, m.address),\n pendleAssetId(m.chainId, m.underlying),\n ])\n }\n if (ids.length === 0) {\n return { chainId: args.chainId, prices: [], notes: 'No asset ids to price.' }\n }\n const json = await pendleCoreFetch<{\n priceMap?: Record<string, { usd?: unknown; price?: unknown } | number>\n prices?: unknown\n errors?: unknown\n }>({\n path: '/v1/prices/assets',\n query: { ids: ids.slice(0, 80).join(',') },\n })\n const prices: { id: string; usd: number | null }[] = []\n const map = json.priceMap ?? {}\n for (const id of ids.slice(0, 80)) {\n const entry = map[id] ?? map[id.toLowerCase()]\n if (typeof entry === 'number') {\n prices.push({ id, usd: Number.isFinite(entry) ? entry : null })\n } else if (entry && typeof entry === 'object') {\n prices.push({ id, usd: asNumber((entry as { usd?: unknown }).usd ?? (entry as { price?: unknown }).price) })\n } else {\n prices.push({ id, usd: null })\n }\n }\n return {\n chainId: args.chainId,\n prices,\n notes: 'USD prices from GET /v1/prices/assets for the current listing or supplied ids only.',\n }\n}\n\nexport function collectPendleMarketAddresses(row: PendleMarketRow): string[] {\n return [row.address, row.pt, row.yt, row.sy, row.underlying].map((a) => a.toLowerCase())\n}\n\nexport async function pendleIconAddressesForChain(chainId: number): Promise<string[]> {\n const now = Date.now()\n const cached = iconCacheByChain.get(chainId)\n if (cached && now - cached.at < PENDLE_ICON_CACHE_MS) return [...cached.addresses]\n const addrs = new Set<string>()\n const rows = await pendleFetchMarketsForChain(chainId)\n for (const row of rows) {\n for (const a of collectPendleMarketAddresses(row)) addrs.add(a)\n }\n try {\n const pendleHits = await pendleSearchAssets({ chainId, query: 'PENDLE' })\n for (const row of pendleHits.results) {\n for (const a of collectPendleMarketAddresses(row)) addrs.add(a)\n }\n } catch {\n /* listing addresses are enough for icons */\n }\n iconCacheByChain.set(chainId, { at: now, addresses: addrs })\n return [...addrs]\n}\n\nexport async function pendleSearchAssets(args: {\n chainId: number\n query: string\n}): Promise<{ chainId: number; results: PendleMarketRow[]; notes: string }> {\n const q = args.query.trim()\n if (!q) throw new Error('query is required.')\n if (!(await isPendleChainSupported(args.chainId))) {\n return { chainId: args.chainId, results: [], notes: `Pendle is not listed on chain ${args.chainId}.` }\n }\n\n const parsedId = parsePendleAssetId(q)\n if (parsedId || isAddress(q)) {\n const id = parsedId ? pendleAssetId(parsedId.chainId, parsedId.address) : pendleAssetId(args.chainId, q)\n try {\n const json = await pendleCoreFetch<{ markets?: unknown }>({\n path: '/v1/markets/all',\n query: { ids: id, chainId: args.chainId },\n })\n const raw = Array.isArray(json.markets) ? json.markets : []\n const exact: PendleMarketRow[] = []\n for (const item of raw) {\n const row = parsePendleMarket(item)\n if (row && row.chainId === args.chainId) exact.push(row)\n }\n if (exact.length) {\n exact.sort(sortPendleMarketsByTvl)\n const live = exact.filter((r) => !isPendleMarketExpired(r))\n if (live.length) {\n return {\n chainId: args.chainId,\n results: live,\n notes: 'Exact market/asset id lookup via GET /v1/markets/all?ids= (active only).',\n }\n }\n return {\n chainId: args.chainId,\n results: exact,\n notes: 'Exact market/asset id lookup — matured (redeem PT or remove LP only).',\n }\n }\n } catch {\n /* fall through to paginated search */\n }\n }\n\n const scanned = await pendleFetchMarketsForChain(args.chainId)\n const activeHits = selectPendleListingMarkets(scanned, { query: q })\n if (activeHits.length > 0) {\n return {\n chainId: args.chainId,\n results: activeHits,\n notes: `Matched ${activeHits.length} active market(s) for ${q} on chain ${args.chainId}.`,\n }\n }\n const expiredHits = selectPendleListingMarkets(scanned, { query: q, includeExpired: true }).filter((r) =>\n isPendleMarketExpired(r),\n )\n if (expiredHits.length > 0) {\n return {\n chainId: args.chainId,\n results: expiredHits,\n notes:\n `No live market matched ${q}. Showing ${expiredHits.length} matured market(s) ` +\n `(redeem PT or remove LP only — mint / YT swap / add LP will fail).`,\n }\n }\n return {\n chainId: args.chainId,\n results: [],\n notes: `No Pendle market on chain ${args.chainId} matched ${q}.`,\n }\n}\n","import { createPublicClient, defineChain, getAddress, http, parseAbi, parseUnits } from 'viem'\nimport { pendleCoreFetch } from './api.js'\nimport { pendleFetchAssetsByIds } from './discover.js'\nimport {\n PENDLE_NATIVE_PLACEHOLDER,\n isPendleNativeToken,\n normalizePendleTokenAddress,\n pendleAssetId,\n} from './support.js'\n\nexport type PendleTokenAmount = { token: string; amount: string }\n\nexport type PendleConvertTx = {\n to: string\n data: `0x${string}`\n value: string\n from?: string\n}\n\nexport type PendleConvertQuote = {\n action: string\n inputs: PendleTokenAmount[]\n outputs: PendleTokenAmount[]\n requiredApprovals: PendleTokenAmount[]\n priceImpact: number | null\n impliedApyBefore: number | null\n impliedApyAfter: number | null\n effectiveApy: number | null\n tx: PendleConvertTx\n}\n\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nfunction asString(v: unknown): string | null {\n return typeof v === 'string' && v.trim() ? v.trim() : null\n}\n\nfunction asNumber(v: unknown): number | null {\n if (typeof v === 'number' && Number.isFinite(v)) return v\n if (typeof v === 'string' && v.trim()) {\n const n = Number.parseFloat(v)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\nexport type PendleConvertActionKind =\n | 'swap'\n | 'mint_py'\n | 'redeem_py'\n | 'mint_sy'\n | 'redeem_sy'\n | 'add_liquidity'\n | 'remove_liquidity'\n | 'convert'\n\n/** Infer Convert action from token sets. Market / PT / YT / SY roles come from the catalog, never constants. */\nexport function classifyPendleConvertAction(args: {\n tokensIn: string[]\n tokensOut: string[]\n roles?: { market?: string; pt?: string; yt?: string; sy?: string }\n}): PendleConvertActionKind {\n const norm = (s: string) => s.trim().toLowerCase()\n const ins = args.tokensIn.map(norm)\n const outs = args.tokensOut.map(norm)\n const market = args.roles?.market?.trim().toLowerCase()\n const pt = args.roles?.pt?.trim().toLowerCase()\n const yt = args.roles?.yt?.trim().toLowerCase()\n const sy = args.roles?.sy?.trim().toLowerCase()\n if (market && ins.includes(market)) return 'remove_liquidity'\n if (market && outs.includes(market)) return 'add_liquidity'\n if (pt && yt && outs.includes(pt) && outs.includes(yt)) return 'mint_py'\n if (pt && yt && ins.includes(pt) && ins.includes(yt)) return 'redeem_py'\n if (sy && outs.includes(sy) && !ins.includes(sy)) return 'mint_sy'\n if (sy && ins.includes(sy) && !outs.includes(sy)) return 'redeem_sy'\n if (ins.length === 1 && outs.length === 1) return 'swap'\n return 'convert'\n}\n\nexport function slippagePercentToConvert(slippagePercent: number): number {\n if (!Number.isFinite(slippagePercent) || slippagePercent <= 0 || slippagePercent >= 100) {\n throw new Error('Slippage must be between 0 and 100 (exclusive).')\n }\n return slippagePercent / 100\n}\n\nexport async function resolvePendleTokenDecimals(args: {\n chainId: number\n rpcUrl?: string\n token: string\n decimals?: number\n}): Promise<number> {\n if (args.decimals != null && Number.isInteger(args.decimals) && args.decimals >= 0 && args.decimals <= 18) {\n return args.decimals\n }\n if (isPendleNativeToken(args.token)) return 18\n const id = pendleAssetId(args.chainId, normalizePendleTokenAddress(args.token))\n try {\n const assets = await pendleFetchAssetsByIds([id])\n if (assets[0]) return assets[0].decimals\n } catch {\n /* on-chain fallback */\n }\n if (!args.rpcUrl?.trim()) return 18\n const addr = getAddress(args.token as `0x${string}`)\n const ch = defineChain({\n id: args.chainId,\n name: 'PendleDecimals',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const d = await client.readContract({ address: addr, abi: erc20DecimalsAbi, functionName: 'decimals' })\n return Number(d)\n}\n\nexport function parsePendleConvertResponse(raw: unknown): PendleConvertQuote {\n const root = asRecord(raw)\n if (!root) throw new Error('Pendle convert returned an empty body.')\n const routes = Array.isArray(root.routes) ? root.routes : []\n const route = asRecord(routes[0]) ?? root\n const txRaw = asRecord(route.tx) ?? asRecord(root.tx)\n if (!txRaw) throw new Error('Pendle convert response missing routes[0].tx.')\n const to = asString(txRaw.to)\n const data = asString(txRaw.data)\n if (!to || !data) throw new Error('Pendle convert tx is missing to/data. Use the API tx — do not hardcode a router.')\n const dataHex = (data.startsWith('0x') ? data : `0x${data}`) as `0x${string}`\n const value = asString(txRaw.value) ?? '0'\n const dataObj = asRecord(route.data) ?? asRecord(root.data)\n const implied = asRecord(dataObj?.impliedApy)\n const parseAmounts = (v: unknown): PendleTokenAmount[] => {\n if (!Array.isArray(v)) return []\n const out: PendleTokenAmount[] = []\n for (const item of v) {\n const o = asRecord(item)\n const token = asString(o?.token)\n const amount = asString(o?.amount)\n if (token && amount) out.push({ token, amount })\n }\n return out\n }\n return {\n action: asString(root.action) ?? asString(route.action) ?? 'convert',\n inputs: parseAmounts(root.inputs ?? route.inputs),\n outputs: parseAmounts(route.outputs ?? root.outputs),\n requiredApprovals: parseAmounts(root.requiredApprovals ?? route.requiredApprovals),\n priceImpact: asNumber(dataObj?.priceImpact),\n impliedApyBefore: asNumber(implied?.before),\n impliedApyAfter: asNumber(implied?.after),\n effectiveApy: asNumber(dataObj?.effectiveApy),\n tx: {\n to: getAddress(to as `0x${string}`),\n data: dataHex,\n value,\n from: asString(txRaw.from) ?? undefined,\n },\n }\n}\n\nexport async function pendleConvert(args: {\n chainId: number\n receiver: string\n slippagePercent: number\n tokensIn: { token: string; amountWei: string }[]\n tokensOut: string[]\n enableAggregator?: boolean\n additionalData?: string\n}): Promise<PendleConvertQuote> {\n if (args.tokensIn.length === 0) throw new Error('tokensIn is required.')\n if (args.tokensOut.length === 0) throw new Error('tokensOut is required.')\n const receiver = getAddress(args.receiver as `0x${string}`)\n const body = {\n receiver,\n slippage: slippagePercentToConvert(args.slippagePercent),\n enableAggregator: args.enableAggregator === true,\n inputs: args.tokensIn.map((t) => ({\n token: normalizePendleTokenAddress(t.token),\n amount: t.amountWei,\n })),\n outputs: args.tokensOut.map((t) => normalizePendleTokenAddress(t)),\n additionalData: args.additionalData ?? 'impliedApy,effectiveApy',\n }\n const json = await pendleCoreFetch<unknown>({\n path: `/v3/sdk/${args.chainId}/convert`,\n method: 'POST',\n body,\n })\n return parsePendleConvertResponse(json)\n}\n\nexport async function pendleQuoteConvert(args: {\n chainId: number\n rpcUrl?: string\n receiver?: string\n slippagePercent: number\n tokensIn: { token: string; amountHuman: string; decimals?: number }[]\n tokensOut: string[]\n enableAggregator?: boolean\n}): Promise<PendleConvertQuote> {\n const receiver = args.receiver?.trim() || PENDLE_NATIVE_PLACEHOLDER\n const tokensIn: { token: string; amountWei: string }[] = []\n for (const t of args.tokensIn) {\n const decimals = await resolvePendleTokenDecimals({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n token: t.token,\n decimals: t.decimals,\n })\n tokensIn.push({\n token: t.token,\n amountWei: parseUnits(t.amountHuman.trim(), decimals).toString(),\n })\n }\n return pendleConvert({\n chainId: args.chainId,\n receiver,\n slippagePercent: args.slippagePercent,\n tokensIn,\n tokensOut: args.tokensOut,\n enableAggregator: args.enableAggregator,\n })\n}\n\nexport async function pendleQuoteSwap(args: {\n chainId: number\n rpcUrl?: string\n tokenIn: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n enableAggregator?: boolean\n tokenInDecimals?: number\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.tokenIn, amountHuman: args.amountHuman, decimals: args.tokenInDecimals }],\n tokensOut: [args.tokenOut],\n enableAggregator: args.enableAggregator,\n })\n}\n\nexport async function pendleQuoteMintPy(args: {\n chainId: number\n rpcUrl?: string\n tokenIn: string\n pt: string\n yt: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n tokenInDecimals?: number\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.tokenIn, amountHuman: args.amountHuman, decimals: args.tokenInDecimals }],\n tokensOut: [args.pt, args.yt],\n })\n}\n\nexport async function pendleQuoteRedeemPy(args: {\n chainId: number\n rpcUrl?: string\n pt: string\n yt: string\n tokenOut: string\n amountPtHuman: string\n amountYtHuman?: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n const tokensIn = [{ token: args.pt, amountHuman: args.amountPtHuman }]\n const ytAmt = (args.amountYtHuman ?? args.amountPtHuman).trim()\n if (ytAmt && ytAmt !== '0') tokensIn.push({ token: args.yt, amountHuman: ytAmt })\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn,\n tokensOut: [args.tokenOut],\n })\n}\n\nexport async function pendleQuoteMintSy(args: {\n chainId: number\n rpcUrl?: string\n tokenIn: string\n sy: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.tokenIn, amountHuman: args.amountHuman }],\n tokensOut: [args.sy],\n })\n}\n\nexport async function pendleQuoteRedeemSy(args: {\n chainId: number\n rpcUrl?: string\n sy: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.sy, amountHuman: args.amountHuman }],\n tokensOut: [args.tokenOut],\n })\n}\n\nexport async function pendleQuoteAddLiquidity(args: {\n chainId: number\n rpcUrl?: string\n tokensIn: { token: string; amountHuman: string }[]\n market: string\n keepYt?: boolean\n yt?: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n const tokensOut = [args.market]\n if (args.keepYt) {\n if (!args.yt?.trim()) throw new Error('yt is required for zero-price-impact (keep YT) add liquidity.')\n tokensOut.push(args.yt)\n }\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: args.tokensIn,\n tokensOut,\n })\n}\n\nexport async function pendleQuoteRemoveLiquidity(args: {\n chainId: number\n rpcUrl?: string\n market: string\n lpAmountHuman: string\n tokensOut: string[]\n slippagePercent: number\n receiver?: string\n enableAggregator?: boolean\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.market, amountHuman: args.lpAmountHuman }],\n tokensOut: args.tokensOut,\n enableAggregator: args.enableAggregator,\n })\n}\n","export function buildPendlePurposePrefill(args: {\n action: string\n detail: string\n chainId: number\n slippagePercent?: number\n}): string {\n const act = (args.action || 'convert').trim()\n const detail = (args.detail || '').trim()\n const slip =\n args.slippagePercent != null && Number.isFinite(args.slippagePercent)\n ? ` (max slippage ${args.slippagePercent}%)`\n : ''\n return `Pendle: ${act} ${detail}${slip} on chain ${args.chainId}`\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","/** Default MPC sign-request agreement window for fast-moving DeFi protocols (30 minutes). */\nexport const DEFAULT_DEFI_MULTISIGN_EXPIRY_SECONDS = 30 * 60\n\n/** Protocol ids that default to 30-minute expiry when `expiryDate` is omitted on multisign MCP tools. */\nexport const DEFI_PROTOCOLS_WITH_30MIN_EXPIRY = new Set([\n 'uniswap-v4',\n 'gmx',\n 'hyperliquid',\n 'arcus',\n 'curve-dao',\n 'aerodrome',\n 'pendle',\n])\n\nexport function defiMultisignExpiryUnixSeconds(\n protocolId: string | undefined,\n explicitExpiryDate?: number | null,\n): number | undefined {\n if (typeof explicitExpiryDate === 'number' && Number.isFinite(explicitExpiryDate) && explicitExpiryDate > 0) {\n return Math.floor(explicitExpiryDate)\n }\n if (protocolId && DEFI_PROTOCOLS_WITH_30MIN_EXPIRY.has(protocolId)) {\n return Math.floor(Date.now() / 1000) + DEFAULT_DEFI_MULTISIGN_EXPIRY_SECONDS\n }\n return undefined\n}\n","import { createPublicClient, defineChain, encodeFunctionData, getAddress, http, parseAbi, type Address } from 'viem'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { routerSwapGasLimitFromEstimate } from '../../../chains/evm/routerSwapGas.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { defiMultisignExpiryUnixSeconds } from '../../../core/expiry.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport {\n pendleQuoteAddLiquidity,\n pendleQuoteConvert,\n pendleQuoteMintPy,\n pendleQuoteMintSy,\n pendleQuoteRedeemPy,\n pendleQuoteRedeemSy,\n pendleQuoteRemoveLiquidity,\n pendleQuoteSwap,\n type PendleConvertQuote,\n} from './convert.js'\nimport { buildPendlePurposePrefill } from './purpose.js'\nimport { PENDLE_CONVERT_DEFAULT_GAS_UNITS, PENDLE_PROTOCOL_ID, isPendleNativeToken } from './support.js'\n\ntype PendleStep = EvmTxStep & { kind: 'approve' | 'convert'; routerSwap?: boolean; fallbackGas?: bigint }\n\nconst erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\n\nfunction txValueWei(raw: string): bigint {\n try {\n return BigInt(raw)\n } catch {\n return 0n\n }\n}\n\nasync function approveStepsIfNeeded(args: {\n rpcUrl: string\n chainId: number\n owner: Address\n spender: Address\n approvals: { token: string; amount: string }[]\n}): Promise<PendleStep[]> {\n const steps: PendleStep[] = []\n const ch = defineChain({\n id: args.chainId,\n name: 'PendleApprove',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n for (const a of args.approvals) {\n if (isPendleNativeToken(a.token)) continue\n const token = getAddress(a.token as `0x${string}`)\n const amountWei = BigInt(a.amount)\n const allowance = await client.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [args.owner, args.spender],\n })\n if (allowance >= amountWei) continue\n if (allowance > 0n) {\n steps.push({\n to: token,\n data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n kind: 'approve',\n fallbackGas: 80_000n,\n })\n }\n steps.push({\n to: token,\n data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [args.spender, amountWei] }),\n value: 0n,\n kind: 'approve',\n fallbackGas: 80_000n,\n })\n }\n return steps\n}\n\nexport function isPendleConvertEvmSignRequest(extra: Record<string, unknown> | null | undefined): boolean {\n const evm = extra?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n const t = String((evm as { type?: unknown }).type ?? '')\n return t.startsWith('pendle_')\n}\n\nexport async function buildEvmMultisignBodyPendleFromConvert(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address | string\n purposeText: string\n expiryDate?: number\n quote: PendleConvertQuote\n purposeAction: string\n}): Promise<ReturnType<typeof buildEvmMultisignBatch>> {\n const executor = getAddress(args.executorAddress as `0x${string}`)\n const spender = getAddress(args.quote.tx.to as `0x${string}`)\n const steps: PendleStep[] = [\n ...(await approveStepsIfNeeded({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n owner: executor,\n spender,\n approvals: args.quote.requiredApprovals,\n })),\n {\n to: spender,\n data: args.quote.tx.data,\n value: txValueWei(args.quote.tx.value),\n kind: 'convert',\n routerSwap: true,\n fallbackGas: PENDLE_CONVERT_DEFAULT_GAS_UNITS,\n },\n ]\n const expiryDate = defiMultisignExpiryUnixSeconds(PENDLE_PROTOCOL_ID, args.expiryDate)\n const purposeText = args.purposeText.trim() || buildPendlePurposePrefill({\n action: args.purposeAction,\n detail: args.quote.action,\n chainId: args.chainId,\n })\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n const first = steps[0]!\n const firstDataNo0x = first.data.startsWith('0x') ? first.data.slice(2) : first.data\n const payableValueWei = steps.reduce((a, s) => a + s.value, 0n)\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n 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 expiryDate,\n },\n steps,\n purposeSuffix:\n steps.length === 1\n ? `Pendle: ${args.purposeAction} via Hosted SDK convert.`\n : `Pendle: approve router from convert tx.to, then ${args.purposeAction}.`,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: first.to,\n payableValueWei: payableValueWei > 0n ? payableValueWei : undefined,\n resolveGasLimit: async ({ step, estimatedGas }) => {\n const s = step as PendleStep\n if (s.routerSwap) return routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n return estimatedGas\n },\n buildBatchMeta: ({ step }) => {\n const s = step as PendleStep\n return {\n evm: {\n type: s.kind === 'approve' ? 'pendle_approve' : `pendle_${args.purposeAction.replace(/\\s+/g, '_')}`,\n version: 1,\n chainId: String(args.chainId),\n convertAction: args.quote.action,\n },\n }\n },\n })\n}\n\nexport type PendleMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address | string\n purposeText: string\n expiryDate?: number\n convertSnapshot?: PendleConvertQuote\n}\n\nexport async function buildEvmMultisignBodyPendleSwapBatch(\n args: PendleMultisignCommon & {\n tokenIn: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n enableAggregator?: boolean\n tokenInDecimals?: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteSwap({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokenIn: args.tokenIn,\n tokenOut: args.tokenOut,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n enableAggregator: args.enableAggregator,\n tokenInDecimals: args.tokenInDecimals,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'swap' })\n}\n\nexport async function buildEvmMultisignBodyPendleMintPyBatch(\n args: PendleMultisignCommon & {\n tokenIn: string\n pt: string\n yt: string\n amountHuman: string\n slippagePercent: number\n tokenInDecimals?: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteMintPy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokenIn: args.tokenIn,\n pt: args.pt,\n yt: args.yt,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n tokenInDecimals: args.tokenInDecimals,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'mint_py' })\n}\n\nexport async function buildEvmMultisignBodyPendleRedeemPyBatch(\n args: PendleMultisignCommon & {\n pt: string\n yt: string\n tokenOut: string\n amountPtHuman: string\n amountYtHuman?: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteRedeemPy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n pt: args.pt,\n yt: args.yt,\n tokenOut: args.tokenOut,\n amountPtHuman: args.amountPtHuman,\n amountYtHuman: args.amountYtHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'redeem_py' })\n}\n\nexport async function buildEvmMultisignBodyPendleMintSyBatch(\n args: PendleMultisignCommon & {\n tokenIn: string\n sy: string\n amountHuman: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteMintSy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokenIn: args.tokenIn,\n sy: args.sy,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'mint_sy' })\n}\n\nexport async function buildEvmMultisignBodyPendleRedeemSyBatch(\n args: PendleMultisignCommon & {\n sy: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteRedeemSy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n sy: args.sy,\n tokenOut: args.tokenOut,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'redeem_sy' })\n}\n\nexport async function buildEvmMultisignBodyPendleAddLiquidityBatch(\n args: PendleMultisignCommon & {\n tokensIn: { token: string; amountHuman: string }[]\n market: string\n keepYt?: boolean\n yt?: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteAddLiquidity({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokensIn: args.tokensIn,\n market: args.market,\n keepYt: args.keepYt,\n yt: args.yt,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'add_liquidity' })\n}\n\nexport async function buildEvmMultisignBodyPendleRemoveLiquidityBatch(\n args: PendleMultisignCommon & {\n market: string\n lpAmountHuman: string\n tokensOut: string[]\n slippagePercent: number\n enableAggregator?: boolean\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteRemoveLiquidity({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n market: args.market,\n lpAmountHuman: args.lpAmountHuman,\n tokensOut: args.tokensOut,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n enableAggregator: args.enableAggregator,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'remove_liquidity' })\n}\n\nexport async function buildEvmMultisignBodyPendleConvertBatch(\n args: PendleMultisignCommon & {\n tokensIn: { token: string; amountHuman: string }[]\n tokensOut: string[]\n slippagePercent: number\n enableAggregator?: boolean\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: String(args.executorAddress),\n slippagePercent: args.slippagePercent,\n tokensIn: args.tokensIn,\n tokensOut: args.tokensOut,\n enableAggregator: args.enableAggregator,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: quote.action })\n}\n\n","import { getAddress, isAddress } from 'viem'\nimport { pendleCoreFetch } from './api.js'\n\nexport type PendleMerkleRewardRow = {\n user: string\n token: string\n merkleRoot: string\n chainId: number\n assetId: string\n amount: string\n fromTimestamp: string | null\n toTimestamp: string | null\n}\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nexport function parsePendleMerkleRewardRow(raw: unknown): PendleMerkleRewardRow | null {\n const o = asRecord(raw)\n if (!o) return null\n const token = typeof o.token === 'string' ? o.token : ''\n const chainId = Number(o.chainId)\n if (!token || !Number.isFinite(chainId)) return null\n return {\n user: typeof o.user === 'string' ? o.user : '',\n token,\n merkleRoot: typeof o.merkleRoot === 'string' ? o.merkleRoot : '',\n chainId,\n assetId: typeof o.assetId === 'string' ? o.assetId : '',\n amount: String(o.amount ?? ''),\n fromTimestamp: typeof o.fromTimestamp === 'string' ? o.fromTimestamp : null,\n toTimestamp: typeof o.toTimestamp === 'string' ? o.toTimestamp : null,\n }\n}\n\nexport async function pendleFetchMerkleRewards(args: {\n user: string\n}): Promise<{\n user: string\n claimableRewards: PendleMerkleRewardRow[]\n claimedRewards: PendleMerkleRewardRow[]\n notes: string\n}> {\n if (!isAddress(args.user)) throw new Error('user must be an EVM address.')\n const user = getAddress(args.user)\n const json = await pendleCoreFetch<{ claimableRewards?: unknown; claimedRewards?: unknown }>({\n path: `/v1/dashboard/merkle-rewards/${user}`,\n })\n const claimable = Array.isArray(json.claimableRewards)\n ? json.claimableRewards.map(parsePendleMerkleRewardRow).filter((r): r is PendleMerkleRewardRow => r != null)\n : []\n const claimed = Array.isArray(json.claimedRewards)\n ? json.claimedRewards.map(parsePendleMerkleRewardRow).filter((r): r is PendleMerkleRewardRow => r != null)\n : []\n return {\n user,\n claimableRewards: claimable,\n claimedRewards: claimed,\n notes:\n 'Informational airdrop list only. Core does not include claim proofs. Tell the user to claim airdrops on app.pendle.finance. Redeem on-chain SY/YT/LP incentives with ctm_pendle_build_redeem_rewards_multisign.',\n }\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport { pendleCoreFetch } from './api.js'\nimport { isPendleMarketExpired, pendleFetchAssetsByIds, type PendleAssetRow } from './discover.js'\nimport { parsePendleAssetId } from './support.js'\n\nexport type PendleLpHolding = {\n chainId: number\n marketId: string\n market: string\n name: string\n symbol: string\n decimals: number\n expiry: string | null\n matured: boolean\n closed: boolean\n lpBalanceWei: string\n lpAmountHuman: string\n lpUsd: number | null\n ptBalanceWei: string\n ytBalanceWei: string\n}\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nfunction asNumber(v: unknown): number | null {\n if (typeof v === 'number' && Number.isFinite(v)) return v\n if (typeof v === 'string' && v.trim()) {\n const n = Number.parseFloat(v)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\nexport function weiToHumanAmount(wei: string, decimals: number): string {\n try {\n const raw = formatUnits(BigInt(wei), decimals)\n if (!raw.includes('.')) return raw\n return raw.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n } catch {\n return wei\n }\n}\n\nexport function parsePendlePositionToken(raw: unknown): { balanceWei: string; usd: number | null } {\n const o = asRecord(raw)\n if (!o) return { balanceWei: '0', usd: null }\n const balance = o.balance == null ? '0' : String(o.balance)\n return { balanceWei: /^\\d+$/.test(balance) ? balance : '0', usd: asNumber(o.valuation) }\n}\n\nfunction positiveWei(wei: string): boolean {\n try {\n return BigInt(wei) > 0n\n } catch {\n return false\n }\n}\n\nexport function collectPendleMarketPositions(raw: unknown, closed: boolean): Array<{\n marketId: string\n chainId: number\n market: string\n closed: boolean\n lp: { balanceWei: string; usd: number | null }\n pt: { balanceWei: string; usd: number | null }\n yt: { balanceWei: string; usd: number | null }\n}> {\n const o = asRecord(raw)\n if (!o) return []\n const marketId = typeof o.marketId === 'string' ? o.marketId : ''\n const parsed = parsePendleAssetId(marketId)\n if (!parsed) return []\n let market: string\n try {\n market = getAddress(parsed.address as `0x${string}`)\n } catch {\n return []\n }\n const lp = parsePendlePositionToken(o.lp)\n if (!positiveWei(lp.balanceWei)) return []\n return [\n {\n marketId,\n chainId: parsed.chainId,\n market,\n closed,\n lp,\n pt: parsePendlePositionToken(o.pt),\n yt: parsePendlePositionToken(o.yt),\n },\n ]\n}\n\nasync function assetsByIds(ids: string[]): Promise<Map<string, PendleAssetRow>> {\n const out = new Map<string, PendleAssetRow>()\n const unique = [...new Set(ids.map((id) => id.trim()).filter(Boolean))]\n for (let i = 0; i < unique.length; i += 20) {\n const batch = await pendleFetchAssetsByIds(unique.slice(i, i + 20))\n for (const row of batch) out.set(row.id.toLowerCase(), row)\n }\n return out\n}\n\nexport async function pendleFetchPositions(args: {\n user: string\n chainId?: number\n filterUsd?: number\n}): Promise<{ user: string; chainId: number | null; lp: PendleLpHolding[]; notes: string }> {\n if (!isAddress(args.user)) throw new Error('user must be an EVM address.')\n const user = getAddress(args.user)\n const chainId = args.chainId != null && Number.isFinite(args.chainId) ? args.chainId : undefined\n const json = await pendleCoreFetch<{ positions?: unknown }>({\n path: `/v1/dashboard/positions/database/${user}`,\n query: {\n ...(chainId != null ? { chainId } : {}),\n ...(args.filterUsd != null ? { filterUsd: args.filterUsd } : {}),\n },\n })\n const groups = Array.isArray(json.positions) ? json.positions : []\n const collected: ReturnType<typeof collectPendleMarketPositions> = []\n for (const group of groups) {\n const g = asRecord(group)\n if (!g) continue\n const groupChain = asNumber(g.chainId)\n if (chainId != null && groupChain != null && groupChain !== chainId) continue\n for (const row of Array.isArray(g.openPositions) ? g.openPositions : []) {\n collected.push(...collectPendleMarketPositions(row, false))\n }\n for (const row of Array.isArray(g.closedPositions) ? g.closedPositions : []) {\n collected.push(...collectPendleMarketPositions(row, true))\n }\n }\n const scoped = (chainId != null ? collected.filter((r) => r.chainId === chainId) : collected).filter((r) => {\n if (args.filterUsd != null && r.lp.usd != null && r.lp.usd < args.filterUsd) return false\n try {\n return BigInt(r.lp.balanceWei) >= 10n ** 12n || (r.lp.usd != null && r.lp.usd >= (args.filterUsd ?? 0.1))\n } catch {\n return false\n }\n })\n const meta = await assetsByIds(scoped.map((r) => r.marketId))\n const minUsd = args.filterUsd\n const lp: PendleLpHolding[] = []\n for (const row of scoped) {\n const asset = meta.get(row.marketId.toLowerCase())\n const decimals = asset?.decimals ?? 18\n const expiry = asset?.expiry ?? null\n const usd = row.lp.usd\n if (minUsd != null && (usd == null || usd < minUsd)) continue\n lp.push({\n chainId: row.chainId,\n marketId: row.marketId,\n market: row.market,\n name: asset?.name || asset?.symbol || `${row.market.slice(0, 8)}…`,\n symbol: asset?.symbol || 'LP',\n decimals,\n expiry,\n matured: isPendleMarketExpired({ expiry }),\n closed: row.closed,\n lpBalanceWei: row.lp.balanceWei,\n lpAmountHuman: weiToHumanAmount(row.lp.balanceWei, decimals),\n lpUsd: usd,\n ptBalanceWei: row.pt.balanceWei,\n ytBalanceWei: row.yt.balanceWei,\n })\n }\n lp.sort((a, b) => {\n if (a.matured !== b.matured) return a.matured ? 1 : -1\n return (b.lpUsd ?? 0) - (a.lpUsd ?? 0)\n })\n const capped = lp.slice(0, 80)\n const matured = capped.filter((r) => r.matured).length\n return {\n user,\n chainId: chainId ?? null,\n lp: capped,\n notes:\n capped.length === 0\n ? `No Pendle LP for ${user}${chainId != null ? ` on chain ${chainId}` : ''}.`\n : `${capped.length} Pendle LP holding(s)${chainId != null ? ` on chain ${chainId}` : ''}` +\n (lp.length > capped.length ? ` (showing top ${capped.length} of ${lp.length})` : '') +\n (matured ? ` (${matured} matured — remove LP or redeem PT only)` : '') +\n '. Amounts from Core dashboard (not the node token list). Claimable rewards on this snapshot may be up to 24h stale — redeem with ctm_pendle_build_redeem_rewards_multisign.',\n }\n}\n","import { getAddress, type Address } from 'viem'\nimport { pendleCoreFetch } from './api.js'\nimport { parsePendleConvertResponse, type PendleConvertQuote } from './convert.js'\nimport { buildEvmMultisignBodyPendleFromConvert } from './multisign.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\n\nexport async function pendleRedeemInterestsAndRewards(args: {\n chainId: number\n receiver: string\n sys?: string[]\n yts?: string[]\n markets?: string[]\n}): Promise<PendleConvertQuote> {\n const receiver = getAddress(args.receiver as `0x${string}`)\n const json = await pendleCoreFetch<unknown>({\n path: `/v1/sdk/${args.chainId}/redeem-interests-and-rewards`,\n query: {\n receiver,\n sys: args.sys?.length ? args.sys.join(',') : undefined,\n yts: args.yts?.length ? args.yts.join(',') : undefined,\n markets: args.markets?.length ? args.markets.join(',') : undefined,\n },\n })\n return parsePendleConvertResponse(json)\n}\n\nexport async function buildEvmMultisignBodyPendleRedeemRewardsBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address | string\n purposeText: string\n expiryDate?: number\n sys?: string[]\n yts?: string[]\n markets?: string[]\n convertSnapshot?: PendleConvertQuote\n}) {\n const quote =\n args.convertSnapshot ??\n (await pendleRedeemInterestsAndRewards({\n chainId: args.chainId,\n receiver: String(args.executorAddress),\n sys: args.sys,\n yts: args.yts,\n markets: args.markets,\n }))\n return buildEvmMultisignBodyPendleFromConvert({\n ...args,\n quote,\n purposeAction: 'redeem_rewards',\n })\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isPendleChainSupported } from './discover.js'\nimport { PENDLE_PROTOCOL_ID } from './support.js'\n\nexport * from './support.js'\nexport * from './api.js'\nexport * from './discover.js'\nexport * from './convert.js'\nexport * from './purpose.js'\nexport * from './multisign.js'\nexport * from './merkle.js'\nexport * from './positions.js'\nexport * from './redeemRewards.js'\n\nexport { PENDLE_PROTOCOL_ID }\n\nexport const pendleProtocolModule: ProtocolModule = {\n id: PENDLE_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n if (!Number.isFinite(n)) return false\n return isPendleChainSupported(n)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n { id: 'pendle.fetch-markets', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'List live Pendle markets (TVL-ranked, cap 100, matured omitted)', commonParams: [], params: {} },\n { id: 'pendle.search-assets', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Search live PT/YT/SY/underlying (matured only if address-pinned)', commonParams: [], params: {} },\n { id: 'pendle.swap', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Swap token ↔ PT/YT via Hosted SDK convert', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.mint-py', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Mint PT + YT', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.redeem-py', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem PT + YT (PT only after expiry)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.add-liquidity', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Add Pendle AMM liquidity', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.fetch-positions', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'List this wallet’s Pendle LP (including matured)', commonParams: [], params: {} },\n { id: 'pendle.remove-liquidity', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Remove Pendle AMM liquidity', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.redeem-rewards', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem on-chain SY/YT/LP interest and incentives (not merkle airdrops)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(pendleProtocolModule)\n"]}
1
+ {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/agent/support/assetFilter.ts","../../../../src/protocols/evm/pendle/support.ts","../../../../src/protocols/evm/pendle/api.ts","../../../../src/protocols/evm/pendle/discover.ts","../../../../src/core/defiEvmClient.ts","../../../../src/protocols/evm/pendle/convert.ts","../../../../src/protocols/evm/pendle/purpose.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/core/expiry.ts","../../../../src/protocols/evm/pendle/multisign.ts","../../../../src/protocols/evm/pendle/merkle.ts","../../../../src/protocols/evm/pendle/positions.ts","../../../../src/protocols/evm/pendle/redeemRewards.ts","../../../../src/protocols/evm/pendle/index.ts"],"names":["getAddress","isAddress","asRecord","asString","asNumber","defineChain","createPublicClient","gasLimitFromEstimateAndChainConfig","parseAbi"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","import { getAddress, isAddress } from 'viem'\n\n/** Match an optional fetch filter that is either an ERC-20 address or a ticker (USDT). */\nexport function matchesAssetFilter(opts: {\n address?: string\n symbol?: string\n filter?: string\n}): boolean {\n const f = (opts.filter ?? '').trim()\n if (!f) return true\n const addr = (opts.address ?? '').trim()\n if (isAddress(f) && isAddress(addr)) {\n return getAddress(addr) === getAddress(f)\n }\n const sym = (opts.symbol ?? '').trim()\n if (!sym) return false\n return sym.toLowerCase() === f.toLowerCase()\n}\n","export const PENDLE_PROTOCOL_ID = 'pendle'\n\nexport const PENDLE_CORE_API_BASE = 'https://api-v2.pendle.finance/core'\n\n/** Official Hosted SDK / Convert native placeholder. */\nexport const PENDLE_NATIVE_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nexport const PENDLE_LISTING_CAP = 100\n/** `/v2/markets/all` returns oldest first — scan enough pages to find live markets. */\nexport const PENDLE_LISTING_MAX_PAGES = 8\nexport const PENDLE_SEARCH_EXTRA_PAGES = 3\nexport const PENDLE_ICON_CACHE_MS = 12 * 60 * 1000\nexport const PENDLE_CHAIN_CACHE_MS = 30 * 60 * 1000\nexport const PENDLE_CONVERT_DEFAULT_GAS_UNITS = 650_000n\n\nexport function parsePendleAssetId(id: string): { chainId: number; address: string } | null {\n const raw = (id ?? '').trim()\n const dash = raw.indexOf('-')\n if (dash <= 0) return null\n const chainId = Number.parseInt(raw.slice(0, dash), 10)\n const address = raw.slice(dash + 1).trim()\n if (!Number.isFinite(chainId) || chainId <= 0 || !address) return null\n return { chainId, address }\n}\n\nexport function pendleAssetId(chainId: number, address: string): string {\n return `${chainId}-${address.trim().toLowerCase()}`\n}\n\nexport function isPendleNativeToken(token: string): boolean {\n const t = token.trim().toLowerCase()\n return (\n t === 'eth' ||\n t === 'native' ||\n t === PENDLE_NATIVE_PLACEHOLDER.toLowerCase() ||\n t === '0x0000000000000000000000000000000000000000'\n )\n}\n\nexport function normalizePendleTokenAddress(token: string): string {\n if (isPendleNativeToken(token)) return PENDLE_NATIVE_PLACEHOLDER.toLowerCase()\n return token.trim().toLowerCase()\n}\n","import { PENDLE_CORE_API_BASE } from './support.js'\n\nconst FETCH_TIMEOUT_MS = 120_000\n\nexport class PendleApiError extends Error {\n readonly status: number\n readonly path: string\n\n constructor(message: string, status: number, path: string) {\n super(message)\n this.name = 'PendleApiError'\n this.status = status\n this.path = path\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction queryString(params: Record<string, string | number | boolean | undefined>): string {\n const q = new URLSearchParams()\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === '') continue\n q.set(k, String(v))\n }\n const s = q.toString()\n return s ? `?${s}` : ''\n}\n\nexport async function pendleCoreFetch<T>(args: {\n path: string\n method?: 'GET' | 'POST'\n query?: Record<string, string | number | boolean | undefined>\n body?: unknown\n apiKey?: string\n}): Promise<T> {\n const path = args.path.startsWith('/') ? args.path : `/${args.path}`\n const url = `${PENDLE_CORE_API_BASE}${path}${queryString(args.query ?? {})}`\n const headers: Record<string, string> = { Accept: 'application/json' }\n if (args.apiKey?.trim()) headers.Authorization = `Bearer ${args.apiKey.trim()}`\n if (args.body !== undefined) headers['Content-Type'] = 'application/json'\n\n let lastError: unknown\n for (let attempt = 0; attempt < 4; attempt++) {\n const ac = new AbortController()\n const timer = setTimeout(() => ac.abort(), FETCH_TIMEOUT_MS)\n try {\n const res = await fetch(url, {\n method: args.method ?? 'GET',\n headers,\n body: args.body === undefined ? undefined : JSON.stringify(args.body),\n signal: ac.signal,\n })\n if (res.status === 429) {\n const wait = Math.min(8_000, 500 * 2 ** attempt)\n await sleep(wait)\n lastError = new PendleApiError(`Pendle API rate limited (429) on ${path}`, 429, path)\n continue\n }\n const text = await res.text()\n if (!res.ok) {\n throw new PendleApiError(\n `Pendle API ${res.status} ${path}: ${text.slice(0, 400)}`,\n res.status,\n path,\n )\n }\n if (!text.trim()) return {} as T\n return JSON.parse(text) as T\n } catch (err) {\n lastError = err\n if (err instanceof PendleApiError && err.status !== 429) throw err\n if (attempt < 3 && (err instanceof PendleApiError || (err as { name?: string })?.name === 'AbortError')) {\n await sleep(Math.min(8_000, 400 * 2 ** attempt))\n continue\n }\n throw err\n } finally {\n clearTimeout(timer)\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError))\n}\n","import { getAddress, isAddress } from 'viem'\nimport { matchesAssetFilter } from '../../../agent/support/assetFilter.js'\nimport { pendleCoreFetch } from './api.js'\nimport {\n PENDLE_CHAIN_CACHE_MS,\n PENDLE_ICON_CACHE_MS,\n PENDLE_LISTING_CAP,\n PENDLE_LISTING_MAX_PAGES,\n parsePendleAssetId,\n pendleAssetId,\n} from './support.js'\n\nexport type PendlePointCampaign = {\n name: string\n type: string | null\n pendleAsset: string | null\n value: number | null\n}\n\nexport type PendleMarketRow = {\n chainId: number\n name: string\n address: string\n expiry: string | null\n pt: string\n yt: string\n sy: string\n underlying: string\n underlyingSymbol: string | null\n ptSymbol: string | null\n ytSymbol: string | null\n impliedApy: number | null\n tvlUsd: number | null\n liquidityUsd: number | null\n points: PendlePointCampaign[]\n}\n\nexport type PendleAssetRow = {\n id: string\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n expiry: string | null\n}\n\ntype IconCache = { at: number; addresses: Set<string> }\nconst iconCacheByChain = new Map<number, IconCache>()\ntype MarketsCache = { at: number; rows: PendleMarketRow[] }\nconst marketsCacheByChain = new Map<number, MarketsCache>()\nlet chainIdsCache: { at: number; chainIds: number[] } | null = null\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nfunction asNumber(v: unknown): number | null {\n if (typeof v === 'number' && Number.isFinite(v)) return v\n if (typeof v === 'string' && v.trim()) {\n const n = Number.parseFloat(v)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\nfunction asString(v: unknown): string | null {\n if (typeof v === 'string' && v.trim()) return v.trim()\n return null\n}\n\nfunction asExpiry(v: unknown): string | null {\n const s = asString(v)\n if (s) return s\n const n = asNumber(v)\n if (n == null) return null\n const ms = n < 1e12 ? n * 1000 : n\n return new Date(ms).toISOString()\n}\n\nexport function pendleMarketExpiryMs(expiry: string | null | undefined): number | null {\n const raw = (expiry ?? '').trim()\n if (!raw) return null\n if (/^\\d+$/.test(raw)) {\n const n = Number(raw)\n return n < 1e12 ? n * 1000 : n\n }\n const t = Date.parse(raw)\n return Number.isFinite(t) ? t : null\n}\n\nexport function isPendleMarketExpired(row: { expiry: string | null }, nowMs = Date.now()): boolean {\n const t = pendleMarketExpiryMs(row.expiry)\n if (t == null) return false\n return t <= nowMs\n}\n\n/** Mint PY, YT/PT swap, and add LP revert after maturity. Redeem PT / remove LP / SY / rewards stay valid. */\nexport function pendleActionNeedsLiveMarket(\n kind: 'swap' | 'mintPy' | 'redeemPy' | 'mintSy' | 'redeemSy' | 'addLiquidity' | 'removeLiquidity' | 'redeemRewards' | string,\n): boolean {\n return kind === 'swap' || kind === 'mintPy' || kind === 'addLiquidity'\n}\n\nfunction marketMatchesPin(row: PendleMarketRow, address: string): boolean {\n const a = address.trim().toLowerCase()\n if (!a) return false\n return [row.address, row.pt, row.yt, row.sy].some((x) => x.toLowerCase() === a)\n}\n\nexport function selectPendleListingMarkets(\n rows: PendleMarketRow[],\n args: {\n nowMs?: number\n cap?: number\n query?: string\n pointsOnly?: boolean\n includeAddresses?: string[]\n includeExpired?: boolean\n } = {},\n): PendleMarketRow[] {\n const nowMs = args.nowMs ?? Date.now()\n const cap = args.cap ?? PENDLE_LISTING_CAP\n const pins = (args.includeAddresses ?? []).map((a) => a.trim().toLowerCase()).filter(Boolean)\n const q = (args.query ?? '').trim()\n let out = rows.filter((r) => {\n const pinned = pins.some((p) => marketMatchesPin(r, p))\n if (!args.includeExpired && !pinned && isPendleMarketExpired(r, nowMs)) return false\n if (args.pointsOnly && r.points.length === 0) return false\n if (q && !marketMatchesQuery(r, q)) return false\n return true\n })\n out.sort(sortPendleMarketsByTvl)\n return out.slice(0, cap)\n}\n\nfunction addressFromAssetIdOrHex(raw: unknown, fallbackChainId: number): string | null {\n if (typeof raw !== 'string' || !raw.trim()) return null\n const parsed = parsePendleAssetId(raw)\n if (parsed) {\n try {\n return getAddress(parsed.address as `0x${string}`)\n } catch {\n return parsed.address.toLowerCase()\n }\n }\n if (isAddress(raw)) return getAddress(raw)\n if (raw.startsWith(`${fallbackChainId}-`)) {\n const rest = raw.slice(String(fallbackChainId).length + 1)\n if (isAddress(rest)) return getAddress(rest)\n }\n return null\n}\n\nfunction parsePoints(raw: unknown): PendlePointCampaign[] {\n if (!Array.isArray(raw)) return []\n const out: PendlePointCampaign[] = []\n for (const item of raw) {\n const o = asRecord(item)\n if (!o) continue\n const name = asString(o.name) ?? asString(o.key) ?? asString(o.pointName)\n if (!name) continue\n out.push({\n name,\n type: asString(o.type),\n pendleAsset: asString(o.pendleAsset),\n value: asNumber(o.value),\n })\n }\n return out\n}\n\nexport function marketTvlUsd(row: PendleMarketRow): number {\n return row.tvlUsd ?? row.liquidityUsd ?? 0\n}\n\nexport function sortPendleMarketsByTvl(a: PendleMarketRow, b: PendleMarketRow): number {\n const d = marketTvlUsd(b) - marketTvlUsd(a)\n if (d !== 0) return d\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\nexport function parsePendleMarket(raw: unknown): PendleMarketRow | null {\n const o = asRecord(raw)\n if (!o) return null\n const chainId = asNumber(o.chainId)\n const address = addressFromAssetIdOrHex(o.address, chainId ?? 0)\n if (chainId == null || !address) return null\n const details = asRecord(o.details)\n const tvl =\n asNumber(o.tvl) ??\n asNumber(details?.tvl) ??\n asNumber(details?.totalTvl) ??\n asNumber(asRecord(details?.liquidity)?.usd)\n const liquidity =\n asNumber(o.liquidity) ??\n asNumber(details?.liquidity) ??\n asNumber(asRecord(details?.liquidity)?.usd)\n const impliedApy =\n asNumber(o.impliedApy) ?? asNumber(details?.impliedApy) ?? asNumber(asRecord(o.pt)?.impliedApy)\n const pt = addressFromAssetIdOrHex(o.pt ?? asRecord(o.pt)?.address ?? asRecord(o.pt)?.id, chainId)\n const yt = addressFromAssetIdOrHex(o.yt ?? asRecord(o.yt)?.address ?? asRecord(o.yt)?.id, chainId)\n const sy = addressFromAssetIdOrHex(o.sy ?? asRecord(o.sy)?.address ?? asRecord(o.sy)?.id, chainId)\n const underlying = addressFromAssetIdOrHex(\n o.underlyingAsset ?? o.underlying ?? asRecord(o.underlyingAsset)?.address,\n chainId,\n )\n if (!pt || !yt || !sy || !underlying) return null\n const expired = asExpiry(o.expiry) ?? asExpiry(details?.expiry)\n return {\n chainId,\n name: asString(o.name) ?? asString(o.proSymbol) ?? `${address.slice(0, 8)}…`,\n address,\n expiry: expired,\n pt,\n yt,\n sy,\n underlying,\n underlyingSymbol: asString(asRecord(o.underlyingAsset)?.symbol) ?? asString(o.underlyingSymbol),\n ptSymbol: asString(asRecord(o.pt)?.symbol) ?? asString(o.ptSymbol),\n ytSymbol: asString(asRecord(o.yt)?.symbol) ?? asString(o.ytSymbol),\n impliedApy,\n tvlUsd: tvl,\n liquidityUsd: liquidity,\n points: parsePoints(o.points ?? details?.points),\n }\n}\n\nexport function parsePendleAsset(raw: unknown): PendleAssetRow | null {\n const o = asRecord(raw)\n if (!o) return null\n const chainId = asNumber(o.chainId)\n const address = addressFromAssetIdOrHex(o.address ?? o.id, chainId ?? 0)\n if (chainId == null || !address) return null\n const decimals = asNumber(o.decimals)\n return {\n id: asString(o.id) ?? pendleAssetId(chainId, address),\n chainId,\n address,\n symbol: asString(o.symbol) ?? '—',\n name: asString(o.name) ?? asString(o.symbol) ?? '—',\n decimals: decimals != null && decimals >= 0 ? Math.floor(decimals) : 18,\n expiry: asString(o.expiry),\n }\n}\n\nexport async function pendleFetchSupportedChainIds(): Promise<number[]> {\n const now = Date.now()\n if (chainIdsCache && now - chainIdsCache.at < PENDLE_CHAIN_CACHE_MS) return chainIdsCache.chainIds\n const json = await pendleCoreFetch<{ chainIds?: unknown }>({ path: '/v1/chains' })\n const ids = Array.isArray(json.chainIds)\n ? json.chainIds.map((n) => Number(n)).filter((n) => Number.isFinite(n) && n > 0)\n : []\n chainIdsCache = { at: now, chainIds: ids }\n return ids\n}\n\nexport async function isPendleChainSupported(chainId: number): Promise<boolean> {\n try {\n const ids = await pendleFetchSupportedChainIds()\n if (ids.length === 0) return true\n return ids.includes(chainId)\n } catch {\n return true\n }\n}\n\nexport async function pendleFetchMarketsPage(args: {\n skip?: number\n limit?: number\n chainId?: number\n}): Promise<PendleMarketRow[]> {\n const limit = Math.min(PENDLE_LISTING_CAP, Math.max(1, args.limit ?? PENDLE_LISTING_CAP))\n const json = await pendleCoreFetch<{ markets?: unknown; results?: unknown }>({\n path: '/v2/markets/all',\n query: {\n skip: args.skip ?? 0,\n limit,\n ...(args.chainId != null ? { chainId: args.chainId } : {}),\n },\n })\n const raw = Array.isArray(json.markets) ? json.markets : Array.isArray(json.results) ? json.results : []\n const rows: PendleMarketRow[] = []\n for (const item of raw) {\n const row = parsePendleMarket(item)\n if (row) rows.push(row)\n }\n return rows\n}\n\nexport async function pendleFetchMarketsForChain(chainId: number): Promise<PendleMarketRow[]> {\n const now = Date.now()\n const cached = marketsCacheByChain.get(chainId)\n if (cached && now - cached.at < PENDLE_ICON_CACHE_MS) return cached.rows\n const rows: PendleMarketRow[] = []\n for (let page = 0; page < PENDLE_LISTING_MAX_PAGES; page++) {\n const batch = await pendleFetchMarketsPage({\n skip: page * PENDLE_LISTING_CAP,\n limit: PENDLE_LISTING_CAP,\n chainId,\n })\n const onChain = batch.filter((r) => r.chainId === chainId)\n rows.push(...onChain)\n if (batch.length < PENDLE_LISTING_CAP || onChain.length === 0) break\n }\n marketsCacheByChain.set(chainId, { at: now, rows })\n return rows\n}\n\nfunction marketMatchesQuery(row: PendleMarketRow, query: string): boolean {\n const q = query.trim()\n if (!q) return true\n if (\n matchesAssetFilter({ address: row.address, symbol: row.name, filter: q }) ||\n matchesAssetFilter({ address: row.pt, symbol: row.ptSymbol ?? undefined, filter: q }) ||\n matchesAssetFilter({ address: row.yt, symbol: row.ytSymbol ?? undefined, filter: q }) ||\n matchesAssetFilter({ address: row.sy, filter: q }) ||\n matchesAssetFilter({ address: row.underlying, symbol: row.underlyingSymbol ?? undefined, filter: q })\n ) {\n return true\n }\n const hay = `${row.name} ${row.ptSymbol ?? ''} ${row.ytSymbol ?? ''} ${row.underlyingSymbol ?? ''}`.toLowerCase()\n return hay.includes(q.toLowerCase())\n}\n\nexport async function pendleFetchMarketsSummary(args: {\n chainId: number\n query?: string\n pointsOnly?: boolean\n includeAddresses?: string[]\n}): Promise<{ chainId: number; markets: PendleMarketRow[]; notes: string }> {\n if (!(await isPendleChainSupported(args.chainId))) {\n return {\n chainId: args.chainId,\n markets: [],\n notes: `Pendle Core API does not list chain ${args.chainId}.`,\n }\n }\n const scanned = await pendleFetchMarketsForChain(args.chainId)\n const rows = selectPendleListingMarkets(scanned, {\n query: args.query,\n pointsOnly: args.pointsOnly,\n includeAddresses: args.includeAddresses,\n })\n const expiredOmitted = scanned.filter((r) => isPendleMarketExpired(r)).length\n return {\n chainId: args.chainId,\n markets: rows,\n notes:\n `Top ${rows.length} active Pendle markets on chain ${args.chainId} by TVL/liquidity ` +\n `(scanned ${scanned.length}, omitted ${expiredOmitted} matured). ` +\n `Use ctm_pendle_search_assets for long-tail or expired markets (PT redeem / remove LP). Do not web-search Pendle APYs.`,\n }\n}\n\nexport async function pendleFetchAssetsByIds(ids: string[]): Promise<PendleAssetRow[]> {\n if (ids.length === 0) return []\n const json = await pendleCoreFetch<{ assets?: unknown }>({\n path: '/v1/assets/all',\n query: { ids: ids.slice(0, 20).join(',') },\n })\n const raw = Array.isArray(json.assets) ? json.assets : []\n const out: PendleAssetRow[] = []\n for (const item of raw) {\n const row = parsePendleAsset(item)\n if (row) out.push(row)\n }\n return out\n}\n\nexport async function pendleFetchPricesSummary(args: {\n chainId: number\n ids?: string[]\n query?: string\n}): Promise<{ chainId: number; prices: { id: string; usd: number | null }[]; notes: string }> {\n let ids = (args.ids ?? []).map((s) => s.trim()).filter(Boolean)\n if (ids.length === 0) {\n const listed = await pendleFetchMarketsSummary({ chainId: args.chainId, query: args.query })\n ids = listed.markets.flatMap((m) => [\n pendleAssetId(m.chainId, m.pt),\n pendleAssetId(m.chainId, m.yt),\n pendleAssetId(m.chainId, m.sy),\n pendleAssetId(m.chainId, m.address),\n pendleAssetId(m.chainId, m.underlying),\n ])\n }\n if (ids.length === 0) {\n return { chainId: args.chainId, prices: [], notes: 'No asset ids to price.' }\n }\n const json = await pendleCoreFetch<{\n priceMap?: Record<string, { usd?: unknown; price?: unknown } | number>\n prices?: unknown\n errors?: unknown\n }>({\n path: '/v1/prices/assets',\n query: { ids: ids.slice(0, 80).join(',') },\n })\n const prices: { id: string; usd: number | null }[] = []\n const map = json.priceMap ?? {}\n for (const id of ids.slice(0, 80)) {\n const entry = map[id] ?? map[id.toLowerCase()]\n if (typeof entry === 'number') {\n prices.push({ id, usd: Number.isFinite(entry) ? entry : null })\n } else if (entry && typeof entry === 'object') {\n prices.push({ id, usd: asNumber((entry as { usd?: unknown }).usd ?? (entry as { price?: unknown }).price) })\n } else {\n prices.push({ id, usd: null })\n }\n }\n return {\n chainId: args.chainId,\n prices,\n notes: 'USD prices from GET /v1/prices/assets for the current listing or supplied ids only.',\n }\n}\n\nexport function collectPendleMarketAddresses(row: PendleMarketRow): string[] {\n return [row.address, row.pt, row.yt, row.sy, row.underlying].map((a) => a.toLowerCase())\n}\n\nexport async function pendleIconAddressesForChain(chainId: number): Promise<string[]> {\n const now = Date.now()\n const cached = iconCacheByChain.get(chainId)\n if (cached && now - cached.at < PENDLE_ICON_CACHE_MS) return [...cached.addresses]\n const addrs = new Set<string>()\n const rows = await pendleFetchMarketsForChain(chainId)\n for (const row of rows) {\n for (const a of collectPendleMarketAddresses(row)) addrs.add(a)\n }\n try {\n const pendleHits = await pendleSearchAssets({ chainId, query: 'PENDLE' })\n for (const row of pendleHits.results) {\n for (const a of collectPendleMarketAddresses(row)) addrs.add(a)\n }\n } catch {\n /* listing addresses are enough for icons */\n }\n iconCacheByChain.set(chainId, { at: now, addresses: addrs })\n return [...addrs]\n}\n\nexport async function pendleSearchAssets(args: {\n chainId: number\n query: string\n}): Promise<{ chainId: number; results: PendleMarketRow[]; notes: string }> {\n const q = args.query.trim()\n if (!q) throw new Error('query is required.')\n if (!(await isPendleChainSupported(args.chainId))) {\n return { chainId: args.chainId, results: [], notes: `Pendle is not listed on chain ${args.chainId}.` }\n }\n\n const parsedId = parsePendleAssetId(q)\n if (parsedId || isAddress(q)) {\n const id = parsedId ? pendleAssetId(parsedId.chainId, parsedId.address) : pendleAssetId(args.chainId, q)\n try {\n const json = await pendleCoreFetch<{ markets?: unknown }>({\n path: '/v1/markets/all',\n query: { ids: id, chainId: args.chainId },\n })\n const raw = Array.isArray(json.markets) ? json.markets : []\n const exact: PendleMarketRow[] = []\n for (const item of raw) {\n const row = parsePendleMarket(item)\n if (row && row.chainId === args.chainId) exact.push(row)\n }\n if (exact.length) {\n exact.sort(sortPendleMarketsByTvl)\n const live = exact.filter((r) => !isPendleMarketExpired(r))\n if (live.length) {\n return {\n chainId: args.chainId,\n results: live,\n notes: 'Exact market/asset id lookup via GET /v1/markets/all?ids= (active only).',\n }\n }\n return {\n chainId: args.chainId,\n results: exact,\n notes: 'Exact market/asset id lookup — matured (redeem PT or remove LP only).',\n }\n }\n } catch {\n /* fall through to paginated search */\n }\n }\n\n const scanned = await pendleFetchMarketsForChain(args.chainId)\n const activeHits = selectPendleListingMarkets(scanned, { query: q })\n if (activeHits.length > 0) {\n return {\n chainId: args.chainId,\n results: activeHits,\n notes: `Matched ${activeHits.length} active market(s) for ${q} on chain ${args.chainId}.`,\n }\n }\n const expiredHits = selectPendleListingMarkets(scanned, { query: q, includeExpired: true }).filter((r) =>\n isPendleMarketExpired(r),\n )\n if (expiredHits.length > 0) {\n return {\n chainId: args.chainId,\n results: expiredHits,\n notes:\n `No live market matched ${q}. Showing ${expiredHits.length} matured market(s) ` +\n `(redeem PT or remove LP only — mint / YT swap / add LP will fail).`,\n }\n }\n return {\n chainId: args.chainId,\n results: [],\n notes: `No Pendle market on chain ${args.chainId} matched ${q}.`,\n }\n}\n","import { http, type Transport } from 'viem'\n\n/**\n * Optional browser transport for protocol `eth_*` reads (allowance, decimals, spoke views).\n * Node / MCP leave this unset and use viem `http(rpcUrl)`.\n */\nlet evmRpcTransportFactory: ((rpcUrl: string) => Transport) | undefined\n\nexport function setDefiEvmRpcTransportFactory(factory: ((rpcUrl: string) => Transport) | undefined): void {\n evmRpcTransportFactory = factory\n}\n\nexport function getDefiEvmRpcTransportFactory(): ((rpcUrl: string) => Transport) | undefined {\n return evmRpcTransportFactory\n}\n\n/** Same-origin proxy in the browser when the app has called {@link setDefiEvmRpcTransportFactory}. */\nexport function defiEvmTransport(rpcUrl: string, opts?: Parameters<typeof http>[1]): Transport {\n const url = rpcUrl.trim()\n return evmRpcTransportFactory?.(url) ?? http(url, opts)\n}\n","import { createPublicClient, defineChain, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { pendleCoreFetch } from './api.js'\nimport { pendleFetchAssetsByIds } from './discover.js'\nimport {\n PENDLE_NATIVE_PLACEHOLDER,\n isPendleNativeToken,\n normalizePendleTokenAddress,\n pendleAssetId,\n} from './support.js'\n\nexport type PendleTokenAmount = { token: string; amount: string }\n\nexport type PendleConvertTx = {\n to: string\n data: `0x${string}`\n value: string\n from?: string\n}\n\nexport type PendleConvertQuote = {\n action: string\n inputs: PendleTokenAmount[]\n outputs: PendleTokenAmount[]\n requiredApprovals: PendleTokenAmount[]\n priceImpact: number | null\n impliedApyBefore: number | null\n impliedApyAfter: number | null\n effectiveApy: number | null\n tx: PendleConvertTx\n}\n\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nfunction asString(v: unknown): string | null {\n return typeof v === 'string' && v.trim() ? v.trim() : null\n}\n\nfunction asNumber(v: unknown): number | null {\n if (typeof v === 'number' && Number.isFinite(v)) return v\n if (typeof v === 'string' && v.trim()) {\n const n = Number.parseFloat(v)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\nexport type PendleConvertActionKind =\n | 'swap'\n | 'mint_py'\n | 'redeem_py'\n | 'mint_sy'\n | 'redeem_sy'\n | 'add_liquidity'\n | 'remove_liquidity'\n | 'convert'\n\n/** Infer Convert action from token sets. Market / PT / YT / SY roles come from the catalog, never constants. */\nexport function classifyPendleConvertAction(args: {\n tokensIn: string[]\n tokensOut: string[]\n roles?: { market?: string; pt?: string; yt?: string; sy?: string }\n}): PendleConvertActionKind {\n const norm = (s: string) => s.trim().toLowerCase()\n const ins = args.tokensIn.map(norm)\n const outs = args.tokensOut.map(norm)\n const market = args.roles?.market?.trim().toLowerCase()\n const pt = args.roles?.pt?.trim().toLowerCase()\n const yt = args.roles?.yt?.trim().toLowerCase()\n const sy = args.roles?.sy?.trim().toLowerCase()\n if (market && ins.includes(market)) return 'remove_liquidity'\n if (market && outs.includes(market)) return 'add_liquidity'\n if (pt && yt && outs.includes(pt) && outs.includes(yt)) return 'mint_py'\n if (pt && yt && ins.includes(pt) && ins.includes(yt)) return 'redeem_py'\n if (sy && outs.includes(sy) && !ins.includes(sy)) return 'mint_sy'\n if (sy && ins.includes(sy) && !outs.includes(sy)) return 'redeem_sy'\n if (ins.length === 1 && outs.length === 1) return 'swap'\n return 'convert'\n}\n\nexport function slippagePercentToConvert(slippagePercent: number): number {\n if (!Number.isFinite(slippagePercent) || slippagePercent <= 0 || slippagePercent >= 100) {\n throw new Error('Slippage must be between 0 and 100 (exclusive).')\n }\n return slippagePercent / 100\n}\n\nexport async function resolvePendleTokenDecimals(args: {\n chainId: number\n rpcUrl?: string\n token: string\n decimals?: number\n}): Promise<number> {\n if (args.decimals != null && Number.isInteger(args.decimals) && args.decimals >= 0 && args.decimals <= 18) {\n return args.decimals\n }\n if (isPendleNativeToken(args.token)) return 18\n const id = pendleAssetId(args.chainId, normalizePendleTokenAddress(args.token))\n try {\n const assets = await pendleFetchAssetsByIds([id])\n if (assets[0]) return assets[0].decimals\n } catch {\n /* on-chain fallback */\n }\n if (!args.rpcUrl?.trim()) return 18\n const addr = getAddress(args.token as `0x${string}`)\n const ch = defineChain({\n id: args.chainId,\n name: 'PendleDecimals',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(args.rpcUrl) })\n const d = await client.readContract({ address: addr, abi: erc20DecimalsAbi, functionName: 'decimals' })\n return Number(d)\n}\n\nexport function parsePendleConvertResponse(raw: unknown): PendleConvertQuote {\n const root = asRecord(raw)\n if (!root) throw new Error('Pendle convert returned an empty body.')\n const routes = Array.isArray(root.routes) ? root.routes : []\n const route = asRecord(routes[0]) ?? root\n const txRaw = asRecord(route.tx) ?? asRecord(root.tx)\n if (!txRaw) throw new Error('Pendle convert response missing routes[0].tx.')\n const to = asString(txRaw.to)\n const data = asString(txRaw.data)\n if (!to || !data) throw new Error('Pendle convert tx is missing to/data. Use the API tx — do not hardcode a router.')\n const dataHex = (data.startsWith('0x') ? data : `0x${data}`) as `0x${string}`\n const value = asString(txRaw.value) ?? '0'\n const dataObj = asRecord(route.data) ?? asRecord(root.data)\n const implied = asRecord(dataObj?.impliedApy)\n const parseAmounts = (v: unknown): PendleTokenAmount[] => {\n if (!Array.isArray(v)) return []\n const out: PendleTokenAmount[] = []\n for (const item of v) {\n const o = asRecord(item)\n const token = asString(o?.token)\n const amount = asString(o?.amount)\n if (token && amount) out.push({ token, amount })\n }\n return out\n }\n return {\n action: asString(root.action) ?? asString(route.action) ?? 'convert',\n inputs: parseAmounts(root.inputs ?? route.inputs),\n outputs: parseAmounts(route.outputs ?? root.outputs),\n requiredApprovals: parseAmounts(root.requiredApprovals ?? route.requiredApprovals),\n priceImpact: asNumber(dataObj?.priceImpact),\n impliedApyBefore: asNumber(implied?.before),\n impliedApyAfter: asNumber(implied?.after),\n effectiveApy: asNumber(dataObj?.effectiveApy),\n tx: {\n to: getAddress(to as `0x${string}`),\n data: dataHex,\n value,\n from: asString(txRaw.from) ?? undefined,\n },\n }\n}\n\nexport async function pendleConvert(args: {\n chainId: number\n receiver: string\n slippagePercent: number\n tokensIn: { token: string; amountWei: string }[]\n tokensOut: string[]\n enableAggregator?: boolean\n additionalData?: string\n}): Promise<PendleConvertQuote> {\n if (args.tokensIn.length === 0) throw new Error('tokensIn is required.')\n if (args.tokensOut.length === 0) throw new Error('tokensOut is required.')\n const receiver = getAddress(args.receiver as `0x${string}`)\n const body = {\n receiver,\n slippage: slippagePercentToConvert(args.slippagePercent),\n enableAggregator: args.enableAggregator === true,\n inputs: args.tokensIn.map((t) => ({\n token: normalizePendleTokenAddress(t.token),\n amount: t.amountWei,\n })),\n outputs: args.tokensOut.map((t) => normalizePendleTokenAddress(t)),\n additionalData: args.additionalData ?? 'impliedApy,effectiveApy',\n }\n const json = await pendleCoreFetch<unknown>({\n path: `/v3/sdk/${args.chainId}/convert`,\n method: 'POST',\n body,\n })\n return parsePendleConvertResponse(json)\n}\n\nexport async function pendleQuoteConvert(args: {\n chainId: number\n rpcUrl?: string\n receiver?: string\n slippagePercent: number\n tokensIn: { token: string; amountHuman: string; decimals?: number }[]\n tokensOut: string[]\n enableAggregator?: boolean\n}): Promise<PendleConvertQuote> {\n const receiver = args.receiver?.trim() || PENDLE_NATIVE_PLACEHOLDER\n const tokensIn: { token: string; amountWei: string }[] = []\n for (const t of args.tokensIn) {\n const decimals = await resolvePendleTokenDecimals({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n token: t.token,\n decimals: t.decimals,\n })\n tokensIn.push({\n token: t.token,\n amountWei: parseUnits(t.amountHuman.trim(), decimals).toString(),\n })\n }\n return pendleConvert({\n chainId: args.chainId,\n receiver,\n slippagePercent: args.slippagePercent,\n tokensIn,\n tokensOut: args.tokensOut,\n enableAggregator: args.enableAggregator,\n })\n}\n\nexport async function pendleQuoteSwap(args: {\n chainId: number\n rpcUrl?: string\n tokenIn: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n enableAggregator?: boolean\n tokenInDecimals?: number\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.tokenIn, amountHuman: args.amountHuman, decimals: args.tokenInDecimals }],\n tokensOut: [args.tokenOut],\n enableAggregator: args.enableAggregator,\n })\n}\n\nexport async function pendleQuoteMintPy(args: {\n chainId: number\n rpcUrl?: string\n tokenIn: string\n pt: string\n yt: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n tokenInDecimals?: number\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.tokenIn, amountHuman: args.amountHuman, decimals: args.tokenInDecimals }],\n tokensOut: [args.pt, args.yt],\n })\n}\n\nexport async function pendleQuoteRedeemPy(args: {\n chainId: number\n rpcUrl?: string\n pt: string\n yt: string\n tokenOut: string\n amountPtHuman: string\n amountYtHuman?: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n const tokensIn = [{ token: args.pt, amountHuman: args.amountPtHuman }]\n const ytAmt = (args.amountYtHuman ?? args.amountPtHuman).trim()\n if (ytAmt && ytAmt !== '0') tokensIn.push({ token: args.yt, amountHuman: ytAmt })\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn,\n tokensOut: [args.tokenOut],\n })\n}\n\nexport async function pendleQuoteMintSy(args: {\n chainId: number\n rpcUrl?: string\n tokenIn: string\n sy: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.tokenIn, amountHuman: args.amountHuman }],\n tokensOut: [args.sy],\n })\n}\n\nexport async function pendleQuoteRedeemSy(args: {\n chainId: number\n rpcUrl?: string\n sy: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.sy, amountHuman: args.amountHuman }],\n tokensOut: [args.tokenOut],\n })\n}\n\nexport async function pendleQuoteAddLiquidity(args: {\n chainId: number\n rpcUrl?: string\n tokensIn: { token: string; amountHuman: string }[]\n market: string\n keepYt?: boolean\n yt?: string\n slippagePercent: number\n receiver?: string\n}): Promise<PendleConvertQuote> {\n const tokensOut = [args.market]\n if (args.keepYt) {\n if (!args.yt?.trim()) throw new Error('yt is required for zero-price-impact (keep YT) add liquidity.')\n tokensOut.push(args.yt)\n }\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: args.tokensIn,\n tokensOut,\n })\n}\n\nexport async function pendleQuoteRemoveLiquidity(args: {\n chainId: number\n rpcUrl?: string\n market: string\n lpAmountHuman: string\n tokensOut: string[]\n slippagePercent: number\n receiver?: string\n enableAggregator?: boolean\n}): Promise<PendleConvertQuote> {\n return pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: args.receiver,\n slippagePercent: args.slippagePercent,\n tokensIn: [{ token: args.market, amountHuman: args.lpAmountHuman }],\n tokensOut: args.tokensOut,\n enableAggregator: args.enableAggregator,\n })\n}\n","export function buildPendlePurposePrefill(args: {\n action: string\n detail: string\n chainId: number\n slippagePercent?: number\n}): string {\n const act = (args.action || 'convert').trim()\n const detail = (args.detail || '').trim()\n const slip =\n args.slippagePercent != null && Number.isFinite(args.slippagePercent)\n ? ` (max slippage ${args.slippagePercent}%)`\n : ''\n return `Pendle: ${act} ${detail}${slip} on chain ${args.chainId}`\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 { keccak256, createPublicClient, defineChain, serializeTransaction, getAddress, parseGwei, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../core/defiEvmClient.js'\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: defiEvmTransport(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","/** Default MPC sign-request agreement window for fast-moving DeFi protocols (30 minutes). */\nexport const DEFAULT_DEFI_MULTISIGN_EXPIRY_SECONDS = 30 * 60\n\n/** Protocol ids that default to 30-minute expiry when `expiryDate` is omitted on multisign MCP tools. */\nexport const DEFI_PROTOCOLS_WITH_30MIN_EXPIRY = new Set([\n 'uniswap-v4',\n 'gmx',\n 'hyperliquid',\n 'arcus',\n 'curve-dao',\n 'aerodrome',\n 'pendle',\n])\n\nexport function defiMultisignExpiryUnixSeconds(\n protocolId: string | undefined,\n explicitExpiryDate?: number | null,\n): number | undefined {\n if (typeof explicitExpiryDate === 'number' && Number.isFinite(explicitExpiryDate) && explicitExpiryDate > 0) {\n return Math.floor(explicitExpiryDate)\n }\n if (protocolId && DEFI_PROTOCOLS_WITH_30MIN_EXPIRY.has(protocolId)) {\n return Math.floor(Date.now() / 1000) + DEFAULT_DEFI_MULTISIGN_EXPIRY_SECONDS\n }\n return undefined\n}\n","import { createPublicClient, defineChain, encodeFunctionData, getAddress, parseAbi, type Address } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { routerSwapGasLimitFromEstimate } from '../../../chains/evm/routerSwapGas.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { defiMultisignExpiryUnixSeconds } from '../../../core/expiry.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport {\n pendleQuoteAddLiquidity,\n pendleQuoteConvert,\n pendleQuoteMintPy,\n pendleQuoteMintSy,\n pendleQuoteRedeemPy,\n pendleQuoteRedeemSy,\n pendleQuoteRemoveLiquidity,\n pendleQuoteSwap,\n type PendleConvertQuote,\n} from './convert.js'\nimport { buildPendlePurposePrefill } from './purpose.js'\nimport { PENDLE_CONVERT_DEFAULT_GAS_UNITS, PENDLE_PROTOCOL_ID, isPendleNativeToken } from './support.js'\n\ntype PendleStep = EvmTxStep & { kind: 'approve' | 'convert'; routerSwap?: boolean; fallbackGas?: bigint }\n\nconst erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\n\nfunction txValueWei(raw: string): bigint {\n try {\n return BigInt(raw)\n } catch {\n return 0n\n }\n}\n\nasync function approveStepsIfNeeded(args: {\n rpcUrl: string\n chainId: number\n owner: Address\n spender: Address\n approvals: { token: string; amount: string }[]\n}): Promise<PendleStep[]> {\n const steps: PendleStep[] = []\n const ch = defineChain({\n id: args.chainId,\n name: 'PendleApprove',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(args.rpcUrl) })\n for (const a of args.approvals) {\n if (isPendleNativeToken(a.token)) continue\n const token = getAddress(a.token as `0x${string}`)\n const amountWei = BigInt(a.amount)\n const allowance = await client.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [args.owner, args.spender],\n })\n if (allowance >= amountWei) continue\n if (allowance > 0n) {\n steps.push({\n to: token,\n data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [args.spender, 0n] }),\n value: 0n,\n kind: 'approve',\n fallbackGas: 80_000n,\n })\n }\n steps.push({\n to: token,\n data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [args.spender, amountWei] }),\n value: 0n,\n kind: 'approve',\n fallbackGas: 80_000n,\n })\n }\n return steps\n}\n\nexport function isPendleConvertEvmSignRequest(extra: Record<string, unknown> | null | undefined): boolean {\n const evm = extra?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n const t = String((evm as { type?: unknown }).type ?? '')\n return t.startsWith('pendle_')\n}\n\nexport async function buildEvmMultisignBodyPendleFromConvert(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address | string\n purposeText: string\n expiryDate?: number\n quote: PendleConvertQuote\n purposeAction: string\n}): Promise<ReturnType<typeof buildEvmMultisignBatch>> {\n const executor = getAddress(args.executorAddress as `0x${string}`)\n const spender = getAddress(args.quote.tx.to as `0x${string}`)\n const steps: PendleStep[] = [\n ...(await approveStepsIfNeeded({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n owner: executor,\n spender,\n approvals: args.quote.requiredApprovals,\n })),\n {\n to: spender,\n data: args.quote.tx.data,\n value: txValueWei(args.quote.tx.value),\n kind: 'convert',\n routerSwap: true,\n fallbackGas: PENDLE_CONVERT_DEFAULT_GAS_UNITS,\n },\n ]\n const expiryDate = defiMultisignExpiryUnixSeconds(PENDLE_PROTOCOL_ID, args.expiryDate)\n const purposeText = args.purposeText.trim() || buildPendlePurposePrefill({\n action: args.purposeAction,\n detail: args.quote.action,\n chainId: args.chainId,\n })\n const chainGasLimitRouter =\n args.chainDetail?.gasLimit != null &&\n Number.isFinite(Number(args.chainDetail.gasLimit)) &&\n Number(args.chainDetail.gasLimit) > 0\n ? Number(args.chainDetail.gasLimit)\n : undefined\n const first = steps[0]!\n const firstDataNo0x = first.data.startsWith('0x') ? first.data.slice(2) : first.data\n const payableValueWei = steps.reduce((a, s) => a + s.value, 0n)\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n 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 expiryDate,\n },\n steps,\n purposeSuffix:\n steps.length === 1\n ? `Pendle: ${args.purposeAction} via Hosted SDK convert.`\n : `Pendle: approve router from convert tx.to, then ${args.purposeAction}.`,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: first.to,\n payableValueWei: payableValueWei > 0n ? payableValueWei : undefined,\n resolveGasLimit: async ({ step, estimatedGas }) => {\n const s = step as PendleStep\n if (s.routerSwap) return routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n return estimatedGas\n },\n buildBatchMeta: ({ step }) => {\n const s = step as PendleStep\n return {\n evm: {\n type: s.kind === 'approve' ? 'pendle_approve' : `pendle_${args.purposeAction.replace(/\\s+/g, '_')}`,\n version: 1,\n chainId: String(args.chainId),\n convertAction: args.quote.action,\n },\n }\n },\n })\n}\n\nexport type PendleMultisignCommon = {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address | string\n purposeText: string\n expiryDate?: number\n convertSnapshot?: PendleConvertQuote\n}\n\nexport async function buildEvmMultisignBodyPendleSwapBatch(\n args: PendleMultisignCommon & {\n tokenIn: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n enableAggregator?: boolean\n tokenInDecimals?: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteSwap({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokenIn: args.tokenIn,\n tokenOut: args.tokenOut,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n enableAggregator: args.enableAggregator,\n tokenInDecimals: args.tokenInDecimals,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'swap' })\n}\n\nexport async function buildEvmMultisignBodyPendleMintPyBatch(\n args: PendleMultisignCommon & {\n tokenIn: string\n pt: string\n yt: string\n amountHuman: string\n slippagePercent: number\n tokenInDecimals?: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteMintPy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokenIn: args.tokenIn,\n pt: args.pt,\n yt: args.yt,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n tokenInDecimals: args.tokenInDecimals,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'mint_py' })\n}\n\nexport async function buildEvmMultisignBodyPendleRedeemPyBatch(\n args: PendleMultisignCommon & {\n pt: string\n yt: string\n tokenOut: string\n amountPtHuman: string\n amountYtHuman?: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteRedeemPy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n pt: args.pt,\n yt: args.yt,\n tokenOut: args.tokenOut,\n amountPtHuman: args.amountPtHuman,\n amountYtHuman: args.amountYtHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'redeem_py' })\n}\n\nexport async function buildEvmMultisignBodyPendleMintSyBatch(\n args: PendleMultisignCommon & {\n tokenIn: string\n sy: string\n amountHuman: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteMintSy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokenIn: args.tokenIn,\n sy: args.sy,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'mint_sy' })\n}\n\nexport async function buildEvmMultisignBodyPendleRedeemSyBatch(\n args: PendleMultisignCommon & {\n sy: string\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteRedeemSy({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n sy: args.sy,\n tokenOut: args.tokenOut,\n amountHuman: args.amountHuman,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'redeem_sy' })\n}\n\nexport async function buildEvmMultisignBodyPendleAddLiquidityBatch(\n args: PendleMultisignCommon & {\n tokensIn: { token: string; amountHuman: string }[]\n market: string\n keepYt?: boolean\n yt?: string\n slippagePercent: number\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteAddLiquidity({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n tokensIn: args.tokensIn,\n market: args.market,\n keepYt: args.keepYt,\n yt: args.yt,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'add_liquidity' })\n}\n\nexport async function buildEvmMultisignBodyPendleRemoveLiquidityBatch(\n args: PendleMultisignCommon & {\n market: string\n lpAmountHuman: string\n tokensOut: string[]\n slippagePercent: number\n enableAggregator?: boolean\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteRemoveLiquidity({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n market: args.market,\n lpAmountHuman: args.lpAmountHuman,\n tokensOut: args.tokensOut,\n slippagePercent: args.slippagePercent,\n receiver: String(args.executorAddress),\n enableAggregator: args.enableAggregator,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: 'remove_liquidity' })\n}\n\nexport async function buildEvmMultisignBodyPendleConvertBatch(\n args: PendleMultisignCommon & {\n tokensIn: { token: string; amountHuman: string }[]\n tokensOut: string[]\n slippagePercent: number\n enableAggregator?: boolean\n },\n) {\n const quote =\n args.convertSnapshot ??\n (await pendleQuoteConvert({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n receiver: String(args.executorAddress),\n slippagePercent: args.slippagePercent,\n tokensIn: args.tokensIn,\n tokensOut: args.tokensOut,\n enableAggregator: args.enableAggregator,\n }))\n return buildEvmMultisignBodyPendleFromConvert({ ...args, quote, purposeAction: quote.action })\n}\n\n","import { getAddress, isAddress } from 'viem'\nimport { pendleCoreFetch } from './api.js'\n\nexport type PendleMerkleRewardRow = {\n user: string\n token: string\n merkleRoot: string\n chainId: number\n assetId: string\n amount: string\n fromTimestamp: string | null\n toTimestamp: string | null\n}\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nexport function parsePendleMerkleRewardRow(raw: unknown): PendleMerkleRewardRow | null {\n const o = asRecord(raw)\n if (!o) return null\n const token = typeof o.token === 'string' ? o.token : ''\n const chainId = Number(o.chainId)\n if (!token || !Number.isFinite(chainId)) return null\n return {\n user: typeof o.user === 'string' ? o.user : '',\n token,\n merkleRoot: typeof o.merkleRoot === 'string' ? o.merkleRoot : '',\n chainId,\n assetId: typeof o.assetId === 'string' ? o.assetId : '',\n amount: String(o.amount ?? ''),\n fromTimestamp: typeof o.fromTimestamp === 'string' ? o.fromTimestamp : null,\n toTimestamp: typeof o.toTimestamp === 'string' ? o.toTimestamp : null,\n }\n}\n\nexport async function pendleFetchMerkleRewards(args: {\n user: string\n}): Promise<{\n user: string\n claimableRewards: PendleMerkleRewardRow[]\n claimedRewards: PendleMerkleRewardRow[]\n notes: string\n}> {\n if (!isAddress(args.user)) throw new Error('user must be an EVM address.')\n const user = getAddress(args.user)\n const json = await pendleCoreFetch<{ claimableRewards?: unknown; claimedRewards?: unknown }>({\n path: `/v1/dashboard/merkle-rewards/${user}`,\n })\n const claimable = Array.isArray(json.claimableRewards)\n ? json.claimableRewards.map(parsePendleMerkleRewardRow).filter((r): r is PendleMerkleRewardRow => r != null)\n : []\n const claimed = Array.isArray(json.claimedRewards)\n ? json.claimedRewards.map(parsePendleMerkleRewardRow).filter((r): r is PendleMerkleRewardRow => r != null)\n : []\n return {\n user,\n claimableRewards: claimable,\n claimedRewards: claimed,\n notes:\n 'Informational airdrop list only. Core does not include claim proofs. Tell the user to claim airdrops on app.pendle.finance. Redeem on-chain SY/YT/LP incentives with ctm_pendle_build_redeem_rewards_multisign.',\n }\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport { pendleCoreFetch } from './api.js'\nimport { isPendleMarketExpired, pendleFetchAssetsByIds, type PendleAssetRow } from './discover.js'\nimport { parsePendleAssetId } from './support.js'\n\nexport type PendleLpHolding = {\n chainId: number\n marketId: string\n market: string\n name: string\n symbol: string\n decimals: number\n expiry: string | null\n matured: boolean\n closed: boolean\n lpBalanceWei: string\n lpAmountHuman: string\n lpUsd: number | null\n ptBalanceWei: string\n ytBalanceWei: string\n}\n\nfunction asRecord(v: unknown): Record<string, unknown> | null {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null\n}\n\nfunction asNumber(v: unknown): number | null {\n if (typeof v === 'number' && Number.isFinite(v)) return v\n if (typeof v === 'string' && v.trim()) {\n const n = Number.parseFloat(v)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\nexport function weiToHumanAmount(wei: string, decimals: number): string {\n try {\n const raw = formatUnits(BigInt(wei), decimals)\n if (!raw.includes('.')) return raw\n return raw.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n } catch {\n return wei\n }\n}\n\nexport function parsePendlePositionToken(raw: unknown): { balanceWei: string; usd: number | null } {\n const o = asRecord(raw)\n if (!o) return { balanceWei: '0', usd: null }\n const balance = o.balance == null ? '0' : String(o.balance)\n return { balanceWei: /^\\d+$/.test(balance) ? balance : '0', usd: asNumber(o.valuation) }\n}\n\nfunction positiveWei(wei: string): boolean {\n try {\n return BigInt(wei) > 0n\n } catch {\n return false\n }\n}\n\nexport function collectPendleMarketPositions(raw: unknown, closed: boolean): Array<{\n marketId: string\n chainId: number\n market: string\n closed: boolean\n lp: { balanceWei: string; usd: number | null }\n pt: { balanceWei: string; usd: number | null }\n yt: { balanceWei: string; usd: number | null }\n}> {\n const o = asRecord(raw)\n if (!o) return []\n const marketId = typeof o.marketId === 'string' ? o.marketId : ''\n const parsed = parsePendleAssetId(marketId)\n if (!parsed) return []\n let market: string\n try {\n market = getAddress(parsed.address as `0x${string}`)\n } catch {\n return []\n }\n const lp = parsePendlePositionToken(o.lp)\n if (!positiveWei(lp.balanceWei)) return []\n return [\n {\n marketId,\n chainId: parsed.chainId,\n market,\n closed,\n lp,\n pt: parsePendlePositionToken(o.pt),\n yt: parsePendlePositionToken(o.yt),\n },\n ]\n}\n\nasync function assetsByIds(ids: string[]): Promise<Map<string, PendleAssetRow>> {\n const out = new Map<string, PendleAssetRow>()\n const unique = [...new Set(ids.map((id) => id.trim()).filter(Boolean))]\n for (let i = 0; i < unique.length; i += 20) {\n const batch = await pendleFetchAssetsByIds(unique.slice(i, i + 20))\n for (const row of batch) out.set(row.id.toLowerCase(), row)\n }\n return out\n}\n\nexport async function pendleFetchPositions(args: {\n user: string\n chainId?: number\n filterUsd?: number\n}): Promise<{ user: string; chainId: number | null; lp: PendleLpHolding[]; notes: string }> {\n if (!isAddress(args.user)) throw new Error('user must be an EVM address.')\n const user = getAddress(args.user)\n const chainId = args.chainId != null && Number.isFinite(args.chainId) ? args.chainId : undefined\n const json = await pendleCoreFetch<{ positions?: unknown }>({\n path: `/v1/dashboard/positions/database/${user}`,\n query: {\n ...(chainId != null ? { chainId } : {}),\n ...(args.filterUsd != null ? { filterUsd: args.filterUsd } : {}),\n },\n })\n const groups = Array.isArray(json.positions) ? json.positions : []\n const collected: ReturnType<typeof collectPendleMarketPositions> = []\n for (const group of groups) {\n const g = asRecord(group)\n if (!g) continue\n const groupChain = asNumber(g.chainId)\n if (chainId != null && groupChain != null && groupChain !== chainId) continue\n for (const row of Array.isArray(g.openPositions) ? g.openPositions : []) {\n collected.push(...collectPendleMarketPositions(row, false))\n }\n for (const row of Array.isArray(g.closedPositions) ? g.closedPositions : []) {\n collected.push(...collectPendleMarketPositions(row, true))\n }\n }\n const scoped = (chainId != null ? collected.filter((r) => r.chainId === chainId) : collected).filter((r) => {\n if (args.filterUsd != null && r.lp.usd != null && r.lp.usd < args.filterUsd) return false\n try {\n return BigInt(r.lp.balanceWei) >= 10n ** 12n || (r.lp.usd != null && r.lp.usd >= (args.filterUsd ?? 0.1))\n } catch {\n return false\n }\n })\n const meta = await assetsByIds(scoped.map((r) => r.marketId))\n const minUsd = args.filterUsd\n const lp: PendleLpHolding[] = []\n for (const row of scoped) {\n const asset = meta.get(row.marketId.toLowerCase())\n const decimals = asset?.decimals ?? 18\n const expiry = asset?.expiry ?? null\n const usd = row.lp.usd\n if (minUsd != null && (usd == null || usd < minUsd)) continue\n lp.push({\n chainId: row.chainId,\n marketId: row.marketId,\n market: row.market,\n name: asset?.name || asset?.symbol || `${row.market.slice(0, 8)}…`,\n symbol: asset?.symbol || 'LP',\n decimals,\n expiry,\n matured: isPendleMarketExpired({ expiry }),\n closed: row.closed,\n lpBalanceWei: row.lp.balanceWei,\n lpAmountHuman: weiToHumanAmount(row.lp.balanceWei, decimals),\n lpUsd: usd,\n ptBalanceWei: row.pt.balanceWei,\n ytBalanceWei: row.yt.balanceWei,\n })\n }\n lp.sort((a, b) => {\n if (a.matured !== b.matured) return a.matured ? 1 : -1\n return (b.lpUsd ?? 0) - (a.lpUsd ?? 0)\n })\n const capped = lp.slice(0, 80)\n const matured = capped.filter((r) => r.matured).length\n return {\n user,\n chainId: chainId ?? null,\n lp: capped,\n notes:\n capped.length === 0\n ? `No Pendle LP for ${user}${chainId != null ? ` on chain ${chainId}` : ''}.`\n : `${capped.length} Pendle LP holding(s)${chainId != null ? ` on chain ${chainId}` : ''}` +\n (lp.length > capped.length ? ` (showing top ${capped.length} of ${lp.length})` : '') +\n (matured ? ` (${matured} matured — remove LP or redeem PT only)` : '') +\n '. Amounts from Core dashboard (not the node token list). Claimable rewards on this snapshot may be up to 24h stale — redeem with ctm_pendle_build_redeem_rewards_multisign.',\n }\n}\n","import { getAddress, type Address } from 'viem'\nimport { pendleCoreFetch } from './api.js'\nimport { parsePendleConvertResponse, type PendleConvertQuote } from './convert.js'\nimport { buildEvmMultisignBodyPendleFromConvert } from './multisign.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\n\nexport async function pendleRedeemInterestsAndRewards(args: {\n chainId: number\n receiver: string\n sys?: string[]\n yts?: string[]\n markets?: string[]\n}): Promise<PendleConvertQuote> {\n const receiver = getAddress(args.receiver as `0x${string}`)\n const json = await pendleCoreFetch<unknown>({\n path: `/v1/sdk/${args.chainId}/redeem-interests-and-rewards`,\n query: {\n receiver,\n sys: args.sys?.length ? args.sys.join(',') : undefined,\n yts: args.yts?.length ? args.yts.join(',') : undefined,\n markets: args.markets?.length ? args.markets.join(',') : undefined,\n },\n })\n return parsePendleConvertResponse(json)\n}\n\nexport async function buildEvmMultisignBodyPendleRedeemRewardsBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n executorAddress: Address | string\n purposeText: string\n expiryDate?: number\n sys?: string[]\n yts?: string[]\n markets?: string[]\n convertSnapshot?: PendleConvertQuote\n}) {\n const quote =\n args.convertSnapshot ??\n (await pendleRedeemInterestsAndRewards({\n chainId: args.chainId,\n receiver: String(args.executorAddress),\n sys: args.sys,\n yts: args.yts,\n markets: args.markets,\n }))\n return buildEvmMultisignBodyPendleFromConvert({\n ...args,\n quote,\n purposeAction: 'redeem_rewards',\n })\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isPendleChainSupported } from './discover.js'\nimport { PENDLE_PROTOCOL_ID } from './support.js'\n\nexport * from './support.js'\nexport * from './api.js'\nexport * from './discover.js'\nexport * from './convert.js'\nexport * from './purpose.js'\nexport * from './multisign.js'\nexport * from './merkle.js'\nexport * from './positions.js'\nexport * from './redeemRewards.js'\n\nexport { PENDLE_PROTOCOL_ID }\n\nexport const pendleProtocolModule: ProtocolModule = {\n id: PENDLE_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n if (!Number.isFinite(n)) return false\n return isPendleChainSupported(n)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n { id: 'pendle.fetch-markets', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'List live Pendle markets (TVL-ranked, cap 100, matured omitted)', commonParams: [], params: {} },\n { id: 'pendle.search-assets', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Search live PT/YT/SY/underlying (matured only if address-pinned)', commonParams: [], params: {} },\n { id: 'pendle.swap', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Swap token ↔ PT/YT via Hosted SDK convert', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.mint-py', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Mint PT + YT', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.redeem-py', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem PT + YT (PT only after expiry)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.add-liquidity', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Add Pendle AMM liquidity', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.fetch-positions', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'List this wallet’s Pendle LP (including matured)', commonParams: [], params: {} },\n { id: 'pendle.remove-liquidity', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Remove Pendle AMM liquidity', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'pendle.redeem-rewards', protocolId: PENDLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem on-chain SY/YT/LP interest and incentives (not merkle airdrops)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(pendleProtocolModule)\n"]}