@continuumdao/ctm-mpc-defi 0.2.1 → 0.2.2

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 (57) hide show
  1. package/dist/agent/catalog.cjs +62 -11
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +27 -1
  4. package/dist/agent/catalog.js +61 -12
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/curve-dao/SKILL.md +2 -1
  7. package/dist/chains/evm/index.cjs +54 -0
  8. package/dist/chains/evm/index.cjs.map +1 -1
  9. package/dist/chains/evm/index.d.ts +13 -1
  10. package/dist/chains/evm/index.js +52 -2
  11. package/dist/chains/evm/index.js.map +1 -1
  12. package/dist/core/index.cjs +64 -0
  13. package/dist/core/index.cjs.map +1 -1
  14. package/dist/core/index.d.ts +20 -1
  15. package/dist/core/index.js +56 -1
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/index.cjs +131 -0
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +2 -2
  20. package/dist/index.js +120 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/protocols/evm/aave-v4/index.cjs +766 -6
  23. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  24. package/dist/protocols/evm/aave-v4/index.d.ts +417 -1
  25. package/dist/protocols/evm/aave-v4/index.js +741 -8
  26. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  27. package/dist/protocols/evm/curve-dao/index.cjs +233 -7
  28. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  29. package/dist/protocols/evm/curve-dao/index.d.ts +66 -1
  30. package/dist/protocols/evm/curve-dao/index.js +227 -9
  31. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  32. package/dist/protocols/evm/ethena/index.cjs +104 -0
  33. package/dist/protocols/evm/ethena/index.cjs.map +1 -1
  34. package/dist/protocols/evm/ethena/index.d.ts +46 -1
  35. package/dist/protocols/evm/ethena/index.js +99 -1
  36. package/dist/protocols/evm/ethena/index.js.map +1 -1
  37. package/dist/protocols/evm/euler-v2/index.cjs +2334 -37
  38. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  39. package/dist/protocols/evm/euler-v2/index.d.ts +464 -1
  40. package/dist/protocols/evm/euler-v2/index.js +2286 -39
  41. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  42. package/dist/protocols/evm/lido/index.cjs +110 -0
  43. package/dist/protocols/evm/lido/index.cjs.map +1 -1
  44. package/dist/protocols/evm/lido/index.d.ts +33 -2
  45. package/dist/protocols/evm/lido/index.js +107 -2
  46. package/dist/protocols/evm/lido/index.js.map +1 -1
  47. package/dist/protocols/evm/maple/index.cjs +83 -0
  48. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  49. package/dist/protocols/evm/maple/index.d.ts +22 -1
  50. package/dist/protocols/evm/maple/index.js +82 -1
  51. package/dist/protocols/evm/maple/index.js.map +1 -1
  52. package/dist/protocols/evm/sky/index.cjs +217 -0
  53. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  54. package/dist/protocols/evm/sky/index.d.ts +56 -1
  55. package/dist/protocols/evm/sky/index.js +210 -2
  56. package/dist/protocols/evm/sky/index.js.map +1 -1
  57. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/curve-dao/support.ts","../../../../src/protocols/evm/curve-dao/swapDestinations.ts","../../../../src/protocols/evm/curve-dao/apiSession.ts","../../../../src/protocols/evm/curve-dao/purpose.ts","../../../../src/protocols/evm/curve-dao/executeHelpers.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/curve-dao/multisign.ts","../../../../src/protocols/evm/curve-dao/index.ts"],"names":["getAddress","gasLimitFromEstimateAndChainConfig","ETH_PLACEHOLDER","defineChain","createPublicClient","http","parseUnits"],"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","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nconst CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554,\n])\n\nexport function isCurveApiChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n return CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS.has(n)\n}\n\nexport { isCurveApiChainSupported as isCurveDaoChainSupported }\n","import { formatUnits, getAddress, isAddress, parseUnits } from 'viem'\n\nexport const CURVE_NATIVE_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nconst ETH_PLACEHOLDER = CURVE_NATIVE_PLACEHOLDER\n\nfunction normalizeAddr(a: string): string {\n return a.toLowerCase()\n}\n\n/** Map token in list to the address shape Curve uses in pool graphs (native → 0xeeee…). */\nexport function toCurveTokenKey(tokenInAddress: string, wrappedNative: string | undefined): string {\n if (!isAddress(tokenInAddress)) return normalizeAddr(tokenInAddress)\n try {\n const a = getAddress(tokenInAddress)\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n return a.toLowerCase()\n } catch {\n return normalizeAddr(tokenInAddress)\n }\n}\n\n/**\n * Router / `getBestRouteAndOutput` expect the same coin id as the pool graph: wrapped native\n * is represented as `0xeeee…`, not the WETH (etc.) contract. Without this, route discovery can\n * return an empty route while BFS (which uses `toCurveTokenKey`) still finds a path.\n */\nexport function toCurveRouterTokenId(tokenAddress: string, wrappedNative: string | undefined): string {\n const t = (tokenAddress ?? '').trim().toLowerCase()\n if (t === ETH_PLACEHOLDER) return ETH_PLACEHOLDER\n if (!isAddress((tokenAddress ?? '').trim())) return normalizeAddr((tokenAddress ?? '').trim())\n try {\n const a = getAddress((tokenAddress ?? '').trim())\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n /** Lowercase matches pool graph keys and `@curvefi/api`’s `DECIMALS` lookups. */\n return a.toLowerCase()\n } catch {\n return normalizeAddr((tokenAddress ?? '').trim())\n }\n}\n\n/**\n * Turn the user’s decimal string into a canonical form using **this chain’s** token-in decimals\n * (from the asset row). `@curvefi/api` uses the same for `parseUnits` when building routes; an\n * over-long fraction (e.g. 1e-8 on USDC) can make internal calls fail and yield an empty route / 0.0.\n */\nexport function normalizeCurveRouterAmountString(raw: string, tokenInDecimals: number): string {\n const t = raw.trim().replace(/,/g, '')\n if (!t) return ''\n if (!Number.isInteger(tokenInDecimals) || tokenInDecimals < 0 || tokenInDecimals > 18) {\n throw new Error('Invalid token-in decimals for amount normalization.')\n }\n const wei = parseUnits(t, tokenInDecimals)\n return formatUnits(wei, tokenInDecimals)\n}\n\nfunction addEdge(adj: Map<string, Set<string>>, a: string, b: string) {\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/**\n * Build graph from the same pool list the Curve router uses (`getPool` / `getPoolList` on the\n * public `@curvefi/api` instance; `getPoolsData` is internal).\n */\nexport function buildCurveLiquidityGraphFromApi(curve: {\n getPoolList: () => string[]\n getPool: (id: string) => {\n underlyingCoinAddresses: string[] | undefined\n wrappedCoinAddresses: string[] | undefined\n }\n}): Map<string, Set<string>> {\n const adj = new Map<string, Set<string>>()\n for (const id of curve.getPoolList()) {\n try {\n const pool = curve.getPool(id)\n const w = (pool.wrappedCoinAddresses ?? []).map(normalizeAddr)\n const u = (pool.underlyingCoinAddresses ?? []).map(normalizeAddr)\n const all = [...new Set([...w, ...u])]\n for (let i = 0; i < all.length; i++) {\n for (let j = i + 1; j < all.length; j++) {\n addEdge(adj, all[i], all[j])\n }\n }\n } catch {\n /* pool constructor can throw for stale ids */\n }\n }\n return adj\n}\n\n/**\n * Add bidirectional edge between the SDK's native placeholder coin and WETH, when the chain uses\n * wrapped native in pools (mirrors the Curve dialog graph).\n */\nexport function addNativeWethBridge(adj: Map<string, Set<string>>, wrappedNative: string | undefined) {\n if (!wrappedNative) return\n const w = wrappedNative.toLowerCase()\n const a = ETH_PLACEHOLDER\n const b = w\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/** True when the token key appears in the graph with at least one swap neighbor. */\nexport function isCurveTokenKeySwappable(\n swappableNodeKeys: ReadonlySet<string>,\n graphTokenKey: string,\n): boolean {\n return swappableNodeKeys.has(graphTokenKey)\n}\n\n/**\n * All token keys in `adj` that have at least one pool neighbor (candidates to start a path from).\n */\nexport function swappableCurveGraphNodeKeys(adj: Map<string, Set<string>>): Set<string> {\n const out = new Set<string>()\n for (const [k, neigh] of adj) {\n if (neigh.size > 0) out.add(k)\n }\n return out\n}\n\n/**\n * All tokens in the same connected component as `start` (excluding `start`), for router discovery.\n */\nexport function bfsCurveSwapDestinations(adj: Map<string, Set<string>>, start: string): Set<string> {\n const s = normalizeAddr(start)\n const visited = new Set<string>([s])\n const q: string[] = [s]\n while (q.length) {\n const n = q.shift()!\n for (const nxt of adj.get(n) ?? []) {\n if (!visited.has(nxt)) {\n visited.add(nxt)\n q.push(nxt)\n }\n }\n }\n visited.delete(s)\n return visited\n}\n\nexport type CurveDestToken = {\n address: string\n symbol: string\n name: string\n /** From Curve `getCoinsData` (on-chain), when available. */\n decimals: number | null\n}\n","import {\n addNativeWethBridge,\n buildCurveLiquidityGraphFromApi,\n swappableCurveGraphNodeKeys,\n} from './swapDestinations.js'\n\n/** Live `@curvefi/api` instance with pools already fetched, plus the routing graph. */\nexport type CurveFullSession = {\n /** Same reference used for getCoinsData / router; pools already loaded. */\n curve: any\n adj: Map<string, Set<string>>\n swappableNodeKeys: ReadonlySet<string>\n wrappedNative: string | undefined\n}\n\n/**\n * Fetches all factory pools in parallel (best-effort; failures are ignored per factory,\n * same as the Curve dialog).\n */\nexport async function fetchAllCurvePools(curve: {\n factory: { fetchPools: () => Promise<unknown> }\n crvUSDFactory: { fetchPools: () => Promise<unknown> }\n EYWAFactory: { fetchPools: () => Promise<unknown> }\n cryptoFactory: { fetchPools: () => Promise<unknown> }\n twocryptoFactory: { fetchPools: () => Promise<unknown> }\n tricryptoFactory: { fetchPools: () => Promise<unknown> }\n stableNgFactory: { fetchPools: () => Promise<unknown> }\n}): Promise<void> {\n const run = (p: Promise<unknown>) => p.catch(() => undefined)\n await Promise.all([\n run(curve.factory.fetchPools()),\n run(curve.crvUSDFactory.fetchPools()),\n run(curve.EYWAFactory.fetchPools()),\n run(curve.cryptoFactory.fetchPools()),\n run(curve.twocryptoFactory.fetchPools()),\n run(curve.tricryptoFactory.fetchPools()),\n run(curve.stableNgFactory.fetchPools()),\n ])\n}\n\n/**\n * One init + `fetchAllCurvePools` + graph build. Reuse this session for the asset list and the\n * Curve dialog to avoid duplicating the Curve API work.\n */\nexport async function loadFullCurveSessionForRpc(rpcUrl: string): Promise<CurveFullSession | null> {\n const url = (rpcUrl ?? '').trim()\n if (!url) return null\n try {\n const { default: curve } = await import('@curvefi/api')\n await curve.init('JsonRpc', { url }, {})\n const wrapped = (curve.getNetworkConstants() as { NATIVE_COIN?: { wrappedAddress?: string } })\n .NATIVE_COIN?.wrappedAddress\n if (!curve.hasRouter || !curve.hasRouter()) {\n return {\n curve,\n adj: new Map(),\n swappableNodeKeys: new Set<string>(),\n wrappedNative: wrapped,\n }\n }\n await fetchAllCurvePools(curve)\n const adj = buildCurveLiquidityGraphFromApi(curve)\n addNativeWethBridge(adj, wrapped)\n return {\n curve,\n adj,\n swappableNodeKeys: swappableCurveGraphNodeKeys(adj),\n wrappedNative: wrapped,\n }\n } catch {\n return null\n }\n}\n\n","/**\n * One-line prefill for multi-sign \"Purpose\" on Curve (DAO) swap (user may add detail below).\n * Matches the spirit of `buildUniswapV4PurposePrefill` for Uniswap.\n */\nexport function buildCurveDaoPurposePrefill(args: {\n tokenInSymbol: string\n tokenOutSymbol: string\n amountIn: string\n /** Quoted output from `getBestRouteAndOutput` (decimal string, no symbol). */\n quoteOutAmount: string | null\n slippageInput: string\n chainName: string\n chainId: number\n}): string {\n const symIn = (args.tokenInSymbol || '').trim() || 'token in'\n const symOut = (args.tokenOutSymbol || '').trim() || 'token out'\n const rawS = String(args.slippageInput || '0.5').trim().replace(/,/g, '')\n const parsedSlip = Number.parseFloat(rawS)\n const slip = Number.isFinite(parsedSlip) ? parsedSlip : 0.5\n const slipText = (Math.round(slip * 100) / 100).toString()\n const cname = (args.chainName || '').trim() || 'chain'\n const amt = (args.amountIn || '').trim()\n const qo = (args.quoteOutAmount || '').trim()\n let mid: string\n if (amt && qo) {\n mid = `${amt} ${symIn} for an estimated ${qo} ${symOut}`\n } else if (amt) {\n mid = `${amt} ${symIn} for an estimated output in ${symOut}`\n } else {\n mid = `… ${symIn} → ${symOut}`\n }\n return `Curve: swap ${mid} (max slippage ${slipText}%) on ${cname} (chainId ${args.chainId})`\n}\n","import type { ProposalTxParams } from '@continuumdao/continuum-node-sdk'\nexport type { ProposalTxParams }\n\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nexport const CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS = 1_200_000n\n\nexport function isCurveDaoSwapEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0 && ex) {\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[batchIndex] && typeof bm[batchIndex] === 'object' && !Array.isArray(bm[batchIndex])) {\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n if (String((evm0 as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange') return true\n }\n }\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n return String((evm as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange'\n}\n\nexport function isCurveDaoErc20ApproveEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex?.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const evm0 = (bm[index] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n return t === 'curve_dao_erc20_approve'\n }\n }\n return false\n}\n\nexport function resolveCurveDaoRouterGasUnitsFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): bigint | null {\n if (!detail) return null\n const propBatch = (detail.proposal_tx_params ??\n detail.proposalTxParams ??\n detail.ProposalTxParams) as unknown\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (Array.isArray(propBatch) && propBatch.length > index) {\n const row = propBatch[index]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined,\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n const ex = parseExtraJsonObject(detail)\n const bm = ex?.batchMeta\n if (Array.isArray(bm)) {\n for (const item of bm) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue\n const cd = (item as Record<string, unknown>).curveDao as Record<string, unknown> | undefined\n const gb = cd?.gasBuildExchange as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gb?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n }\n }\n return null\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\nimport { toCurveRouterTokenId } from './swapDestinations.js'\nimport { CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS } from './executeHelpers.js'\nimport { routerSwapGasLimitFromEstimate } from '../../../chains/evm/routerSwapGas.js'\n\nconst ETH_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const\n\ntype CurveStepKind = 'approve' | 'exchange'\ntype CurveStep = EvmTxStep & { kind: CurveStepKind; routerSwap?: boolean; fallbackGas?: bigint }\n\nfunction txToViemStep(tx: {\n to?: string | null\n data?: string | null\n value?: string | bigint | number | null\n}): { to: Address; data: `0x${string}`; value: bigint } {\n if (!tx.to) throw new Error('Transaction missing `to`')\n const to = getAddress((tx.to ?? '').trim() as `0x${string}`)\n const raw = (tx.data ?? '0x').toString()\n const data = (raw.startsWith('0x') ? raw : `0x${raw}`) as `0x${string}`\n let value = 0n\n if (tx.value != null) {\n if (typeof tx.value === 'bigint') value = tx.value\n else value = BigInt(String(tx.value))\n }\n return { to, data, value }\n}\n\n/**\n * Build `POST /multiSignRequest` body: optional ERC-20 approve(s) to the Curve router, then\n * `CurveRouterNG.exchange` via `@curvefi/api` `router.populateSwap`.\n */\nexport async function buildEvmMultisignBodyCurveDaoBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n tokenIn: Address\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n executorAddress: Address\n purposeText: string\n}) {\n const tokenIn = getAddress(args.tokenIn)\n const executor = getAddress(args.executorAddress)\n\n const session = await loadFullCurveSessionForRpc(args.rpcUrl)\n if (!session?.curve?.router?.populateSwap) {\n throw new Error('Curve router is not available (load session failed or chain has no router).')\n }\n const { curve, wrappedNative } = session\n const wn = wrappedNative as string | undefined\n const tokenInId = toCurveRouterTokenId(tokenIn, wn)\n const outTrim = (args.tokenOut ?? '').trim()\n const tokenOutId = toCurveRouterTokenId(\n outTrim.toLowerCase() === ETH_PLACEHOLDER ? ETH_PLACEHOLDER : getAddress(outTrim),\n wn,\n )\n const isNativeIn = tokenInId.toLowerCase() === ETH_PLACEHOLDER\n const slip = args.slippagePercent\n if (!Number.isFinite(slip) || slip <= 0 || slip >= 100) {\n throw new Error('Slippage must be between 0 and 100 (exclusive).')\n }\n\n const swapPop = await curve.router.populateSwap(tokenInId, tokenOutId, args.amountHuman, slip)\n const swapBase = txToViemStep(swapPop as Parameters<typeof txToViemStep>[0])\n const rawTo = (swapPop as { to?: string | null })?.to\n if (rawTo == null || String(rawTo).trim() === '') {\n throw new Error('Curve populateSwap did not return a destination address (router).')\n }\n const routerAddr = getAddress(String(rawTo).trim() as `0x${string}`)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n ])\n const erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\n const steps: CurveStep[] = []\n\n if (!isNativeIn) {\n const decimalsN = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(decimalsN))\n const currentAllowance = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, routerAddr],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, 0n],\n })\n steps.push({ to: tokenIn, data: dataReset, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, amountWei],\n })\n steps.push({ to: tokenIn, data: dataApprove, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n }\n\n steps.push({\n ...swapBase,\n kind: 'exchange',\n routerSwap: true,\n fallbackGas: CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS,\n })\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\n const gasLimitByIndex = new Map<number, bigint>()\n const n = steps.length\n const purposeSuffix =\n n === 1\n ? 'Curve (DAO): 1-tx — CurveRouterNG.exchange (native in or allowance already set).'\n : `Curve (DAO): ${n}-tx batch — ERC-20 approve Curve router, then CurveRouterNG.exchange.`\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n const payableValueWei = steps.filter((s) => s.kind === 'exchange').reduce((a, s) => a + s.value, 0n)\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n payableValueWei: payableValueWei > 0n ? payableValueWei : undefined,\n resolveGasLimit: async ({ step, index, estimatedGas }) => {\n const s = step as CurveStep\n let gasLimitI: bigint\n if (s.kind === 'exchange') {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = estimatedGas\n }\n gasLimitByIndex.set(index, gasLimitI)\n return gasLimitI\n },\n buildBatchMeta: ({ step, index, gasLimit }) => {\n const s = step as CurveStep\n const gl = gasLimitByIndex.get(index) ?? gasLimit\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'ERC20.approve',\n to: 'Curve router',\n function: 'approve(address spender, uint256 amount)',\n spender: routerAddr,\n amountHuman: args.amountHuman,\n note: 'Allowance approved for this swap amount only (not unlimited).',\n }),\n evm: { type: 'curve_dao_erc20_approve', version: 1, chainId: String(args.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'CurveRouterNG.exchange',\n note: 'Calldata from @curvefi/api `router.populateSwap` (same on-chain as router `exchange`).',\n }),\n evm: { type: 'curve_dao_router_exchange', version: 1, chainId: String(args.chainId) },\n curveDao: {\n slippagePercent: slip,\n amountHuman: args.amountHuman,\n tokenIn: tokenInId,\n tokenOut: tokenOutId,\n isNativeIn,\n gasBuildExchange: { baseGasUnits: gl.toString() },\n },\n }\n },\n })\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isCurveApiChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './swapDestinations.js'\nexport * from './apiSession.js'\nexport * from './purpose.js'\nexport * from './executeHelpers.js'\nexport * from './multisign.js'\n\nexport const CURVE_DAO_PROTOCOL_ID = 'curve-dao'\n\nexport const curveDaoProtocolModule: ProtocolModule = {\n id: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isCurveApiChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'curve-dao.swap',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap via Curve Router NG (optional ERC-20 approve batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 token in (native uses WETH path in UI)' },\n tokenOut: { type: 'address', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage percent (0–100 exclusive)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(curveDaoProtocolModule)\n\nimport { buildEvmMultisignBodyCurveDaoBatch } from './multisign.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\n\nexport const curveDao = {\n buildSwapMultisignBody: buildEvmMultisignBodyCurveDaoBatch,\n isChainSupported: isCurveApiChainSupported,\n loadSession: loadFullCurveSessionForRpc,\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/curve-dao/support.ts","../../../../src/chains/evm/normalizeAmount.ts","../../../../src/protocols/evm/curve-dao/swapDestinations.ts","../../../../src/protocols/evm/curve-dao/apiSession.ts","../../../../src/protocols/evm/curve-dao/purpose.ts","../../../../src/protocols/evm/curve-dao/executeHelpers.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/curve-dao/multisign.ts","../../../../src/protocols/evm/curve-dao/quote.ts","../../../../src/protocols/evm/curve-dao/quoteDisplay.ts","../../../../src/protocols/evm/curve-dao/index.ts"],"names":["getAddress","gasLimitFromEstimateAndChainConfig","ETH_PLACEHOLDER","defineChain","createPublicClient","http","parseUnits","parseAbi","formatUnits"],"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","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nconst CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 1, 10, 56, 100, 137, 146, 196, 250, 252, 324, 999, 1284, 2222, 5000, 8453, 42161, 42220, 43114, 1313161554,\n])\n\nexport function isCurveApiChainSupported(chainId: string | number | bigint | null | undefined): boolean {\n const n = parseEvmChainIdToNumber(chainId)\n if (Number.isNaN(n) || n < 0) return false\n return CURVE_FULL_NETWORK_CONSTANTS_CHAIN_IDS.has(n)\n}\n\nexport { isCurveApiChainSupported as isCurveDaoChainSupported }\n","import { formatUnits, parseUnits } from 'viem'\n\n/**\n * Canonical human decimal string for a token amount (truncate to token decimals via wei round-trip).\n * Used by Curve router and multisign dialogs across protocols.\n */\nexport function normalizeHumanDecimalAmount(raw: string, tokenDecimals: number): string {\n const t = raw.trim().replace(/,/g, '')\n if (!t) return ''\n if (!Number.isInteger(tokenDecimals) || tokenDecimals < 0 || tokenDecimals > 18) {\n throw new Error('Invalid token decimals for amount normalization.')\n }\n const wei = parseUnits(t, tokenDecimals)\n return formatUnits(wei, tokenDecimals)\n}\n\n/** @deprecated Prefer normalizeHumanDecimalAmount; kept for Curve router parity. */\nexport const normalizeCurveRouterAmountString = normalizeHumanDecimalAmount\n","import { getAddress, isAddress } from 'viem'\nimport { normalizeHumanDecimalAmount } from '../../../chains/evm/normalizeAmount.js'\n\nexport const CURVE_NATIVE_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nconst ETH_PLACEHOLDER = CURVE_NATIVE_PLACEHOLDER\n\nfunction normalizeAddr(a: string): string {\n return a.toLowerCase()\n}\n\n/** Map token in list to the address shape Curve uses in pool graphs (native → 0xeeee…). */\nexport function toCurveTokenKey(tokenInAddress: string, wrappedNative: string | undefined): string {\n if (!isAddress(tokenInAddress)) return normalizeAddr(tokenInAddress)\n try {\n const a = getAddress(tokenInAddress)\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n return a.toLowerCase()\n } catch {\n return normalizeAddr(tokenInAddress)\n }\n}\n\n/**\n * Router / `getBestRouteAndOutput` expect the same coin id as the pool graph: wrapped native\n * is represented as `0xeeee…`, not the WETH (etc.) contract. Without this, route discovery can\n * return an empty route while BFS (which uses `toCurveTokenKey`) still finds a path.\n */\nexport function toCurveRouterTokenId(tokenAddress: string, wrappedNative: string | undefined): string {\n const t = (tokenAddress ?? '').trim().toLowerCase()\n if (t === ETH_PLACEHOLDER) return ETH_PLACEHOLDER\n if (!isAddress((tokenAddress ?? '').trim())) return normalizeAddr((tokenAddress ?? '').trim())\n try {\n const a = getAddress((tokenAddress ?? '').trim())\n if (wrappedNative && a.toLowerCase() === wrappedNative.toLowerCase()) {\n return ETH_PLACEHOLDER\n }\n /** Lowercase matches pool graph keys and `@curvefi/api`’s `DECIMALS` lookups. */\n return a.toLowerCase()\n } catch {\n return normalizeAddr((tokenAddress ?? '').trim())\n }\n}\n\n/**\n * Turn the user’s decimal string into a canonical form using **this chain’s** token-in decimals\n * (from the asset row). `@curvefi/api` uses the same for `parseUnits` when building routes; an\n * over-long fraction (e.g. 1e-8 on USDC) can make internal calls fail and yield an empty route / 0.0.\n */\nexport function normalizeCurveRouterAmountString(raw: string, tokenInDecimals: number): string {\n return normalizeHumanDecimalAmount(raw, tokenInDecimals)\n}\n\nfunction addEdge(adj: Map<string, Set<string>>, a: string, b: string) {\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/**\n * Build graph from the same pool list the Curve router uses (`getPool` / `getPoolList` on the\n * public `@curvefi/api` instance; `getPoolsData` is internal).\n */\nexport function buildCurveLiquidityGraphFromApi(curve: {\n getPoolList: () => string[]\n getPool: (id: string) => {\n underlyingCoinAddresses: string[] | undefined\n wrappedCoinAddresses: string[] | undefined\n }\n}): Map<string, Set<string>> {\n const adj = new Map<string, Set<string>>()\n for (const id of curve.getPoolList()) {\n try {\n const pool = curve.getPool(id)\n const w = (pool.wrappedCoinAddresses ?? []).map(normalizeAddr)\n const u = (pool.underlyingCoinAddresses ?? []).map(normalizeAddr)\n const all = [...new Set([...w, ...u])]\n for (let i = 0; i < all.length; i++) {\n for (let j = i + 1; j < all.length; j++) {\n addEdge(adj, all[i], all[j])\n }\n }\n } catch {\n /* pool constructor can throw for stale ids */\n }\n }\n return adj\n}\n\n/**\n * Add bidirectional edge between the SDK's native placeholder coin and WETH, when the chain uses\n * wrapped native in pools (mirrors the Curve dialog graph).\n */\nexport function addNativeWethBridge(adj: Map<string, Set<string>>, wrappedNative: string | undefined) {\n if (!wrappedNative) return\n const w = wrappedNative.toLowerCase()\n const a = ETH_PLACEHOLDER\n const b = w\n if (a === b) return\n if (!adj.has(a)) adj.set(a, new Set())\n if (!adj.has(b)) adj.set(b, new Set())\n adj.get(a)!.add(b)\n adj.get(b)!.add(a)\n}\n\n/** True when the token key appears in the graph with at least one swap neighbor. */\nexport function isCurveTokenKeySwappable(\n swappableNodeKeys: ReadonlySet<string>,\n graphTokenKey: string,\n): boolean {\n return swappableNodeKeys.has(graphTokenKey)\n}\n\n/**\n * All token keys in `adj` that have at least one pool neighbor (candidates to start a path from).\n */\nexport function swappableCurveGraphNodeKeys(adj: Map<string, Set<string>>): Set<string> {\n const out = new Set<string>()\n for (const [k, neigh] of adj) {\n if (neigh.size > 0) out.add(k)\n }\n return out\n}\n\n/**\n * All tokens in the same connected component as `start` (excluding `start`), for router discovery.\n */\nexport function bfsCurveSwapDestinations(adj: Map<string, Set<string>>, start: string): Set<string> {\n const s = normalizeAddr(start)\n const visited = new Set<string>([s])\n const q: string[] = [s]\n while (q.length) {\n const n = q.shift()!\n for (const nxt of adj.get(n) ?? []) {\n if (!visited.has(nxt)) {\n visited.add(nxt)\n q.push(nxt)\n }\n }\n }\n visited.delete(s)\n return visited\n}\n\nexport type CurveDestToken = {\n address: string\n symbol: string\n name: string\n /** From Curve `getCoinsData` (on-chain), when available. */\n decimals: number | null\n}\n","import {\n addNativeWethBridge,\n buildCurveLiquidityGraphFromApi,\n swappableCurveGraphNodeKeys,\n} from './swapDestinations.js'\n\n/** Live `@curvefi/api` instance with pools already fetched, plus the routing graph. */\nexport type CurveFullSession = {\n /** Same reference used for getCoinsData / router; pools already loaded. */\n curve: any\n adj: Map<string, Set<string>>\n swappableNodeKeys: ReadonlySet<string>\n wrappedNative: string | undefined\n}\n\n/**\n * Fetches all factory pools in parallel (best-effort; failures are ignored per factory,\n * same as the Curve dialog).\n */\nexport async function fetchAllCurvePools(curve: {\n factory: { fetchPools: () => Promise<unknown> }\n crvUSDFactory: { fetchPools: () => Promise<unknown> }\n EYWAFactory: { fetchPools: () => Promise<unknown> }\n cryptoFactory: { fetchPools: () => Promise<unknown> }\n twocryptoFactory: { fetchPools: () => Promise<unknown> }\n tricryptoFactory: { fetchPools: () => Promise<unknown> }\n stableNgFactory: { fetchPools: () => Promise<unknown> }\n}): Promise<void> {\n const run = (p: Promise<unknown>) => p.catch(() => undefined)\n await Promise.all([\n run(curve.factory.fetchPools()),\n run(curve.crvUSDFactory.fetchPools()),\n run(curve.EYWAFactory.fetchPools()),\n run(curve.cryptoFactory.fetchPools()),\n run(curve.twocryptoFactory.fetchPools()),\n run(curve.tricryptoFactory.fetchPools()),\n run(curve.stableNgFactory.fetchPools()),\n ])\n}\n\n/**\n * One init + `fetchAllCurvePools` + graph build. Reuse this session for the asset list and the\n * Curve dialog to avoid duplicating the Curve API work.\n */\nexport async function loadFullCurveSessionForRpc(rpcUrl: string): Promise<CurveFullSession | null> {\n const url = (rpcUrl ?? '').trim()\n if (!url) return null\n try {\n const { default: curve } = await import('@curvefi/api')\n await curve.init('JsonRpc', { url }, {})\n const wrapped = (curve.getNetworkConstants() as { NATIVE_COIN?: { wrappedAddress?: string } })\n .NATIVE_COIN?.wrappedAddress\n if (!curve.hasRouter || !curve.hasRouter()) {\n return {\n curve,\n adj: new Map(),\n swappableNodeKeys: new Set<string>(),\n wrappedNative: wrapped,\n }\n }\n await fetchAllCurvePools(curve)\n const adj = buildCurveLiquidityGraphFromApi(curve)\n addNativeWethBridge(adj, wrapped)\n return {\n curve,\n adj,\n swappableNodeKeys: swappableCurveGraphNodeKeys(adj),\n wrappedNative: wrapped,\n }\n } catch {\n return null\n }\n}\n\nexport type CurveSessionSnapshot = {\n wrappedNative: string | undefined\n swappableNodeKeys: string[]\n routerReady: boolean\n adj: Record<string, string[]>\n}\n\n/** JSON-safe Curve session for browser clients (via Next.js API route). */\nexport async function loadCurveSessionSnapshotForRpc(\n rpcUrl: string,\n): Promise<CurveSessionSnapshot | null> {\n const session = await loadFullCurveSessionForRpc(rpcUrl)\n if (!session) return null\n const adj: Record<string, string[]> = {}\n for (const [key, neighbors] of session.adj) {\n adj[key] = [...neighbors]\n }\n return {\n wrappedNative: session.wrappedNative,\n swappableNodeKeys: [...session.swappableNodeKeys],\n routerReady: Boolean(session.curve?.hasRouter?.() && session.curve.hasRouter()),\n adj,\n }\n}\n\nexport type CurveCoinDataRow = {\n address: string\n name?: string\n symbol?: string\n decimals?: number | null\n}\n\n/** On-chain token metadata via `@curvefi/api` `getCoinsData` (server-side). */\nexport async function fetchCurveCoinsDataForRpc(\n rpcUrl: string,\n addresses: string[],\n): Promise<CurveCoinDataRow[]> {\n const session = await loadFullCurveSessionForRpc(rpcUrl)\n if (!session?.curve?.getCoinsData) return []\n const coins = await session.curve.getCoinsData(addresses)\n return addresses.map((addr, i) => {\n const c = coins[i] as { name?: string; symbol?: string; decimals?: number } | undefined\n const dec = c?.decimals\n const decimals =\n typeof dec === 'number' && Number.isInteger(dec) && dec >= 0 && dec <= 18 ? dec : null\n return {\n address: addr,\n name: (c?.name && String(c.name).trim()) || '—',\n symbol: (c?.symbol && String(c.symbol).trim()) || addr.slice(0, 6),\n decimals,\n }\n })\n}\n\n","/**\n * One-line prefill for multi-sign \"Purpose\" on Curve (DAO) swap (user may add detail below).\n * Matches the spirit of `buildUniswapV4PurposePrefill` for Uniswap.\n */\nexport function buildCurveDaoPurposePrefill(args: {\n tokenInSymbol: string\n tokenOutSymbol: string\n amountIn: string\n /** Quoted output from `getBestRouteAndOutput` (decimal string, no symbol). */\n quoteOutAmount: string | null\n slippageInput: string\n chainName: string\n chainId: number\n}): string {\n const symIn = (args.tokenInSymbol || '').trim() || 'token in'\n const symOut = (args.tokenOutSymbol || '').trim() || 'token out'\n const rawS = String(args.slippageInput || '0.5').trim().replace(/,/g, '')\n const parsedSlip = Number.parseFloat(rawS)\n const slip = Number.isFinite(parsedSlip) ? parsedSlip : 0.5\n const slipText = (Math.round(slip * 100) / 100).toString()\n const cname = (args.chainName || '').trim() || 'chain'\n const amt = (args.amountIn || '').trim()\n const qo = (args.quoteOutAmount || '').trim()\n let mid: string\n if (amt && qo) {\n mid = `${amt} ${symIn} for an estimated ${qo} ${symOut}`\n } else if (amt) {\n mid = `${amt} ${symIn} for an estimated output in ${symOut}`\n } else {\n mid = `… ${symIn} → ${symOut}`\n }\n return `Curve: swap ${mid} (max slippage ${slipText}%) on ${cname} (chainId ${args.chainId})`\n}\n","import type { ProposalTxParams } from '@continuumdao/continuum-node-sdk'\nexport type { ProposalTxParams }\n\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nexport const CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS = 1_200_000n\n\nexport function isCurveDaoSwapEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0 && ex) {\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[batchIndex] && typeof bm[batchIndex] === 'object' && !Array.isArray(bm[batchIndex])) {\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n if (String((evm0 as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange') return true\n }\n }\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n return String((evm as Record<string, unknown>).type ?? '') === 'curve_dao_router_exchange'\n}\n\nexport function isCurveDaoErc20ApproveEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex?.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const evm0 = (bm[index] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n return t === 'curve_dao_erc20_approve'\n }\n }\n return false\n}\n\nexport function resolveCurveDaoRouterGasUnitsFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): bigint | null {\n if (!detail) return null\n const propBatch = (detail.proposal_tx_params ??\n detail.proposalTxParams ??\n detail.ProposalTxParams) as unknown\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (Array.isArray(propBatch) && propBatch.length > index) {\n const row = propBatch[index]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined,\n )\n if (gl != null && gl > 0n) return gl\n }\n }\n const ex = parseExtraJsonObject(detail)\n const bm = ex?.batchMeta\n if (Array.isArray(bm)) {\n for (const item of bm) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue\n const cd = (item as Record<string, unknown>).curveDao as Record<string, unknown> | undefined\n const gb = cd?.gasBuildExchange as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gb?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n }\n }\n return null\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\nimport { toCurveRouterTokenId } from './swapDestinations.js'\nimport { CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS } from './executeHelpers.js'\nimport { routerSwapGasLimitFromEstimate } from '../../../chains/evm/routerSwapGas.js'\n\nconst ETH_PLACEHOLDER = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const\n\ntype CurveStepKind = 'approve' | 'exchange'\ntype CurveStep = EvmTxStep & { kind: CurveStepKind; routerSwap?: boolean; fallbackGas?: bigint }\n\nfunction txToViemStep(tx: {\n to?: string | null\n data?: string | null\n value?: string | bigint | number | null\n}): { to: Address; data: `0x${string}`; value: bigint } {\n if (!tx.to) throw new Error('Transaction missing `to`')\n const to = getAddress((tx.to ?? '').trim() as `0x${string}`)\n const raw = (tx.data ?? '0x').toString()\n const data = (raw.startsWith('0x') ? raw : `0x${raw}`) as `0x${string}`\n let value = 0n\n if (tx.value != null) {\n if (typeof tx.value === 'bigint') value = tx.value\n else value = BigInt(String(tx.value))\n }\n return { to, data, value }\n}\n\n/**\n * Build `POST /multiSignRequest` body: optional ERC-20 approve(s) to the Curve router, then\n * `CurveRouterNG.exchange` via `@curvefi/api` `router.populateSwap`.\n */\nexport async function buildEvmMultisignBodyCurveDaoBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n tokenIn: Address\n tokenOut: string\n amountHuman: string\n slippagePercent: number\n executorAddress: Address\n purposeText: string\n}) {\n const tokenIn = getAddress(args.tokenIn)\n const executor = getAddress(args.executorAddress)\n\n const session = await loadFullCurveSessionForRpc(args.rpcUrl)\n if (!session?.curve?.router?.populateSwap) {\n throw new Error('Curve router is not available (load session failed or chain has no router).')\n }\n const { curve, wrappedNative } = session\n const wn = wrappedNative as string | undefined\n const tokenInId = toCurveRouterTokenId(tokenIn, wn)\n const outTrim = (args.tokenOut ?? '').trim()\n const tokenOutId = toCurveRouterTokenId(\n outTrim.toLowerCase() === ETH_PLACEHOLDER ? ETH_PLACEHOLDER : getAddress(outTrim),\n wn,\n )\n const isNativeIn = tokenInId.toLowerCase() === ETH_PLACEHOLDER\n const slip = args.slippagePercent\n if (!Number.isFinite(slip) || slip <= 0 || slip >= 100) {\n throw new Error('Slippage must be between 0 and 100 (exclusive).')\n }\n\n const swapPop = await curve.router.populateSwap(tokenInId, tokenOutId, args.amountHuman, slip)\n const swapBase = txToViemStep(swapPop as Parameters<typeof txToViemStep>[0])\n const rawTo = (swapPop as { to?: string | null })?.to\n if (rawTo == null || String(rawTo).trim() === '') {\n throw new Error('Curve populateSwap did not return a destination address (router).')\n }\n const routerAddr = getAddress(String(rawTo).trim() as `0x${string}`)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n ])\n const erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\n const steps: CurveStep[] = []\n\n if (!isNativeIn) {\n const decimalsN = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(decimalsN))\n const currentAllowance = await publicClient.readContract({\n address: tokenIn,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, routerAddr],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, 0n],\n })\n steps.push({ to: tokenIn, data: dataReset, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [routerAddr, amountWei],\n })\n steps.push({ to: tokenIn, data: dataApprove, value: 0n, kind: 'approve', fallbackGas: 80_000n })\n }\n }\n\n steps.push({\n ...swapBase,\n kind: 'exchange',\n routerSwap: true,\n fallbackGas: CURVE_ROUTER_EXCHANGE_DEFAULT_GAS_UNITS,\n })\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\n const gasLimitByIndex = new Map<number, bigint>()\n const n = steps.length\n const purposeSuffix =\n n === 1\n ? 'Curve (DAO): 1-tx — CurveRouterNG.exchange (native in or allowance already set).'\n : `Curve (DAO): ${n}-tx batch — ERC-20 approve Curve router, then CurveRouterNG.exchange.`\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n const payableValueWei = steps.filter((s) => s.kind === 'exchange').reduce((a, s) => a + s.value, 0n)\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n payableValueWei: payableValueWei > 0n ? payableValueWei : undefined,\n resolveGasLimit: async ({ step, index, estimatedGas }) => {\n const s = step as CurveStep\n let gasLimitI: bigint\n if (s.kind === 'exchange') {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = estimatedGas\n }\n gasLimitByIndex.set(index, gasLimitI)\n return gasLimitI\n },\n buildBatchMeta: ({ step, index, gasLimit }) => {\n const s = step as CurveStep\n const gl = gasLimitByIndex.get(index) ?? gasLimit\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'ERC20.approve',\n to: 'Curve router',\n function: 'approve(address spender, uint256 amount)',\n spender: routerAddr,\n amountHuman: args.amountHuman,\n note: 'Allowance approved for this swap amount only (not unlimited).',\n }),\n evm: { type: 'curve_dao_erc20_approve', version: 1, chainId: String(args.chainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'CurveDao',\n name: 'CurveRouterNG.exchange',\n note: 'Calldata from @curvefi/api `router.populateSwap` (same on-chain as router `exchange`).',\n }),\n evm: { type: 'curve_dao_router_exchange', version: 1, chainId: String(args.chainId) },\n curveDao: {\n slippagePercent: slip,\n amountHuman: args.amountHuman,\n tokenIn: tokenInId,\n tokenOut: tokenOutId,\n isNativeIn,\n gasBuildExchange: { baseGasUnits: gl.toString() },\n },\n }\n },\n })\n}\n","import {\n\tcreatePublicClient,\n\tdefineChain,\n\tgetAddress,\n\thttp,\n\tparseAbi,\n\tzeroAddress,\n} from 'viem'\nimport {loadFullCurveSessionForRpc} from './apiSession.js'\nimport {\n\tCURVE_NATIVE_PLACEHOLDER,\n\tnormalizeCurveRouterAmountString,\n\ttoCurveRouterTokenId,\n} from './swapDestinations.js'\nimport {isCurveApiChainSupported} from './support.js'\n\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\n\nfunction normalizeNativeTokenIn(tokenIn: string): string {\n\tconst trimmed = tokenIn.trim()\n\tif (!trimmed) return tokenIn\n\tconst lower = trimmed.toLowerCase()\n\tif (\n\t\tlower === 'eth' ||\n\t\tlower === 'native' ||\n\t\tlower === 'native_eth' ||\n\t\tlower === zeroAddress.toLowerCase() ||\n\t\tlower === CURVE_NATIVE_PLACEHOLDER.toLowerCase()\n\t) {\n\t\treturn CURVE_NATIVE_PLACEHOLDER\n\t}\n\treturn trimmed\n}\n\nasync function resolveTokenInDecimals(args: {\n\trpcUrl: string\n\tchainId: number\n\ttokenIn: string\n\ttokenInDecimals?: number\n}): Promise<number> {\n\tif (\n\t\targs.tokenInDecimals != null &&\n\t\tNumber.isInteger(args.tokenInDecimals) &&\n\t\targs.tokenInDecimals >= 0 &&\n\t\targs.tokenInDecimals <= 18\n\t) {\n\t\treturn args.tokenInDecimals\n\t}\n\tconst normalized = normalizeNativeTokenIn(args.tokenIn)\n\tif (normalized.toLowerCase() === CURVE_NATIVE_PLACEHOLDER.toLowerCase()) {\n\t\treturn 18\n\t}\n\tconst addr = getAddress(\n\t\tnormalized.startsWith('0x')\n\t\t\t? (normalized as `0x${string}`)\n\t\t\t: (`0x${normalized}` as `0x${string}`),\n\t)\n\tconst ch = defineChain({\n\t\tid: args.chainId,\n\t\tname: 'CurveQuote',\n\t\tnativeCurrency: {decimals: 18, name: 'Ether', symbol: 'ETH'},\n\t\trpcUrls: {default: {http: [args.rpcUrl]}},\n\t})\n\tconst publicClient = createPublicClient({chain: ch, transport: http(args.rpcUrl)})\n\tconst decimalsN = await publicClient.readContract({\n\t\taddress: addr,\n\t\tabi: erc20DecimalsAbi,\n\t\tfunctionName: 'decimals',\n\t})\n\treturn Number(decimalsN)\n}\n\nexport type CurveDaoQuoteResult = {\n\tinputAmount: string\n\toutput: string\n\troute: unknown\n\tpriceImpactPercent: number | null\n\ttokenInRouterId: string\n\ttokenOutRouterId: string\n}\n\n/**\n * Curve Router NG quote via `@curvefi/api` `getBestRouteAndOutput` (+ optional `swapPriceImpact`).\n * Same semantics as continuumdao-node-app Curve dialog / `useCurveDaoRoutesAndQuote`.\n */\nexport async function curveDaoQuote(args: {\n\trpcUrl: string\n\tchainId: number\n\ttokenIn: string\n\ttokenOut: string\n\tamountHuman: string\n\ttokenInDecimals?: number\n}): Promise<CurveDaoQuoteResult> {\n\tconst rpcUrl = (args.rpcUrl ?? '').trim()\n\tif (!rpcUrl) {\n\t\tthrow new Error('rpcUrl is required.')\n\t}\n\tif (!Number.isFinite(args.chainId) || args.chainId <= 0) {\n\t\tthrow new Error('chainId must be a positive integer.')\n\t}\n\tif (!isCurveApiChainSupported(args.chainId)) {\n\t\tthrow new Error(`Chain ${args.chainId} is not supported by Curve Router NG.`)\n\t}\n\n\tconst tokenInDecimals = await resolveTokenInDecimals({\n\t\trpcUrl,\n\t\tchainId: args.chainId,\n\t\ttokenIn: args.tokenIn,\n\t\ttokenInDecimals: args.tokenInDecimals,\n\t})\n\tconst amountForRouter = normalizeCurveRouterAmountString(\n\t\targs.amountHuman,\n\t\ttokenInDecimals,\n\t)\n\tif (!amountForRouter) {\n\t\tthrow new Error('amountHuman must be a positive decimal string.')\n\t}\n\n\tconst session = await loadFullCurveSessionForRpc(rpcUrl)\n\tif (!session?.curve?.router?.getBestRouteAndOutput) {\n\t\tthrow new Error('Curve router is not available (session load failed or chain has no router).')\n\t}\n\n\tconst {curve, wrappedNative: wn} = session\n\tconst tokenInRouterId = toCurveRouterTokenId(normalizeNativeTokenIn(args.tokenIn), wn)\n\tconst tokenOutTrim = (args.tokenOut ?? '').trim()\n\tconst tokenOutRouterId = toCurveRouterTokenId(\n\t\ttokenOutTrim.toLowerCase() === CURVE_NATIVE_PLACEHOLDER.toLowerCase()\n\t\t\t? CURVE_NATIVE_PLACEHOLDER\n\t\t\t: getAddress(\n\t\t\t\t\ttokenOutTrim.startsWith('0x')\n\t\t\t\t\t\t? (tokenOutTrim as `0x${string}`)\n\t\t\t\t\t\t: (`0x${tokenOutTrim}` as `0x${string}`),\n\t\t\t\t),\n\t\twn,\n\t)\n\n\tconst res = await curve.router.getBestRouteAndOutput(\n\t\ttokenInRouterId,\n\t\ttokenOutRouterId,\n\t\tamountForRouter,\n\t)\n\tconst route = (res as {route?: unknown})?.route\n\tif (!route || (Array.isArray(route) && route.length === 0)) {\n\t\tthrow new Error(\n\t\t\t'Curve router could not find a pool route for this pair and size.',\n\t\t)\n\t}\n\tconst outStr = String((res as {output?: string})?.output ?? '0')\n\n\tlet priceImpactPercent: number | null = null\n\ttry {\n\t\tconst pi = await curve.router.swapPriceImpact(\n\t\t\ttokenInRouterId,\n\t\t\ttokenOutRouterId,\n\t\t\tamountForRouter,\n\t\t)\n\t\tif (typeof pi === 'number' && Number.isFinite(pi)) {\n\t\t\tpriceImpactPercent = pi\n\t\t}\n\t} catch {\n\t\t/* best-effort */\n\t}\n\n\treturn {\n\t\tinputAmount: amountForRouter,\n\t\toutput: outStr,\n\t\troute,\n\t\tpriceImpactPercent,\n\t\ttokenInRouterId,\n\t\ttokenOutRouterId,\n\t}\n}\n","import { formatUnits, parseUnits } from 'viem'\n\n/**\n * UI helpers for Curve `getBestRouteAndOutput` + `swapPriceImpact` in the multi-sign dialog.\n * Values are human-decimal strings from `@curvefi/api` (not wei).\n */\n\n/**\n * In amount for a second, tiny `getBestRouteAndOutput` call — ~0.01% of the trade, ≥1 wei,\n * &lt; full size so marginal output/input approximates the pre-trade spot.\n */\nexport function curveProbeInAmountString(fullNormalizedHuman: string, tokenInDecimals: number): string | null {\n const t = (fullNormalizedHuman ?? '').trim()\n if (!t) return null\n if (!Number.isInteger(tokenInDecimals) || tokenInDecimals < 0 || tokenInDecimals > 18) return null\n let wei: bigint\n try {\n wei = parseUnits(t, tokenInDecimals)\n } catch {\n return null\n }\n if (wei <= 1n) return null\n let p = wei / 10000n\n if (p < 1n) p = 1n\n if (p >= wei) p = wei - 1n\n return formatUnits(p, tokenInDecimals)\n}\n\n/**\n * Compares average execution rate (full quote) vs marginal rate (tiny probe) as a positive\n * \"execution slippage\" percent when the average is worse than the marginal.\n */\nexport function computeCurveExecutionSlippagePercent(args: {\n fullInHuman: string\n fullOutHuman: string\n probeInHuman: string\n probeOutHuman: string\n}): number | null {\n const aIn = parseFloat((args.fullInHuman ?? '').replace(/,/g, '').trim())\n const aOut = parseFloat((args.fullOutHuman ?? '').replace(/,/g, '').trim())\n const pIn = parseFloat((args.probeInHuman ?? '').replace(/,/g, '').trim())\n const pOut = parseFloat((args.probeOutHuman ?? '').replace(/,/g, '').trim())\n if (!(aIn > 0) || !(aOut >= 0) || !(pIn > 0) || !Number.isFinite(pOut) || pOut < 0) return null\n const marginal = pOut / pIn\n const avg = aOut / aIn\n if (!Number.isFinite(marginal) || marginal <= 0 || !Number.isFinite(avg)) return null\n const pct = (1 - avg / marginal) * 100\n if (!Number.isFinite(pct)) return null\n return Math.max(0, pct)\n}\n\n/** e.g. \"1 USDC ≈ 0.9992 USDT\" from quoted input/output amounts. */\nexport function formatCurveExchangeLine(\n amountIn: string,\n amountOut: string,\n tokenInSymbol: string,\n tokenOutSymbol: string,\n): string {\n const a = parseFloat((amountIn ?? '').replace(/,/g, '').trim())\n const b = parseFloat((amountOut ?? '').replace(/,/g, '').trim())\n const sIn = (tokenInSymbol || '').trim() || 'in'\n const sOut = (tokenOutSymbol || '').trim() || 'out'\n if (!(a > 0) || !Number.isFinite(b)) return '—'\n const r = b / a\n let rate: string\n if (r >= 0.0001) {\n rate = r\n .toFixed(8)\n .replace(/0+$/, '')\n .replace(/\\.$/, '')\n } else if (r > 0) {\n rate = r.toPrecision(6)\n } else {\n rate = '0'\n }\n if (!rate) rate = '0'\n return `1 ${sIn} ≈ ${rate} ${sOut}`\n}\n\n/** @curvefi `swapPriceImpact` return value: ~0–100% pool price impact. */\nexport function formatCurvePriceImpact(percent0to100: number | null | undefined): string {\n if (percent0to100 == null || !Number.isFinite(percent0to100) || percent0to100 < 0) return '—'\n if (percent0to100 === 0) return '0%'\n if (percent0to100 < 0.0001) return '<0.0001%'\n const t =\n percent0to100 < 0.01\n ? percent0to100.toFixed(4)\n : percent0to100 < 1\n ? percent0to100.toFixed(3)\n : percent0to100 < 10\n ? percent0to100.toFixed(2)\n : percent0to100.toFixed(1)\n return `${t.replace(/(\\.\\d*?[1-9])0+$/g, '$1').replace(/\\.0$/, '')}%`\n}\n\n/**\n * Shown to match `router.populateSwap` (min received at user max slippage). Display-only float math.\n */\nexport function formatMinOutAtUserSlippage(quoteOutDecimal: string, userSlippagePercentInput: string, tokenOutSymbol: string): string {\n const q = parseFloat((quoteOutDecimal ?? '').replace(/,/g, '').trim())\n const rawS = (userSlippagePercentInput ?? '0.5').trim().replace(/,/g, '')\n const slip = Number.parseFloat(rawS)\n const s = Number.isFinite(slip) && slip >= 0 && slip < 100 ? slip : 0.5\n if (!Number.isFinite(q) || q < 0) return '—'\n const min = q * ((100 - s) / 100)\n const sOut = (tokenOutSymbol || '').trim() || 'out'\n const t = min\n .toFixed(8)\n .replace(/\\.?0+$/, '')\n .replace(/(\\.\\d*?[1-9])0+$/, '$1')\n return `${t} ${sOut}`.trim()\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isCurveApiChainSupported } from './support.js'\n\nexport * from './support.js'\nexport * from './swapDestinations.js'\nexport * from './apiSession.js'\nexport * from './purpose.js'\nexport * from './executeHelpers.js'\nexport * from './multisign.js'\nexport * from './quote.js'\nexport * from './quoteDisplay.js'\n\nexport const CURVE_DAO_PROTOCOL_ID = 'curve-dao'\n\nexport const curveDaoProtocolModule: ProtocolModule = {\n id: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isCurveApiChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n if (token.category !== 'evm') return false\n return token.kind === 'native' || token.kind === 'erc20'\n },\n actions: [\n {\n id: 'curve-dao.quote',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Quote swap via Curve Router NG (getBestRouteAndOutput)',\n commonParams: [],\n params: {\n chainId: { type: 'number', required: true, description: 'EVM chain id' },\n tokenIn: { type: 'address', required: true, description: 'Token in or native placeholder' },\n tokenOut: { type: 'address', required: true, description: 'Token out or native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n },\n },\n {\n id: 'curve-dao.swap',\n protocolId: CURVE_DAO_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Swap via Curve Router NG (optional ERC-20 approve batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenIn: { type: 'address', required: true, description: 'ERC-20 token in (native uses WETH path in UI)' },\n tokenOut: { type: 'address', required: true, description: 'Output token or 0xeeee… native placeholder' },\n amountHuman: { type: 'string', required: true, description: 'Human-readable input amount' },\n slippagePercent: { type: 'number', required: true, description: 'Slippage percent (0–100 exclusive)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(curveDaoProtocolModule)\n\nimport { buildEvmMultisignBodyCurveDaoBatch } from './multisign.js'\nimport { loadFullCurveSessionForRpc } from './apiSession.js'\n\nexport const curveDao = {\n buildSwapMultisignBody: buildEvmMultisignBodyCurveDaoBatch,\n isChainSupported: isCurveApiChainSupported,\n loadSession: loadFullCurveSessionForRpc,\n}\n"]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var viem = require('viem');
4
4
  var continuumNodeSdk = require('@continuumdao/continuum-node-sdk');
5
+ var chains = require('viem/chains');
5
6
 
6
7
  // src/core/registry.ts
7
8
  var modules = [];
@@ -805,6 +806,103 @@ function resolveEthenaBatchStepGasFromSignRequest(detail, batchIndex) {
805
806
  }
806
807
  return null;
807
808
  }
809
+ var ETHENA_MINTING_V2_MAINNET = "0xe3490297a08d6fC8Da46Edb7B6142E4F461b62D3";
810
+ var ETHENA_MINTING_READ_ABI = viem.parseAbi([
811
+ "function isSupportedAsset(address asset) view returns (bool)"
812
+ ]);
813
+ var cachedClient = null;
814
+ function publicClientForMainnetRpc(rpcUrl) {
815
+ if (cachedClient && cachedClient.rpc === rpcUrl) return cachedClient.client;
816
+ const c = viem.createPublicClient({ chain: chains.mainnet, transport: viem.http(rpcUrl.trim(), { batch: { batchSize: 64 } }) });
817
+ cachedClient = { rpc: rpcUrl, client: c };
818
+ return c;
819
+ }
820
+ async function fetchEthenaMintingIsSupportedMap(rpcUrl, contractAddresses) {
821
+ const out = /* @__PURE__ */ new Map();
822
+ if (!rpcUrl.trim()) return out;
823
+ const unique = [];
824
+ const seen = /* @__PURE__ */ new Set();
825
+ for (const raw of contractAddresses) {
826
+ try {
827
+ const a = viem.getAddress(raw);
828
+ const k = a.toLowerCase();
829
+ if (seen.has(k)) continue;
830
+ seen.add(k);
831
+ unique.push(a);
832
+ } catch {
833
+ }
834
+ }
835
+ if (unique.length === 0) return out;
836
+ const client = publicClientForMainnetRpc(rpcUrl);
837
+ const res = await client.multicall({
838
+ contracts: unique.map((asset) => ({
839
+ address: ETHENA_MINTING_V2_MAINNET,
840
+ abi: ETHENA_MINTING_READ_ABI,
841
+ functionName: "isSupportedAsset",
842
+ args: [asset]
843
+ })),
844
+ allowFailure: true
845
+ });
846
+ for (let i = 0; i < unique.length; i++) {
847
+ const row = res[i];
848
+ if (row.status !== "success") continue;
849
+ if (row.result === true) out.set(unique[i], true);
850
+ }
851
+ return out;
852
+ }
853
+ var STAKED_USDE_V2_VIEWS_ABI = viem.parseAbi([
854
+ "function cooldownDuration() view returns (uint24)",
855
+ "function cooldowns(address account) view returns (uint104 cooldownEnd, uint152 underlyingAmount)"
856
+ ]);
857
+ function publicClientForMainnet(rpcUrl) {
858
+ return viem.createPublicClient({
859
+ chain: { id: 1, name: "Ethereum", nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 }, rpcUrls: { default: { http: [rpcUrl.trim()] } } },
860
+ transport: viem.http(rpcUrl.trim())
861
+ });
862
+ }
863
+ async function readEthenaStakedUsdeCooldownDuration(args) {
864
+ const v = viem.getAddress(args.vault ?? SUSDE_ETHEREUM_MAINNET);
865
+ const c = publicClientForMainnet(args.rpcUrl);
866
+ const d = await c.readContract({
867
+ address: v,
868
+ abi: STAKED_USDE_V2_VIEWS_ABI,
869
+ functionName: "cooldownDuration"
870
+ });
871
+ return BigInt(d);
872
+ }
873
+ async function readEthenaStakedUsdeUserCooldown(args) {
874
+ const v = viem.getAddress(args.vault ?? SUSDE_ETHEREUM_MAINNET);
875
+ const c = publicClientForMainnet(args.rpcUrl);
876
+ const r = await c.readContract({
877
+ address: v,
878
+ abi: STAKED_USDE_V2_VIEWS_ABI,
879
+ functionName: "cooldowns",
880
+ args: [viem.getAddress(args.account)]
881
+ });
882
+ const tuple = r;
883
+ return {
884
+ cooldownEnd: BigInt(tuple[0]),
885
+ underlyingAmount: BigInt(tuple[1])
886
+ };
887
+ }
888
+ async function readEthenaMainnetBlockTimestamp(rpcUrl) {
889
+ const c = publicClientForMainnet(rpcUrl);
890
+ const b = await c.getBlock({ blockTag: "latest" });
891
+ return b.timestamp;
892
+ }
893
+ function formatEthenaCooldownDurationLabel(totalSec) {
894
+ if (totalSec <= 0n) return "0 seconds";
895
+ const d = totalSec / 86400n;
896
+ const h = totalSec % 86400n / 3600n;
897
+ const m = totalSec % 3600n / 60n;
898
+ const s = totalSec % 60n;
899
+ const parts = [];
900
+ if (d > 0n) parts.push(`${d} day${d === 1n ? "" : "s"}`);
901
+ if (h > 0n) parts.push(`${h} hour${h === 1n ? "" : "s"}`);
902
+ if (m > 0n) parts.push(`${m} min`);
903
+ if (s > 0n) parts.push(`${s} sec`);
904
+ return parts.join(", ");
905
+ }
808
906
 
809
907
  // src/protocols/evm/ethena/index.ts
810
908
  var ETHENA_PROTOCOL_ID = "ethena";
@@ -830,6 +928,7 @@ registerProtocolModule(ethenaProtocolModule);
830
928
 
831
929
  exports.ETHENA_KEY_ADDRESSES_DOC = ETHENA_KEY_ADDRESSES_DOC;
832
930
  exports.ETHENA_LABS_GITHUB = ETHENA_LABS_GITHUB;
931
+ exports.ETHENA_MINTING_V2_MAINNET = ETHENA_MINTING_V2_MAINNET;
833
932
  exports.ETHENA_PROTOCOL_ID = ETHENA_PROTOCOL_ID;
834
933
  exports.ETHENA_SUSDE_DEPOSIT_GET_SIG_GAS_FALLBACK = ETHENA_SUSDE_DEPOSIT_GET_SIG_GAS_FALLBACK;
835
934
  exports.SUSDE_ETHEREUM_MAINNET = SUSDE_ETHEREUM_MAINNET;
@@ -841,11 +940,16 @@ exports.buildEvmMultisignBodyEthenaSusdeRedeemToUsde = buildEvmMultisignBodyEthe
841
940
  exports.buildEvmMultisignBodyEthenaUnstakeClaim = buildEvmMultisignBodyEthenaUnstakeClaim;
842
941
  exports.buildEvmMultisignBodyEthenaUsdeStakeToSusde = buildEvmMultisignBodyEthenaUsdeStakeToSusde;
843
942
  exports.ethenaProtocolModule = ethenaProtocolModule;
943
+ exports.fetchEthenaMintingIsSupportedMap = fetchEthenaMintingIsSupportedMap;
944
+ exports.formatEthenaCooldownDurationLabel = formatEthenaCooldownDurationLabel;
844
945
  exports.isEthenaSusdeDepositBatchStep = isEthenaSusdeDepositBatchStep;
845
946
  exports.isEthenaUsdeOnAssetsChain = isEthenaUsdeOnAssetsChain;
846
947
  exports.isEvmChainInEthenaUsdeList = isEvmChainInEthenaUsdeList;
847
948
  exports.listEthenaUsdeEvmNetworkRows = listEthenaUsdeEvmNetworkRows;
949
+ exports.readEthenaMainnetBlockTimestamp = readEthenaMainnetBlockTimestamp;
848
950
  exports.readEthenaStakePreviewShares = readEthenaStakePreviewShares;
951
+ exports.readEthenaStakedUsdeCooldownDuration = readEthenaStakedUsdeCooldownDuration;
952
+ exports.readEthenaStakedUsdeUserCooldown = readEthenaStakedUsdeUserCooldown;
849
953
  exports.readEthenaUnstakePreviewUsde = readEthenaUnstakePreviewUsde;
850
954
  exports.resolveEthenaBatchStepGasFromSignRequest = resolveEthenaBatchStepGasFromSignRequest;
851
955
  exports.usdeTokenAddressOnEvmChain = usdeTokenAddressOnEvmChain;