@sherwoodagent/cli 0.88.2 → 0.89.1

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 (87) hide show
  1. package/dist/{abis-WJQ6IVYV.js → abis-2VBXBA7Y.js} +16 -2
  2. package/dist/{agent-FCGZL4GF.js → agent-KMLNSKBS.js} +11 -11
  3. package/dist/{chat-AKLYUJZV.js → chat-JW5Z3JRE.js} +13 -13
  4. package/dist/{chunk-6SAE2VDK.js → chunk-6IC2NRED.js} +2 -2
  5. package/dist/{chunk-HMFPP2PE.js → chunk-77MBGRE5.js} +52 -24
  6. package/dist/chunk-77MBGRE5.js.map +1 -0
  7. package/dist/{chunk-G5MXVAFC.js → chunk-D3GTHAJS.js} +5 -5
  8. package/dist/chunk-G5FOHSQW.js +338 -0
  9. package/dist/chunk-G5FOHSQW.js.map +1 -0
  10. package/dist/chunk-GAQMHH44.js +18 -0
  11. package/dist/chunk-GAQMHH44.js.map +1 -0
  12. package/dist/{chunk-FWQESFFM.js → chunk-GYGSKMZE.js} +91 -8
  13. package/dist/chunk-GYGSKMZE.js.map +1 -0
  14. package/dist/{chunk-J2IZWAEW.js → chunk-JCL2DEH3.js} +2048 -2
  15. package/dist/chunk-JCL2DEH3.js.map +1 -0
  16. package/dist/{chunk-BH3VTJ4F.js → chunk-JKSDCCVL.js} +6 -6
  17. package/dist/{chunk-EEI6FRTE.js → chunk-JLOROS5V.js} +3 -3
  18. package/dist/{chunk-6D3FNU75.js → chunk-JRGYI34A.js} +5 -5
  19. package/dist/chunk-KZGY7NT7.js +209 -0
  20. package/dist/chunk-KZGY7NT7.js.map +1 -0
  21. package/dist/{chunk-G3FUEM5N.js → chunk-LIW6K4OJ.js} +2 -2
  22. package/dist/{chunk-4ITTHKRX.js → chunk-P4LFNKSX.js} +5 -5
  23. package/dist/{chunk-3TZIOAPH.js → chunk-QUAVAJWE.js} +13 -2
  24. package/dist/chunk-QUAVAJWE.js.map +1 -0
  25. package/dist/chunk-QVXKYT2N.js +489 -0
  26. package/dist/chunk-QVXKYT2N.js.map +1 -0
  27. package/dist/{chunk-QFGZQYZA.js → chunk-WDPA2BYK.js} +1024 -87
  28. package/dist/chunk-WDPA2BYK.js.map +1 -0
  29. package/dist/{chunk-CWGP4VXZ.js → chunk-YIN6R66K.js} +7 -7
  30. package/dist/chunk-Z3YLWXMN.js +513 -0
  31. package/dist/chunk-Z3YLWXMN.js.map +1 -0
  32. package/dist/{chunk-D4BSBW3Q.js → chunk-Z53JZORT.js} +3 -3
  33. package/dist/{chunk-SCQAKMMI.js → chunk-ZPOPWFSP.js} +5 -5
  34. package/dist/{client-PYFE6YQR.js → client-DA434B67.js} +4 -4
  35. package/dist/{config-ZGFS4I7K.js → config-UZ2GIXAO.js} +6 -2
  36. package/dist/{eas-B4HR2HXX.js → eas-ZH7BDEOK.js} +7 -7
  37. package/dist/{governor-QFBN6RYS.js → governor-WHT2V2EU.js} +7 -7
  38. package/dist/identity-TRPUQEQK.js +19 -0
  39. package/dist/index.js +7758 -5862
  40. package/dist/index.js.map +1 -1
  41. package/dist/launchpad-GKB645EU.js +30 -0
  42. package/dist/lighter-perp-template-VC4TB7AM.js +92 -0
  43. package/dist/lighter-preflight-GH3JKLR6.js +149 -0
  44. package/dist/lighter-preflight-GH3JKLR6.js.map +1 -0
  45. package/dist/{network-7445KSCF.js → network-EZ5X2BF7.js} +3 -3
  46. package/dist/network-EZ5X2BF7.js.map +1 -0
  47. package/dist/{price-EXZDYVDD.js → price-RX5J7GTO.js} +9 -7
  48. package/dist/{price-EXZDYVDD.js.map → price-RX5J7GTO.js.map} +1 -1
  49. package/dist/{providers-6UZKDFQD.js → providers-XEEFKITN.js} +5 -5
  50. package/dist/{research-T7A27OMB.js → research-PYMQ5VKH.js} +9 -9
  51. package/dist/{session-45NQAHFI.js → session-DE47TUEW.js} +15 -15
  52. package/dist/{trade-ZOVM433K.js → trade-3VMAQ75D.js} +20 -18
  53. package/dist/{trade-ZOVM433K.js.map → trade-3VMAQ75D.js.map} +1 -1
  54. package/dist/{vault-E7XD6DLD.js → vault-PXGG2E3K.js} +9 -9
  55. package/dist/vault-PXGG2E3K.js.map +1 -0
  56. package/dist/{xmtp-72IRK7JL.js → xmtp-5PTIIVAI.js} +7 -7
  57. package/package.json +1 -1
  58. package/dist/chunk-3TZIOAPH.js.map +0 -1
  59. package/dist/chunk-FWQESFFM.js.map +0 -1
  60. package/dist/chunk-HMFPP2PE.js.map +0 -1
  61. package/dist/chunk-J2IZWAEW.js.map +0 -1
  62. package/dist/chunk-QFGZQYZA.js.map +0 -1
  63. package/dist/identity-I2BG4IGT.js +0 -18
  64. /package/dist/{abis-WJQ6IVYV.js.map → abis-2VBXBA7Y.js.map} +0 -0
  65. /package/dist/{agent-FCGZL4GF.js.map → agent-KMLNSKBS.js.map} +0 -0
  66. /package/dist/{chat-AKLYUJZV.js.map → chat-JW5Z3JRE.js.map} +0 -0
  67. /package/dist/{chunk-6SAE2VDK.js.map → chunk-6IC2NRED.js.map} +0 -0
  68. /package/dist/{chunk-G5MXVAFC.js.map → chunk-D3GTHAJS.js.map} +0 -0
  69. /package/dist/{chunk-BH3VTJ4F.js.map → chunk-JKSDCCVL.js.map} +0 -0
  70. /package/dist/{chunk-EEI6FRTE.js.map → chunk-JLOROS5V.js.map} +0 -0
  71. /package/dist/{chunk-6D3FNU75.js.map → chunk-JRGYI34A.js.map} +0 -0
  72. /package/dist/{chunk-G3FUEM5N.js.map → chunk-LIW6K4OJ.js.map} +0 -0
  73. /package/dist/{chunk-4ITTHKRX.js.map → chunk-P4LFNKSX.js.map} +0 -0
  74. /package/dist/{chunk-CWGP4VXZ.js.map → chunk-YIN6R66K.js.map} +0 -0
  75. /package/dist/{chunk-D4BSBW3Q.js.map → chunk-Z53JZORT.js.map} +0 -0
  76. /package/dist/{chunk-SCQAKMMI.js.map → chunk-ZPOPWFSP.js.map} +0 -0
  77. /package/dist/{client-PYFE6YQR.js.map → client-DA434B67.js.map} +0 -0
  78. /package/dist/{config-ZGFS4I7K.js.map → config-UZ2GIXAO.js.map} +0 -0
  79. /package/dist/{eas-B4HR2HXX.js.map → eas-ZH7BDEOK.js.map} +0 -0
  80. /package/dist/{governor-QFBN6RYS.js.map → governor-WHT2V2EU.js.map} +0 -0
  81. /package/dist/{identity-I2BG4IGT.js.map → identity-TRPUQEQK.js.map} +0 -0
  82. /package/dist/{network-7445KSCF.js.map → launchpad-GKB645EU.js.map} +0 -0
  83. /package/dist/{vault-E7XD6DLD.js.map → lighter-perp-template-VC4TB7AM.js.map} +0 -0
  84. /package/dist/{providers-6UZKDFQD.js.map → providers-XEEFKITN.js.map} +0 -0
  85. /package/dist/{research-T7A27OMB.js.map → research-PYMQ5VKH.js.map} +0 -0
  86. /package/dist/{session-45NQAHFI.js.map → session-DE47TUEW.js.map} +0 -0
  87. /package/dist/{xmtp-72IRK7JL.js.map → xmtp-5PTIIVAI.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/swap-router.ts","../src/lib/template-encoder.ts","../src/strategies/moonwell-supply-template.ts","../src/strategies/venice-inference-template.ts","../src/strategies/aerodrome-lp-template.ts","../src/strategies/wsteth-moonwell-template.ts","../src/strategies/mamo-yield-template.ts","../src/strategies/portfolio-template.ts","../src/strategies/hyperliquid-perp-template.ts","../src/lib/abis-legacy.ts","../src/strategies/hyperliquid-grid-template.ts","../src/strategies/morpho-supply-template.ts","../src/strategies/morpho-cl-shared.ts","../src/strategies/concentrated-liquidity-template.ts"],"sourcesContent":["/**\n * SwapRouter — the single owner of \"swap tokenIn→tokenOut on the current chain\".\n *\n * Surface (small, deep):\n * - detectRoute(tokenIn, tokenOut, feeTier?) → Route (wraps template-encoder's\n * detectSwapRoute; pure on the current deployment target)\n * - buildSwapCalldata(route, opts?) → adapter swapExtraData (delegates\n * byte encoding to template-encoder's tested buildSwapExtraData)\n * - quote({tokenIn, tokenOut, amountIn}) → Route + amountOut via the active\n * network's QuoterV2 (Synthra shim on robinhood-testnet)\n *\n * Quoting primitives (getQuote / getMultiHopQuote) moved here from lib/quote.ts,\n * which is now a back-compat re-export shim. QuoterV2's quote functions are NOT\n * view — they revert internally after computing — so we use eth_call and decode\n * the return data. The client is injectable (`deps.client`) so tests never need\n * a live RPC.\n *\n * Path/extraData byte layouts are owned by template-encoder.ts (golden-vector\n * tested) and strategies/portfolio-template.ts (v4 modes) — this module only\n * composes them; it never re-implements an encoding.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult } from \"viem\";\nimport { getPublicClient } from \"./client.js\";\nimport { getNetwork } from \"./network.js\";\nimport { UNISWAP } from \"./addresses.js\";\nimport { UNISWAP_QUOTER_V2_ABI } from \"./abis.js\";\nimport { buildSwapExtraData, detectSwapRoute, encodeV3Path } from \"./template-encoder.js\";\n\nexport const DEFAULT_FEE_TIER = 3000;\n\n/**\n * Standard v3 fee tiers probed by best-execution tier selection (SHE-20 /\n * #436). Matches the candidate set the old per-chain auto-detect enumerated\n * (preferred + 10000/3000/500) — no new venues, just an output comparison.\n */\nexport const CANDIDATE_FEE_TIERS: readonly number[] = [500, 3000, 10000];\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\n\n/**\n * Minimal client surface needed for quoting (eth_call). getPublicClient()\n * satisfies it; tests inject a mock.\n */\nexport interface QuoterClient {\n call(args: { to: Address; data: Hex }): Promise<{ data?: Hex }>;\n}\n\nexport interface QuoteDeps {\n client?: QuoterClient;\n}\n\nexport type Route =\n | {\n kind: \"v3-direct\";\n tokenIn: Address;\n tokenOut: Address;\n feeTier: number;\n routeDesc: string;\n }\n | {\n kind: \"v3-hop\";\n tokenIn: Address;\n tokenOut: Address;\n via: Address;\n feeIn: number;\n feeOut: number;\n routeDesc: string;\n };\n\nexport interface QuoteResult {\n amountOut: bigint;\n sqrtPriceX96After: bigint;\n gasEstimate: bigint;\n}\n\nexport interface Quote extends QuoteResult {\n route: Route;\n}\n\n// ── Route detection ──\n\n/**\n * Detect the swap route for a token pair on the current chain.\n * Wraps template-encoder's detectSwapRoute (which owns the per-chain routing\n * decision); on the current deployment target this is pure — always a direct\n * v3-style route through the Synthra-backed adapter.\n */\nexport async function detectRoute(\n tokenIn: Address,\n tokenOut: Address,\n preferredFeeTier: number = DEFAULT_FEE_TIER,\n): Promise<Route> {\n const detected = await detectSwapRoute(tokenIn, tokenOut, preferredFeeTier);\n if (!detected) {\n throw new Error(`No swap route found for ${tokenIn}→${tokenOut} (fee ${preferredFeeTier})`);\n }\n return {\n kind: \"v3-direct\",\n tokenIn,\n tokenOut,\n feeTier: preferredFeeTier,\n routeDesc: detected.routeDesc,\n };\n}\n\n// ── Calldata building ──\n\n/**\n * Build adapter swapExtraData for a route. Byte encoding is delegated to\n * template-encoder's tested buildSwapExtraData (mode 0 single-hop / mode 1\n * multi-hop with a per-hop slippage budget).\n */\nexport function buildSwapCalldata(\n route: Route,\n opts: { perHopSlippageBps?: number } = {},\n): Hex {\n const network = getNetwork();\n if (route.kind === \"v3-hop\") {\n return buildSwapExtraData(\n network,\n route.tokenIn,\n route.tokenOut,\n route.feeIn,\n { via: route.via, feeIn: route.feeIn, feeOut: route.feeOut },\n opts.perHopSlippageBps ?? 100,\n );\n }\n return buildSwapExtraData(network, route.tokenIn, route.tokenOut, route.feeTier);\n}\n\n// ── Quoting ──\n\nfunction quoterAddress(): Address {\n const quoter = UNISWAP().QUOTER_V2;\n if (quoter === ZERO) {\n throw new Error(\"QuoterV2 not deployed on this network\");\n }\n return quoter;\n}\n\n/**\n * Quote a swap on the current chain: detect the route, then price it through\n * the network's QuoterV2 (Synthra shim on robinhood-testnet).\n */\nexport async function quote(\n params: { tokenIn: Address; tokenOut: Address; amountIn: bigint; feeTier?: number },\n deps: QuoteDeps = {},\n): Promise<Quote> {\n const route = await detectRoute(params.tokenIn, params.tokenOut, params.feeTier);\n if (route.kind === \"v3-hop\") {\n const path = encodeSwapPath(\n [route.tokenIn, route.via, route.tokenOut],\n [route.feeIn, route.feeOut],\n );\n const result = await getMultiHopQuote({ path, amountIn: params.amountIn }, deps);\n return { route, ...result };\n }\n const result = await getQuote(\n {\n tokenIn: route.tokenIn,\n tokenOut: route.tokenOut,\n amountIn: params.amountIn,\n fee: route.feeTier,\n },\n deps,\n );\n return { route, ...result };\n}\n\n/**\n * Best-execution fee-tier selection (SHE-20 / #436).\n *\n * Quotes `amountIn` (exact-in) through EVERY candidate fee tier and returns\n * the tier with the highest `amountOut` — never the first tier that merely\n * quotes. A tier whose quote reverts, returns no data, or returns a zero\n * output is skipped (no pool, or a pool too shallow to price the amount).\n *\n * Determinism: tiers are probed in a fixed order — the preferred tier first,\n * then the remaining candidates ascending as listed in CANDIDATE_FEE_TIERS —\n * and a strictly-greater comparison picks the winner, so on an exact\n * output tie the earlier tier (i.e. the preferred one) wins.\n *\n * Returns null when NO candidate quotes at all (no route, or the quoter is\n * unreachable). Callers decide the fallback: the portfolio propose flow\n * falls back to the preferred tier — the pre-SHE-20 behavior — rather than\n * failing, so a dead RPC cannot brick a propose that works today.\n */\nexport async function selectBestFeeTier(\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n preferredFeeTier?: number;\n candidateFeeTiers?: readonly number[];\n },\n deps: QuoteDeps = {},\n): Promise<{\n feeTier: number;\n amountOut: bigint;\n quoted: { feeTier: number; amountOut: bigint }[];\n} | null> {\n const preferred = params.preferredFeeTier ?? DEFAULT_FEE_TIER;\n const candidates = params.candidateFeeTiers ?? CANDIDATE_FEE_TIERS;\n const tiers = [preferred, ...candidates.filter((t) => t !== preferred)];\n\n const quoted: { feeTier: number; amountOut: bigint }[] = [];\n for (const fee of tiers) {\n try {\n const { amountOut } = await getQuote(\n { tokenIn: params.tokenIn, tokenOut: params.tokenOut, amountIn: params.amountIn, fee },\n deps,\n );\n if (amountOut > 0n) quoted.push({ feeTier: fee, amountOut });\n } catch {\n // No pool at this tier (quoter revert / no data) — skip it.\n }\n }\n\n if (quoted.length === 0) return null;\n let best = quoted[0];\n for (const q of quoted) {\n if (q.amountOut > best.amountOut) best = q;\n }\n return { feeTier: best.feeTier, amountOut: best.amountOut, quoted };\n}\n\n/**\n * Get a single-hop swap quote from QuoterV2 (moved from lib/quote.ts).\n */\nexport async function getQuote(\n params: { tokenIn: Address; tokenOut: Address; amountIn: bigint; fee: number },\n deps: QuoteDeps = {},\n): Promise<QuoteResult> {\n const client = deps.client ?? getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n const { data } = await client.call({ to: quoterAddress(), data: calldata });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this pair/fee\");\n }\n\n const [amountOut, sqrtPriceX96After, , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n data,\n }) as [bigint, bigint, number, bigint];\n\n return { amountOut, sqrtPriceX96After, gasEstimate };\n}\n\n/**\n * Get a multi-hop swap quote from QuoterV2 (moved from lib/quote.ts).\n */\nexport async function getMultiHopQuote(\n params: { path: Hex; amountIn: bigint },\n deps: QuoteDeps = {},\n): Promise<QuoteResult> {\n const client = deps.client ?? getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n args: [params.path, params.amountIn],\n });\n\n const { data } = await client.call({ to: quoterAddress(), data: calldata });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this path\");\n }\n\n const [amountOut, , , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n data,\n }) as [bigint, bigint[], number[], bigint];\n\n return { amountOut, sqrtPriceX96After: 0n, gasEstimate };\n}\n\n// ── Pure helpers (moved from lib/quote.ts) ──\n\n/**\n * Apply slippage tolerance to a quote amount.\n * Returns the minimum acceptable output amount.\n */\nexport function applySlippage(amountOut: bigint, slippageBps: number): bigint {\n return (amountOut * BigInt(10000 - slippageBps)) / 10000n;\n}\n\n/**\n * Encode a Uniswap V3 multi-hop swap path (address + uint24 fee + address ...).\n * Validates the shape here (>= 2 tokens), then delegates the byte layout to\n * template-encoder's tested encodeV3Path.\n */\nexport function encodeSwapPath(tokens: Address[], fees: number[]): Hex {\n if (tokens.length < 2 || fees.length !== tokens.length - 1) {\n throw new Error(\"Invalid path: need at least 2 tokens and (tokens-1) fees\");\n }\n return encodeV3Path(tokens, fees);\n}\n\n/** Token decimals for display purposes (moved from lib/quote.ts). */\nexport const TOKEN_DECIMALS: Record<string, number> = {\n USDC: 6,\n WETH: 18,\n cbETH: 18,\n wstETH: 18,\n cbBTC: 8,\n DAI: 18,\n AERO: 18,\n};\n","/**\n * Template encoder — pure params → bytes encoding for strategy templates.\n *\n * Extracted from commands/strategy-template.ts so the calldata-producing logic\n * is testable without a chain. The interface is deliberately small:\n *\n * - buildInitDataForTemplate(templateKey, opts, vault, resolved?) — per-template\n * initialize() payload + the asset/amount the vault must fund.\n * - buildCallsForTemplate(templateKey, clone, asset, amount, extraApprovals?) —\n * the execute/settle BatchCall arrays for a proposal.\n *\n * Secondary exports (parseSwapRouteSpec, buildSwapExtraData, encodeV3Path,\n * parseAlignedOverrides, computeProposalAssetChecks, resolve* helpers) exist for\n * the command layer and for tests.\n *\n * PURITY RULE: nothing in this module performs chain I/O or touches the signer.\n * The two inputs that historically needed RPC (the Venice minVVV auto-quote and\n * the Aerodrome tokenA/tokenB decimals) are supplied by the caller via\n * `ResolvedChainInputs` — see resolveChainInputsForTemplate in\n * commands/strategy-template.ts. Registry lookups (TOKENS(), CHAINLINK(), …) are\n * config reads keyed off the network singleton, not RPC.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport {\n parseUnits,\n isAddress,\n encodeAbiParameters,\n concat,\n numberToHex,\n} from \"viem\";\nimport chalk from \"chalk\";\n\nimport { getNetwork } from \"./network.js\";\nimport {\n TOKENS,\n MOONWELL,\n VENICE,\n AERODROME,\n UNISWAP,\n SYNTHRA,\n CHAINLINK,\n ROBINHOOD_STOCK_ROUTES,\n} from \"./addresses.js\";\nimport type { BatchCall } from \"./batch.js\";\n\nimport * as moonwellBuilder from \"../strategies/moonwell-supply-template.js\";\nimport * as veniceBuilder from \"../strategies/venice-inference-template.js\";\nimport * as aerodromeBuilder from \"../strategies/aerodrome-lp-template.js\";\nimport * as wstethBuilder from \"../strategies/wsteth-moonwell-template.js\";\nimport * as mamoBuilder from \"../strategies/mamo-yield-template.js\";\nimport * as portfolioBuilder from \"../strategies/portfolio-template.js\";\nimport * as hyperliquidPerpBuilder from \"../strategies/hyperliquid-perp-template.js\";\nimport * as hyperliquidGridBuilder from \"../strategies/hyperliquid-grid-template.js\";\n// ── lighter ──\nimport * as lighterBuilder from \"../strategies/lighter-perp-template.js\";\n// ── /lighter ──\n// ── launchpad ──\nimport * as launchpadBuilder from \"../strategies/launchpad-template.js\";\n// ── morpho-supply / concentrated-liquidity ──\nimport * as morphoSupplyBuilder from \"../strategies/morpho-supply-template.js\";\nimport * as clBuilder from \"../strategies/concentrated-liquidity-template.js\";\n// ── end morpho-supply / concentrated-liquidity ──\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\n\n/**\n * Chain-derived inputs the encoder cannot (and must not) fetch itself.\n * Resolved by the command layer BEFORE encoding (see\n * resolveChainInputsForTemplate in commands/strategy-template.ts).\n */\nexport interface ResolvedChainInputs {\n /** venice-inference: agent wallet — the caller defaults it to the signer. */\n veniceAgent?: Address;\n /**\n * venice-inference: auto-quoted minVVV (18-dec) for a non-direct path when\n * --min-vvv was not passed. Quoted via the Aerodrome router off-module.\n */\n veniceMinVVV?: bigint;\n /** aerodrome-lp: on-chain decimals() of tokenA / tokenB. */\n aerodromeDecimals?: { decimalsA: number; decimalsB: number };\n /**\n * portfolio: per-allocation best-execution v3 fee tier, index-aligned with\n * --tokens (SHE-20 / #436). Quoted by the command layer (see\n * resolveChainInputsForTemplate in commands/strategy-template-lib.ts) at\n * each leg's ACTUAL allocation amount (weight × totalAmount) across all\n * candidate tiers, picking the highest output. A null/undefined slot falls\n * through to detectSwapRoute's preferred-tier default — an explicit\n * --swap-routes override for the slot still wins over both.\n */\n portfolioFeeTiers?: ({ feeTier: number; routeDesc: string } | null)[];\n // ── lighter ──\n /**\n * lighter-perp: the L2 agent key `sherwood lighter keygen` saved to the local\n * config, used when --pubkey is not passed. Read by the command layer.\n */\n lighterSavedKey?: { pubKey: string; apiKeyIndex: number };\n // ── /lighter ──\n // ── launchpad ──\n /**\n * launchpad: every chain-derived input (vault asset + decimals, quote\n * decimals, swap routes + floors, the live-fee-derived maxFeeIn, deadline,\n * and the drawdown the proposal must declare). Resolved and preflighted by\n * commands/launchpad-preflight.ts.\n */\n launchpad?: launchpadBuilder.LaunchpadResolved;\n // ── morpho-supply / concentrated-liquidity ──\n /**\n * morpho-supply: the preflighted init plan (market params read from Morpho,\n * vault asset + decimals, every _initialize check passed). Built by\n * strategies/morpho-cl-resolve.ts.\n */\n morphoSupply?: morphoSupplyBuilder.MorphoSupplyPlan;\n /**\n * concentrated-liquidity: the preflighted InitParams (pool + market state,\n * snapped range, computed expectedLiquidity). Built by\n * strategies/morpho-cl-resolve.ts.\n */\n concentratedLiquidity?: clBuilder.CLPlan;\n // ── end morpho-supply / concentrated-liquidity ──\n}\n\n// ── Uniswap V3 swap routing helpers ──\n\n/**\n * Encode Uniswap V3 packed path: token (20 bytes) + fee (3 bytes) + token (20 bytes) [+ fee + token ...]\n */\nexport function encodeV3Path(tokens: Address[], fees: number[]): Hex {\n if (tokens.length !== fees.length + 1) throw new Error(\"tokens.length must be fees.length + 1\");\n const parts: Hex[] = [];\n for (let i = 0; i < tokens.length; i++) {\n parts.push(tokens[i].toLowerCase() as Hex);\n if (i < fees.length) {\n // fee as 3 bytes (uint24)\n parts.push(numberToHex(fees[i], { size: 3 }));\n }\n }\n return concat(parts);\n}\n\n/**\n * Build swapExtraData for the UniswapSwapAdapter.\n *\n * Mode 0 — single-hop: 0x00 + abi.encode(uint24 fee)\n * Mode 1 — multi-hop: 0x01 + abi.encode(bytes path, uint16 perHopSlippageBps)\n *\n * Sherlock run #2 #11: mode-1 extraData now carries a per-hop slippage\n * budget so the adapter's `_chainedSingleHops` can enforce a per-hop\n * `amountOutMinimum` derived from a quoter pre-call at swap time. This\n * closes the cascading-sandwich attack on intermediate hops. Default\n * to 100 bps (1%) per hop unless the caller overrides — conservative\n * for typical V3 routes; mainnet templates with deeper pools can\n * tighten this. The adapter still enforces the top-level `amountOutMin`\n * on the final hop, so cumulative slippage is doubly capped.\n *\n * robinhood-testnet uses the registry UniswapSwapAdapter (Synthra-router-backed,\n * QuoterV2-shim), which consumes the SAME mode-prefixed encoding as the other\n * chains — mode 0 single-hop / mode 1 multi-hop — so no special-case here.\n */\nexport function buildSwapExtraData(\n network: string,\n tokenIn: Address,\n tokenOut: Address,\n feeTier: number,\n hop?: { via: Address; feeIn: number; feeOut: number },\n perHopSlippageBps: number = 100,\n): Hex {\n if (hop) {\n // Multi-hop: tokenIn → hop.via → tokenOut\n const path = encodeV3Path([tokenIn, hop.via, tokenOut], [hop.feeIn, hop.feeOut]);\n const encoded = encodeAbiParameters(\n [{ type: \"bytes\" }, { type: \"uint16\" }],\n [path, perHopSlippageBps],\n );\n return `0x01${encoded.slice(2)}` as Hex;\n }\n\n // Single-hop: mode 0\n const encoded = encodeAbiParameters([{ type: \"uint24\" }], [feeTier]);\n return `0x00${encoded.slice(2)}` as Hex;\n}\n\n// ── Explicit per-token swap-route spec parsing (--swap-routes) ──\n//\n// One entry per allocation, comma-separated at the flag level. Each entry:\n// 'v3:<fee>' → mode 0 (v3 single-hop)\n// 'v4:<fee>:<tickSpacing>' → mode 2 (v4 single-hop hookless)\n// 'v4path:<hop>+<hop>+...' → mode 3 (v4 multi-hop hookless)\n// where hop = '<currency>@<fee>:<tickSpacing>' and\n// currency ∈ { 'eth'|'native' → address(0), 'self' → this allocation's\n// token, or a literal 0x-address }. The last hop's currency MUST resolve\n// to the allocation token (contract-enforced); 'self' is the ergonomic form.\n\nexport function parseSwapRouteSpec(spec: string, token: Address): Hex {\n const s = spec.trim();\n const [kind, ...restParts] = s.split(\":\");\n const rest = restParts.join(\":\");\n switch (kind) {\n case \"v3\": {\n const fee = Number(rest);\n if (!Number.isInteger(fee) || fee <= 0) throw new Error(`bad v3 fee in '${spec}'`);\n return portfolioBuilder.v3SingleHopExtraData(fee);\n }\n case \"v4\": {\n const [feeStr, tsStr] = rest.split(\":\");\n const fee = Number(feeStr);\n const tickSpacing = Number(tsStr);\n if (!Number.isInteger(fee) || fee <= 0) throw new Error(`bad v4 fee in '${spec}'`);\n if (!Number.isInteger(tickSpacing) || tickSpacing <= 0) throw new Error(`bad v4 tickSpacing in '${spec}'`);\n return portfolioBuilder.v4SingleHopExtraData(fee, tickSpacing);\n }\n case \"v4path\": {\n const hops = rest.split(\"+\").map((hopStr) => {\n const [currencyRaw, feeTs] = hopStr.split(\"@\");\n if (!feeTs) throw new Error(`bad v4path hop '${hopStr}' in '${spec}' (expected currency@fee:tickSpacing)`);\n const [feeStr, tsStr] = feeTs.split(\":\");\n const fee = Number(feeStr);\n const tickSpacing = Number(tsStr);\n if (!Number.isInteger(fee) || fee <= 0) throw new Error(`bad v4path fee in '${spec}'`);\n if (!Number.isInteger(tickSpacing) || tickSpacing <= 0) throw new Error(`bad v4path tickSpacing in '${spec}'`);\n const c = currencyRaw.trim().toLowerCase();\n let currency: Address;\n if (c === \"eth\" || c === \"native\") currency = ZERO;\n else if (c === \"self\") currency = token;\n else if (isAddress(currencyRaw.trim())) currency = currencyRaw.trim() as Address;\n else throw new Error(`bad v4path currency '${currencyRaw}' in '${spec}' (use eth/native/self/0x-address)`);\n return { currency, fee, tickSpacing };\n });\n return portfolioBuilder.v4PathExtraData(hops);\n }\n default:\n throw new Error(`unknown swap-route kind '${kind}' in '${spec}' (use v3/v4/v4path)`);\n }\n}\n\n/**\n * Auto-detect swap route for a token pair on Uniswap V3.\n * Returns { direct: true, feeTier } or { direct: false, hop } or null if no route found.\n *\n * NOTE (encoder purity): on the current deployment target this performs NO\n * chain I/O — the multi-chain v3 pool probing was removed with Base/HyperEVM.\n * If per-chain detection comes back, the pool probing belongs in the command\n * layer (resolveChainInputsForTemplate), NOT here.\n */\nexport async function detectSwapRoute(\n asset: Address,\n token: Address,\n preferredFeeTier: number,\n): Promise<{ extraData: Hex; routeDesc: string } | null> {\n const network = getNetwork();\n // Both Robinhood chains use a direct v3-style route (Synthra-backed adapter\n // on 46630, official Uniswap v3 on the fork). Multi-chain v3 auto-detect (Base/HyperEVM)\n // was removed with those chains; re-add per-chain detection here when a chain\n // with distinct routing comes back.\n return {\n extraData: buildSwapExtraData(network, asset, token, preferredFeeTier),\n routeDesc: `direct (fee ${preferredFeeTier})`,\n };\n}\n\n// ── Helpers for building init data per template ──\n\n/**\n * Pure (no-RPC) derivation of the assets a propose call will pull from the\n * vault. Mirrors the asset/amount slice of `buildInitDataForTemplate` so the\n * propose preflight can balance-check the vault BEFORE clone + init burns\n * any gas. Returns one entry per token the vault has to fund — single\n * entry for most templates, two for aerodrome-lp (tokenA + tokenB).\n *\n * Templates whose amount is `0n` (hyperliquid-perp / -grid in dynamic-all\n * mode, wsteth-moonwell without --amount) intentionally return entries\n * with `amount === 0n`; the caller short-circuits on those.\n *\n * Kept in sync with `buildInitDataForTemplate` per-branch logic. The\n * sync-invariant suite in template-encoder.test.ts enforces the mirror for\n * venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp\n * and hyperliquid-grid. NOT enforced there: moonwell-supply (no Moonwell\n * market on the Robinhood-testnet token registry, so the branch is\n * unreachable in tests) and aerodrome-lp (returns [] — per-leg decimals\n * need RPC). Diverging here only weakens the preflight guard — the real\n * values still come from `buildInitDataForTemplate`, so we'd just miss a\n * warning, never produce an inconsistent on-chain call.\n */\nexport function computeProposalAssetChecks(\n templateKey: string,\n opts: Record<string, string | boolean | undefined>,\n): { asset: Address; amount: bigint; label: string }[] {\n if (templateKey === \"moonwell-supply\" || templateKey === \"mamo-yield\") {\n if (!opts.amount) return [];\n const token = (opts.token as string) || \"USDC\";\n const asset = resolveToken(token);\n const decimals = assetDecimalsForSymbol(token);\n return [{ asset, amount: parseUnits(opts.amount as string, decimals), label: token.toUpperCase() }];\n }\n\n if (templateKey === \"venice-inference\") {\n if (!opts.amount) return [];\n const assetSymbol = (opts.asset as string) || \"USDC\";\n const asset = resolveToken(assetSymbol);\n const decimals = assetDecimalsForSymbol(assetSymbol);\n return [{ asset, amount: parseUnits(opts.amount as string, decimals), label: assetSymbol.toUpperCase() }];\n }\n\n if (templateKey === \"aerodrome-lp\") {\n // Aerodrome needs both legs of the pair funded. We can't compute the\n // per-leg parseUnits without a decimals() RPC, so we fall back to a\n // raw-units balance check (vault must hold at least `amountA` raw of\n // tokenA AND `amountB` raw of tokenB). Worst case: a stricter check\n // than needed, never permissive.\n if (!opts.tokenA || !opts.tokenB || !opts.amountA || !opts.amountB) return [];\n // amountA/amountB are human strings — without decimals we can't normalize.\n // Skip the precise check for aerodrome and let buildInitDataForTemplate\n // handle errors. (Other templates cover the common --amount footgun.)\n return [];\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n if (!opts.amount) return []; // dynamic-all mode\n return [{\n asset: TOKENS().WETH,\n amount: parseUnits(opts.amount as string, 18),\n label: \"WETH\",\n }];\n }\n\n if (templateKey === \"portfolio\") {\n if (!opts.amount) return [];\n // Keep this in lock-step with buildInitDataForTemplate's portfolio branch:\n // default asset is USDG on robinhood mainnet (6 dec, no USDC there), WETH on\n // robinhood-testnet, USDC elsewhere; decimals resolved from token metadata.\n const assetSymbol = (opts.asset as string) || defaultPortfolioAsset();\n const asset = resolveToken(assetSymbol);\n const decimals = assetDecimalsForSymbol(assetSymbol);\n return [{ asset, amount: parseUnits(opts.amount as string, decimals), label: assetSymbol.toUpperCase() }];\n }\n\n if (templateKey === \"hyperliquid-perp\" || templateKey === \"hyperliquid-grid\") {\n if (!opts.amount) return []; // dynamic-all mode — skip check\n const token = (opts.token as string) || \"USDC\";\n const asset = resolveToken(token);\n const decimals = assetDecimalsForSymbol(token);\n return [{ asset, amount: parseUnits(opts.amount as string, decimals), label: token.toUpperCase() }];\n }\n\n // ── lighter ──\n if (templateKey === \"lighter-perp\") {\n // The template pins USDG; the ceiling is --deposit (alias --amount).\n const human = (opts.deposit ?? opts.amount) as string | undefined;\n if (!human) return [];\n let amount: bigint;\n try {\n amount = lighterBuilder.usdgToTicks(human);\n } catch {\n return []; // the encoder reports the malformed flag\n }\n return [{ asset: lighterBuilder.LIGHTER_USDG, amount, label: \"USDG\" }];\n }\n // ── /lighter ──\n\n return [];\n}\n\n/**\n * Parse a comma-separated per-allocation override flag (--feeds,\n * --price-decimals, --swap-routes) into a slot-aligned array.\n *\n * Empty entries are PRESERVED (trimmed to \"\"), NOT filtered — so partial\n * overrides work: an empty slot falls through to that flag's per-slot\n * auto-resolve default (e.g. `--price-decimals \"8,,8\"` overrides slots 0 and 2\n * and auto-resolves slot 1). Filtering empties would collapse the length and\n * either misalign the remaining entries or trip the length check.\n *\n * Alignment is validated only when the flag is PRESENT (`raw !== undefined`):\n * an unset flag yields `[]` and `mismatch: false`. A present flag whose entry\n * count ≠ `expectedLen` returns `mismatch: true` for the caller to hard-exit.\n * (An unset flag is `undefined` here; `\"\"` — an explicitly empty flag — is\n * \"present\" and splits to `[\"\"]`, i.e. one empty slot.)\n */\nexport function parseAlignedOverrides(\n raw: string | undefined,\n expectedLen: number,\n): { values: string[]; mismatch: boolean } {\n if (raw === undefined) return { values: [], mismatch: false };\n const values = raw.split(\",\").map((s) => s.trim());\n return { values, mismatch: values.length !== expectedLen };\n}\n\nexport async function buildInitDataForTemplate(\n templateKey: string,\n opts: Record<string, string | boolean | undefined>,\n vault: Address,\n resolved?: ResolvedChainInputs,\n): Promise<{\n initData: Hex;\n asset: Address;\n assetAmount: bigint;\n extraApprovals?: { token: Address; amount: bigint }[];\n /** launchpad: the risk-envelope drawdown the proposal must declare (overrides the CLI default). */\n maxDrawdownBps?: number;\n}> {\n if (templateKey === \"moonwell-supply\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for moonwell-supply template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const mToken = resolveMToken(token);\n const decimals = assetDecimalsForSymbol(token);\n const supplyAmount = parseUnits(opts.amount as string, decimals);\n const minRedeem = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n // V2: Moonwell's native-ETH (mWETH) market redeems raw ETH the strategy\n // wraps back to WETH — every non-USDC token here is the WETH market.\n const isNativeEthMarket = token.toUpperCase() !== \"USDC\";\n\n return {\n initData: moonwellBuilder.buildInitData(underlying, mToken, supplyAmount, minRedeem, isNativeEthMarket),\n asset: underlying,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"venice-inference\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for venice-inference template\"));\n process.exit(1);\n }\n const assetSymbol = (opts.asset as string) || \"USDC\";\n const asset = resolveToken(assetSymbol);\n const vvv = VENICE().VVV;\n const isDirect = asset.toLowerCase() === vvv.toLowerCase();\n const decimals = assetDecimalsForSymbol(assetSymbol);\n const assetAmount = parseUnits(opts.amount as string, decimals);\n // The signer-default agent and the Aerodrome getAmountsOut auto-quote are\n // chain/signer concerns — the command layer resolves both (see\n // resolveChainInputsForTemplate) and passes them in.\n const agent = (opts.agent as Address) || resolved?.veniceAgent;\n if (!agent) {\n throw new Error(\n \"venice-inference: missing agent — pass --agent or resolve chain inputs (signer default) before encoding\",\n );\n }\n const isSingleHop = !!opts.singleHop;\n\n // minVVV: explicit flag wins; non-direct paths without it need the\n // caller-resolved auto-quote (5% slippage applied at quote time).\n let minVVV = 0n;\n if (!isDirect) {\n if (opts.minVvv) {\n minVVV = parseUnits(opts.minVvv as string, 18);\n } else if (resolved?.veniceMinVVV !== undefined) {\n minVVV = resolved.veniceMinVVV;\n } else {\n throw new Error(\n \"venice-inference: missing resolved minVVV quote — pass --min-vvv or resolve chain inputs before encoding\",\n );\n }\n }\n\n const params: veniceBuilder.VeniceInferenceInitParams = {\n asset,\n weth: isDirect ? ZERO : TOKENS().WETH,\n vvv,\n sVVV: VENICE().STAKING,\n aeroRouter: isDirect ? ZERO : AERODROME().ROUTER,\n aeroFactory: isDirect ? ZERO : AERODROME().FACTORY,\n agent,\n assetAmount,\n minVVV,\n deadlineOffset: 300n,\n singleHop: isSingleHop,\n };\n\n return {\n initData: veniceBuilder.buildInitData(params),\n asset,\n assetAmount,\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n for (const flag of [\"tokenA\", \"tokenB\", \"amountA\", \"amountB\", \"lpToken\"]) {\n if (!opts[flag]) {\n console.error(chalk.red(`--${flag.replace(/([A-Z])/g, \"-$1\").toLowerCase()} is required for aerodrome-lp template`));\n process.exit(1);\n }\n }\n const tokenA = opts.tokenA as Address;\n const tokenB = opts.tokenB as Address;\n // decimals() is a chain read — the command layer resolves it (see\n // resolveChainInputsForTemplate) and passes it in.\n if (!resolved?.aerodromeDecimals) {\n throw new Error(\n \"aerodrome-lp: missing resolved tokenA/tokenB decimals — resolve chain inputs before encoding\",\n );\n }\n const { decimalsA, decimalsB } = resolved.aerodromeDecimals;\n const amountA = parseUnits(opts.amountA as string, decimalsA);\n const amountB = parseUnits(opts.amountB as string, decimalsB);\n const minAOut = parseUnits((opts.minAOut as string) || \"0\", decimalsA);\n const minBOut = parseUnits((opts.minBOut as string) || \"0\", decimalsB);\n\n const params: aerodromeBuilder.AerodromeLPInitParams = {\n tokenA,\n tokenB,\n stable: !!opts.stable,\n factory: AERODROME().FACTORY,\n router: AERODROME().ROUTER,\n gauge: (opts.gauge as Address) || ZERO,\n lpToken: opts.lpToken as Address,\n amountADesired: amountA,\n amountBDesired: amountB,\n amountAMin: amountA, // use desired as min for now\n amountBMin: amountB,\n minAmountAOut: minAOut,\n minAmountBOut: minBOut,\n };\n\n return {\n initData: aerodromeBuilder.buildInitData(params),\n asset: tokenA,\n assetAmount: amountA,\n extraApprovals: [{ token: tokenB, amount: amountB }],\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n const supplyAmount = opts.amount ? parseUnits(opts.amount as string, 18) : 0n; // WETH = 18 decimals; 0 => use full vault balance at execute time\n const slippageBps = BigInt((opts.slippage as string) || \"500\"); // default 5% slippage\n // Per-unit rates (1e18-scaled) — Aerodrome wstETH/WETH stable pool trades\n // near 1:1, so default the expected rate to 1e18. Slippage cuts from that.\n // Rates scale with amountIn at execute time → dynamic-all mode is safe.\n const ONE = 10n ** 18n;\n const minWstethOutPerWeth = (ONE * (10000n - slippageBps)) / 10000n;\n const minWethOutPerWsteth = (ONE * (10000n - slippageBps)) / 10000n;\n\n const params: wstethBuilder.WstETHMoonwellInitParams = {\n weth: TOKENS().WETH,\n wsteth: TOKENS().wstETH,\n mwsteth: MOONWELL().mWstETH,\n aeroRouter: AERODROME().ROUTER,\n aeroFactory: AERODROME().FACTORY,\n chainlinkWstethEthFeed: CHAINLINK().WSTETH_ETH_FEED,\n supplyAmount,\n minWstethOutPerWeth,\n minWethOutPerWsteth,\n deadlineOffset: 300n,\n };\n\n return {\n initData: wstethBuilder.buildInitData(params),\n asset: TOKENS().WETH,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"mamo-yield\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for mamo-yield template\"));\n process.exit(1);\n }\n if (!opts.mamoFactory) {\n console.error(chalk.red(\"--mamo-factory is required for mamo-yield template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const decimals = assetDecimalsForSymbol(token);\n const amount = parseUnits(opts.amount as string, decimals);\n const minRedeemAmount = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n\n return {\n initData: mamoBuilder.buildInitData(underlying, opts.mamoFactory as Address, minRedeemAmount),\n asset: underlying,\n assetAmount: amount,\n };\n }\n\n if (templateKey === \"portfolio\") {\n if (!opts.amount) { console.error(chalk.red(\"--amount is required for portfolio template\")); process.exit(1); }\n if (!opts.tokens || !opts.weights) {\n console.error(chalk.red(\"--tokens and --weights are required for portfolio template\"));\n console.error(chalk.dim(\" --tokens: comma-separated token addresses or symbols\"));\n console.error(chalk.dim(\" --weights: comma-separated bps (must sum to 10000)\"));\n process.exit(1);\n }\n const network = getNetwork();\n const tokens = TOKENS();\n const assetSymbol = (opts.asset as string) || defaultPortfolioAsset();\n const asset = resolveToken(assetSymbol);\n const decimals = assetDecimalsForSymbol(assetSymbol);\n const totalAmount = parseUnits(opts.amount as string, decimals);\n const maxSlippageBps = Number((opts.maxSlippage as string) || \"500\");\n const feeTier = (opts.feeTier as string) || \"3000\";\n\n // Parse token specs, keeping the original symbol/spec so we can resolve a\n // Chainlink push feed on chains that use AggregatorV3 push feeds.\n const tokenSpecs = (opts.tokens as string).split(\",\").map((t) => t.trim());\n const tokenAddrs = tokenSpecs.map((trimmed) => {\n if (isAddress(trimmed)) return trimmed as Address;\n const allTokens = tokens as Record<string, Address>;\n const resolvedAddr = allTokens[trimmed.toUpperCase()];\n if (resolvedAddr && resolvedAddr !== ZERO) return resolvedAddr;\n console.error(chalk.red(`Unknown token: ${trimmed}`)); process.exit(1);\n });\n const weightsBps = (opts.weights as string).split(\",\").map((w) => Number(w.trim()));\n if (tokenAddrs.length !== weightsBps.length) { console.error(chalk.red(\"--tokens and --weights must have same length\")); process.exit(1); }\n if (weightsBps.reduce((a, b) => a + b, 0) !== 10000) { console.error(chalk.red(`Weights must sum to 10000`)); process.exit(1); }\n\n const swapAdapter = (opts.swapAdapter as Address) || resolveSwapAdapter();\n // v1 is push-feed only: each allocation carries an AggregatorV3 proxy\n // ADDRESS, and priceDecimals must equal that feed's live decimals() (8 for\n // the tokenized-equity feeds, 18 for crypto pairs).\n const chainlink = CHAINLINK() as Record<string, Address>;\n\n // Optional explicit per-allocation overrides (comma-separated, aligned to\n // --tokens). All three flags parse identically via parseAlignedOverrides:\n // empty entries are preserved so a partial override (e.g. \"8,,8\") falls\n // through to that slot's auto-resolve default; a PRESENT flag must align\n // 1:1 with --tokens (an unset flag → [] and skips the check).\n // --feeds: AggregatorV3 proxy address per allocation. Empty slot\n // → auto-resolve SYMBOL_USD_FEED below.\n // --price-decimals: raw feed scale per allocation. Empty slot → 8.\n const feeds = parseAlignedOverrides(opts.feeds as string | undefined, tokenAddrs.length);\n const feedOverrides = feeds.values;\n if (feeds.mismatch) { console.error(chalk.red(\"--feeds must have the same length as --tokens\")); process.exit(1); }\n const priceDecimals = parseAlignedOverrides(opts.priceDecimals as string | undefined, tokenAddrs.length);\n const priceDecimalOverrides = priceDecimals.values;\n if (priceDecimals.mismatch) { console.error(chalk.red(\"--price-decimals must have the same length as --tokens\")); process.exit(1); }\n\n // Explicit per-token swap-route overrides (aligned to --tokens). An empty\n // entry falls through to the robinhood default / auto-detect below.\n const swapRoutes = parseAlignedOverrides(opts.swapRoutes as string | undefined, tokenAddrs.length);\n const swapRouteOverrides = swapRoutes.values;\n if (swapRoutes.mismatch) { console.error(chalk.red(\"--swap-routes must have the same length as --tokens\")); process.exit(1); }\n\n // Robinhood mainnet default swap routes come from the data-driven\n // ROBINHOOD_STOCK_ROUTES registry (verified on-chain liquidity) plus a WETH\n // v3 fee-500 leg. A robinhood basket token with a feed but NO verified route\n // and NO --swap-routes override fails fast (see below) rather than falling\n // through to a v3 auto-detect that is guaranteed dead on 4663.\n const wethAddr = TOKENS().WETH;\n function robinhoodDefaultRoute(token: Address, symbol: string): { extraData: Hex; routeDesc: string } | null {\n // Robinhood-mainnet-only default route (verified ROBINHOOD_STOCK_ROUTES).\n // Mainnet is not in the current deployment target, so this is inert today;\n // string-compare keeps it forward-compatible for when 4663 is added back.\n if ((network as string) !== \"robinhood\") return null;\n if (wethAddr !== ZERO && token.toLowerCase() === wethAddr.toLowerCase()) {\n return { extraData: portfolioBuilder.v3SingleHopExtraData(500), routeDesc: \"v3 direct (fee 500)\" };\n }\n const r = ROBINHOOD_STOCK_ROUTES[symbol.toUpperCase()];\n if (r) {\n return {\n extraData: portfolioBuilder.v4PathExtraData([\n { currency: ZERO, fee: r.nativeFee, tickSpacing: r.nativeTickSpacing },\n { currency: token, fee: r.stockFee, tickSpacing: r.stockTickSpacing },\n ]),\n routeDesc: `v4 multi-hop (USDG→ETH fee ${r.nativeFee} / ts ${r.nativeTickSpacing} → ${symbol.toUpperCase()} fee ${r.stockFee} / ts ${r.stockTickSpacing})`,\n };\n }\n return null;\n }\n\n // Auto-detect swap routes for each token\n console.log(chalk.dim(\" Detecting swap routes...\"));\n const allocations: portfolioBuilder.BasketAllocation[] = [];\n for (let i = 0; i < tokenAddrs.length; i++) {\n const token = tokenAddrs[i];\n let route: { extraData: Hex; routeDesc: string } | null = null;\n const override = swapRouteOverrides[i];\n if (override) {\n try {\n route = { extraData: parseSwapRouteSpec(override, token), routeDesc: `explicit '${override}'` };\n } catch (e) {\n console.error(chalk.red(`Bad --swap-routes entry for ${tokenSpecs[i]}: ${(e as Error).message}`));\n process.exit(1);\n }\n }\n if (!route) route = robinhoodDefaultRoute(token, tokenSpecs[i]);\n if (!route && (network as string) === \"robinhood\") {\n // No verified default route and no override. v3 auto-detect is dead on\n // 4663 (no v3 stock pools) — fail fast with an actionable message rather\n // than emitting a doomed proposal.\n console.error(\n chalk.red(\n `No verified default swap route for ${tokenSpecs[i]} on robinhood mainnet.`,\n ),\n );\n console.error(\n chalk.yellow(\n ` Pass --swap-routes to set it explicitly for this token, e.g.\\n` +\n ` --swap-routes 'v4path:eth@500:10+self@50000:1000' (USDG→ETH→${tokenSpecs[i].toUpperCase()})`,\n ),\n );\n process.exit(1);\n }\n if (!route) {\n // Best-execution tier resolved by the command layer (SHE-20 / #436):\n // every candidate tier quoted at the leg's actual amount, highest\n // output wins. Slot is null when quoting was unavailable (or the\n // caller skipped it, e.g. explicit --fee-tier) — then fall through to\n // the preferred-tier default below, the pre-SHE-20 behavior.\n const best = resolved?.portfolioFeeTiers?.[i];\n if (best) {\n route = {\n extraData: buildSwapExtraData(network, asset, token, best.feeTier),\n routeDesc: best.routeDesc,\n };\n }\n }\n if (!route) route = await detectSwapRoute(asset, token, Number(feeTier));\n if (!route) {\n console.error(chalk.red(`No swap route found for ${token}. No Uniswap V3 pool (direct or via WETH). Pass --swap-routes to set it explicitly.`));\n process.exit(1);\n }\n console.log(chalk.dim(` ${token.slice(0, 10)}... → ${route.routeDesc}`));\n\n // Resolve the per-allocation Chainlink push feed + priceDecimals.\n // Default priceDecimals 8 (the tokenized-equity feed scale); override wins.\n const priceDecimals = priceDecimalOverrides[i]\n ? Number(priceDecimalOverrides[i])\n : 8;\n\n let feed = feedOverrides[i] as Address | undefined;\n if (feed && !isAddress(feed)) {\n console.error(chalk.red(`Bad --feeds entry for ${tokenSpecs[i]}: '${feed}' is not a 0x-prefixed AggregatorV3 address.`));\n process.exit(1);\n }\n if (!feed) {\n // Auto-resolve SYMBOL_USD_FEED from the CHAINLINK() registry by symbol.\n // WETH/ETH share the ETH_USD_FEED key (there is no WETH_USD_FEED).\n const sym = tokenSpecs[i].toUpperCase();\n const feedKey = sym === \"WETH\" || sym === \"ETH\" ? \"ETH_USD_FEED\" : `${sym}_USD_FEED`;\n feed = isAddress(tokenSpecs[i]) ? undefined : chainlink[feedKey];\n }\n if (!feed || feed === ZERO) {\n console.error(chalk.red(`No Chainlink push feed for ${tokenSpecs[i]} on ${network}. Pass --feeds <feedAddr,...> to supply AggregatorV3 addresses (every slot must be non-zero).`));\n process.exit(1);\n }\n\n allocations.push({\n token, weightBps: weightsBps[i],\n swapExtraData: route.extraData,\n priceDecimals,\n feed,\n });\n }\n return {\n initData: portfolioBuilder.buildInitData(asset, swapAdapter, allocations, totalAmount, maxSlippageBps),\n asset, assetAmount: totalAmount,\n };\n }\n\n if (templateKey === \"hyperliquid-perp\") {\n const token = (opts.token as string) || \"USDC\";\n const asset = resolveToken(token);\n const decimals = assetDecimalsForSymbol(token);\n // Omit --amount to use the vault's full asset balance at execute time (dynamic-all mode).\n const depositAmount = opts.amount ? parseUnits(opts.amount as string, decimals) : 0n;\n const leverage = Number((opts.leverage as string) || \"10\");\n const assetIndex = Number((opts.assetIndex as string) || \"0\");\n const maxPosition = parseUnits((opts.maxPosition as string) || \"100000\", decimals);\n const maxTradesDay = Number((opts.maxTradesPerDay as string) || \"50\");\n return {\n initData: hyperliquidPerpBuilder.buildInitData(asset, depositAmount, assetIndex, leverage, maxPosition, maxTradesDay),\n asset, assetAmount: depositAmount,\n };\n }\n\n if (templateKey === \"hyperliquid-grid\") {\n const token = (opts.token as string) || \"USDC\";\n const asset = resolveToken(token);\n const decimals = assetDecimalsForSymbol(token);\n const depositAmount = opts.amount ? parseUnits(opts.amount as string, decimals) : 0n;\n const leverage = Number((opts.leverage as string) || \"5\");\n const maxOrderSize = parseUnits((opts.maxOrderSize as string) || \"10000\", decimals);\n const maxOrdersPerTick = Number((opts.maxOrdersPerTick as string) || \"20\");\n const assetIndices = ((opts.assetIndices as string) || \"0\")\n .split(\",\")\n .map((s) => Number(s.trim()))\n .filter((n) => !Number.isNaN(n));\n return {\n initData: hyperliquidGridBuilder.buildInitData(asset, depositAmount, leverage, maxOrderSize, maxOrdersPerTick, assetIndices),\n asset, assetAmount: depositAmount,\n };\n }\n\n // ── lighter ──\n if (templateKey === \"lighter-perp\") {\n const params = lighterBuilder.parseLighterTemplateFlags(\n {\n pubkey: opts.pubkey as string | undefined,\n keyIndex: opts.keyIndex as string | undefined,\n markets: opts.markets as string | undefined,\n deposit: opts.deposit as string | undefined,\n amount: opts.amount as string | undefined,\n },\n resolved?.lighterSavedKey,\n );\n return {\n initData: lighterBuilder.buildInitData(params),\n asset: lighterBuilder.LIGHTER_USDG,\n assetAmount: params.depositAmount,\n };\n }\n // ── /lighter ──\n // ── launchpad ──\n if (templateKey === \"launchpad\") {\n if (!resolved?.launchpad) {\n throw new Error(\"launchpad: missing resolved chain inputs — run resolveChainInputsForTemplate before encoding\");\n }\n const { params } = launchpadBuilder.buildLaunchpadInitParams(opts, resolved.launchpad);\n return {\n initData: launchpadBuilder.buildInitData(params),\n asset: resolved.launchpad.asset,\n assetAmount: params.assetIn,\n maxDrawdownBps: resolved.launchpad.maxDrawdownBps,\n };\n }\n\n // ── morpho-supply / concentrated-liquidity ──\n // Both init tuples are functions of live venue state and both _initialize\n // bodies revert on venue checks, so the chain reads + preflight run in the\n // command layer (strategies/morpho-cl-resolve.ts) and hand over a plan.\n if (templateKey === \"morpho-supply\") {\n const plan = resolved?.morphoSupply;\n if (!plan) throw new Error(\"morpho-supply: missing resolved market plan — resolve chain inputs before encoding\");\n return {\n initData: morphoSupplyBuilder.buildInitData(plan.morpho, plan.marketParams, plan.supplyAmount),\n asset: plan.asset,\n assetAmount: plan.supplyAmount,\n };\n }\n\n if (templateKey === \"concentrated-liquidity\") {\n const plan = resolved?.concentratedLiquidity;\n if (!plan) throw new Error(\"concentrated-liquidity: missing resolved pool/market plan — resolve chain inputs before encoding\");\n // _execute pulls only collateralAmount from the vault; the borrow comes\n // from Morpho, so it is not vault capital.\n return {\n initData: clBuilder.buildInitData(plan.params),\n asset: plan.asset,\n assetAmount: plan.params.collateralAmount,\n };\n }\n // ── end morpho-supply / concentrated-liquidity ──\n\n throw new Error(`No init builder for template: ${templateKey}`);\n}\n\nexport function buildCallsForTemplate(\n templateKey: string,\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n extraApprovals?: { token: Address; amount: bigint }[],\n): { executeCalls: BatchCall[]; settleCalls: BatchCall[] } {\n if (templateKey === \"moonwell-supply\") {\n return {\n executeCalls: moonwellBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: moonwellBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"venice-inference\") {\n return {\n executeCalls: veniceBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: veniceBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n const tokenB = extraApprovals?.[0]?.token ?? ZERO;\n const amountB = extraApprovals?.[0]?.amount ?? 0n;\n return {\n executeCalls: aerodromeBuilder.buildExecuteCalls(clone, asset, assetAmount, tokenB, amountB),\n settleCalls: aerodromeBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n return {\n executeCalls: wstethBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: wstethBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"mamo-yield\") {\n return {\n executeCalls: mamoBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: mamoBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"portfolio\") {\n return {\n executeCalls: portfolioBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: portfolioBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"hyperliquid-perp\") {\n return {\n executeCalls: hyperliquidPerpBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: hyperliquidPerpBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"hyperliquid-grid\") {\n return {\n executeCalls: hyperliquidGridBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: hyperliquidGridBuilder.buildSettleCalls(clone),\n };\n }\n\n // ── lighter ──\n if (templateKey === \"lighter-perp\") {\n return {\n executeCalls: lighterBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: lighterBuilder.buildSettleCalls(clone),\n };\n }\n // ── /lighter ──\n // ── launchpad ──\n if (templateKey === \"launchpad\") {\n return {\n executeCalls: launchpadBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: launchpadBuilder.buildSettleCalls(clone),\n };\n }\n\n // ── morpho-supply / concentrated-liquidity ──\n if (templateKey === \"morpho-supply\") {\n return {\n executeCalls: morphoSupplyBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: morphoSupplyBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"concentrated-liquidity\") {\n return {\n executeCalls: clBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: clBuilder.buildSettleCalls(clone),\n };\n }\n // ── end morpho-supply / concentrated-liquidity ──\n\n throw new Error(`No call builder for template: ${templateKey}`);\n}\n\n// ── Token resolution (registry lookups — config reads, not RPC) ──\n\nexport function resolveSwapAdapter(): Address {\n const network = getNetwork();\n if (network === \"robinhood-testnet\" && SYNTHRA().ROUTER === ZERO) {\n console.error(chalk.red(\"Synthra DEX not available\"));\n process.exit(1);\n }\n // The deployed adapter on robinhood-testnet is the registry's UniswapSwapAdapter\n // (UNISWAP_SWAP_ADAPTER), backed by Synthra's router + a QuoterV2 shim\n // (SYNTHRA_QUOTER_V2_SHIM). It consumes MODE-PREFIXED extraData (0x00 single-hop\n // / 0x01 multi-hop — see buildSwapExtraData). An earlier build hardcoded a bare\n // SynthraDirectAdapter address here paired with un-prefixed extraData; that\n // adapter's on-chain `quote()` returns 0 (bricking PortfolioStrategy execute\n // with QuoteUnavailable), so always resolve the registry adapter instead.\n const adapterAddr = UNISWAP().SWAP_ADAPTER;\n if (adapterAddr !== ZERO) return adapterAddr;\n console.error(chalk.red(\"UniswapSwapAdapter not deployed yet. Use --swap-adapter to specify manually.\"));\n process.exit(1);\n}\n\nexport function resolveToken(symbolOrAddress: string): Address {\n if (isAddress(symbolOrAddress)) return symbolOrAddress as Address;\n const upper = symbolOrAddress.toUpperCase();\n // Spread the per-network TOKENS() registry (so USDG / stock tokens on robinhood\n // resolve without a second hand-rolled map — mirrors the basket-token path),\n // then overlay VVV which lives in the Venice registry rather than TOKENS().\n const tokenMap: Record<string, Address> = {\n ...(TOKENS() as Record<string, Address>),\n VVV: VENICE().VVV,\n };\n const addr = tokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`Unknown token: ${symbolOrAddress}`));\n process.exit(1);\n }\n return addr;\n}\n\n/**\n * Default vault asset for the portfolio template on the current network:\n * WETH on Robinhood testnet (an ETH-only chain), USDG on the Robinhood mainnet\n * fork, USDC as the forward-compatible default for any other chain added back.\n * Single source of truth shared by buildInitDataForTemplate +\n * computeProposalAssetChecks.\n *\n * THE FORK BRANCH IS NOT COSMETIC. Robinhood mainnet has no USDC — the token\n * resolves to address(0) — so falling through to the USDC default made every\n * portfolio proposal on the fork die in preflight with a bare\n * \"Unknown token: USDC\", naming a token the operator never asked for. The rest\n * of this file already assumed otherwise (\"default asset is USDG on robinhood\n * mainnet (6 dec, no USDC there)\"); this is the line that was left behind.\n */\nexport function defaultPortfolioAsset(): string {\n const network = getNetwork();\n if (network === \"robinhood-testnet\") return \"WETH\";\n if (network === \"robinhood-fork\") return \"USDG\";\n return \"USDC\";\n}\n\n/**\n * Decimals for a vault-asset symbol. USDC and USDG are 6-decimal stables; every\n * other supported vault asset (WETH, stock tokens, …) is 18-decimal. Kept as one\n * helper so the funding math can't drift between the preflight check and the\n * on-chain init data.\n */\nexport function assetDecimalsForSymbol(symbol: string): number {\n const upper = symbol.toUpperCase();\n return upper === \"USDC\" || upper === \"USDG\" ? 6 : 18;\n}\n\nexport function resolveMToken(tokenSymbol: string): Address {\n const upper = tokenSymbol.toUpperCase();\n const moonwell = MOONWELL();\n const mTokenMap: Record<string, Address> = {\n USDC: moonwell.mUSDC,\n WETH: moonwell.mWETH,\n };\n const addr = mTokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`No Moonwell market for: ${tokenSymbol}`));\n process.exit(1);\n }\n return addr;\n}\n","/**\n * MoonwellSupplyStrategy call builder.\n *\n * InitParams (Solidity, V2): (address underlying, address mToken, uint256 supplyAmount,\n * uint256 minRedeemAmount, bool isNativeEthMarket)\n *\n * `isNativeEthMarket` — true when the mToken is Moonwell's native-ETH (mWETH)\n * market, whose redeem returns raw ETH the strategy must wrap back to WETH.\n * false for ERC-20 markets (USDC). V2 beta added this field; encoding the old\n * 4-field payload makes the clone's `initialize` abi.decode revert with empty\n * data (vnet e2e finding, issues #411-#414).\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mToken: Address,\n supplyAmount: bigint,\n minRedeemAmount: bigint,\n isNativeEthMarket: boolean,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"bool\" },\n ],\n [underlying, mToken, supplyAmount, minRedeemAmount, isNativeEthMarket],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, supplyAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * VeniceInferenceStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address asset, address weth, address vvv, address sVVV,\n * address aeroRouter, address aeroFactory, address agent,\n * uint256 assetAmount, uint256 minVVV, uint256 deadlineOffset, bool singleHop\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface VeniceInferenceInitParams {\n asset: Address;\n weth: Address;\n vvv: Address;\n sVVV: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n agent: Address;\n assetAmount: bigint;\n minVVV: bigint;\n deadlineOffset: bigint;\n singleHop: boolean;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"asset\", type: \"address\" as const },\n { name: \"weth\", type: \"address\" as const },\n { name: \"vvv\", type: \"address\" as const },\n { name: \"sVVV\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"agent\", type: \"address\" as const },\n { name: \"assetAmount\", type: \"uint256\" as const },\n { name: \"minVVV\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n { name: \"singleHop\", type: \"bool\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: VeniceInferenceInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, assetAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * AerodromeLPStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address tokenA, address tokenB, bool stable,\n * address factory, address router, address gauge, address lpToken,\n * uint256 amountADesired, uint256 amountBDesired,\n * uint256 amountAMin, uint256 amountBMin,\n * uint256 minAmountAOut, uint256 minAmountBOut\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface AerodromeLPInitParams {\n tokenA: Address;\n tokenB: Address;\n stable: boolean;\n factory: Address;\n router: Address;\n gauge: Address;\n lpToken: Address;\n amountADesired: bigint;\n amountBDesired: bigint;\n amountAMin: bigint;\n amountBMin: bigint;\n minAmountAOut: bigint;\n minAmountBOut: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"tokenA\", type: \"address\" as const },\n { name: \"tokenB\", type: \"address\" as const },\n { name: \"stable\", type: \"bool\" as const },\n { name: \"factory\", type: \"address\" as const },\n { name: \"router\", type: \"address\" as const },\n { name: \"gauge\", type: \"address\" as const },\n { name: \"lpToken\", type: \"address\" as const },\n { name: \"amountADesired\", type: \"uint256\" as const },\n { name: \"amountBDesired\", type: \"uint256\" as const },\n { name: \"amountAMin\", type: \"uint256\" as const },\n { name: \"amountBMin\", type: \"uint256\" as const },\n { name: \"minAmountAOut\", type: \"uint256\" as const },\n { name: \"minAmountBOut\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: AerodromeLPInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n tokenA: Address,\n amountA: bigint,\n tokenB: Address,\n amountB: bigint,\n): BatchCall[] {\n return [\n {\n target: tokenA,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountA],\n }),\n value: 0n,\n },\n {\n target: tokenB,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountB],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * WstETHMoonwellStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address weth, address wsteth, address mwsteth,\n * address aeroRouter, address aeroFactory, address chainlinkWstethEthFeed,\n * uint256 supplyAmount, uint256 minWstethOutPerWeth, uint256 minWethOutPerWsteth, uint256 deadlineOffset\n * supplyAmount = 0 means use the vault's full WETH balance at execute time\n * min*PerX are 1e18-scaled per-unit rates so slippage protection scales with amountIn.\n * chainlinkWstethEthFeed is the Chainlink WSTETH/ETH price feed used by the\n * strategy's `_positionValue` for live NAV during an active proposal. Base\n * mainnet: 0x43a5C292A453A3bF3606fa856197f09D7B74251a (heartbeat 24h, 18 decimals).\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, maxUint256 } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface WstETHMoonwellInitParams {\n weth: Address;\n wsteth: Address;\n mwsteth: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n chainlinkWstethEthFeed: Address;\n supplyAmount: bigint;\n minWstethOutPerWeth: bigint;\n minWethOutPerWsteth: bigint;\n deadlineOffset: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"weth\", type: \"address\" as const },\n { name: \"wsteth\", type: \"address\" as const },\n { name: \"mwsteth\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"chainlinkWstethEthFeed\", type: \"address\" as const },\n { name: \"supplyAmount\", type: \"uint256\" as const },\n { name: \"minWstethOutPerWeth\", type: \"uint256\" as const },\n { name: \"minWethOutPerWsteth\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: WstETHMoonwellInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n weth: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n // In dynamic-all mode (supplyAmount == 0) we can't know the exact amount\n // at proposal-build time, so approve maxUint256 then revoke to 0 after\n // execute() in the same batch. This bounds the residual allowance to a\n // single atomic tx — any leftover approval is cleared before control\n // returns to the governor.\n const approveAmount = supplyAmount === 0n ? maxUint256 : supplyAmount;\n\n return [\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, approveAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, 0n],\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * MamoYieldStrategy call builder.\n *\n * InitParams (Solidity): (address underlying, address mamoFactory, uint256 minRedeemAmount)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mamoFactory: Address,\n minRedeemAmount: bigint,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n ],\n [underlying, mamoFactory, minRedeemAmount],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n amount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}","/**\n * PortfolioStrategy call builder.\n *\n * InitParams (Solidity): (address asset, address swapAdapter, address[] tokens,\n * uint256[] weightsBps, uint256 totalAmount, uint256 maxSlippageBps,\n * bytes[] swapExtraData, uint8[] priceDecimals, address[] feeds)\n *\n * `priceDecimals[i]` declares the raw Chainlink feed scale for allocation `i`\n * (typically 8 for tokenized stocks, 18 for crypto pairs). It normalizes the\n * position value into the vault asset's decimals.\n *\n * `feeds[i]` is the AggregatorV3 push-feed proxy bound to allocation `i`\n * (Sherlock #56). Chainlink Data Streams is gone at v1 — there is no verifier\n * and no bytes32 feed id; the contract asserts the feed's live `decimals()`\n * equals `priceDecimals[i]` and rejects a zero address. Staleness is a flat\n * contract-wide `MAX_PUSH_PRICE_AGE` (26h), not a per-slot declaration.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { concat, encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\n// ── UniswapSwapAdapter swapExtraData builders ──\n//\n// Wire format for every mode: one raw mode byte, then abi-encoded route data\n// (see UniswapSwapAdapter.sol header):\n// Mode 0 — v3 single-hop: 0x00 + abi.encode(uint24 fee)\n// Mode 1 — v3 multi-hop: 0x01 + abi.encode(bytes path, uint16 perHopSlippageBps)\n// Mode 2 — v4 single-hop: 0x02 + abi.encode(uint24 fee, int24 tickSpacing)\n// Mode 3 — v4 multi-hop: 0x03 + abi.encode(PathHop[]) where\n// PathHop = { address currency; uint24 fee; int24 tickSpacing }\n// hop i swaps prev currency → hops[i].currency; native ETH = address(0)\n// allowed as an intermediate; last hop currency MUST equal the token.\n\nconst ZERO_ADDRESS: Address = \"0x0000000000000000000000000000000000000000\";\n\n/** Concatenate a raw 1-byte mode prefix with abi-encoded route data. */\nfunction withMode(mode: number, routeData: Hex): Hex {\n const modeByte = (`0x${mode.toString(16).padStart(2, \"0\")}`) as Hex;\n return concat([modeByte, routeData]);\n}\n\n/** Mode 0 — Uniswap v3 single-hop. */\nexport function v3SingleHopExtraData(fee: number): Hex {\n return withMode(0, encodeAbiParameters([{ type: \"uint24\" }], [fee]));\n}\n\n/** Mode 2 — Uniswap v4 single-hop (hookless). */\nexport function v4SingleHopExtraData(fee: number, tickSpacing: number): Hex {\n return withMode(\n 2,\n encodeAbiParameters(\n [{ type: \"uint24\" }, { type: \"int24\" }],\n [fee, tickSpacing],\n ),\n );\n}\n\nexport interface V4PathHop {\n currency: Address; // address(0) = native ETH; last hop MUST equal the allocation token\n fee: number;\n tickSpacing: number;\n}\n\n/** Mode 3 — Uniswap v4 multi-hop (hookless; native ETH allowed as intermediate). */\nexport function v4PathExtraData(hops: V4PathHop[]): Hex {\n // The adapter's _orientHops reverts InvalidPath for n < 2 (a single hop is\n // mode 2) — reject at build time instead of at first execution.\n if (hops.length < 2) throw new Error(\"v4PathExtraData: mode 3 needs >= 2 hops (use v4SingleHopExtraData for one)\");\n return withMode(\n 3,\n encodeAbiParameters(\n [\n {\n type: \"tuple[]\",\n components: [\n { type: \"address\", name: \"currency\" },\n { type: \"uint24\", name: \"fee\" },\n { type: \"int24\", name: \"tickSpacing\" },\n ],\n },\n ],\n [hops.map((h) => ({ currency: h.currency, fee: h.fee, tickSpacing: h.tickSpacing }))],\n ),\n );\n}\n\nexport { ZERO_ADDRESS as NATIVE_ETH };\n\nexport interface BasketAllocation {\n token: Address;\n weightBps: number; // e.g. 4000 = 40%\n swapExtraData: Hex; // adapter-specific (fee tier, path, etc.)\n priceDecimals: number; // Chainlink feed report decimals (8 or 18)\n feed: Address; // AggregatorV3 push-feed proxy; must be non-zero\n}\n\nexport function buildInitData(\n asset: Address,\n swapAdapter: Address,\n allocations: BasketAllocation[],\n totalAmount: bigint,\n maxSlippageBps: number,\n): Hex {\n const tokens = allocations.map((a) => a.token);\n const weightsBps = allocations.map((a) => BigInt(a.weightBps));\n const swapExtraData = allocations.map((a) => a.swapExtraData);\n const priceDecimals = allocations.map((a) => a.priceDecimals);\n const feeds = allocations.map((a) => a.feed);\n\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"address[]\" },\n { type: \"uint256[]\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"bytes[]\" },\n { type: \"uint8[]\" },\n { type: \"address[]\" },\n ],\n [\n asset,\n swapAdapter,\n tokens,\n weightsBps,\n totalAmount,\n BigInt(maxSlippageBps),\n swapExtraData,\n priceDecimals,\n feeds,\n ],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n totalAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, totalAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n\n// ── Rebalancing ──\n\nimport { PORTFOLIO_STRATEGY_ABI } from \"../lib/abis.js\";\n\n/**\n * Encode calldata for `rebalanceDelta()`.\n *\n * Takes no arguments at v1: the strategy reads every price from its bound\n * AggregatorV3 push feeds. The old `bytes[] priceReports` parameter went with\n * Chainlink Data Streams. Called directly by the proposer (not via vault batch).\n */\nexport function encodeRebalanceDeltaCalldata(): Hex {\n return encodeFunctionData({\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"rebalanceDelta\",\n });\n}\n\n/**\n * Encode calldata for `updateParams()`.\n *\n * At v1 weights and routes are FROZEN — a non-empty array for either reverts\n * (`WeightsFrozen` / `RoutesFrozen`). The tolerance is the only tunable, and\n * only downward: `newMaxSlippageBps` must sit in\n * [MIN_SLIPPAGE_BPS, current maxSlippageBps].\n */\nexport function encodeTightenSlippageCalldata(newMaxSlippageBps: number): Hex {\n const data = encodeAbiParameters(\n [{ type: \"uint256[]\" }, { type: \"uint256\" }, { type: \"bytes[]\" }],\n [[], BigInt(newMaxSlippageBps), []],\n );\n\n return encodeFunctionData({\n abi: PORTFOLIO_STRATEGY_ABI,\n functionName: \"updateParams\",\n args: [data],\n });\n}\n","/**\n * HyperliquidPerpStrategy call builder.\n *\n * InitParams (Solidity): (address asset, uint256 depositAmount, uint32 perpAssetIndex, uint32 leverage, uint256 maxPositionSize, uint32 maxTradesPerDay)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, maxUint256 } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\n// Frozen: the contract no longer ships in the protocol. See abis-legacy.ts.\nimport { HYPERLIQUID_PERP_STRATEGY_ABI } from \"../lib/abis-legacy.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n asset: Address,\n depositAmount: bigint,\n perpAssetIndex: number,\n leverage: number,\n maxPositionSize: bigint,\n maxTradesPerDay: number,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n { type: \"uint32\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n ],\n [asset, depositAmount, perpAssetIndex, leverage, maxPositionSize, maxTradesPerDay],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n amount: bigint,\n): BatchCall[] {\n // In dynamic-all mode (amount == 0) we approve maxUint256 up front and\n // revoke to 0 after execute() in the same atomic batch — the residual\n // allowance never persists beyond the tx.\n const approveAmount = amount === 0n ? maxUint256 : amount;\n\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, approveAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, 0n],\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n\n/** Phase 2: sweep USDC back to vault after async HyperCore transfer completes. */\nexport function buildSweepToVaultCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: HYPERLIQUID_PERP_STRATEGY_ABI,\n functionName: \"sweepToVault\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * FROZEN ABIs for contracts that NO LONGER SHIP IN THE PROTOCOL.\n *\n * `HyperliquidPerpStrategy` was removed from sherwood-protocol — `src/strategies/`\n * now holds only BaseStrategy, ConcentratedLiquidity, MorphoSupply and Portfolio.\n * It therefore has no build artifact, and `cli/src/lib/abis.ts` (which IS\n * generated) cannot carry it: requiring it made `npm run codegen` fail outright\n * against the post-audit protocol, which in turn blocked every ABI update.\n *\n * KEPT RATHER THAN DELETED, deliberately. Strategies already deployed from the\n * old template are still live on chain and still addressable; ripping the ABI\n * out would break the CLI's ability to talk to them, which is a product\n * decision separate from the contract's removal from the repo.\n *\n * FROZEN means frozen: nothing regenerates this file, so it can only be correct\n * for the bytecode that was deployed when the contract still existed. Do not\n * extend it, and do not add new contracts here — a contract that ships belongs\n * in the generated module, pinned to a real artifact.\n *\n * See sherwoodagent/sherwood#535 for the surrounding cleanup: the `grid`\n * commands, `hyperliquid-executor`, and the perp paths in `agent.ts` all still\n * target this contract and need their own decision.\n */\n\nexport const HYPERLIQUID_PERP_STRATEGY_ABI = [\n {\n name: \"asset\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"assetTraded\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"\", type: \"uint32\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"cumulativeSwept\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"depositAmount\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n { name: \"execute\", type: \"function\", stateMutability: \"nonpayable\", inputs: [], outputs: [] },\n {\n name: \"executed\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"finalizeForHyperCore\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"token\", type: \"uint64\" },\n { name: \"variant\", type: \"uint8\" },\n { name: \"createNonce\", type: \"uint64\" },\n ],\n outputs: [],\n },\n {\n name: \"getMarginSummary\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"summary\",\n type: \"tuple\",\n components: [\n { name: \"accountValue\", type: \"int64\" },\n { name: \"marginUsed\", type: \"uint64\" },\n { name: \"ntlPos\", type: \"uint64\" },\n { name: \"rawUsd\", type: \"int64\" },\n ],\n },\n ],\n },\n {\n name: \"getPosition\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"pos\",\n type: \"tuple\",\n components: [\n { name: \"szi\", type: \"int64\" },\n { name: \"entryNtl\", type: \"uint64\" },\n { name: \"isolatedRawUsd\", type: \"int64\" },\n { name: \"leverage\", type: \"uint32\" },\n { name: \"isIsolated\", type: \"bool\" },\n ],\n },\n ],\n },\n {\n name: \"getSpotBalance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"balance\",\n type: \"tuple\",\n components: [\n { name: \"total\", type: \"uint64\" },\n { name: \"hold\", type: \"uint64\" },\n { name: \"entryNtl\", type: \"uint64\" },\n ],\n },\n ],\n },\n {\n name: \"hasActiveStopLoss\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"hyperCoreFinalized\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"inFlightToHc\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"initialize\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"vault_\", type: \"address\" },\n { name: \"proposer_\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n outputs: [],\n },\n {\n name: \"initiateReturn\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\n {\n name: \"lastRecoverBlock\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"lastTradeReset\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"leverage\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint32\" }],\n },\n {\n name: \"maxPositionSize\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"maxTradesPerDay\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint32\" }],\n },\n {\n name: \"moveSpotToPerp\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\n {\n name: \"name\",\n type: \"function\",\n stateMutability: \"pure\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n {\n name: \"perpAssetIndex\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint32\" }],\n },\n {\n name: \"positions\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"ps\",\n type: \"tuple[]\",\n components: [\n { name: \"venue\", type: \"address\" },\n { name: \"kind\", type: \"bytes32\" },\n { name: \"ref\", type: \"bytes\" },\n ],\n },\n ],\n },\n {\n name: \"proposer\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"recoverHcResiduals\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\n {\n name: \"returnsInitiated\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"returnsInitiatedBlock\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"selfManagesFees\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n { name: \"settle\", type: \"function\", stateMutability: \"nonpayable\", inputs: [], outputs: [] },\n {\n name: \"settled\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"state\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"sweepToVault\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\n {\n name: \"tradedAssets\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint32\" }],\n },\n {\n name: \"tradesToday\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint32\" }],\n },\n {\n name: \"updateParams\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"data\", type: \"bytes\" }],\n outputs: [],\n },\n {\n name: \"vault\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"FundsParked\",\n type: \"event\",\n inputs: [{ name: \"amount\", type: \"uint256\", indexed: false }],\n },\n {\n name: \"FundsSwept\",\n type: \"event\",\n inputs: [{ name: \"amount\", type: \"uint256\", indexed: false }],\n },\n {\n name: \"HyperCoreFinalized\",\n type: \"event\",\n inputs: [\n { name: \"token\", type: \"uint64\", indexed: false },\n { name: \"variant\", type: \"uint8\", indexed: false },\n { name: \"createNonce\", type: \"uint64\", indexed: false },\n ],\n },\n {\n name: \"PositionClosed\",\n type: \"event\",\n inputs: [\n { name: \"asset\", type: \"uint32\", indexed: false },\n { name: \"limitPx\", type: \"uint64\", indexed: false },\n { name: \"sz\", type: \"uint64\", indexed: false },\n ],\n },\n {\n name: \"PositionOpened\",\n type: \"event\",\n inputs: [\n { name: \"asset\", type: \"uint32\", indexed: false },\n { name: \"isBuy\", type: \"bool\", indexed: false },\n { name: \"limitPx\", type: \"uint64\", indexed: false },\n { name: \"sz\", type: \"uint64\", indexed: false },\n { name: \"leverage\", type: \"uint32\", indexed: false },\n ],\n },\n { name: \"ReturnsInitiated\", type: \"event\", inputs: [] },\n { name: \"Settled\", type: \"event\", inputs: [] },\n {\n name: \"StopLossUpdated\",\n type: \"event\",\n inputs: [{ name: \"triggerPx\", type: \"uint64\", indexed: false }],\n },\n { name: \"AccountMarginSummaryPrecompileCallFailed\", type: \"error\", inputs: [] },\n { name: \"AlreadyExecuted\", type: \"error\", inputs: [] },\n { name: \"AlreadyFinalized\", type: \"error\", inputs: [] },\n { name: \"AlreadyInitialized\", type: \"error\", inputs: [] },\n { name: \"AlreadySettled\", type: \"error\", inputs: [] },\n { name: \"DepositAmountTooLarge\", type: \"error\", inputs: [] },\n { name: \"InvalidAction\", type: \"error\", inputs: [] },\n { name: \"InvalidAmount\", type: \"error\", inputs: [] },\n { name: \"MaxTradesExceeded\", type: \"error\", inputs: [] },\n { name: \"NotAuthorized\", type: \"error\", inputs: [] },\n { name: \"NotExecuted\", type: \"error\", inputs: [] },\n { name: \"NotProposer\", type: \"error\", inputs: [] },\n { name: \"NotSweepable\", type: \"error\", inputs: [] },\n { name: \"NotVault\", type: \"error\", inputs: [] },\n { name: \"Position2PrecompileCallFailed\", type: \"error\", inputs: [] },\n {\n name: \"PositionTooLarge\",\n type: \"error\",\n inputs: [{ name: \"actual\", type: \"uint256\" }, { name: \"max\", type: \"uint256\" }],\n },\n { name: \"ReturnsNotInitiated\", type: \"error\", inputs: [] },\n {\n name: \"SafeERC20FailedOperation\",\n type: \"error\",\n inputs: [{ name: \"token\", type: \"address\" }],\n },\n { name: \"SettleTooSoon\", type: \"error\", inputs: [] },\n { name: \"SpotBalancePrecompileCallFailed\", type: \"error\", inputs: [] },\n { name: \"ZeroAddress\", type: \"error\", inputs: [] },\n] as const;\n","/**\n * HyperliquidGridStrategy call builder.\n *\n * InitParams (Solidity): (address asset, uint256 depositAmount, uint32 leverage, uint256 maxOrderSize, uint32 maxOrdersPerTick, uint32[] assetIndices)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, maxUint256 } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n asset: Address,\n depositAmount: bigint,\n leverage: number,\n maxOrderSize: bigint,\n maxOrdersPerTick: number,\n assetIndices: number[],\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n { type: \"uint256\" },\n { type: \"uint32\" },\n { type: \"uint32[]\" },\n ],\n [asset, depositAmount, leverage, maxOrderSize, maxOrdersPerTick, assetIndices],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n amount: bigint,\n): BatchCall[] {\n const approveAmount = amount === 0n ? maxUint256 : amount;\n\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, approveAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, 0n],\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * MorphoSupplyStrategy call builder + init preflight.\n *\n * Init data (Solidity `_initialize`):\n * abi.decode(data, (address morpho, MarketParams mp, uint256 supplyAmount))\n * THREE top-level parameters, not one tuple: `MarketParams` is a static struct,\n * so it is inlined as five words and the payload has no leading offset.\n *\n * Batch shape (contract natspec):\n * Execute: [asset.approve(strategy, supplyAmount), strategy.execute()]\n * Settle: [strategy.settle()]\n * `_execute` pulls exactly `supplyAmount` of the vault asset, so the whole\n * `maxCapital` sits on the `execute()` call (see capsForCalls).\n *\n * `planMorphoSupply` mirrors every `_initialize` check against a chain snapshot\n * read by the command layer (see morpho-cl-resolve.ts), so a proposal that\n * would revert at clone-init fails here, before any gas is spent.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, formatUnits, parseUnits } from \"viem\";\n\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport {\n MARKET_PARAMS_COMPONENTS,\n ZERO_ADDRESS,\n marketIdOf,\n sameAddress,\n withSelector,\n type MarketParams,\n} from \"./morpho-cl-shared.js\";\n\n// ── Encoding ──\n\nexport function buildInitData(morpho: Address, marketParams: MarketParams, supplyAmount: bigint): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"tuple\", components: MARKET_PARAMS_COMPONENTS },\n { type: \"uint256\" },\n ],\n [morpho, marketParams as never, supplyAmount],\n );\n}\n\nexport function buildExecuteCalls(clone: Address, asset: Address, supplyAmount: bigint): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({ abi: ERC20_ABI, functionName: \"approve\", args: [clone, supplyAmount] }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({ abi: BASE_STRATEGY_ABI, functionName: \"execute\" }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({ abi: BASE_STRATEGY_ABI, functionName: \"settle\" }),\n value: 0n,\n },\n ];\n}\n\n// ── Preflight ──\n\n/** What the command layer read from chain for one morpho-supply proposal. */\nexport interface MorphoSupplyChainState {\n /** `IERC4626(vault).asset()`. */\n vaultAsset: Address;\n assetDecimals: number;\n assetSymbol: string;\n /** `asset.balanceOf(vault)` — execute pulls `supplyAmount` from here. */\n vaultBalance: bigint;\n /** `vault.governor().tierRegistry()`; null = unresolved. */\n tierRegistry: Address | null;\n /** `registry.isCounterpartyAllowed(morpho)`. */\n morphoAllowed: boolean;\n /** `morpho.idToMarketParams(marketId)` — all-zero for an id Morpho never created. */\n marketParams: MarketParams;\n /** `morpho.market(id)`. */\n market: { lastUpdate: bigint; totalSupplyAssets: bigint; totalBorrowAssets: bigint };\n}\n\nexport interface MorphoSupplyInputs {\n morpho: Address;\n marketId: Hex;\n /** `--amount`, human units of the vault asset. */\n amount: string;\n}\n\nexport interface MorphoSupplyPlan {\n morpho: Address;\n marketId: Hex;\n marketParams: MarketParams;\n asset: Address;\n supplyAmount: bigint;\n}\n\nexport interface PreflightResult<P> {\n plan: P | null;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Pure: derive the init params and run every `_initialize` check, in the\n * contract's order. Returns ALL failures rather than the first, so one run\n * tells the operator everything that is wrong.\n */\nexport function planMorphoSupply(\n inputs: MorphoSupplyInputs,\n state: MorphoSupplyChainState,\n): PreflightResult<MorphoSupplyPlan> {\n const errors: string[] = [];\n const warnings: string[] = [];\n const { morpho, marketId } = inputs;\n const mp = state.marketParams;\n\n // `if (morpho_ == address(0)) revert ZeroAddress();`\n if (sameAddress(morpho, ZERO_ADDRESS)) {\n errors.push(`${withSelector(\"ZeroAddress()\")}: no Morpho Blue address — pass --morpho on this network`);\n }\n // `if (registry == address(0)) revert TierRegistryUnresolved();`\n if (!state.tierRegistry) {\n errors.push(\n `${withSelector(\"TierRegistryUnresolved()\")}: the vault's governor names no TierRegistry, so the strategy cannot bind Morpho`,\n );\n } else if (!state.morphoAllowed) {\n // `if (!_isCounterpartyAllowed(registry, morpho_)) revert MorphoNotAllowed(morpho_, registry);`\n errors.push(\n `${withSelector(\"MorphoNotAllowed(address,address)\")}: Morpho ${morpho} is not counterparty-allowlisted on the vault's TierRegistry ${state.tierRegistry}`,\n );\n }\n\n let supplyAmount = 0n;\n try {\n supplyAmount = parseUnits(inputs.amount, state.assetDecimals);\n } catch {\n errors.push(`--amount '${inputs.amount}' is not a decimal amount of ${state.assetSymbol}`);\n }\n // `if (supplyAmount_ == 0) revert InvalidAmount();`\n if (supplyAmount === 0n) errors.push(`${withSelector(\"InvalidAmount()\")}: --amount must be > 0`);\n\n const unknownMarket = sameAddress(mp.loanToken, ZERO_ADDRESS) && mp.lltv === 0n;\n if (unknownMarket) {\n // idToMarketParams answers all-zero for an id this Morpho never created; the\n // contract would fail LoanAssetMismatch first (zero != vault asset).\n errors.push(\n `${withSelector(\"MarketNotCreated()\")}: market ${marketId} does not exist on Morpho ${morpho} (idToMarketParams is empty)`,\n );\n } else {\n // `if (mp.loanToken != vaultAsset) revert LoanAssetMismatch();`\n if (!sameAddress(mp.loanToken, state.vaultAsset)) {\n errors.push(\n `${withSelector(\"LoanAssetMismatch()\")}: market ${marketId} lends ${mp.loanToken}, but the vault asset is ${state.vaultAsset} (${state.assetSymbol})`,\n );\n }\n // The id we will store is keccak(abi.encode(mp)); a Morpho answering\n // params that hash elsewhere is not the market the operator named.\n const derived = marketIdOf(mp);\n if (derived.toLowerCase() !== marketId.toLowerCase()) {\n errors.push(`market params returned for ${marketId} hash to ${derived} — not the market you named`);\n }\n // `if (IMorpho(morpho_).market(id).lastUpdate == 0) revert MarketNotCreated();`\n if (state.market.lastUpdate === 0n) {\n errors.push(`${withSelector(\"MarketNotCreated()\")}: market ${marketId} has never been created on ${morpho}`);\n }\n }\n\n // Not an init check: `_execute` pulls supplyAmount from the vault, so a\n // short vault passes init and review, then reverts at execute.\n if (supplyAmount > 0n && state.vaultBalance < supplyAmount) {\n errors.push(\n `vault holds ${formatUnits(state.vaultBalance, state.assetDecimals)} ${state.assetSymbol} but execute pulls ` +\n `${formatUnits(supplyAmount, state.assetDecimals)} (--amount is in human units)`,\n );\n }\n\n if (errors.length > 0) return { plan: null, errors, warnings };\n return {\n plan: { morpho, marketId, marketParams: mp, asset: state.vaultAsset, supplyAmount },\n errors,\n warnings,\n };\n}\n","/**\n * Shared pieces of the Morpho Supply and Concentrated Liquidity template\n * builders: the Morpho `MarketParams` shape, the third-party venue defaults, the\n * minimal read ABIs the preflights use, and the small parsers both templates'\n * flag handling needs.\n *\n * Both templates bind every counterparty through the SAME walk the contracts do\n * at `_initialize`: `vault.governor() -> governor.tierRegistry() ->\n * registry.isCounterpartyAllowed(x)`. `readTierRegistry` / `readAllowed` mirror\n * that walk, including its fail-closed reading of an unanswerable hop.\n */\n\nimport type { Abi, Address, Hex } from \"viem\";\nimport { encodeAbiParameters, isAddress, keccak256, toFunctionSelector } from \"viem\";\n\nimport { STRATEGY_VENUES, type StrategyVenues } from \"../lib/addresses.js\";\nimport { CONCENTRATED_LIQUIDITY_STRATEGY_ABI } from \"../lib/abis.js\";\n\nexport const ZERO_ADDRESS: Address = \"0x0000000000000000000000000000000000000000\";\n\n// ── Morpho MarketParams ──\n\n/** `MarketParams` — the five fields that identify a Morpho Blue market. */\nexport interface MarketParams {\n loanToken: Address;\n collateralToken: Address;\n oracle: Address;\n irm: Address;\n lltv: bigint;\n}\n\ntype TupleComponent = { name: string; type: string; components?: readonly TupleComponent[] };\n\nfunction viewOutputComponents(abi: readonly unknown[], fn: string): readonly TupleComponent[] {\n const entry = (abi as { type: string; name?: string; outputs?: readonly TupleComponent[] }[]).find(\n (e) => e.type === \"function\" && e.name === fn,\n );\n const components = entry?.outputs?.[0]?.components;\n if (!components) throw new Error(`generated ABI has no tuple output for ${fn}()`);\n return components;\n}\n\n/**\n * Field order + widths of `MarketParams`, taken from the GENERATED strategy ABI\n * (`marketParams()` returns the struct) rather than restated by hand. If the\n * contract ever reorders the struct, codegen moves this with it and the\n * `cast abi-encode` golden vectors in the tests go red.\n */\nexport const MARKET_PARAMS_COMPONENTS = viewOutputComponents(\n CONCENTRATED_LIQUIDITY_STRATEGY_ABI,\n \"marketParams\",\n);\n\n/** `Id = keccak256(abi.encode(MarketParams))` — Morpho's MarketParamsLib.id. */\nexport function marketIdOf(mp: MarketParams): Hex {\n return keccak256(\n encodeAbiParameters(\n [{ type: \"address\" }, { type: \"address\" }, { type: \"address\" }, { type: \"address\" }, { type: \"uint256\" }],\n [mp.loanToken, mp.collateralToken, mp.oracle, mp.irm, mp.lltv],\n ),\n );\n}\n\n// ── Third-party venues ──\n//\n// Not Sherwood contracts: the Morpho Blue singleton and the Uniswap V3\n// deployment the two templates are initialized against. They live in the\n// shared venue book, `STRATEGY_VENUES()` in lib/addresses.ts, so the\n// address-parity test checks them against sherwood-protocol chains/<id>.json.\n// ZERO on 46630 and on the coordination-only 4663: pass them by flag there.\n\nexport type MorphoClVenues = Pick<StrategyVenues, \"MORPHO_BLUE\" | \"UNISWAP_V3_FACTORY\" | \"UNISWAP_V3_POSITION_MANAGER\">;\n\nexport function MORPHO_CL_VENUES(): MorphoClVenues {\n const v = STRATEGY_VENUES();\n return {\n MORPHO_BLUE: v.MORPHO_BLUE,\n UNISWAP_V3_FACTORY: v.UNISWAP_V3_FACTORY,\n UNISWAP_V3_POSITION_MANAGER: v.UNISWAP_V3_POSITION_MANAGER,\n };\n}\n\n// ── Minimal read ABIs ──\n\nexport const MORPHO_READ_ABI = [\n {\n type: \"function\",\n name: \"idToMarketParams\",\n stateMutability: \"view\",\n inputs: [{ name: \"id\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"tuple\", components: MARKET_PARAMS_COMPONENTS }],\n },\n {\n type: \"function\",\n name: \"market\",\n stateMutability: \"view\",\n inputs: [{ name: \"id\", type: \"bytes32\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"totalSupplyAssets\", type: \"uint128\" },\n { name: \"totalSupplyShares\", type: \"uint128\" },\n { name: \"totalBorrowAssets\", type: \"uint128\" },\n { name: \"totalBorrowShares\", type: \"uint128\" },\n { name: \"lastUpdate\", type: \"uint128\" },\n { name: \"fee\", type: \"uint128\" },\n ],\n },\n ],\n },\n] as const;\n\nexport const TIER_BINDING_ABI = [\n { type: \"function\", name: \"governor\", stateMutability: \"view\", inputs: [], outputs: [{ name: \"\", type: \"address\" }] },\n { type: \"function\", name: \"tierRegistry\", stateMutability: \"view\", inputs: [], outputs: [{ name: \"\", type: \"address\" }] },\n {\n type: \"function\",\n name: \"isCounterpartyAllowed\",\n stateMutability: \"view\",\n inputs: [{ name: \"counterparty\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n] as const;\n\nexport const VAULT_ASSET_ABI = [\n { type: \"function\", name: \"asset\", stateMutability: \"view\", inputs: [], outputs: [{ name: \"\", type: \"address\" }] },\n] as const;\n\nexport const ERC4626_PREVIEW_ABI = [\n { type: \"function\", name: \"asset\", stateMutability: \"view\", inputs: [], outputs: [{ name: \"\", type: \"address\" }] },\n {\n type: \"function\",\n name: \"previewDeposit\",\n stateMutability: \"view\",\n inputs: [{ name: \"assets\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n type: \"function\",\n name: \"previewRedeem\",\n stateMutability: \"view\",\n inputs: [{ name: \"shares\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Chain reader ──\n\n/**\n * The slice of a viem PublicClient the resolvers use. Declared structurally so\n * unit tests can hand in a plain mock; the command layer passes the real client.\n */\nexport interface ChainReader {\n readContract(args: {\n address: Address;\n abi: Abi | readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise<unknown>;\n getCode(args: { address: Address }): Promise<Hex | undefined>;\n}\n\n/** `vault.governor().tierRegistry()`; null when any hop is unreadable or zero. */\nexport async function readTierRegistry(client: ChainReader, vault: Address): Promise<Address | null> {\n try {\n const governor = (await client.readContract({\n address: vault,\n abi: TIER_BINDING_ABI,\n functionName: \"governor\",\n })) as Address;\n if (!governor || governor === ZERO_ADDRESS) return null;\n const registry = (await client.readContract({\n address: governor,\n abi: TIER_BINDING_ABI,\n functionName: \"tierRegistry\",\n })) as Address;\n return registry && registry !== ZERO_ADDRESS ? registry : null;\n } catch {\n return null;\n }\n}\n\n/**\n * `registry.isCounterpartyAllowed(x)` for each address. A registry that cannot\n * answer vouches for nothing — every entry reads false, exactly as the\n * contracts' `_readAllowed` fails closed.\n */\nexport async function readAllowed(\n client: ChainReader,\n registry: Address | null,\n counterparties: Address[],\n): Promise<Record<string, boolean>> {\n const out: Record<string, boolean> = {};\n const unique = [...new Set(counterparties.map((c) => c.toLowerCase()))];\n await Promise.all(\n unique.map(async (c) => {\n if (!registry) {\n out[c] = false;\n return;\n }\n try {\n out[c] = (await client.readContract({\n address: registry,\n abi: TIER_BINDING_ABI,\n functionName: \"isCounterpartyAllowed\",\n args: [c as Address],\n })) as boolean;\n } catch {\n out[c] = false;\n }\n }),\n );\n return out;\n}\n\nexport function isAllowed(allowed: Record<string, boolean>, a: Address): boolean {\n return allowed[a.toLowerCase()] === true;\n}\n\nexport function sameAddress(a: Address, b: Address): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\n/** \"Name(types)\" → \"Name(types) [0xabcdef01]\" for preflight messages. */\nexport function withSelector(signature: string): string {\n return `${signature} [${toFunctionSelector(signature)}]`;\n}\n\n// ── Flag parsers ──\n\nexport function parseAddressFlag(raw: unknown, flag: string): Address {\n const s = String(raw ?? \"\").trim();\n if (!isAddress(s)) throw new Error(`${flag} must be a 0x-address (got '${s}')`);\n return s as Address;\n}\n\nexport function parseBytes32Flag(raw: unknown, flag: string): Hex {\n const s = String(raw ?? \"\").trim();\n if (!/^0x[0-9a-fA-F]{64}$/.test(s)) throw new Error(`${flag} must be a 0x-prefixed 32-byte hex id (got '${s}')`);\n return s.toLowerCase() as Hex;\n}\n\n/** Integer flag within [min, max]; `fallback` when the flag is absent. */\nexport function parseIntFlag(\n raw: unknown,\n flag: string,\n fallback: number,\n min: number = Number.MIN_SAFE_INTEGER,\n max: number = Number.MAX_SAFE_INTEGER,\n): number {\n if (raw === undefined || raw === null || raw === \"\") return fallback;\n const s = String(raw).trim();\n if (!/^-?\\d+$/.test(s)) throw new Error(`${flag} must be an integer (got '${s}')`);\n const n = Number(s);\n if (n < min || n > max) throw new Error(`${flag} must be within [${min}, ${max}] (got ${n})`);\n return n;\n}\n\n/** Non-negative integer flag as bigint (uint256-sized values). */\nexport function parseUintFlag(raw: unknown, flag: string, fallback: bigint): bigint {\n if (raw === undefined || raw === null || raw === \"\") return fallback;\n const s = String(raw).trim();\n if (!/^\\d+$/.test(s)) throw new Error(`${flag} must be a non-negative integer (got '${s}')`);\n return BigInt(s);\n}\n","/**\n * ConcentratedLiquidityStrategy call builder, V3 range math and init preflight.\n *\n * Init data (Solidity `_initialize`): `abi.decode(data, (InitParams))` — ONE\n * tuple. `InitParams` ends in `bytes swapExtraData`, so it is DYNAMIC: the\n * payload opens with a 0x20 offset word. Encoding the fields as a flat\n * parameter list drops that word and init reverts with empty returndata (the\n * #411-#414 shape), so the encoder below always wraps them in one tuple.\n *\n * InitParams {\n * address pool; address positionManager; address uniswapFactory;\n * address swapAdapter; address morpho; MarketParams marketParams;\n * uint256 collateralAmount; uint256 borrowAmount;\n * int24 tickLower; int24 tickUpper; uint128 expectedLiquidity;\n * uint256 swapFractionBps; uint32 twapWindow; uint256 maxTwapDeviationBps;\n * uint256 mintSlippageBps; RerangePolicy rerange;\n * uint256 settleSlippageBps; uint256 settleDeadline; bytes swapExtraData;\n * }\n * RerangePolicy { int24 halfWidthTicks; uint256 triggerBps; uint256 minInterval;\n * uint256 maxReranges; uint256 slippageBps; uint256 swapFractionBps; }\n *\n * Batch shape (contract natspec):\n * Execute: [asset.approve(strategy, collateralAmount), strategy.execute()]\n * Settle: [strategy.settle()]\n * `_execute` pulls exactly `collateralAmount` of the vault asset. The borrow\n * leg comes from Morpho, not the vault, so it is NOT part of maxCapital or the\n * execute call cap.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData, formatUnits } from \"viem\";\n\nimport { ERC20_ABI, BASE_STRATEGY_ABI, CONCENTRATED_LIQUIDITY_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { v3SingleHopExtraData } from \"./portfolio-template.js\";\nimport {\n MARKET_PARAMS_COMPONENTS,\n ZERO_ADDRESS,\n isAllowed,\n marketIdOf,\n sameAddress,\n withSelector,\n type MarketParams,\n} from \"./morpho-cl-shared.js\";\nimport type { PreflightResult } from \"./morpho-supply-template.js\";\n\n// ── Contract constants (ConcentratedLiquidityStrategy.sol, mirrored) ──\n\nexport const BPS = 10_000n;\nexport const FEE_DENOMINATOR = 1_000_000n;\nexport const MIN_TICK = -887_272;\nexport const MAX_TICK = 887_272;\nexport const MAX_POOL_SHARE_BPS = 1_000n;\nexport const MIN_LLTV_BUFFER_BPS = 500n;\nexport const MAX_SLIPPAGE_BPS = 1_000;\nexport const MAX_TWAP_DEVIATION_BPS = 1_000;\nexport const MIN_TWAP_WINDOW = 300;\nexport const MAX_RERANGE_LIMIT = 20;\nexport const MAX_HALF_WIDTH_TICKS = MAX_TICK;\n\n/**\n * CLI defaults. Taken from the protocol's own valid fixtures\n * (test/strategies/ConcentratedLiquidityStrategy.t.sol `_defaultParams`):\n * 30-min TWAP, 100-tick spot/TWAP bound, 5% mint/settle/rerange slippage,\n * rerange trigger at 80% of the half-range, 1h between reranges, at most 3.\n */\nexport const CL_DEFAULTS = {\n twapWindow: 1800,\n maxTwapDeviationBps: 100,\n mintSlippageBps: 500,\n settleSlippageBps: 500,\n settleDeadline: 0n,\n rerangeTriggerBps: 8_000,\n rerangeMinInterval: 3600n,\n maxReranges: 3,\n rerangeSlippageBps: 500,\n} as const;\n\n// ── Types ──\n\nexport interface RerangePolicy {\n halfWidthTicks: number;\n triggerBps: bigint;\n minInterval: bigint;\n maxReranges: bigint;\n slippageBps: bigint;\n swapFractionBps: bigint;\n}\n\nexport interface CLInitParams {\n pool: Address;\n positionManager: Address;\n uniswapFactory: Address;\n swapAdapter: Address;\n morpho: Address;\n marketParams: MarketParams;\n collateralAmount: bigint;\n borrowAmount: bigint;\n tickLower: number;\n tickUpper: number;\n expectedLiquidity: bigint;\n swapFractionBps: bigint;\n twapWindow: number;\n maxTwapDeviationBps: bigint;\n mintSlippageBps: bigint;\n rerange: RerangePolicy;\n settleSlippageBps: bigint;\n settleDeadline: bigint;\n swapExtraData: Hex;\n}\n\ntype Component = { name: string; type: string; components?: readonly Component[] };\n\nfunction rerangeComponents(): readonly Component[] {\n const entry = (CONCENTRATED_LIQUIDITY_STRATEGY_ABI as readonly { type: string; name?: string; outputs?: readonly Component[] }[]).find(\n (e) => e.type === \"function\" && e.name === \"rerangePolicy\",\n );\n const c = entry?.outputs?.[0]?.components;\n if (!c) throw new Error(\"generated ABI has no tuple output for rerangePolicy()\");\n return c;\n}\n\n/**\n * `InitParams` components. The two nested structs come from the GENERATED\n * strategy ABI (`marketParams()` / `rerangePolicy()` return them), so their\n * field order tracks the contract; the top level mirrors the struct and is\n * pinned by a `cast abi-encode` golden vector.\n */\nexport const INIT_PARAMS_COMPONENTS: readonly Component[] = [\n { name: \"pool\", type: \"address\" },\n { name: \"positionManager\", type: \"address\" },\n { name: \"uniswapFactory\", type: \"address\" },\n { name: \"swapAdapter\", type: \"address\" },\n { name: \"morpho\", type: \"address\" },\n { name: \"marketParams\", type: \"tuple\", components: MARKET_PARAMS_COMPONENTS },\n { name: \"collateralAmount\", type: \"uint256\" },\n { name: \"borrowAmount\", type: \"uint256\" },\n { name: \"tickLower\", type: \"int24\" },\n { name: \"tickUpper\", type: \"int24\" },\n { name: \"expectedLiquidity\", type: \"uint128\" },\n { name: \"swapFractionBps\", type: \"uint256\" },\n { name: \"twapWindow\", type: \"uint32\" },\n { name: \"maxTwapDeviationBps\", type: \"uint256\" },\n { name: \"mintSlippageBps\", type: \"uint256\" },\n { name: \"rerange\", type: \"tuple\", components: rerangeComponents() },\n { name: \"settleSlippageBps\", type: \"uint256\" },\n { name: \"settleDeadline\", type: \"uint256\" },\n { name: \"swapExtraData\", type: \"bytes\" },\n];\n\n// ── Encoding ──\n\nexport function buildInitData(p: CLInitParams): Hex {\n return encodeAbiParameters([{ type: \"tuple\", components: INIT_PARAMS_COMPONENTS }], [p as never]);\n}\n\nexport function buildExecuteCalls(clone: Address, asset: Address, collateralAmount: bigint): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({ abi: ERC20_ABI, functionName: \"approve\", args: [clone, collateralAmount] }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({ abi: BASE_STRATEGY_ABI, functionName: \"execute\" }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({ abi: BASE_STRATEGY_ABI, functionName: \"settle\" }),\n value: 0n,\n },\n ];\n}\n\n// ── Uniswap V3 math (exact bigint ports) ──\n\nconst Q96 = 1n << 96n;\nconst MAX_UINT256 = (1n << 256n) - 1n;\n\n/** TickMath.getSqrtRatioAtTick — sqrt(1.0001^tick) · 2^96, rounded up. */\nexport function getSqrtRatioAtTick(tick: number): bigint {\n if (!Number.isInteger(tick)) throw new Error(`tick must be an integer (got ${tick})`);\n const absTick = BigInt(Math.abs(tick));\n if (absTick > BigInt(MAX_TICK)) throw new Error(`tick ${tick} outside [${MIN_TICK}, ${MAX_TICK}]`);\n\n let ratio = (absTick & 0x1n) !== 0n ? 0xfffcb933bd6fad37aa2d162d1a594001n : 0x100000000000000000000000000000000n;\n const steps: [bigint, bigint][] = [\n [0x2n, 0xfff97272373d413259a46990580e213an],\n [0x4n, 0xfff2e50f5f656932ef12357cf3c7fdccn],\n [0x8n, 0xffe5caca7e10e4e61c3624eaa0941cd0n],\n [0x10n, 0xffcb9843d60f6159c9db58835c926644n],\n [0x20n, 0xff973b41fa98c081472e6896dfb254c0n],\n [0x40n, 0xff2ea16466c96a3843ec78b326b52861n],\n [0x80n, 0xfe5dee046a99a2a811c461f1969c3053n],\n [0x100n, 0xfcbe86c7900a88aedcffc83b479aa3a4n],\n [0x200n, 0xf987a7253ac413176f2b074cf7815e54n],\n [0x400n, 0xf3392b0822b70005940c7a398e4b70f3n],\n [0x800n, 0xe7159475a2c29b7443b29c7fa6e889d9n],\n [0x1000n, 0xd097f3bdfd2022b8845ad8f792aa5825n],\n [0x2000n, 0xa9f746462d870fdf8a65dc1f90e061e5n],\n [0x4000n, 0x70d869a156d2a1b890bb3df62baf32f7n],\n [0x8000n, 0x31be135f97d08fd981231505542fcfa6n],\n [0x10000n, 0x9aa508b5b7a84e1c677de54f3e99bc9n],\n [0x20000n, 0x5d6af8dedb81196699c329225ee604n],\n [0x40000n, 0x2216e584f5fa1ea926041bedfe98n],\n [0x80000n, 0x48a170391f7dc42444e8fa2n],\n ];\n for (const [bit, mul] of steps) {\n if ((absTick & bit) !== 0n) ratio = (ratio * mul) >> 128n;\n }\n if (tick > 0) ratio = MAX_UINT256 / ratio;\n return (ratio >> 32n) + (ratio % (1n << 32n) === 0n ? 0n : 1n);\n}\n\n/** Floor toward -inf onto the spacing grid (the contract's `_snapDown`). */\nexport function snapDown(tick: number, spacing: number): number {\n return Math.floor(tick / spacing) * spacing;\n}\n\n/** Ceil toward +inf onto the spacing grid (the contract's `_snapUp`). */\nexport function snapUp(tick: number, spacing: number): number {\n return Math.ceil(tick / spacing) * spacing;\n}\n\n/**\n * ±pct around `centerTick` in PRICE terms, snapped OUTWARD to the spacing grid\n * and clamped to the aligned tick domain:\n * lower = snapDown(center + floor(ln(1 - pct) / ln 1.0001))\n * upper = snapUp (center + ceil (ln(1 + pct) / ln 1.0001))\n */\nexport function rangeFromPct(centerTick: number, pct: number, spacing: number): { tickLower: number; tickUpper: number } {\n if (!(pct > 0 && pct < 100)) throw new Error(`--range-pct must be in (0, 100) (got ${pct})`);\n const p = pct / 100;\n const lnBase = Math.log(1.0001);\n const down = Math.floor(Math.log(1 - p) / lnBase);\n const up = Math.ceil(Math.log(1 + p) / lnBase);\n const minAligned = snapUp(MIN_TICK, spacing);\n const maxAligned = snapDown(MAX_TICK, spacing);\n const tickLower = Math.max(minAligned, snapDown(centerTick + down, spacing));\n const tickUpper = Math.min(maxAligned, snapUp(centerTick + up, spacing));\n return { tickLower, tickUpper };\n}\n\n/** LiquidityAmounts.getLiquidityForAmount0 (floor). */\nexport function liquidityForAmount0(sqrtA: bigint, sqrtB: bigint, amount0: bigint): bigint {\n if (sqrtA > sqrtB) [sqrtA, sqrtB] = [sqrtB, sqrtA];\n const intermediate = (sqrtA * sqrtB) / Q96;\n return (amount0 * intermediate) / (sqrtB - sqrtA);\n}\n\n/** LiquidityAmounts.getLiquidityForAmount1 (floor). */\nexport function liquidityForAmount1(sqrtA: bigint, sqrtB: bigint, amount1: bigint): bigint {\n if (sqrtA > sqrtB) [sqrtA, sqrtB] = [sqrtB, sqrtA];\n return (amount1 * Q96) / (sqrtB - sqrtA);\n}\n\n/** LiquidityAmounts.getLiquidityForAmounts — the max L both amounts can fund. */\nexport function liquidityForAmounts(sqrtP: bigint, sqrtA: bigint, sqrtB: bigint, amount0: bigint, amount1: bigint): bigint {\n if (sqrtA > sqrtB) [sqrtA, sqrtB] = [sqrtB, sqrtA];\n if (sqrtP <= sqrtA) return liquidityForAmount0(sqrtA, sqrtB, amount0);\n if (sqrtP < sqrtB) {\n const l0 = liquidityForAmount0(sqrtP, sqrtB, amount0);\n const l1 = liquidityForAmount1(sqrtA, sqrtP, amount1);\n return l0 < l1 ? l0 : l1;\n }\n return liquidityForAmount1(sqrtA, sqrtB, amount1);\n}\n\n/** LiquidityAmounts.getAmountsForLiquidity (floor). */\nexport function amountsForLiquidity(\n sqrtP: bigint,\n sqrtA: bigint,\n sqrtB: bigint,\n liquidity: bigint,\n): { amount0: bigint; amount1: bigint } {\n if (sqrtA > sqrtB) [sqrtA, sqrtB] = [sqrtB, sqrtA];\n const a0 = (lo: bigint, hi: bigint) => (((liquidity << 96n) * (hi - lo)) / hi) / lo;\n const a1 = (lo: bigint, hi: bigint) => (liquidity * (hi - lo)) / Q96;\n if (sqrtP <= sqrtA) return { amount0: a0(sqrtA, sqrtB), amount1: 0n };\n if (sqrtP < sqrtB) return { amount0: a0(sqrtP, sqrtB), amount1: a1(sqrtA, sqrtP) };\n return { amount0: 0n, amount1: a1(sqrtA, sqrtB) };\n}\n\n/** token0 amount → token1 at sqrtPriceX96 (floor). */\nfunction token0ToToken1(amount0: bigint, sqrtP: bigint): bigint {\n return (((amount0 * sqrtP) / Q96) * sqrtP) / Q96;\n}\n\n/** token1 amount → token0 at sqrtPriceX96 (floor). */\nfunction token1ToToken0(amount1: bigint, sqrtP: bigint): bigint {\n return (((amount1 * Q96) / sqrtP) * Q96) / sqrtP;\n}\n\n/**\n * The share of position VALUE a [tickLower, tickUpper] range holds in the\n * pool's other (non-asset) token at the current price, in bps — i.e. the swap\n * fraction under which `_rebalanceToTarget` leaves the mint with neither leg\n * in excess. 0 when the range sits wholly on the asset's side of spot, 10000\n * when wholly on the other side.\n */\nexport function idealSwapFractionBps(sqrtP: bigint, tickLower: number, tickUpper: number, assetIsToken0: boolean): number {\n const sqrtA = getSqrtRatioAtTick(tickLower);\n const sqrtB = getSqrtRatioAtTick(tickUpper);\n const { amount0, amount1 } = amountsForLiquidity(sqrtP, sqrtA, sqrtB, 10n ** 24n);\n const value0 = token0ToToken1(amount0, sqrtP); // token1 units\n const total = value0 + amount1;\n if (total === 0n) return 0;\n const other = assetIsToken0 ? amount1 : value0;\n return Number((other * BPS + total / 2n) / total);\n}\n\n/**\n * expectedLiquidity — the liquidity `_execute` should mint, from the same\n * inputs it will have:\n *\n * D = borrowAmount (collateral is posted whole; the borrow is what gets deployed)\n * swapped = D · swapFractionBps / 10_000 (asset units)\n * otherOut = swapped priced at spot, less the pool fee:\n * asset = token0: swapped · sqrtP² / 2^192\n * asset = token1: swapped · 2^192 / sqrtP²\n * then · (1e6 − fee) / 1e6\n * (amount0, amount1) = the (D − swapped, otherOut) pair in token order\n * L = LiquidityAmounts.getLiquidityForAmounts(sqrtP, sqrt(tickLower), sqrt(tickUpper), amount0, amount1)\n *\n * It ignores the swap's own price impact and the adapter's route, so it is an\n * estimate; the contract only uses it for the init-time pool-share check and\n * re-checks the ACTUAL minted liquidity against the pre-mint pool at execute.\n */\nexport function estimateExpectedLiquidity(args: {\n sqrtPriceX96: bigint;\n tickLower: number;\n tickUpper: number;\n assetIsToken0: boolean;\n deployable: bigint;\n swapFractionBps: number;\n poolFee: number;\n}): bigint {\n const { sqrtPriceX96: sqrtP, assetIsToken0, deployable } = args;\n const swapped = (deployable * BigInt(args.swapFractionBps)) / BPS;\n const kept = deployable - swapped;\n let otherOut = assetIsToken0 ? token0ToToken1(swapped, sqrtP) : token1ToToken0(swapped, sqrtP);\n otherOut = (otherOut * (FEE_DENOMINATOR - BigInt(args.poolFee))) / FEE_DENOMINATOR;\n const amount0 = assetIsToken0 ? kept : otherOut;\n const amount1 = assetIsToken0 ? otherOut : kept;\n return liquidityForAmounts(\n sqrtP,\n getSqrtRatioAtTick(args.tickLower),\n getSqrtRatioAtTick(args.tickUpper),\n amount0,\n amount1,\n );\n}\n\n/**\n * The range `rerange()` re-mints: `halfWidthTicks` either side of `center`,\n * snapped OUTWARD to the spacing grid and clamped to the aligned domain — the\n * contract's `_derivedRange` (the contract centres on the TWAP tick).\n */\nexport function derivedRerangeRange(center: number, halfWidthTicks: number, spacing: number): { tickLower: number; tickUpper: number } {\n const minAligned = snapUp(MIN_TICK, spacing);\n const maxAligned = snapDown(MAX_TICK, spacing);\n const lo = center - halfWidthTicks;\n const hi = center + halfWidthTicks;\n return {\n tickLower: lo <= minAligned ? minAligned : snapDown(lo, spacing),\n tickUpper: hi >= maxAligned ? maxAligned : snapUp(hi, spacing),\n };\n}\n\n/**\n * Price impact, in bps (rounded up), of swapping `amountIn` through a V3 pool\n * at `sqrtPriceX96` ASSUMING the in-range liquidity `liquidity` holds for the\n * whole swap (no tick crossings, no other route): the average execution price\n * vs spot after the fee is √P'/√P for token0 in and √P/√P' for token1 in,\n * token0 in: √P' = L·√P·2^96 / (L·2^96 + amountIn·√P)\n * token1 in: √P' = √P + amountIn·2^96 / L\n * The contract's pool-anchored floor is spot × (1 − fee) × (1 − slippage), so a\n * swap whose impact exceeds its slippage bps reverts. 10000 on an empty pool.\n */\nexport function estimateSwapImpactBps(args: {\n sqrtPriceX96: bigint;\n liquidity: bigint;\n amountIn: bigint;\n tokenInIsToken0: boolean;\n poolFee: number;\n}): number {\n const { sqrtPriceX96: sqrtP, liquidity: L } = args;\n const amt = (args.amountIn * (FEE_DENOMINATOR - BigInt(args.poolFee))) / FEE_DENOMINATOR;\n if (amt === 0n) return 0;\n if (L === 0n || sqrtP === 0n) return 10_000;\n let num: bigint; // impact = num / den\n let den: bigint;\n if (args.tokenInIsToken0) {\n const next = (L * sqrtP * Q96) / (L * Q96 + amt * sqrtP);\n num = sqrtP - next;\n den = sqrtP;\n } else {\n const next = sqrtP + (amt * Q96) / L;\n num = next - sqrtP;\n den = next;\n }\n const bps = (num * BPS + den - 1n) / den;\n return Number(bps > BPS ? BPS : bps);\n}\n\n/** A warning fires when an estimated impact exceeds this share of the chosen slippage. */\nexport const IMPACT_WARN_SHARE_BPS = 7_000n;\n/** …and when expectedLiquidity sits above this share of the pool-share cap. */\nexport const POOL_SHARE_WARN_BPS = 8_000n;\n\n/** The contract's `_tryTwapTick` arithmetic: mean tick, floored toward -inf. */\nexport function twapTickFromCumulatives(tickCumulatives: readonly bigint[], window: number): number {\n const delta = tickCumulatives[1] - tickCumulatives[0];\n const w = BigInt(window);\n let avg = delta / w;\n if (delta < 0n && delta % w !== 0n) avg -= 1n;\n return Number(avg);\n}\n\n// ── Preflight ──\n\n/** What the command layer read from chain for one CL proposal. */\nexport interface CLChainState {\n vaultAsset: Address;\n assetDecimals: number;\n assetSymbol: string;\n vaultBalance: bigint;\n tierRegistry: Address | null;\n /** lowercase address → registry.isCounterpartyAllowed(address). */\n allowed: Record<string, boolean>;\n pool: {\n hasCode: boolean;\n token0: Address;\n token1: Address;\n fee: number;\n tickSpacing: number;\n sqrtPriceX96: bigint;\n tick: number;\n observationCardinality: number;\n liquidity: bigint;\n /** factory.getPool(token0, token1, fee) — must name the pool itself. */\n factoryPool: Address;\n /** Mean tick over twapWindow, or null when the pool cannot serve it. */\n twapTick: number | null;\n };\n marketParams: MarketParams;\n market: { lastUpdate: bigint; totalSupplyAssets: bigint; totalBorrowAssets: bigint };\n collateral: {\n /** ERC-4626 `asset()` of the collateral token; null when unreadable. */\n wrapperAsset: Address | null;\n /** previewRedeem(previewDeposit(collateralAmount)); null when unreadable. */\n value: bigint | null;\n };\n}\n\nexport interface CLInputs {\n pool: Address;\n positionManager: Address;\n uniswapFactory: Address;\n swapAdapter: Address;\n morpho: Address;\n marketId: Hex;\n collateralAmount: bigint;\n borrowAmount: bigint;\n range: { tickLower: number; tickUpper: number } | { pct: number };\n /** Omitted → idealSwapFractionBps for the range at spot. */\n swapFractionBps?: number;\n twapWindow: number;\n maxTwapDeviationBps: number;\n mintSlippageBps: number;\n settleSlippageBps: number;\n settleDeadline: bigint;\n rerange: {\n /** Omitted → max(tickSpacing, ceil((tickUpper - tickLower) / 2)). */\n halfWidthTicks?: number;\n triggerBps: number;\n minInterval: bigint;\n maxReranges: number;\n slippageBps: number;\n /**\n * Omitted → the ideal split for a range of `halfWidthTicks` centred on the\n * current tick (a rerange always re-mints a CENTRED range, whatever the\n * initial range's shape).\n */\n swapFractionBps?: number;\n };\n /** Pre-encoded adapter route; omitted → v3 single hop at the pool's own fee. */\n swapExtraData?: Hex;\n /** Explicit override; omitted → estimateExpectedLiquidity. */\n expectedLiquidity?: bigint;\n}\n\nexport interface CLPlan {\n params: CLInitParams;\n asset: Address;\n otherToken: Address;\n assetIsToken0: boolean;\n /** Informational: what the preflight computed, for the summary line. */\n info: { ltvBps: bigint; lltvBps: bigint; poolShareCap: bigint; spotTick: number; twapTick: number | null };\n}\n\nconst UINT128_MAX = (1n << 128n) - 1n;\n\n/**\n * Pure: derive every InitParams field and run every `_initialize` check, in\n * the contract's order, returning ALL failures. `warnings` are conditions init\n * accepts but `execute()` would refuse right now (TWAP unavailable, spot off\n * TWAP) — they can change before execution, so they do not block.\n */\nexport function planConcentratedLiquidity(inputs: CLInputs, state: CLChainState): PreflightResult<CLPlan> {\n const errors: string[] = [];\n const warnings: string[] = [];\n const asset = state.vaultAsset;\n const mp = state.marketParams;\n const sym = state.assetSymbol;\n const fmt = (v: bigint) => `${formatUnits(v, state.assetDecimals)} ${sym}`;\n\n // (0) zero addresses + amounts\n const named: [string, Address][] = [\n [\"pool\", inputs.pool],\n [\"positionManager\", inputs.positionManager],\n [\"morpho\", inputs.morpho],\n [\"swapAdapter\", inputs.swapAdapter],\n [\"uniswapFactory\", inputs.uniswapFactory],\n ];\n for (const [name, a] of named) {\n if (sameAddress(a, ZERO_ADDRESS)) {\n errors.push(`${withSelector(\"ZeroAddress()\")}: ${name} is unset — no default on this network, pass it by flag`);\n }\n }\n if (inputs.collateralAmount === 0n || inputs.borrowAmount === 0n) {\n errors.push(`${withSelector(\"InvalidAmount()\")}: --collateral-amount and --borrow-amount must both be > 0`);\n }\n\n // (0b) counterparty binding — adapter, position manager, morpho, factory,\n // then the collateral token when it is not the vault asset.\n if (!state.tierRegistry) {\n errors.push(\n `${withSelector(\"TierRegistryUnresolved()\")}: the vault's governor names no TierRegistry, so no counterparty can be vouched for`,\n );\n } else {\n const bound: [string, Address][] = [\n [\"swap adapter\", inputs.swapAdapter],\n [\"position manager\", inputs.positionManager],\n [\"Morpho\", inputs.morpho],\n [\"Uniswap V3 factory\", inputs.uniswapFactory],\n ];\n if (!sameAddress(mp.collateralToken, asset) && !sameAddress(mp.collateralToken, ZERO_ADDRESS)) {\n bound.push([\"market collateral token\", mp.collateralToken]);\n }\n for (const [label, a] of bound) {\n if (!sameAddress(a, ZERO_ADDRESS) && !isAllowed(state.allowed, a)) {\n errors.push(\n `${withSelector(\"CounterpartyNotAllowed(address,address)\")}: ${label} ${a} is not counterparty-allowlisted on TierRegistry ${state.tierRegistry}`,\n );\n }\n }\n }\n\n // (1) pool provenance + asset membership\n const pool = state.pool;\n let otherToken: Address = ZERO_ADDRESS;\n let assetIsToken0 = false;\n let poolUsable = false;\n if (!pool.hasCode) {\n errors.push(`${withSelector(\"PoolNotFromFactory()\")}: pool ${inputs.pool} holds no code`);\n } else {\n if (!sameAddress(pool.factoryPool, inputs.pool)) {\n errors.push(\n `${withSelector(\"PoolNotFromFactory()\")}: factory ${inputs.uniswapFactory}.getPool(token0, token1, ${pool.fee}) = ${pool.factoryPool}, not ${inputs.pool}`,\n );\n }\n if (sameAddress(pool.token0, asset)) {\n assetIsToken0 = true;\n otherToken = pool.token1;\n } else if (sameAddress(pool.token1, asset)) {\n otherToken = pool.token0;\n } else {\n errors.push(\n `${withSelector(\"PoolAssetMismatch()\")}: pool ${inputs.pool} trades ${pool.token0}/${pool.token1}; neither is the vault asset ${asset} (${sym})`,\n );\n }\n if (!sameAddress(otherToken, ZERO_ADDRESS)) {\n poolUsable = true;\n if (state.tierRegistry && !isAllowed(state.allowed, otherToken)) {\n errors.push(\n `${withSelector(\"CounterpartyNotAllowed(address,address)\")}: the pool's other token ${otherToken} is not counterparty-allowlisted on TierRegistry ${state.tierRegistry}`,\n );\n }\n }\n }\n\n // (2) the market exists and lends the vault asset; collateral is the asset\n // or an ERC-4626 wrapper of it — never the volatile leg.\n const unknownMarket = sameAddress(mp.loanToken, ZERO_ADDRESS) && mp.lltv === 0n;\n if (unknownMarket) {\n errors.push(\n `${withSelector(\"MarketNotCreated()\")}: market ${inputs.marketId} does not exist on Morpho ${inputs.morpho} (idToMarketParams is empty)`,\n );\n } else {\n if (!sameAddress(mp.loanToken, asset)) {\n errors.push(\n `${withSelector(\"LoanAssetMismatch()\")}: market ${inputs.marketId} lends ${mp.loanToken}, not the vault asset ${asset} (${sym})`,\n );\n }\n const derived = marketIdOf(mp);\n if (derived.toLowerCase() !== inputs.marketId.toLowerCase()) {\n errors.push(`market params returned for ${inputs.marketId} hash to ${derived} — not the market you named`);\n }\n if (state.market.lastUpdate === 0n) {\n errors.push(`${withSelector(\"MarketNotCreated()\")}: market ${inputs.marketId} has never been created`);\n }\n if (poolUsable && sameAddress(mp.collateralToken, otherToken)) {\n errors.push(\n `${withSelector(\"CollateralAssetMismatch()\")}: the market's collateral ${mp.collateralToken} is the pool's volatile leg — ` +\n `CL borrows the vault asset against the vault asset or an ERC-4626 wrapper of it (e.g. a USDG-loan market with USDG/sUSDG collateral)`,\n );\n } else if (!sameAddress(mp.collateralToken, asset)) {\n const wa = state.collateral.wrapperAsset;\n if (!wa || !sameAddress(wa, asset)) {\n errors.push(\n `${withSelector(\"CollateralAssetMismatch()\")}: the market's collateral ${mp.collateralToken} is neither the vault asset nor an ERC-4626 wrapper of it` +\n (wa ? ` (its asset() is ${wa})` : \" (no ERC-4626 asset())\"),\n );\n }\n }\n }\n\n // (3) the borrow fits the market's lendable liquidity\n const lendable =\n state.market.totalSupplyAssets > state.market.totalBorrowAssets\n ? state.market.totalSupplyAssets - state.market.totalBorrowAssets\n : 0n;\n if (!unknownMarket && inputs.borrowAmount > lendable) {\n errors.push(\n `${withSelector(\"BorrowExceedsLiquidity()\")}: borrow ${fmt(inputs.borrowAmount)} exceeds the market's lendable ${fmt(lendable)}`,\n );\n }\n\n // (4) LTV clears LLTV − MIN_LLTV_BUFFER_BPS (integer math exactly as the contract)\n let ltvBps = 0n;\n const lltvBps = (mp.lltv * BPS) / 10n ** 18n;\n if (!unknownMarket && inputs.collateralAmount > 0n) {\n const value = sameAddress(mp.collateralToken, asset) ? inputs.collateralAmount : state.collateral.value;\n if (value === null || value === 0n) {\n if (!sameAddress(mp.collateralToken, asset)) {\n errors.push(\n `${withSelector(\"CollateralValueUnavailable()\")}: ${mp.collateralToken}.previewRedeem(previewDeposit(${inputs.collateralAmount})) is unreadable or zero`,\n );\n }\n } else {\n ltvBps = (inputs.borrowAmount * BPS) / value;\n if (lltvBps < MIN_LLTV_BUFFER_BPS || ltvBps > lltvBps - MIN_LLTV_BUFFER_BPS) {\n const maxLtv = lltvBps >= MIN_LLTV_BUFFER_BPS ? lltvBps - MIN_LLTV_BUFFER_BPS : 0n;\n const maxBorrow = (value * maxLtv) / BPS;\n errors.push(\n `${withSelector(\"LtvInsideLiquidationBuffer()\")}: LTV ${ltvBps} bps vs market LLTV ${lltvBps} bps — must be ≤ ${maxLtv} bps ` +\n `(LLTV − ${MIN_LLTV_BUFFER_BPS} bps buffer); max borrow against ${fmt(inputs.collateralAmount)} collateral ≈ ${fmt(maxBorrow)}`,\n );\n }\n }\n }\n\n // Range: explicit ticks or ±pct around spot, snapped to the pool's spacing.\n const spacing = pool.tickSpacing;\n let tickLower = 0;\n let tickUpper = 0;\n let rangeOk = false;\n if (poolUsable) {\n if (\"pct\" in inputs.range) {\n try {\n ({ tickLower, tickUpper } = rangeFromPct(pool.tick, inputs.range.pct, spacing));\n } catch (e) {\n errors.push((e as Error).message);\n }\n } else {\n ({ tickLower, tickUpper } = inputs.range);\n }\n // (6) ordered, non-empty, spacing-aligned (plus the pool's own tick domain).\n if (tickLower >= tickUpper || spacing <= 0 || tickLower % spacing !== 0 || tickUpper % spacing !== 0) {\n errors.push(\n `${withSelector(\"InvalidTickRange()\")}: [${tickLower}, ${tickUpper}] must be ordered, non-empty and multiples of tickSpacing ${spacing}`,\n );\n } else if (tickLower < MIN_TICK || tickUpper > MAX_TICK) {\n errors.push(`tick range [${tickLower}, ${tickUpper}] leaves the V3 domain [${MIN_TICK}, ${MAX_TICK}] — the mint would revert`);\n } else {\n rangeOk = true;\n }\n }\n\n // Swap fraction: explicit, or the value split the range needs at spot.\n const swapFractionBps =\n inputs.swapFractionBps ??\n (rangeOk ? idealSwapFractionBps(pool.sqrtPriceX96, tickLower, tickUpper, assetIsToken0) : 0);\n\n // (5) pool-share cap on expectedLiquidity\n const poolShareCap = (pool.liquidity * MAX_POOL_SHARE_BPS) / BPS;\n let expectedLiquidity = inputs.expectedLiquidity ?? 0n;\n if (inputs.expectedLiquidity === undefined && rangeOk && pool.sqrtPriceX96 > 0n) {\n expectedLiquidity = estimateExpectedLiquidity({\n sqrtPriceX96: pool.sqrtPriceX96,\n tickLower,\n tickUpper,\n assetIsToken0,\n deployable: inputs.borrowAmount,\n swapFractionBps,\n poolFee: pool.fee,\n });\n }\n if (poolUsable && rangeOk) {\n if (expectedLiquidity === 0n) {\n errors.push(`${withSelector(\"InvalidAmount()\")}: expectedLiquidity is 0 — the borrow is too small to mint in this range`);\n } else if (expectedLiquidity > UINT128_MAX) {\n errors.push(`expectedLiquidity ${expectedLiquidity} does not fit uint128`);\n } else if (expectedLiquidity > poolShareCap) {\n const maxBorrow = (inputs.borrowAmount * poolShareCap) / expectedLiquidity;\n errors.push(\n `${withSelector(\"PositionExceedsPoolShareCap()\")}: expected liquidity ${expectedLiquidity} exceeds ${MAX_POOL_SHARE_BPS} bps of the pool's in-range liquidity ` +\n `(${pool.liquidity} → cap ${poolShareCap}); at this range the borrow must stay under ≈ ${fmt(maxBorrow)}`,\n );\n }\n }\n\n // _requireValidBounds\n const bounds: [boolean, string][] = [\n [inputs.twapWindow < MIN_TWAP_WINDOW, `--twap-window ${inputs.twapWindow} < MIN_TWAP_WINDOW ${MIN_TWAP_WINDOW}`],\n [\n inputs.maxTwapDeviationBps === 0 || inputs.maxTwapDeviationBps > MAX_TWAP_DEVIATION_BPS,\n `--max-twap-deviation ${inputs.maxTwapDeviationBps} must be in [1, ${MAX_TWAP_DEVIATION_BPS}]`,\n ],\n [\n inputs.mintSlippageBps === 0 || inputs.mintSlippageBps > MAX_SLIPPAGE_BPS,\n `--mint-slippage-bps ${inputs.mintSlippageBps} must be in [1, ${MAX_SLIPPAGE_BPS}]`,\n ],\n [\n inputs.settleSlippageBps === 0 || inputs.settleSlippageBps > MAX_SLIPPAGE_BPS,\n `--settle-slippage-bps ${inputs.settleSlippageBps} must be in [1, ${MAX_SLIPPAGE_BPS}] (0 is not a legal init value)`,\n ],\n [swapFractionBps < 0 || swapFractionBps > 10_000, `--swap-fraction-bps ${swapFractionBps} must be in [0, 10000]`],\n ];\n for (const [bad, msg] of bounds) if (bad) errors.push(`${withSelector(\"InvalidBound()\")}: ${msg}`);\n\n // _requireValidRerangePolicy\n const halfWidthTicks =\n inputs.rerange.halfWidthTicks ?? Math.max(spacing, Math.ceil((tickUpper - tickLower) / 2));\n // A rerange re-mints a range CENTRED on the TWAP, so its split is the split a\n // centred range needs — NOT the initial one. Reusing the initial fraction\n // breaks every off-centre range: a one-sided initial range has fraction 0 or\n // 10000, and re-minting a centred range from one token mints zero liquidity.\n // Approximation: centred on today's spot tick (execute/rerange both require\n // spot within maxTwapDeviation of the TWAP they centre on).\n let rerangeSwapFraction = swapFractionBps;\n if (inputs.rerange.swapFractionBps !== undefined) {\n rerangeSwapFraction = inputs.rerange.swapFractionBps;\n } else if (poolUsable && rangeOk && pool.sqrtPriceX96 > 0n && halfWidthTicks >= spacing && halfWidthTicks <= MAX_HALF_WIDTH_TICKS) {\n const centred = derivedRerangeRange(pool.tick, halfWidthTicks, spacing);\n rerangeSwapFraction = idealSwapFractionBps(pool.sqrtPriceX96, centred.tickLower, centred.tickUpper, assetIsToken0);\n }\n if (poolUsable && rangeOk) {\n const policy: [boolean, string][] = [\n [halfWidthTicks < spacing, `--rerange-half-width ${halfWidthTicks} < tickSpacing ${spacing}`],\n [\n halfWidthTicks * 2 < tickUpper - tickLower,\n `--rerange-half-width ${halfWidthTicks} × 2 is narrower than the initial range (${tickUpper - tickLower} ticks)`,\n ],\n [halfWidthTicks > MAX_HALF_WIDTH_TICKS, `--rerange-half-width ${halfWidthTicks} > ${MAX_HALF_WIDTH_TICKS}`],\n ];\n for (const [bad, msg] of policy) if (bad) errors.push(`${withSelector(\"InvalidRerangePolicy()\")}: ${msg}`);\n }\n const policyBounds: [boolean, string][] = [\n [\n inputs.rerange.triggerBps === 0 || inputs.rerange.triggerBps > 10_000,\n `--rerange-trigger-bps ${inputs.rerange.triggerBps} must be in [1, 10000]`,\n ],\n [inputs.rerange.maxReranges > MAX_RERANGE_LIMIT, `--max-reranges ${inputs.rerange.maxReranges} > ${MAX_RERANGE_LIMIT}`],\n [\n inputs.rerange.slippageBps === 0 || inputs.rerange.slippageBps > MAX_SLIPPAGE_BPS,\n `--rerange-slippage-bps ${inputs.rerange.slippageBps} must be in [1, ${MAX_SLIPPAGE_BPS}]`,\n ],\n [\n rerangeSwapFraction < 0 || rerangeSwapFraction > 10_000,\n `--rerange-swap-fraction-bps ${rerangeSwapFraction} must be in [0, 10000]`,\n ],\n ];\n for (const [bad, msg] of policyBounds) if (bad) errors.push(`${withSelector(\"InvalidRerangePolicy()\")}: ${msg}`);\n\n // Execute-time conditions (not init reverts) — the vault funds, and the\n // TWAP guard execute() runs before it touches anything.\n if (inputs.collateralAmount > 0n && state.vaultBalance < inputs.collateralAmount) {\n errors.push(\n `vault holds ${fmt(state.vaultBalance)} but execute pulls ${fmt(inputs.collateralAmount)} as collateral (amounts are human units)`,\n );\n }\n if (poolUsable) {\n if (pool.observationCardinality < 2 || pool.twapTick === null) {\n warnings.push(\n `pool ${inputs.pool} cannot serve a ${inputs.twapWindow}s TWAP right now (observation cardinality ${pool.observationCardinality}) — ` +\n `execute() reverts ${withSelector(\"TwapUnavailable()\")} until it can; raise it with pool.increaseObservationCardinalityNext(n) and wait out the window`,\n );\n } else {\n const dev = Math.abs(pool.tick - pool.twapTick);\n if (dev > inputs.maxTwapDeviationBps) {\n warnings.push(\n `spot tick ${pool.tick} is ${dev} ticks from the ${inputs.twapWindow}s TWAP ${pool.twapTick} (bound ${inputs.maxTwapDeviationBps}) — ` +\n `execute() would revert ${withSelector(\"SpotOutsideTwapBound()\")} if it ran now`,\n );\n }\n }\n }\n\n // Slippage vs the swaps' OWN price impact through this pool. Init accepts any\n // slippage in [1, 1000] bps, but the pool-anchored floor is spot × (1 − fee)\n // × (1 − slippage): a swap whose impact alone eats the slippage reverts. The\n // settle slippage matters most — it is fixed at init and can only be\n // TIGHTENED later, never raised.\n if (poolUsable && rangeOk && pool.sqrtPriceX96 > 0n && expectedLiquidity > 0n && expectedLiquidity <= UINT128_MAX) {\n const sqrtA = getSqrtRatioAtTick(tickLower);\n const sqrtB = getSqrtRatioAtTick(tickUpper);\n const otherIsToken0 = !assetIsToken0;\n const pick = (a: { amount0: bigint; amount1: bigint }) => (otherIsToken0 ? a.amount0 : a.amount1);\n const legNow = pick(amountsForLiquidity(pool.sqrtPriceX96, sqrtA, sqrtB, expectedLiquidity));\n // Range edge on the volatile side: the whole position is the volatile leg.\n const edgeSqrt = otherIsToken0 ? sqrtA : sqrtB;\n const legEdge = pick(amountsForLiquidity(edgeSqrt, sqrtA, sqrtB, expectedLiquidity));\n const impact = (sqrt: bigint, amountIn: bigint, tokenInIsToken0: boolean) =>\n estimateSwapImpactBps({ sqrtPriceX96: sqrt, liquidity: pool.liquidity, amountIn, tokenInIsToken0, poolFee: pool.fee });\n const settleNow = impact(pool.sqrtPriceX96, legNow, otherIsToken0);\n const settleEdge = impact(edgeSqrt, legEdge, otherIsToken0);\n const settle = BigInt(inputs.settleSlippageBps);\n const approx = `(constant in-range liquidity ${pool.liquidity}, no tick crossings, pool route only — an estimate)`;\n const suggest = (bps: number) => Math.min(MAX_SLIPPAGE_BPS, Math.ceil((bps * 10_000) / Number(IMPACT_WARN_SHARE_BPS)));\n if (BigInt(settleNow) * BPS > settle * IMPACT_WARN_SHARE_BPS) {\n warnings.push(\n `settle sells the volatile leg (~${legNow} base units of ${otherToken} at today's price) through this pool with an estimated ` +\n `${settleNow} bps price impact ${approx} — more than 70% of --settle-slippage-bps ${inputs.settleSlippageBps}, so settle() ` +\n `can revert on its own slippage floor. Settle slippage can only be tightened after init: consider --settle-slippage-bps ${suggest(settleNow)} ` +\n `or a smaller borrow`,\n );\n } else if (BigInt(settleEdge) * BPS > settle * BPS) {\n warnings.push(\n `if price reaches the range edge on the volatile side, settle sells the whole position (~${legEdge} base units of ${otherToken}) ` +\n `with an estimated ${settleEdge} bps impact ${approx} — above --settle-slippage-bps ${inputs.settleSlippageBps}, which can only be ` +\n `tightened after init; consider --settle-slippage-bps ${suggest(settleEdge)} or a smaller borrow`,\n );\n }\n const swapped = (inputs.borrowAmount * BigInt(swapFractionBps)) / BPS;\n const mintImpact = impact(pool.sqrtPriceX96, swapped, assetIsToken0);\n if (BigInt(mintImpact) * BPS > BigInt(inputs.mintSlippageBps) * IMPACT_WARN_SHARE_BPS) {\n warnings.push(\n `execute swaps ${fmt(swapped)} into ${otherToken} through this pool with an estimated ${mintImpact} bps price impact ${approx} — ` +\n `more than 70% of --mint-slippage-bps ${inputs.mintSlippageBps}; execute() can revert on its slippage floor. Consider ` +\n `--mint-slippage-bps ${suggest(mintImpact)} or a smaller borrow`,\n );\n }\n // The pool-share cap is re-checked at execute against the ACTUAL minted\n // liquidity and the pool's liquidity THEN — a thin margin now is a revert later.\n if (poolShareCap > 0n && expectedLiquidity <= poolShareCap && expectedLiquidity * BPS > poolShareCap * POOL_SHARE_WARN_BPS) {\n const pct = Number((expectedLiquidity * 1000n) / poolShareCap) / 10;\n warnings.push(\n `expected liquidity ${expectedLiquidity} is ${pct}% of the pool-share cap ${poolShareCap} (${MAX_POOL_SHARE_BPS} bps of in-range ` +\n `liquidity ${pool.liquidity}). execute() re-checks the ACTUAL minted liquidity against the pool as it is then; a small drop in ` +\n `pool liquidity (or a mint above the estimate) reverts ${withSelector(\"PositionExceedsPoolShareCap()\")} — leave more headroom`,\n );\n }\n }\n\n if (errors.length > 0) return { plan: null, errors, warnings };\n\n const params: CLInitParams = {\n pool: inputs.pool,\n positionManager: inputs.positionManager,\n uniswapFactory: inputs.uniswapFactory,\n swapAdapter: inputs.swapAdapter,\n morpho: inputs.morpho,\n marketParams: mp,\n collateralAmount: inputs.collateralAmount,\n borrowAmount: inputs.borrowAmount,\n tickLower,\n tickUpper,\n expectedLiquidity,\n swapFractionBps: BigInt(swapFractionBps),\n twapWindow: inputs.twapWindow,\n maxTwapDeviationBps: BigInt(inputs.maxTwapDeviationBps),\n mintSlippageBps: BigInt(inputs.mintSlippageBps),\n rerange: {\n halfWidthTicks,\n triggerBps: BigInt(inputs.rerange.triggerBps),\n minInterval: inputs.rerange.minInterval,\n maxReranges: BigInt(inputs.rerange.maxReranges),\n slippageBps: BigInt(inputs.rerange.slippageBps),\n swapFractionBps: BigInt(rerangeSwapFraction),\n },\n settleSlippageBps: BigInt(inputs.settleSlippageBps),\n settleDeadline: inputs.settleDeadline,\n swapExtraData: inputs.swapExtraData ?? v3SingleHopExtraData(pool.fee),\n };\n return {\n plan: {\n params,\n asset,\n otherToken,\n assetIsToken0,\n info: { ltvBps, lltvBps, poolShareCap, spotTick: pool.tick, twapTick: pool.twapTick },\n },\n errors,\n warnings,\n };\n}\n"],"mappings":"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","names":["encodeFunctionData","parseUnits","isAddress","encodeAbiParameters","concat","buildInitData","buildExecuteCalls","buildSettleCalls","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","encodeAbiParameters","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","maxUint256","buildInitData","encodeAbiParameters","buildExecuteCalls","maxUint256","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","maxUint256","buildInitData","encodeAbiParameters","buildExecuteCalls","maxUint256","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","encodeAbiParameters","encodeAbiParameters","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","formatUnits","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","formatUnits","concat","encoded","encodeAbiParameters","isAddress","parseUnits","buildInitData","robinhoodDefaultRoute","priceDecimals","buildExecuteCalls","buildSettleCalls","ZERO","ZERO","result","encodeFunctionData"]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  getLogsChunked
3
- } from "./chunk-BH3VTJ4F.js";
3
+ } from "./chunk-JKSDCCVL.js";
4
4
  import {
5
5
  TOKENS
6
- } from "./chunk-FWQESFFM.js";
6
+ } from "./chunk-GYGSKMZE.js";
7
7
  import {
8
8
  GAS_UNITS,
9
9
  estimateGasCushion,
@@ -12,17 +12,17 @@ import {
12
12
  getWalletClient,
13
13
  waitForReceipt,
14
14
  writeContractWithRetry
15
- } from "./chunk-D4BSBW3Q.js";
15
+ } from "./chunk-Z53JZORT.js";
16
16
  import {
17
17
  getChain
18
- } from "./chunk-G3FUEM5N.js";
18
+ } from "./chunk-LIW6K4OJ.js";
19
19
  import {
20
20
  getChainContracts
21
- } from "./chunk-3TZIOAPH.js";
21
+ } from "./chunk-QUAVAJWE.js";
22
22
  import {
23
23
  ERC20_ABI,
24
24
  SYNDICATE_VAULT_ABI
25
- } from "./chunk-J2IZWAEW.js";
25
+ } from "./chunk-JCL2DEH3.js";
26
26
 
27
27
  // src/lib/vault.ts
28
28
  import { formatUnits, parseAbiItem } from "viem";
@@ -557,4 +557,4 @@ export {
557
557
  registerAgent,
558
558
  getVaultInfo
559
559
  };
560
- //# sourceMappingURL=chunk-CWGP4VXZ.js.map
560
+ //# sourceMappingURL=chunk-YIN6R66K.js.map