@sherwoodagent/cli 0.89.1 → 0.89.3

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 (70) hide show
  1. package/dist/{abis-2VBXBA7Y.js → abis-VE6A2675.js} +2 -2
  2. package/dist/{agent-KMLNSKBS.js → agent-QU2OSWS4.js} +5 -5
  3. package/dist/{chat-JW5Z3JRE.js → chat-EVRY5BV3.js} +7 -7
  4. package/dist/{chunk-ZPOPWFSP.js → chunk-2SIUEMPV.js} +4 -4
  5. package/dist/{chunk-GYGSKMZE.js → chunk-3R57ETXQ.js} +2 -2
  6. package/dist/{chunk-GYGSKMZE.js.map → chunk-3R57ETXQ.js.map} +1 -1
  7. package/dist/{chunk-D3GTHAJS.js → chunk-5XMQQ4LX.js} +4 -4
  8. package/dist/{chunk-WDPA2BYK.js → chunk-6KXITNND.js} +6 -6
  9. package/dist/{chunk-JLOROS5V.js → chunk-74QYNLJE.js} +2 -2
  10. package/dist/{chunk-JRGYI34A.js → chunk-DQZJULNP.js} +4 -4
  11. package/dist/{chunk-Z53JZORT.js → chunk-I7NYU4JB.js} +28 -4
  12. package/dist/chunk-I7NYU4JB.js.map +1 -0
  13. package/dist/{chunk-P4LFNKSX.js → chunk-KPTKX226.js} +4 -4
  14. package/dist/{chunk-Z3YLWXMN.js → chunk-KXUA5BEH.js} +5 -5
  15. package/dist/{chunk-JKSDCCVL.js → chunk-NJNK6GTJ.js} +3 -3
  16. package/dist/{chunk-JCL2DEH3.js → chunk-SCWNKVNW.js} +2 -1
  17. package/dist/{chunk-JCL2DEH3.js.map → chunk-SCWNKVNW.js.map} +1 -1
  18. package/dist/{chunk-QVXKYT2N.js → chunk-T5NA6KOF.js} +2 -2
  19. package/dist/{chunk-G5FOHSQW.js → chunk-TCUSM4V7.js} +2 -2
  20. package/dist/{chunk-77MBGRE5.js → chunk-UCULHATO.js} +5 -5
  21. package/dist/{chunk-77MBGRE5.js.map → chunk-UCULHATO.js.map} +1 -1
  22. package/dist/{chunk-YIN6R66K.js → chunk-WAF3JU5J.js} +5 -5
  23. package/dist/{chunk-6IC2NRED.js → chunk-WIUPOQNS.js} +2 -2
  24. package/dist/{client-DA434B67.js → client-3BFK7TNL.js} +2 -2
  25. package/dist/{eas-ZH7BDEOK.js → eas-YTAAJSLU.js} +5 -5
  26. package/dist/{governor-WHT2V2EU.js → governor-53PNPDCZ.js} +5 -5
  27. package/dist/{identity-TRPUQEQK.js → identity-462SMK5H.js} +6 -6
  28. package/dist/index.js +161 -41
  29. package/dist/index.js.map +1 -1
  30. package/dist/{launchpad-GKB645EU.js → launchpad-LHMBN4TV.js} +6 -6
  31. package/dist/{lighter-perp-template-VC4TB7AM.js → lighter-perp-template-QRQUEV7E.js} +3 -3
  32. package/dist/{lighter-preflight-GH3JKLR6.js → lighter-preflight-TSLSSYWI.js} +6 -6
  33. package/dist/{price-RX5J7GTO.js → price-QKOARHS4.js} +7 -7
  34. package/dist/{providers-XEEFKITN.js → providers-22A42FKP.js} +3 -3
  35. package/dist/{research-PYMQ5VKH.js → research-3L3BTHWY.js} +5 -5
  36. package/dist/{session-DE47TUEW.js → session-27X337LQ.js} +8 -8
  37. package/dist/{trade-3VMAQ75D.js → trade-6Q7VCDEA.js} +13 -13
  38. package/dist/{vault-PXGG2E3K.js → vault-TQWUWBSG.js} +7 -7
  39. package/dist/{xmtp-5PTIIVAI.js → xmtp-EOMKXRTB.js} +5 -5
  40. package/package.json +1 -1
  41. package/dist/chunk-Z53JZORT.js.map +0 -1
  42. /package/dist/{abis-2VBXBA7Y.js.map → abis-VE6A2675.js.map} +0 -0
  43. /package/dist/{agent-KMLNSKBS.js.map → agent-QU2OSWS4.js.map} +0 -0
  44. /package/dist/{chat-JW5Z3JRE.js.map → chat-EVRY5BV3.js.map} +0 -0
  45. /package/dist/{chunk-ZPOPWFSP.js.map → chunk-2SIUEMPV.js.map} +0 -0
  46. /package/dist/{chunk-D3GTHAJS.js.map → chunk-5XMQQ4LX.js.map} +0 -0
  47. /package/dist/{chunk-WDPA2BYK.js.map → chunk-6KXITNND.js.map} +0 -0
  48. /package/dist/{chunk-JLOROS5V.js.map → chunk-74QYNLJE.js.map} +0 -0
  49. /package/dist/{chunk-JRGYI34A.js.map → chunk-DQZJULNP.js.map} +0 -0
  50. /package/dist/{chunk-P4LFNKSX.js.map → chunk-KPTKX226.js.map} +0 -0
  51. /package/dist/{chunk-Z3YLWXMN.js.map → chunk-KXUA5BEH.js.map} +0 -0
  52. /package/dist/{chunk-JKSDCCVL.js.map → chunk-NJNK6GTJ.js.map} +0 -0
  53. /package/dist/{chunk-QVXKYT2N.js.map → chunk-T5NA6KOF.js.map} +0 -0
  54. /package/dist/{chunk-G5FOHSQW.js.map → chunk-TCUSM4V7.js.map} +0 -0
  55. /package/dist/{chunk-YIN6R66K.js.map → chunk-WAF3JU5J.js.map} +0 -0
  56. /package/dist/{chunk-6IC2NRED.js.map → chunk-WIUPOQNS.js.map} +0 -0
  57. /package/dist/{client-DA434B67.js.map → client-3BFK7TNL.js.map} +0 -0
  58. /package/dist/{eas-ZH7BDEOK.js.map → eas-YTAAJSLU.js.map} +0 -0
  59. /package/dist/{governor-WHT2V2EU.js.map → governor-53PNPDCZ.js.map} +0 -0
  60. /package/dist/{identity-TRPUQEQK.js.map → identity-462SMK5H.js.map} +0 -0
  61. /package/dist/{launchpad-GKB645EU.js.map → launchpad-LHMBN4TV.js.map} +0 -0
  62. /package/dist/{lighter-perp-template-VC4TB7AM.js.map → lighter-perp-template-QRQUEV7E.js.map} +0 -0
  63. /package/dist/{lighter-preflight-GH3JKLR6.js.map → lighter-preflight-TSLSSYWI.js.map} +0 -0
  64. /package/dist/{price-RX5J7GTO.js.map → price-QKOARHS4.js.map} +0 -0
  65. /package/dist/{providers-XEEFKITN.js.map → providers-22A42FKP.js.map} +0 -0
  66. /package/dist/{research-PYMQ5VKH.js.map → research-3L3BTHWY.js.map} +0 -0
  67. /package/dist/{session-DE47TUEW.js.map → session-27X337LQ.js.map} +0 -0
  68. /package/dist/{trade-3VMAQ75D.js.map → trade-6Q7VCDEA.js.map} +0 -0
  69. /package/dist/{vault-PXGG2E3K.js.map → vault-TQWUWBSG.js.map} +0 -0
  70. /package/dist/{xmtp-5PTIIVAI.js.map → xmtp-EOMKXRTB.js.map} +0 -0
@@ -22,7 +22,7 @@ import {
22
22
  SYNTHRA_QUOTER_ABI,
23
23
  UNISWAP_QUOTER_V2_ABI,
24
24
  VENICE_STAKING_ABI
25
- } from "./chunk-JCL2DEH3.js";
25
+ } from "./chunk-SCWNKVNW.js";
26
26
  export {
27
27
  BASE_STRATEGY_ABI,
28
28
  CONCENTRATED_LIQUIDITY_STRATEGY_ABI,
@@ -48,4 +48,4 @@ export {
48
48
  UNISWAP_QUOTER_V2_ABI,
49
49
  VENICE_STAKING_ABI
50
50
  };
51
- //# sourceMappingURL=abis-2VBXBA7Y.js.map
51
+ //# sourceMappingURL=abis-VE6A2675.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getResearchProvider,
3
3
  isX402WalletFunded
4
- } from "./chunk-6IC2NRED.js";
4
+ } from "./chunk-WIUPOQNS.js";
5
5
  import {
6
6
  DEFAULT_WEIGHTS,
7
7
  clamp,
@@ -29,8 +29,8 @@ import {
29
29
  } from "./chunk-DBOINZYU.js";
30
30
  import {
31
31
  chatCompletion
32
- } from "./chunk-JLOROS5V.js";
33
- import "./chunk-Z53JZORT.js";
32
+ } from "./chunk-74QYNLJE.js";
33
+ import "./chunk-I7NYU4JB.js";
34
34
  import "./chunk-LIW6K4OJ.js";
35
35
  import {
36
36
  getVeniceApiKey
@@ -5574,7 +5574,7 @@ var PortfolioTracker = class {
5574
5574
  try {
5575
5575
  const { createPublicClient, http } = await import("viem");
5576
5576
  const { getChain } = await import("./network-EZ5X2BF7.js");
5577
- const { BASE_STRATEGY_ABI, SYNDICATE_VAULT_ABI } = await import("./abis-2VBXBA7Y.js");
5577
+ const { BASE_STRATEGY_ABI, SYNDICATE_VAULT_ABI } = await import("./abis-VE6A2675.js");
5578
5578
  void chain;
5579
5579
  const client = createPublicClient({
5580
5580
  chain: getChain(),
@@ -9550,4 +9550,4 @@ function formatFearGreed(value) {
9550
9550
  export {
9551
9551
  registerAgentCommands
9552
9552
  };
9553
- //# sourceMappingURL=agent-KMLNSKBS.js.map
9553
+ //# sourceMappingURL=agent-QU2OSWS4.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getFund,
3
3
  updateMetadata
4
- } from "./chunk-JRGYI34A.js";
4
+ } from "./chunk-DQZJULNP.js";
5
5
  import {
6
6
  fetchMetadata,
7
7
  uploadMetadata
@@ -10,26 +10,26 @@ import {
10
10
  getTextRecord,
11
11
  resolveFund,
12
12
  setTextRecord
13
- } from "./chunk-P4LFNKSX.js";
13
+ } from "./chunk-KPTKX226.js";
14
14
  import {
15
15
  ENS
16
- } from "./chunk-GYGSKMZE.js";
16
+ } from "./chunk-3R57ETXQ.js";
17
17
  import {
18
18
  formatContractError,
19
19
  getAccount
20
- } from "./chunk-Z53JZORT.js";
20
+ } from "./chunk-I7NYU4JB.js";
21
21
  import "./chunk-LIW6K4OJ.js";
22
22
  import {
23
23
  cacheGroupId,
24
24
  getCachedGroupId
25
25
  } from "./chunk-QUAVAJWE.js";
26
- import "./chunk-JCL2DEH3.js";
26
+ import "./chunk-SCWNKVNW.js";
27
27
 
28
28
  // src/commands/chat.ts
29
29
  import chalk from "chalk";
30
30
  import ora from "ora";
31
31
  async function loadXmtp() {
32
- return import("./xmtp-5PTIIVAI.js");
32
+ return import("./xmtp-EOMKXRTB.js");
33
33
  }
34
34
  function formatTimestamp(date) {
35
35
  return `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}`;
@@ -563,4 +563,4 @@ function registerChatCommands(program) {
563
563
  export {
564
564
  registerChatCommands
565
565
  };
566
- //# sourceMappingURL=chat-JW5Z3JRE.js.map
566
+ //# sourceMappingURL=chat-EVRY5BV3.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  EAS_CONTRACTS,
3
3
  EAS_SCHEMAS
4
- } from "./chunk-GYGSKMZE.js";
4
+ } from "./chunk-3R57ETXQ.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  waitForReceipt,
9
9
  writeContractWithRetry
10
- } from "./chunk-Z53JZORT.js";
10
+ } from "./chunk-I7NYU4JB.js";
11
11
  import {
12
12
  CHAIN_REGISTRY,
13
13
  getChain,
@@ -18,7 +18,7 @@ import {
18
18
  } from "./chunk-LIW6K4OJ.js";
19
19
  import {
20
20
  EAS_ABI
21
- } from "./chunk-JCL2DEH3.js";
21
+ } from "./chunk-SCWNKVNW.js";
22
22
 
23
23
  // src/lib/eas.ts
24
24
  import { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from "viem";
@@ -569,4 +569,4 @@ export {
569
569
  queryApprovals,
570
570
  queryJoinRequests
571
571
  };
572
- //# sourceMappingURL=chunk-ZPOPWFSP.js.map
572
+ //# sourceMappingURL=chunk-2SIUEMPV.js.map
@@ -412,7 +412,7 @@ var ROBINHOOD_FORK_STRATEGY_TEMPLATES = {
412
412
  };
413
413
  var ROBINHOOD_FORK_LAUNCH_ADAPTERS = {
414
414
  SUSHI: "0x20348e428050031647d671F0e24752C01D4b7379",
415
- STONK: "0x0D62944862996791a9BCE992872F9Fa8E3162B49"
415
+ STONK: "0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab"
416
416
  };
417
417
  var ROBINHOOD_FORK_STRATEGY_VENUES = {
418
418
  SUSHI_LAUNCHPAD_V2: "0xF1716eBf85836ffE2985db9A50dd29e5814caBe9",
@@ -601,4 +601,4 @@ export {
601
601
  SYNTHRA,
602
602
  CHAINLINK
603
603
  };
604
- //# sourceMappingURL=chunk-GYGSKMZE.js.map
604
+ //# sourceMappingURL=chunk-3R57ETXQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/address-overrides.ts","../src/lib/fork-tokens.ts","../src/lib/addresses.ts"],"sourcesContent":["/**\n * SIM_ADDRESSES_FILE override layer (spec G1).\n *\n * Points the CLI at a vnet deployment: a chains/{chainId}.json-shaped file\n * (CAPS_SNAKE_CASE keys, written by contracts deploy scripts) is mapped onto\n * the CLI's per-registry key names and merged over the base network registry\n * at call time. Only 0x-string values are considered. Fail-closed: a set-but-\n * unreadable file throws rather than silently using mainnet addresses.\n */\nimport { readFileSync } from \"node:fs\";\nimport type { Address } from \"viem\";\n\ntype RegistryName = \"SHERWOOD\" | \"STRATEGY_TEMPLATES\" | \"LAUNCH_ADAPTERS\" | \"ENS\" | \"UNISWAP\";\n\n// chains-json key → CLI registry key, grouped by target registry.\n// Extend when deploy scripts gain keys the CLI reads (Task 1 Step 2).\n//\n// STRATEGY_TEMPLATES note (Task 1 Step 2 finding): the deploy scripts\n// (DeployTemplates.s.sol / DeployStrategyFactory.s.sol) write chains.json\n// keys with a `_TEMPLATE` suffix (e.g. `MOONWELL_SUPPLY_TEMPLATE`), but the\n// CLI-side STRATEGY_TEMPLATES() registry (cli/src/lib/addresses.ts\n// `BASE_STRATEGY_TEMPLATES`) and its consumers (e.g.\n// cli/src/commands/strategy-template.ts `addressKey: \"MOONWELL_SUPPLY\"`) key\n// off the UNSUFFIXED name. The map below strips the suffix so overrides\n// actually reach the keys the CLI reads.\nconst CHAINS_TO_CLI: Record<RegistryName, Record<string, string>> = {\n SHERWOOD: {\n SYNDICATE_FACTORY: \"FACTORY\",\n SYNDICATE_GOVERNOR: \"GOVERNOR\",\n GUARDIAN_REGISTRY: \"GUARDIAN_REGISTRY\",\n STAKED_WOOD: \"STAKED_WOOD\",\n WOOD: \"WOOD_TOKEN\",\n WOOD_TOKEN: \"WOOD_TOKEN\",\n STRATEGY_FACTORY: \"STRATEGY_FACTORY\",\n },\n STRATEGY_TEMPLATES: {\n MOONWELL_SUPPLY_TEMPLATE: \"MOONWELL_SUPPLY\",\n AERODROME_LP_TEMPLATE: \"AERODROME_LP\",\n VENICE_INFERENCE_TEMPLATE: \"VENICE_INFERENCE\",\n WSTETH_MOONWELL_TEMPLATE: \"WSTETH_MOONWELL\",\n MAMO_YIELD_TEMPLATE: \"MAMO_YIELD\",\n PORTFOLIO_TEMPLATE: \"PORTFOLIO\",\n HYPERLIQUID_PERP_TEMPLATE: \"HYPERLIQUID_PERP\",\n HYPERLIQUID_GRID_TEMPLATE: \"HYPERLIQUID_GRID\",\n // v1 protocol templates (sherwood-protocol chains/<chainId>.json).\n MORPHO_SUPPLY_TEMPLATE: \"MORPHO_SUPPLY\",\n CONCENTRATED_LIQUIDITY_TEMPLATE: \"CONCENTRATED_LIQUIDITY\",\n // sherwood-strategies templates (deployments/<chainId>.json — same flat\n // KEY: address format, so SIM_ADDRESSES_FILE can point at either book or\n // a merge of both).\n LAUNCHPAD_TEMPLATE: \"LAUNCHPAD\",\n LIGHTER_PERP_TEMPLATE: \"LIGHTER_PERP\",\n },\n LAUNCH_ADAPTERS: {\n SUSHI_LAUNCH_ADAPTER: \"SUSHI\",\n STONK_LAUNCH_ADAPTER: \"STONK\",\n },\n ENS: {\n L2_REGISTRAR: \"L2_REGISTRAR\",\n L2_REGISTRY: \"L2_REGISTRY\",\n },\n UNISWAP: {\n UNISWAP_SWAP_ADAPTER: \"SWAP_ADAPTER\",\n },\n};\n\nlet cached: Record<string, Address> | null | undefined;\n\nfunction loadFile(): Record<string, Address> | null {\n if (cached !== undefined) return cached;\n const file = process.env.SIM_ADDRESSES_FILE;\n if (!file) {\n cached = null;\n return cached;\n }\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(readFileSync(file, \"utf8\")) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `SIM_ADDRESSES_FILE is set (${file}) but unreadable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n const out: Record<string, Address> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v === \"string\" && v.startsWith(\"0x\")) out[k] = v as Address;\n }\n cached = out;\n return cached;\n}\n\n/** Mapped overrides for one CLI registry; {} when SIM_ADDRESSES_FILE unset. */\nexport function overridesFor(registry: RegistryName): Record<string, Address> {\n const file = loadFile();\n if (!file) return {};\n const map = CHAINS_TO_CLI[registry];\n const out: Record<string, Address> = {};\n for (const [chainsKey, cliKey] of Object.entries(map)) {\n if (file[chainsKey]) out[cliKey] = file[chainsKey];\n }\n return out;\n}\n\nexport function __resetOverridesCacheForTests(): void {\n cached = undefined;\n}\n","/**\n * Robinhood mainnet fork (Tenderly vnet, chain 9994663) — tokenized-stock map.\n *\n * ONE table for every stock the fork address book carries\n * (sherwood-protocol/chains/9994663.json): token address, its Chainlink USD\n * push feed, and the swap route the fork's Uniswap deployment ACTUALLY quotes\n * for USDG -> stock. `addresses.ts` derives `ROBINHOOD_FORK_TOKENS` and the\n * fork's `<SYM>_USD_FEED` registry from here; the sim's basket builder\n * (`simulation/proposal-specs.ts`) reads feed + route from here.\n *\n * THE ROUTES ARE MEASURED, NOT GUESSED. Every entry below was quoted\n * read-only against the fork's V4Quoter (0x8dc178ef…) and, where v4 had no\n * pool, the v3 QuoterV2 (0x33e885ed…), at 100 USDG on 2026-09-05 (vnet block\n * 21,179,183), and cross-checked against the token's own Chainlink feed. The\n * per-entry `quotedOut` / `feedDeviationBps` fields are that measurement.\n * Tiers probed: v4 3000/60, 10000/200, 500/10, 100/1; v3 500, 3000, 10000.\n *\n * `eligible` is the sim's basket-generation gate, and it is stricter than\n * \"quotes\": PortfolioStrategy floors every buy at the ORACLE-implied amount\n * discounted by maxSlippageBps (`_buyFloor`, push-feed mode), so a pool whose\n * price sits further above the frozen feed than the sim's 5% tolerance\n * executes to a revert no matter how well it quotes. That is META today\n * (+8.3%). SLV is the other exclusion: it has NO v4 pool on any tier and only\n * quotes on v3, and this vnet's v3 position manager is known-corrupted\n * (state-injected token ids), so the v3 leg is unverified end to end. Both\n * stay in the map with their measured route so an explicit\n * `--tokens META --swap-routes v4:3000:60 --max-slippage 1000` still works;\n * they are just not handed to the sim by default.\n *\n * Re-quote before trusting any of this on a fresh fork — the vnet's pools are\n * traded by every sim run and the feeds are frozen at fork time.\n */\n\nimport type { Address } from \"viem\";\n\nexport interface ForkStock {\n /** Tokenized-stock ERC-20 on the fork (18-dec). */\n address: Address;\n /** Chainlink AggregatorV3 USD feed (8-dec) for the same stock. */\n feed: Address;\n /**\n * Swap-route spec in `--swap-routes` syntax (`v4:<fee>:<tickSpacing>` or\n * `v3:<fee>`), or null when no USDG pool quoted on any probed tier.\n */\n route: string | null;\n /** True when the only quoting pool is Uniswap v3 (no v4 pool on any tier). */\n v3Only?: boolean;\n /** Include in sim basket generation. False = keep out of default baskets. */\n eligible: boolean;\n /** Stock received for 100 USDG on the recorded route (human units). */\n quotedOut?: string;\n /** (pool-implied price / Chainlink feed − 1) in bps at the time of the quote. */\n feedDeviationBps?: number;\n /** Why a token is ineligible / unroutable, or anything the next re-quote should know. */\n note?: string;\n}\n\n/** Symbol order mirrors chains/9994663.json. */\nexport const ROBINHOOD_FORK_STOCKS = {\n AAPL: {\n address: \"0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9\" as Address,\n feed: \"0x6B22A786bAa607d76728168703a39Ea9C99f2cD0\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.30994905\",\n feedDeviationBps: 252,\n },\n TSLA: {\n address: \"0x322F0929c4625eD5bAd873c95208D54E1c003b2d\" as Address,\n feed: \"0x4A1166a659A55625345e9515b32adECea5547C38\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.27501216\",\n feedDeviationBps: 265,\n },\n NVDA: {\n address: \"0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC\" as Address,\n feed: \"0x379EC4f7C378F34a1B47E4F3cbeBCbAC3E8E9F15\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.43142676\",\n feedDeviationBps: 199,\n },\n MSFT: {\n address: \"0xe93237C50D904957Cf27E7B1133b510C669c2e74\" as Address,\n feed: \"0x45C3C877C15E6BA2EBB19eA114Ea508d14C1Af2E\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.19882872\",\n feedDeviationBps: -18,\n },\n AMZN: {\n address: \"0x12f190a9F9d7D37a250758b26824B97CE941bF54\" as Address,\n feed: \"0xD5a1508ceD74c084eBf3cBe853e2C968fB2a651C\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.37998363\",\n feedDeviationBps: 264,\n },\n META: {\n address: \"0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35\" as Address,\n feed: \"0x7C38C00C30BEe9378381E7B6135d7283356D71b1\" as Address,\n route: \"v4:3000:60\",\n eligible: false,\n quotedOut: \"0.16185932\",\n feedDeviationBps: 829,\n note:\n \"Quotes, but the pool sits 8.3% above the frozen META/USD feed (v3 agrees: +8.2%), \" +\n \"past the sim's 5% buy floor and near the contract's 10% ceiling. Excluded from \" +\n \"generated baskets until the pool or feed is re-based.\",\n },\n AMD: {\n address: \"0x86923f96303D656E4aa86D9d42D1e57ad2023fdC\" as Address,\n feed: \"0x943A29E7ae51A4798823ca9eEd2ed533B2A22C72\" as Address,\n // The fee-3000 pool does NOT exist — only the 10000/200 tier quotes. This\n // is the case that makes guessing a fee tier a bug.\n route: \"v4:10000:200\",\n eligible: true,\n quotedOut: \"0.20887416\",\n feedDeviationBps: 53,\n },\n SPY: {\n address: \"0x117cc2133c37B721F49dE2A7a74833232B3B4C0C\" as Address,\n feed: \"0x319724394D3A0e3669269846abE664Cd621f9f6A\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.12913164\",\n feedDeviationBps: 63,\n },\n QQQ: {\n address: \"0xD5f3879160bc7c32ebb4dC785F8a4F505888de68\" as Address,\n feed: \"0x80901d846d5D7B030F26B480776EE3b29374C2ae\" as Address,\n // A 10000/200 pool also exists but quoted +48.8% vs feed (near-empty) —\n // never route QQQ through it.\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.13873445\",\n feedDeviationBps: 23,\n },\n SLV: {\n address: \"0x411eFb0E7f985935DAec3D4C3ebaEa0d0AD7D89f\" as Address,\n feed: \"0x209b73908e92Ae021826eD79609845451Ecba2ce\" as Address,\n route: \"v3:500\",\n v3Only: true,\n eligible: false,\n quotedOut: \"1.66443692\",\n feedDeviationBps: -389,\n note:\n \"No v4 USDG pool on any probed tier; only Uniswap v3 quotes (500/3000/10000 all \" +\n \"do, 500 best). This vnet's v3 position manager is corrupted, so the v3 swap leg \" +\n \"is unverified end to end — excluded from generated baskets.\",\n },\n GOOGL: {\n address: \"0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3\" as Address,\n feed: \"0xF6f373a037c30F0e5010d854385cA89185AE638b\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.29346562\",\n feedDeviationBps: 11,\n },\n} as const satisfies Record<string, ForkStock>;\n\nexport type ForkStockSymbol = keyof typeof ROBINHOOD_FORK_STOCKS;\n\nexport const ROBINHOOD_FORK_STOCK_SYMBOLS = Object.keys(ROBINHOOD_FORK_STOCKS) as ForkStockSymbol[];\n\n/** Symbols the sim may put in a generated basket (routable AND inside the slippage floor). */\nexport function forkBasketSymbols(): ForkStockSymbol[] {\n return ROBINHOOD_FORK_STOCK_SYMBOLS.filter((s) => ROBINHOOD_FORK_STOCKS[s].eligible);\n}\n\n/**\n * Feed + route for a basket token, or undefined when the symbol is unknown,\n * unroutable, or gated out of basket generation. Callers own the error text.\n */\nexport function forkBasketMeta(symbol: string): { feed: Address; route: string } | undefined {\n const entry = (ROBINHOOD_FORK_STOCKS as Record<string, ForkStock>)[symbol.toUpperCase()];\n if (!entry || !entry.eligible || !entry.route) return undefined;\n return { feed: entry.feed, route: entry.route };\n}\n\n/** `{ SYM: address }` for the token registry. */\nexport function forkStockAddresses(): Record<ForkStockSymbol, Address> {\n return Object.fromEntries(\n ROBINHOOD_FORK_STOCK_SYMBOLS.map((s) => [s, ROBINHOOD_FORK_STOCKS[s].address]),\n ) as Record<ForkStockSymbol, Address>;\n}\n\n/** `{ SYM_USD_FEED: feed }` for the Chainlink registry (push-feed auto-resolve). */\nexport function forkStockFeeds(): Record<`${ForkStockSymbol}_USD_FEED`, Address> {\n return Object.fromEntries(\n ROBINHOOD_FORK_STOCK_SYMBOLS.map((s) => [`${s}_USD_FEED`, ROBINHOOD_FORK_STOCKS[s].feed]),\n ) as Record<`${ForkStockSymbol}_USD_FEED`, Address>;\n}\n","/**\n * Contract addresses by network.\n *\n * All exports are functions — they resolve at call time based on the\n * current network set via setNetwork(). This ensures --chain works\n * even when modules are imported before the flag is parsed.\n *\n * Current deployment target: Robinhood L2 testnet (chain 46630) only. Other\n * chains may be added back later; when they are, their address blocks + registry\n * entries re-enter here alongside the robinhood-testnet ones.\n *\n * Zero addresses = protocol not deployed on that chain. Strategies that\n * need them will fail at execution time with a clear allowlist error.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { type Network, getNetwork } from \"./network.js\";\nimport { overridesFor } from \"./address-overrides.js\";\nimport { forkStockAddresses, forkStockFeeds } from \"./fork-tokens.js\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\nconst ZERO_BYTES32 =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as `0x${string}`;\n\n// ── Robinhood L2 Testnet (Arbitrum Orbit, chain 46630) ──\n// Synthra DEX for swaps. Stock tokens available.\n\nconst ROBINHOOD_TESTNET_TOKENS = {\n USDC: ZERO,\n // USDG (Robinhood-chain stablecoin, 6-dec). Zero on testnet (Synthra WETH-quoted);\n // real on the mainnet fork. Keyed so `--asset USDG` resolves + decimals=6.\n USDG: ZERO,\n // WETH resolves to Synthra's WETH9 (SYNTHRA_WETH): ALL stock DEX liquidity is\n // denominated in it (e.g. the TSLA fee-3000 pool holds ~37.8 WETH here vs\n // ~0.0003 in the canonical WETH pool). It is WETH9-style (payable deposit()),\n // so --use-eth wrapping works against it. Canonical WETH kept as WETH_CANONICAL\n // so the reference isn't lost.\n WETH: \"0x33e4191705c386532ba27cBF171Db86919200B94\" as Address,\n WETH_CANONICAL: \"0x7943e237c7F95DA44E0301572D358911207852Fa\" as Address,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n TSLA: \"0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E\" as Address,\n AMZN: \"0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02\" as Address,\n PLTR: \"0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0\" as Address,\n NFLX: \"0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93\" as Address,\n AMD: \"0x71178BAc73cBeb415514eB542a8995b82669778d\" as Address,\n // Stocks the mainnet fork carries and the testnet does not (lib/fork-tokens.ts).\n // Keyed here as ZERO so the token-shape type covers both chains.\n AAPL: ZERO,\n NVDA: ZERO,\n MSFT: ZERO,\n META: ZERO,\n SPY: ZERO,\n QQQ: ZERO,\n SLV: ZERO,\n GOOGL: ZERO,\n} as const;\n\nconst ROBINHOOD_TESTNET_MOONWELL = {\n COMPTROLLER: ZERO,\n mUSDC: ZERO,\n mWETH: ZERO,\n mCbETH: ZERO,\n mWstETH: ZERO,\n mCbBTC: ZERO,\n mDAI: ZERO,\n mAERO: ZERO,\n} as const;\n\n// Synthra is Uniswap-V3-compatible; the deployed UniswapSwapAdapter is backed by\n// Synthra's router + a QuoterV2 shim (SYNTHRA_QUOTER_V2_SHIM). SWAP_ROUTER /\n// QUOTER_V2 mirror the Synthra addresses so a direct v3 quote path also resolves.\nconst ROBINHOOD_TESTNET_UNISWAP = {\n SWAP_ROUTER: \"0x3Ce954107b1A675826B33bF23060Dd655e3758fE\" as Address,\n QUOTER_V2: \"0xb06788F027268a9A06c3AD41a88559530D2E54b1\" as Address,\n SWAP_ADAPTER: \"0x4fc3492117cC3bbcE0b210D22a8DC244f9d86490\" as Address,\n} as const;\n\n// ── Synthra DEX (Robinhood L2 — Uniswap V3-compatible concentrated liquidity) ──\n\nconst ROBINHOOD_TESTNET_SYNTHRA = {\n ROUTER: \"0x3Ce954107b1A675826B33bF23060Dd655e3758fE\" as Address,\n QUOTER: \"0x231606c321A99DE81e28fE48B07a93F1ba49e713\" as Address,\n FACTORY: \"0x911b4000D3422F482F4062a913885f7b035382Df\" as Address,\n} as const;\n\n// ── Chainlink AggregatorV3 push feeds ──\n//\n// Data Streams is gone at v1: PortfolioStrategy binds an AggregatorV3 proxy\n// ADDRESS per allocation and there is no verifier proxy to configure.\n\nconst ROBINHOOD_TESTNET_CHAINLINK = {\n WSTETH_ETH_FEED: ZERO,\n // Tokenized-equity push feeds exist only on the mainnet fork. Keyed as ZERO\n // so the registry shape covers both chains and the fork's `<SYM>_USD_FEED`\n // auto-resolve (template-encoder.ts) has a slot.\n ...noneOf(forkStockFeeds()),\n} as const;\n\n// ── Robinhood portfolio-basket route + feed metadata ──\n//\n// Data-driven replacement for the hand-drifting \"known stock\" Set that used to\n// live in strategy-template.ts. Every entry is a VERIFIED-liquidity default\n// swap route for a basket token. Absence from this map means \"no verified\n// default route\" — the CLI fails fast and demands an explicit --swap-routes\n// rather than falling through to a v3 auto-detect that would be dead.\n//\n// `kind: \"v4-native\"` = a Uniswap v4 mode-3 multi-hop USDG → native ETH → stock,\n// consumed by portfolio-template.ts as\n// v4PathExtraData([{currency: ETH, ...native}, {currency: <token>, ...stock}]).\nexport interface RobinhoodStockRoute {\n kind: \"v4-native\";\n nativeFee: number;\n nativeTickSpacing: number;\n stockFee: number;\n stockTickSpacing: number;\n}\n\n// No verified default stock swap routes on the Robinhood testnet — the\n// machinery is retained (see portfolio-template.ts) but the map is empty, so\n// every basket token falls to the existing fail-fast route error until a\n// verified route is added.\n// LOCKSTEP: the app's quote-probe geometry (app/src/lib/price-quote.ts\n// V4_DIRECT_TIERS + via-native path) must stay consistent with any route added\n// here, or the dashboard displays a tier the strategy won't execute.\nexport const ROBINHOOD_STOCK_ROUTES: Record<string, RobinhoodStockRoute> = {};\n\nconst ROBINHOOD_TESTNET_INFRA = {\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as Address, // Deterministic, same everywhere\n} as const;\n\n// ── ENS / Durin ──\n\nconst ROBINHOOD_TESTNET_ENS = {\n L2_REGISTRAR: ZERO,\n L2_REGISTRY: ZERO,\n} as const;\n\n// ── ERC-8004 Agent Identity ──\n//\n// Zero on purpose, not \"pending a deploy\": no ERC-8004 registry exists on the\n// testnet or on the fork, and none should. Identity is a coordination-chain\n// concern — every identity op (mint / load / find / status) runs against 4663\n// via `withNetwork(COORDINATION_NETWORK, …)`, whatever chain the fund is on.\nconst ROBINHOOD_TESTNET_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: ZERO,\n REPUTATION_REGISTRY: ZERO,\n} as const;\n\n// ── Sherwood Protocol (our deployed contracts) ──\n//\n// V2 redeploy (chain 46630): fresh factory/governor/vault-impl/executor plus a\n// full guardian layer (registry + sWOOD + WOOD fixture token) and the V2\n// live-NAV surface (PriceRouter, UniswapSwapAdapter via the Synthra QuoterV2\n// shim, Portfolio template, StrategyFactory). WOOD_TOKEN here is a testnet\n// fixture, not the mainnet OFT.\n//\n// GOVERNOR is the deploy-time bootstrap governor. Governors are per-vault since\n// PR #421 — resolve one at runtime via `factory.governorOf(vault)`\n// (lib/governor.ts `getGovernorOf`), never from this table.\n// Key parity with the SDK book (sdk/src/addresses.ts SherwoodDeployment) is\n// pinned by lib/address-parity.test.ts — add new keys to BOTH books.\nconst ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0xa91AA45AFF32f52b6357044B02a16EBA775feC0b\" as Address,\n GOVERNOR: ZERO, // zeroed since the post-#421 redeploy — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0xA400eFcfFc820C6f812203C58ee00423AeCC0903\" as Address,\n STAKED_WOOD: \"0x21A69A6c9814c0d339C57fDdafed3B283702a739\" as Address,\n WOOD_TOKEN: \"0xCCb4fB59cf40de1E23083037ee81Da1DD747D8d7\" as Address,\n STRATEGY_FACTORY: \"0xb683Bb8EEcBc2419BC3801df6FeA88f96657e670\" as Address,\n MERKL_DISTRIBUTOR: ZERO,\n // Guardian-era contracts from contracts/chains/46630.json (SHE-93).\n VAULT_IMPL: \"0xC57e12d6e2d8Ed49316F0b69c51893CcA44151F7\" as Address,\n BATCH_EXECUTOR_LIB: \"0xF3b8db5aa41c7Ce92478A0Fa9C55a6460533eb86\" as Address,\n GOVERNOR_BEACON: \"0x3D46Ec018cd5893b685b4dfdc3921A4Eb64E11d1\" as Address,\n PROTOCOL_CONFIG: \"0xC104Eb6a522d6718cA28F344B2373B29d57FF2E0\" as Address,\n PRICE_ROUTER: \"0xDd302ffcfA08071780eC1A2f12BccFB9ba6b6731\" as Address,\n TIER_REGISTRY: \"0x99b8068Dc0F6093466964D581f72d947e3e380DB\" as Address,\n // Not in chains/46630.json (econ-security stack not deployed there yet).\n EXPOSURE_LEDGER: ZERO,\n PROPOSER_BOND_ESCROW: ZERO,\n CHALLENGE_GAME: ZERO,\n TOKEN_COURT: ZERO,\n} as const;\n\n// ── Venice (VVV governance + sVVV staking + DIEM compute) ──\n\nconst ROBINHOOD_TESTNET_VENICE = {\n VVV: ZERO,\n STAKING: ZERO,\n DIEM: ZERO,\n} as const;\n\n// ── Aerodrome (Base ve(3,3) DEX) ──\n\nconst ROBINHOOD_TESTNET_AERODROME = {\n ROUTER: ZERO,\n FACTORY: ZERO,\n} as const;\n\n// ── Strategy Templates (ERC-1167 clonable singletons) ──\n// Populated after running script/DeployTemplates.s.sol\n\nconst ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: ZERO as Address,\n AERODROME_LP: ZERO as Address,\n VENICE_INFERENCE: ZERO as Address,\n WSTETH_MOONWELL: ZERO as Address,\n MAMO_YIELD: ZERO as Address,\n HYPERLIQUID_PERP: ZERO as Address,\n HYPERLIQUID_GRID: ZERO as Address,\n // V2 redeploy PORTFOLIO_TEMPLATE (chain 46630).\n PORTFOLIO: \"0x67420Cc504d70a42Adfd8867d878afe0978C7d10\" as Address,\n // v1 templates — deployed on the fork only so far (no 46630 equivalent).\n MORPHO_SUPPLY: ZERO as Address,\n CONCENTRATED_LIQUIDITY: ZERO as Address,\n // sherwood-strategies templates (book: sherwood-strategies\n // deployments/<chainId>.json, keys LAUNCHPAD_TEMPLATE / LIGHTER_PERP_TEMPLATE).\n // No 46630 deployment of either.\n LAUNCHPAD: ZERO as Address,\n LIGHTER_PERP: ZERO as Address,\n} as const;\n\n// ── Launch adapters (sherwood-strategies, LaunchpadStrategy venues) ──\n//\n// ILaunchAdapter implementations a LaunchpadStrategy clone is initialised\n// with — one per launch venue. Book: sherwood-strategies\n// deployments/<chainId>.json (SUSHI_LAUNCH_ADAPTER / STONK_LAUNCH_ADAPTER).\n// Key parity with the SDK (`launchAdapters`) and the strategies book is pinned\n// by lib/address-parity.test.ts.\n\nconst ROBINHOOD_TESTNET_LAUNCH_ADAPTERS = {\n SUSHI: ZERO as Address,\n STONK: ZERO as Address,\n} as const;\n\n// ── Third-party venues the sherwood-strategies templates talk to ──\n//\n// Not Sherwood contracts: the launch venues behind the Sushi / Stonk launch\n// adapters, and the zkLighter core contract behind LighterPerpStrategy.\n// Source: sherwood-strategies script/launchpad/addresses-4663.json and\n// script/lighter/addresses-4663.json (Robinhood mainnet, 4663). The fork\n// (9994663) replays mainnet state, so the SAME addresses are live there —\n// verified by code + pad.quote() on the fork. They are exposed on the fork\n// only: 4663 is coordination-only in the CLI (every Sherwood/strategy address\n// there is ZERO by decision), and 46630 has none of these venues.\n\n/** StonkBrokers SafeLaunchpad V2 quote lanes — one pad per quote token. */\nexport const STONK_LANES = [\"WETH\", \"STONK\", \"USDG\", \"GME\", \"NVDA\", \"AAPL\", \"SPCX\", \"USO\"] as const;\nexport type StonkLane = (typeof STONK_LANES)[number];\n\nexport interface StrategyVenues {\n /** Sushi Launchpad V2 — ERC-1967 UUPS proxy (SUSHI_LAUNCHPAD_V2). */\n SUSHI_LAUNCHPAD_V2: Address;\n /**\n * StonkBrokers SafeLaunchpad V2 pads by quote lane (STONK_SAFE_LAUNCHPAD_V2_<LANE>).\n * `STONK` is the STONKBROKER token lane. V2 pads mint the launch token; the\n * V3 (bring-your-own-token) pads are deliberately not listed.\n */\n STONK_PADS_V2: Record<StonkLane, Address>;\n /** SafeLaunchLensV2 — curve/tax reads, pad as first arg (SAFE_LAUNCH_LENS_V2). */\n STONK_LENS_V2: Address;\n /** zkLighter core contract (ZK_LIGHTER). */\n ZK_LIGHTER: Address;\n /** Morpho Blue singleton (MORPHO_BLUE) — Morpho Supply and CL. */\n MORPHO_BLUE: Address;\n /**\n * Uniswap V3 factory and position manager CL is initialized against\n * (UNISWAP_V3_FACTORY, UNISWAP_V3_POSITION_MANAGER). Resolved on-chain on\n * Robinhood: the canonical Uniswap addresses hold unrelated code there.\n */\n UNISWAP_V3_FACTORY: Address;\n UNISWAP_V3_POSITION_MANAGER: Address;\n}\n\nconst NO_STRATEGY_VENUES: StrategyVenues = {\n SUSHI_LAUNCHPAD_V2: ZERO,\n STONK_PADS_V2: Object.fromEntries(STONK_LANES.map((l) => [l, ZERO])) as Record<StonkLane, Address>,\n STONK_LENS_V2: ZERO,\n ZK_LIGHTER: ZERO,\n MORPHO_BLUE: ZERO,\n UNISWAP_V3_FACTORY: ZERO,\n UNISWAP_V3_POSITION_MANAGER: ZERO,\n};\n\n// ── EAS (Ethereum Attestation Service) ──\n\nconst ROBINHOOD_TESTNET_EAS = {\n EAS: ZERO,\n SCHEMA_REGISTRY: ZERO,\n} as const;\n\n// EAS on Robinhood Chain mainnet (4663). Deployed by Sherwood — EAS is not a\n// predeploy on an Arbitrum Orbit chain. sherwoodagent/sherwood-protocol#278.\nconst ROBINHOOD_MAINNET_EAS = {\n EAS: \"0x7d70441Bb10AcE5d9771dc0b6205D89ddf63205B\" as Address,\n SCHEMA_REGISTRY: \"0xdd7521Ba10773e556Defa6D6c133cB2F663b5c26\" as Address,\n} as const;\n\n/**\n * Schema UIDs are chain-INDEPENDENT: uid = keccak256(schema, resolver,\n * revocable) carries no chainId. With resolver = address(0) these are the same\n * UIDs already registered on Base, and re-registering the same definitions on\n * any chain reproduces them. Verified against Base's live SchemaRegistry.\n */\nconst SHERWOOD_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST: \"0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef\" as Hex,\n AGENT_APPROVED: \"0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607\" as Hex,\n X402_RESEARCH: \"0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708\" as Hex,\n VENICE_PROVISION: \"0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1\" as Hex,\n VENICE_INFERENCE: \"0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14\" as Hex,\n TRADE_EXECUTED: \"0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6\" as Hex,\n} as const;\n\n/**\n * Every non-EAS address book, for the coordination chain. Sherwood core is not\n * deployed on 4663, so these are all zero BY CONSTRUCTION rather than by\n * omission — mapping them to the testnet book would silently hand out 46630\n * addresses during the brief `withNetwork` window an EAS write opens.\n */\nfunction noneOf<T extends Record<string, unknown>>(shape: T): T {\n return Object.fromEntries(Object.keys(shape).map((k) => [k, ZERO])) as T;\n}\n\n// ── EAS Schema UIDs (populated after running scripts/register-eas-schemas.ts) ──\n\nconst ROBINHOOD_TESTNET_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST: ZERO_BYTES32,\n AGENT_APPROVED: ZERO_BYTES32,\n X402_RESEARCH: ZERO_BYTES32,\n VENICE_PROVISION: ZERO_BYTES32,\n VENICE_INFERENCE: ZERO_BYTES32,\n TRADE_EXECUTED: ZERO_BYTES32,\n} as const;\n\n// ── Robinhood Chain mainnet fork (Tenderly vnet, chain 9994663) ──\n//\n// Fork of Robinhood *mainnet*: USDG stablecoin (6-dec), official Uniswap v3+v4,\n// Chainlink PUSH feeds. Core addresses\n// come from sherwood-protocol/chains/9994663.json (fresh deploy). All 11\n// tokenized stocks + their feeds come from lib/fork-tokens.ts (one table, with\n// the measured swap route per token); the feeds are keyed here as\n// `<SYM>_USD_FEED` so a symbol basket auto-resolves its push feed on the fork.\n// Swap routes still need an explicit --swap-routes (ROBINHOOD_STOCK_ROUTES is\n// a different shape and lockstepped with the app's quote probe).\n\nconst ROBINHOOD_FORK_TOKENS: typeof ROBINHOOD_TESTNET_TOKENS = {\n USDC: ZERO,\n USDG: \"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168\" as Address,\n WETH: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\" as Address,\n WETH_CANONICAL: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\" as Address,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n PLTR: ZERO,\n NFLX: ZERO,\n ...forkStockAddresses(),\n};\n\nconst ROBINHOOD_FORK_UNISWAP: typeof ROBINHOOD_TESTNET_UNISWAP = {\n SWAP_ROUTER: \"0xcaf681a66d020601342297493863e78c959e5cb2\" as Address,\n QUOTER_V2: \"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7\" as Address,\n SWAP_ADAPTER: \"0x54E6A7af53143556973493fDeC9d7837A77c67eF\" as Address,\n};\n\n// `<SYM>_USD_FEED` for all 11 stocks so `strategy propose portfolio --tokens\n// AAPL,…` resolves feeds without --feeds (template-encoder.ts auto-resolve).\nconst ROBINHOOD_FORK_CHAINLINK: typeof ROBINHOOD_TESTNET_CHAINLINK = {\n WSTETH_ETH_FEED: ZERO,\n ...forkStockFeeds(),\n};\n\nconst ROBINHOOD_FORK_SHERWOOD: typeof ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0x619af1488F32B4797f6faDa3C3a8De72a5B693E0\" as Address,\n GOVERNOR: ZERO, // per-vault — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0xD8F9E7446E6d6c02198AAaF674A0C5e3d5D1BF72\" as Address,\n STAKED_WOOD: \"0xdDf2B4C52B9575e0e6D03a3A57D75D06a4a9e203\" as Address,\n WOOD_TOKEN: \"0xF8BC08092C06dB6148114DCf82AF881F1085f92b\" as Address,\n STRATEGY_FACTORY: \"0xb06788F027268a9A06c3AD41a88559530D2E54b1\" as Address,\n MERKL_DISTRIBUTOR: ZERO,\n // Guardian-era contracts from sherwood-protocol/chains/9994663.json (SHE-93).\n VAULT_IMPL: \"0xdaB4707c9997a84e931FE98F4688adaFc70b6B95\" as Address,\n BATCH_EXECUTOR_LIB: \"0x899FC2Cac572F64A233344115b488E71E0044f34\" as Address,\n GOVERNOR_BEACON: \"0x3CF45eFE9fBDdd6cB749384Bf5c1bA5Ec96af05d\" as Address,\n PROTOCOL_CONFIG: \"0x8aDb5810B5bF8B9149BE3Ca45Cb441818a9679bB\" as Address,\n // Not in chains/9994663.json (no PriceRouter on the fork).\n PRICE_ROUTER: ZERO,\n TIER_REGISTRY: \"0x4614f058920941A0a9a852e62485fbDE692D75E1\" as Address,\n EXPOSURE_LEDGER: \"0x99D789E7C8E65dB5597dCa692F082B47BE30AB33\" as Address,\n PROPOSER_BOND_ESCROW: \"0x7d25058c891d3AC5C8bc8Da6aA937DFeE648B5cF\" as Address,\n CHALLENGE_GAME: \"0x7046FececcA6c0f5E66Cc998099593ae71A1bbee\" as Address,\n TOKEN_COURT: \"0xC30bA62727be65fd867385Ce27Ff7C78bd66A897\" as Address,\n};\n\nconst ROBINHOOD_FORK_STRATEGY_TEMPLATES: typeof ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: ZERO,\n AERODROME_LP: ZERO,\n VENICE_INFERENCE: ZERO,\n WSTETH_MOONWELL: ZERO,\n MAMO_YIELD: ZERO,\n HYPERLIQUID_PERP: ZERO,\n HYPERLIQUID_GRID: ZERO,\n PORTFOLIO: \"0xAA5872009c527cCb80343E41C52840CEdb095eb0\" as Address,\n // MORPHO_SUPPLY_TEMPLATE / CONCENTRATED_LIQUIDITY_TEMPLATE from\n // sherwood-protocol/chains/9994663.json. Both are live and on the\n // StrategyFactory allowlist; their init encoders live in\n // strategies/morpho-supply-template.ts and concentrated-liquidity-template.ts.\n MORPHO_SUPPLY: \"0x5B55E1Da361573CB0788e750038567D2569BE41d\" as Address,\n CONCENTRATED_LIQUIDITY: \"0xcba9C84F2d382729D1519c5F7f4a9AAaC075f8B5\" as Address,\n // LAUNCHPAD_TEMPLATE from sherwood-strategies deployments/9994663.json\n // (StrategyFactory-approved on the fork).\n LAUNCHPAD: \"0x4435Aae199907f60588902Bcd7c4363a13Bb2951\" as Address,\n // ZERO by decision: Lighter deploys on Robinhood mainnet only (the fork has\n // no Lighter sequencer, so withdrawals never mature), and mainnet is\n // coordination-only in the CLI.\n LIGHTER_PERP: ZERO,\n};\n\n// SUSHI_LAUNCH_ADAPTER / STONK_LAUNCH_ADAPTER from sherwood-strategies\n// deployments/9994663.json.\nconst ROBINHOOD_FORK_LAUNCH_ADAPTERS: typeof ROBINHOOD_TESTNET_LAUNCH_ADAPTERS = {\n SUSHI: \"0x20348e428050031647d671F0e24752C01D4b7379\" as Address,\n STONK: \"0x0D62944862996791a9BCE992872F9Fa8E3162B49\" as Address,\n};\n\nconst ROBINHOOD_FORK_STRATEGY_VENUES: StrategyVenues = {\n SUSHI_LAUNCHPAD_V2: \"0xF1716eBf85836ffE2985db9A50dd29e5814caBe9\" as Address,\n STONK_PADS_V2: {\n WETH: \"0xFCd61B25BbF3AbD6cf0070D6328E351cc30EEC9f\" as Address,\n STONK: \"0x8f6782c5Aa37804d08a9b7bf3984Ff3245Fd6cD4\" as Address,\n USDG: \"0xd4F20033586977A2511f4A2DB4aF7C79a340D70a\" as Address,\n GME: \"0x4B9Dcd6CCFAeF0f6D23065Dd78E79d5E20ec8cFD\" as Address,\n // EIP-55 checksummed here; the source JSON carries a mis-cased form.\n NVDA: \"0xEe96d955d5634813374ecE4C74F2C0ff71B1F9fB\" as Address,\n AAPL: \"0xB0453A81Cbf963903409FFF18AD92941e1c7a864\" as Address,\n SPCX: \"0x0c3b4EDED41696eFF0ed70841f132B519d81c947\" as Address,\n USO: \"0xDb3C81C841ff88db6cDFbDDB0eE049D162A6053B\" as Address,\n },\n STONK_LENS_V2: \"0x25b5Df581f4b2Ed450203f375ad8A28b17F115B3\" as Address,\n ZK_LIGHTER: \"0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d\" as Address,\n MORPHO_BLUE: \"0x9D53d5E3bd5E8d4Cbfa6DB1ca238AEA02E651010\" as Address,\n UNISWAP_V3_FACTORY: \"0x1f7d7550B1b028f7571E69A784071F0205FD2EfA\" as Address,\n UNISWAP_V3_POSITION_MANAGER: \"0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3\" as Address,\n};\n\n// ── Registries (map-based lookup) ──\n\nconst TOKEN_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_TOKENS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_TOKENS,\n \"robinhood-fork\": ROBINHOOD_FORK_TOKENS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_TOKENS), // coordination chain — no Sherwood contracts\n};\n\nconst MOONWELL_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_MOONWELL> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_MOONWELL,\n \"robinhood-fork\": ROBINHOOD_TESTNET_MOONWELL,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_MOONWELL), // coordination chain — no Sherwood contracts\n};\n\nconst UNISWAP_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_UNISWAP> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_UNISWAP,\n \"robinhood-fork\": ROBINHOOD_FORK_UNISWAP,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_UNISWAP), // coordination chain — no Sherwood contracts\n};\n\nconst INFRA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_INFRA> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_INFRA,\n \"robinhood-fork\": ROBINHOOD_TESTNET_INFRA,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_INFRA), // coordination chain — no Sherwood contracts\n};\n\nconst ENS_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_ENS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_ENS,\n \"robinhood-fork\": ROBINHOOD_TESTNET_ENS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_ENS), // coordination chain — no Sherwood contracts\n};\n\n// Canonical ERC-8004 registries ARE live on 4663 (verified on-chain) — the\n// same 0x8004… addresses as Base. Like EAS, identity coordinates there:\n// mint/load/find/status all run against the coordination chain regardless of\n// the fund chain, which is why the testnet/fork entries above stay zero.\nconst ROBINHOOD_MAINNET_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\" as Address,\n REPUTATION_REGISTRY: \"0x8004BAa17C55a88189AE136b182e5fdA19dE9b63\" as Address,\n} as const;\n\nconst AGENT_REGISTRY_MAP: Record<Network, typeof ROBINHOOD_TESTNET_AGENT_REGISTRY> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AGENT_REGISTRY,\n \"robinhood-fork\": ROBINHOOD_TESTNET_AGENT_REGISTRY,\n \"robinhood-mainnet\": ROBINHOOD_MAINNET_AGENT_REGISTRY,\n};\n\nconst SHERWOOD_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_SHERWOOD> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SHERWOOD,\n \"robinhood-fork\": ROBINHOOD_FORK_SHERWOOD,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_SHERWOOD), // coordination chain — no Sherwood contracts\n};\n\nconst VENICE_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_VENICE> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_VENICE,\n \"robinhood-fork\": ROBINHOOD_TESTNET_VENICE,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_VENICE), // coordination chain — no Sherwood contracts\n};\n\nconst AERODROME_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_AERODROME> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AERODROME,\n \"robinhood-fork\": ROBINHOOD_TESTNET_AERODROME,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_AERODROME), // coordination chain — no Sherwood contracts\n};\n\nconst STRATEGY_TEMPLATE_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_STRATEGY_TEMPLATES> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES,\n \"robinhood-fork\": ROBINHOOD_FORK_STRATEGY_TEMPLATES,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_STRATEGY_TEMPLATES), // coordination chain — no Sherwood contracts\n};\n\nconst LAUNCH_ADAPTER_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_LAUNCH_ADAPTERS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_LAUNCH_ADAPTERS,\n \"robinhood-fork\": ROBINHOOD_FORK_LAUNCH_ADAPTERS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_LAUNCH_ADAPTERS), // coordination chain — no Sherwood contracts\n};\n\nconst STRATEGY_VENUE_REGISTRY: Record<Network, StrategyVenues> = {\n \"robinhood-testnet\": NO_STRATEGY_VENUES,\n \"robinhood-fork\": ROBINHOOD_FORK_STRATEGY_VENUES,\n \"robinhood-mainnet\": NO_STRATEGY_VENUES, // coordination chain — venues live, but not exposed (decided)\n};\n\nconst SYNTHRA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_SYNTHRA> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SYNTHRA,\n \"robinhood-fork\": ROBINHOOD_TESTNET_SYNTHRA, // unused on the fork (Uniswap, not Synthra)\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_SYNTHRA), // coordination chain — no Sherwood contracts\n};\n\nconst CHAINLINK_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_CHAINLINK> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_CHAINLINK,\n \"robinhood-fork\": ROBINHOOD_FORK_CHAINLINK,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_CHAINLINK), // coordination chain — no Sherwood contracts\n};\n\n// Attestations live on chain 4663 no matter which chain the fund is on,\n// so every network resolves to the same book (spec §5.1).\nconst EAS_CONTRACT_REGISTRY: Record<Network, typeof ROBINHOOD_MAINNET_EAS> = {\n \"robinhood-testnet\": ROBINHOOD_MAINNET_EAS,\n \"robinhood-fork\": ROBINHOOD_MAINNET_EAS,\n \"robinhood-mainnet\": ROBINHOOD_MAINNET_EAS,\n};\n\n// Attestations live on chain 4663 no matter which chain the fund is on,\n// so every network resolves to the same book (spec §5.1).\nconst EAS_SCHEMA_REGISTRY: Record<Network, typeof SHERWOOD_EAS_SCHEMAS> = {\n \"robinhood-testnet\": SHERWOOD_EAS_SCHEMAS,\n \"robinhood-fork\": SHERWOOD_EAS_SCHEMAS,\n \"robinhood-mainnet\": SHERWOOD_EAS_SCHEMAS,\n};\n\n// ── Exports (functions, resolved at call time) ──\n\nexport function TOKENS() {\n return TOKEN_REGISTRY[getNetwork()];\n}\n\nexport function MOONWELL() {\n return MOONWELL_REGISTRY[getNetwork()];\n}\n\nexport function UNISWAP() {\n return { ...UNISWAP_REGISTRY[getNetwork()], ...overridesFor(\"UNISWAP\") };\n}\n\nexport function INFRA() {\n return INFRA_REGISTRY[getNetwork()];\n}\n\nexport function ENS() {\n return { ...ENS_REGISTRY[getNetwork()], ...overridesFor(\"ENS\") };\n}\n\nexport function AGENT_REGISTRY() {\n return AGENT_REGISTRY_MAP[getNetwork()];\n}\n\nexport function VENICE() {\n return VENICE_REGISTRY[getNetwork()];\n}\n\nexport function SHERWOOD() {\n return { ...SHERWOOD_REGISTRY[getNetwork()], ...overridesFor(\"SHERWOOD\") };\n}\n\nexport function AERODROME() {\n return AERODROME_REGISTRY[getNetwork()];\n}\n\nexport function STRATEGY_TEMPLATES() {\n return {\n ...STRATEGY_TEMPLATE_REGISTRY[getNetwork()],\n ...overridesFor(\"STRATEGY_TEMPLATES\"),\n };\n}\n\n/** Launch adapters (ILaunchAdapter implementations) for LaunchpadStrategy: `{ SUSHI, STONK }`. */\nexport function LAUNCH_ADAPTERS() {\n return {\n ...LAUNCH_ADAPTER_REGISTRY[getNetwork()],\n ...overridesFor(\"LAUNCH_ADAPTERS\"),\n };\n}\n\n/**\n * Third-party venues behind the sherwood-strategies templates (Sushi\n * Launchpad V2, StonkBrokers V2 pads by lane + lens, zkLighter). Fork only;\n * ZERO on 46630 and on the coordination-only 4663. See `StrategyVenues`.\n */\nexport function STRATEGY_VENUES(): StrategyVenues {\n return STRATEGY_VENUE_REGISTRY[getNetwork()];\n}\n\nexport function EAS_CONTRACTS() {\n return EAS_CONTRACT_REGISTRY[getNetwork()];\n}\n\nexport function EAS_SCHEMAS() {\n return EAS_SCHEMA_REGISTRY[getNetwork()];\n}\n\nexport function SYNTHRA() {\n return SYNTHRA_REGISTRY[getNetwork()];\n}\n\nexport function CHAINLINK() {\n return CHAINLINK_REGISTRY[getNetwork()];\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/lib/address-overrides.ts","../src/lib/fork-tokens.ts","../src/lib/addresses.ts"],"sourcesContent":["/**\n * SIM_ADDRESSES_FILE override layer (spec G1).\n *\n * Points the CLI at a vnet deployment: a chains/{chainId}.json-shaped file\n * (CAPS_SNAKE_CASE keys, written by contracts deploy scripts) is mapped onto\n * the CLI's per-registry key names and merged over the base network registry\n * at call time. Only 0x-string values are considered. Fail-closed: a set-but-\n * unreadable file throws rather than silently using mainnet addresses.\n */\nimport { readFileSync } from \"node:fs\";\nimport type { Address } from \"viem\";\n\ntype RegistryName = \"SHERWOOD\" | \"STRATEGY_TEMPLATES\" | \"LAUNCH_ADAPTERS\" | \"ENS\" | \"UNISWAP\";\n\n// chains-json key → CLI registry key, grouped by target registry.\n// Extend when deploy scripts gain keys the CLI reads (Task 1 Step 2).\n//\n// STRATEGY_TEMPLATES note (Task 1 Step 2 finding): the deploy scripts\n// (DeployTemplates.s.sol / DeployStrategyFactory.s.sol) write chains.json\n// keys with a `_TEMPLATE` suffix (e.g. `MOONWELL_SUPPLY_TEMPLATE`), but the\n// CLI-side STRATEGY_TEMPLATES() registry (cli/src/lib/addresses.ts\n// `BASE_STRATEGY_TEMPLATES`) and its consumers (e.g.\n// cli/src/commands/strategy-template.ts `addressKey: \"MOONWELL_SUPPLY\"`) key\n// off the UNSUFFIXED name. The map below strips the suffix so overrides\n// actually reach the keys the CLI reads.\nconst CHAINS_TO_CLI: Record<RegistryName, Record<string, string>> = {\n SHERWOOD: {\n SYNDICATE_FACTORY: \"FACTORY\",\n SYNDICATE_GOVERNOR: \"GOVERNOR\",\n GUARDIAN_REGISTRY: \"GUARDIAN_REGISTRY\",\n STAKED_WOOD: \"STAKED_WOOD\",\n WOOD: \"WOOD_TOKEN\",\n WOOD_TOKEN: \"WOOD_TOKEN\",\n STRATEGY_FACTORY: \"STRATEGY_FACTORY\",\n },\n STRATEGY_TEMPLATES: {\n MOONWELL_SUPPLY_TEMPLATE: \"MOONWELL_SUPPLY\",\n AERODROME_LP_TEMPLATE: \"AERODROME_LP\",\n VENICE_INFERENCE_TEMPLATE: \"VENICE_INFERENCE\",\n WSTETH_MOONWELL_TEMPLATE: \"WSTETH_MOONWELL\",\n MAMO_YIELD_TEMPLATE: \"MAMO_YIELD\",\n PORTFOLIO_TEMPLATE: \"PORTFOLIO\",\n HYPERLIQUID_PERP_TEMPLATE: \"HYPERLIQUID_PERP\",\n HYPERLIQUID_GRID_TEMPLATE: \"HYPERLIQUID_GRID\",\n // v1 protocol templates (sherwood-protocol chains/<chainId>.json).\n MORPHO_SUPPLY_TEMPLATE: \"MORPHO_SUPPLY\",\n CONCENTRATED_LIQUIDITY_TEMPLATE: \"CONCENTRATED_LIQUIDITY\",\n // sherwood-strategies templates (deployments/<chainId>.json — same flat\n // KEY: address format, so SIM_ADDRESSES_FILE can point at either book or\n // a merge of both).\n LAUNCHPAD_TEMPLATE: \"LAUNCHPAD\",\n LIGHTER_PERP_TEMPLATE: \"LIGHTER_PERP\",\n },\n LAUNCH_ADAPTERS: {\n SUSHI_LAUNCH_ADAPTER: \"SUSHI\",\n STONK_LAUNCH_ADAPTER: \"STONK\",\n },\n ENS: {\n L2_REGISTRAR: \"L2_REGISTRAR\",\n L2_REGISTRY: \"L2_REGISTRY\",\n },\n UNISWAP: {\n UNISWAP_SWAP_ADAPTER: \"SWAP_ADAPTER\",\n },\n};\n\nlet cached: Record<string, Address> | null | undefined;\n\nfunction loadFile(): Record<string, Address> | null {\n if (cached !== undefined) return cached;\n const file = process.env.SIM_ADDRESSES_FILE;\n if (!file) {\n cached = null;\n return cached;\n }\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(readFileSync(file, \"utf8\")) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `SIM_ADDRESSES_FILE is set (${file}) but unreadable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n const out: Record<string, Address> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v === \"string\" && v.startsWith(\"0x\")) out[k] = v as Address;\n }\n cached = out;\n return cached;\n}\n\n/** Mapped overrides for one CLI registry; {} when SIM_ADDRESSES_FILE unset. */\nexport function overridesFor(registry: RegistryName): Record<string, Address> {\n const file = loadFile();\n if (!file) return {};\n const map = CHAINS_TO_CLI[registry];\n const out: Record<string, Address> = {};\n for (const [chainsKey, cliKey] of Object.entries(map)) {\n if (file[chainsKey]) out[cliKey] = file[chainsKey];\n }\n return out;\n}\n\nexport function __resetOverridesCacheForTests(): void {\n cached = undefined;\n}\n","/**\n * Robinhood mainnet fork (Tenderly vnet, chain 9994663) — tokenized-stock map.\n *\n * ONE table for every stock the fork address book carries\n * (sherwood-protocol/chains/9994663.json): token address, its Chainlink USD\n * push feed, and the swap route the fork's Uniswap deployment ACTUALLY quotes\n * for USDG -> stock. `addresses.ts` derives `ROBINHOOD_FORK_TOKENS` and the\n * fork's `<SYM>_USD_FEED` registry from here; the sim's basket builder\n * (`simulation/proposal-specs.ts`) reads feed + route from here.\n *\n * THE ROUTES ARE MEASURED, NOT GUESSED. Every entry below was quoted\n * read-only against the fork's V4Quoter (0x8dc178ef…) and, where v4 had no\n * pool, the v3 QuoterV2 (0x33e885ed…), at 100 USDG on 2026-09-05 (vnet block\n * 21,179,183), and cross-checked against the token's own Chainlink feed. The\n * per-entry `quotedOut` / `feedDeviationBps` fields are that measurement.\n * Tiers probed: v4 3000/60, 10000/200, 500/10, 100/1; v3 500, 3000, 10000.\n *\n * `eligible` is the sim's basket-generation gate, and it is stricter than\n * \"quotes\": PortfolioStrategy floors every buy at the ORACLE-implied amount\n * discounted by maxSlippageBps (`_buyFloor`, push-feed mode), so a pool whose\n * price sits further above the frozen feed than the sim's 5% tolerance\n * executes to a revert no matter how well it quotes. That is META today\n * (+8.3%). SLV is the other exclusion: it has NO v4 pool on any tier and only\n * quotes on v3, and this vnet's v3 position manager is known-corrupted\n * (state-injected token ids), so the v3 leg is unverified end to end. Both\n * stay in the map with their measured route so an explicit\n * `--tokens META --swap-routes v4:3000:60 --max-slippage 1000` still works;\n * they are just not handed to the sim by default.\n *\n * Re-quote before trusting any of this on a fresh fork — the vnet's pools are\n * traded by every sim run and the feeds are frozen at fork time.\n */\n\nimport type { Address } from \"viem\";\n\nexport interface ForkStock {\n /** Tokenized-stock ERC-20 on the fork (18-dec). */\n address: Address;\n /** Chainlink AggregatorV3 USD feed (8-dec) for the same stock. */\n feed: Address;\n /**\n * Swap-route spec in `--swap-routes` syntax (`v4:<fee>:<tickSpacing>` or\n * `v3:<fee>`), or null when no USDG pool quoted on any probed tier.\n */\n route: string | null;\n /** True when the only quoting pool is Uniswap v3 (no v4 pool on any tier). */\n v3Only?: boolean;\n /** Include in sim basket generation. False = keep out of default baskets. */\n eligible: boolean;\n /** Stock received for 100 USDG on the recorded route (human units). */\n quotedOut?: string;\n /** (pool-implied price / Chainlink feed − 1) in bps at the time of the quote. */\n feedDeviationBps?: number;\n /** Why a token is ineligible / unroutable, or anything the next re-quote should know. */\n note?: string;\n}\n\n/** Symbol order mirrors chains/9994663.json. */\nexport const ROBINHOOD_FORK_STOCKS = {\n AAPL: {\n address: \"0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9\" as Address,\n feed: \"0x6B22A786bAa607d76728168703a39Ea9C99f2cD0\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.30994905\",\n feedDeviationBps: 252,\n },\n TSLA: {\n address: \"0x322F0929c4625eD5bAd873c95208D54E1c003b2d\" as Address,\n feed: \"0x4A1166a659A55625345e9515b32adECea5547C38\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.27501216\",\n feedDeviationBps: 265,\n },\n NVDA: {\n address: \"0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC\" as Address,\n feed: \"0x379EC4f7C378F34a1B47E4F3cbeBCbAC3E8E9F15\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.43142676\",\n feedDeviationBps: 199,\n },\n MSFT: {\n address: \"0xe93237C50D904957Cf27E7B1133b510C669c2e74\" as Address,\n feed: \"0x45C3C877C15E6BA2EBB19eA114Ea508d14C1Af2E\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.19882872\",\n feedDeviationBps: -18,\n },\n AMZN: {\n address: \"0x12f190a9F9d7D37a250758b26824B97CE941bF54\" as Address,\n feed: \"0xD5a1508ceD74c084eBf3cBe853e2C968fB2a651C\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.37998363\",\n feedDeviationBps: 264,\n },\n META: {\n address: \"0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35\" as Address,\n feed: \"0x7C38C00C30BEe9378381E7B6135d7283356D71b1\" as Address,\n route: \"v4:3000:60\",\n eligible: false,\n quotedOut: \"0.16185932\",\n feedDeviationBps: 829,\n note:\n \"Quotes, but the pool sits 8.3% above the frozen META/USD feed (v3 agrees: +8.2%), \" +\n \"past the sim's 5% buy floor and near the contract's 10% ceiling. Excluded from \" +\n \"generated baskets until the pool or feed is re-based.\",\n },\n AMD: {\n address: \"0x86923f96303D656E4aa86D9d42D1e57ad2023fdC\" as Address,\n feed: \"0x943A29E7ae51A4798823ca9eEd2ed533B2A22C72\" as Address,\n // The fee-3000 pool does NOT exist — only the 10000/200 tier quotes. This\n // is the case that makes guessing a fee tier a bug.\n route: \"v4:10000:200\",\n eligible: true,\n quotedOut: \"0.20887416\",\n feedDeviationBps: 53,\n },\n SPY: {\n address: \"0x117cc2133c37B721F49dE2A7a74833232B3B4C0C\" as Address,\n feed: \"0x319724394D3A0e3669269846abE664Cd621f9f6A\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.12913164\",\n feedDeviationBps: 63,\n },\n QQQ: {\n address: \"0xD5f3879160bc7c32ebb4dC785F8a4F505888de68\" as Address,\n feed: \"0x80901d846d5D7B030F26B480776EE3b29374C2ae\" as Address,\n // A 10000/200 pool also exists but quoted +48.8% vs feed (near-empty) —\n // never route QQQ through it.\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.13873445\",\n feedDeviationBps: 23,\n },\n SLV: {\n address: \"0x411eFb0E7f985935DAec3D4C3ebaEa0d0AD7D89f\" as Address,\n feed: \"0x209b73908e92Ae021826eD79609845451Ecba2ce\" as Address,\n route: \"v3:500\",\n v3Only: true,\n eligible: false,\n quotedOut: \"1.66443692\",\n feedDeviationBps: -389,\n note:\n \"No v4 USDG pool on any probed tier; only Uniswap v3 quotes (500/3000/10000 all \" +\n \"do, 500 best). This vnet's v3 position manager is corrupted, so the v3 swap leg \" +\n \"is unverified end to end — excluded from generated baskets.\",\n },\n GOOGL: {\n address: \"0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3\" as Address,\n feed: \"0xF6f373a037c30F0e5010d854385cA89185AE638b\" as Address,\n route: \"v4:3000:60\",\n eligible: true,\n quotedOut: \"0.29346562\",\n feedDeviationBps: 11,\n },\n} as const satisfies Record<string, ForkStock>;\n\nexport type ForkStockSymbol = keyof typeof ROBINHOOD_FORK_STOCKS;\n\nexport const ROBINHOOD_FORK_STOCK_SYMBOLS = Object.keys(ROBINHOOD_FORK_STOCKS) as ForkStockSymbol[];\n\n/** Symbols the sim may put in a generated basket (routable AND inside the slippage floor). */\nexport function forkBasketSymbols(): ForkStockSymbol[] {\n return ROBINHOOD_FORK_STOCK_SYMBOLS.filter((s) => ROBINHOOD_FORK_STOCKS[s].eligible);\n}\n\n/**\n * Feed + route for a basket token, or undefined when the symbol is unknown,\n * unroutable, or gated out of basket generation. Callers own the error text.\n */\nexport function forkBasketMeta(symbol: string): { feed: Address; route: string } | undefined {\n const entry = (ROBINHOOD_FORK_STOCKS as Record<string, ForkStock>)[symbol.toUpperCase()];\n if (!entry || !entry.eligible || !entry.route) return undefined;\n return { feed: entry.feed, route: entry.route };\n}\n\n/** `{ SYM: address }` for the token registry. */\nexport function forkStockAddresses(): Record<ForkStockSymbol, Address> {\n return Object.fromEntries(\n ROBINHOOD_FORK_STOCK_SYMBOLS.map((s) => [s, ROBINHOOD_FORK_STOCKS[s].address]),\n ) as Record<ForkStockSymbol, Address>;\n}\n\n/** `{ SYM_USD_FEED: feed }` for the Chainlink registry (push-feed auto-resolve). */\nexport function forkStockFeeds(): Record<`${ForkStockSymbol}_USD_FEED`, Address> {\n return Object.fromEntries(\n ROBINHOOD_FORK_STOCK_SYMBOLS.map((s) => [`${s}_USD_FEED`, ROBINHOOD_FORK_STOCKS[s].feed]),\n ) as Record<`${ForkStockSymbol}_USD_FEED`, Address>;\n}\n","/**\n * Contract addresses by network.\n *\n * All exports are functions — they resolve at call time based on the\n * current network set via setNetwork(). This ensures --chain works\n * even when modules are imported before the flag is parsed.\n *\n * Current deployment target: Robinhood L2 testnet (chain 46630) only. Other\n * chains may be added back later; when they are, their address blocks + registry\n * entries re-enter here alongside the robinhood-testnet ones.\n *\n * Zero addresses = protocol not deployed on that chain. Strategies that\n * need them will fail at execution time with a clear allowlist error.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { type Network, getNetwork } from \"./network.js\";\nimport { overridesFor } from \"./address-overrides.js\";\nimport { forkStockAddresses, forkStockFeeds } from \"./fork-tokens.js\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\nconst ZERO_BYTES32 =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as `0x${string}`;\n\n// ── Robinhood L2 Testnet (Arbitrum Orbit, chain 46630) ──\n// Synthra DEX for swaps. Stock tokens available.\n\nconst ROBINHOOD_TESTNET_TOKENS = {\n USDC: ZERO,\n // USDG (Robinhood-chain stablecoin, 6-dec). Zero on testnet (Synthra WETH-quoted);\n // real on the mainnet fork. Keyed so `--asset USDG` resolves + decimals=6.\n USDG: ZERO,\n // WETH resolves to Synthra's WETH9 (SYNTHRA_WETH): ALL stock DEX liquidity is\n // denominated in it (e.g. the TSLA fee-3000 pool holds ~37.8 WETH here vs\n // ~0.0003 in the canonical WETH pool). It is WETH9-style (payable deposit()),\n // so --use-eth wrapping works against it. Canonical WETH kept as WETH_CANONICAL\n // so the reference isn't lost.\n WETH: \"0x33e4191705c386532ba27cBF171Db86919200B94\" as Address,\n WETH_CANONICAL: \"0x7943e237c7F95DA44E0301572D358911207852Fa\" as Address,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n TSLA: \"0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E\" as Address,\n AMZN: \"0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02\" as Address,\n PLTR: \"0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0\" as Address,\n NFLX: \"0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93\" as Address,\n AMD: \"0x71178BAc73cBeb415514eB542a8995b82669778d\" as Address,\n // Stocks the mainnet fork carries and the testnet does not (lib/fork-tokens.ts).\n // Keyed here as ZERO so the token-shape type covers both chains.\n AAPL: ZERO,\n NVDA: ZERO,\n MSFT: ZERO,\n META: ZERO,\n SPY: ZERO,\n QQQ: ZERO,\n SLV: ZERO,\n GOOGL: ZERO,\n} as const;\n\nconst ROBINHOOD_TESTNET_MOONWELL = {\n COMPTROLLER: ZERO,\n mUSDC: ZERO,\n mWETH: ZERO,\n mCbETH: ZERO,\n mWstETH: ZERO,\n mCbBTC: ZERO,\n mDAI: ZERO,\n mAERO: ZERO,\n} as const;\n\n// Synthra is Uniswap-V3-compatible; the deployed UniswapSwapAdapter is backed by\n// Synthra's router + a QuoterV2 shim (SYNTHRA_QUOTER_V2_SHIM). SWAP_ROUTER /\n// QUOTER_V2 mirror the Synthra addresses so a direct v3 quote path also resolves.\nconst ROBINHOOD_TESTNET_UNISWAP = {\n SWAP_ROUTER: \"0x3Ce954107b1A675826B33bF23060Dd655e3758fE\" as Address,\n QUOTER_V2: \"0xb06788F027268a9A06c3AD41a88559530D2E54b1\" as Address,\n SWAP_ADAPTER: \"0x4fc3492117cC3bbcE0b210D22a8DC244f9d86490\" as Address,\n} as const;\n\n// ── Synthra DEX (Robinhood L2 — Uniswap V3-compatible concentrated liquidity) ──\n\nconst ROBINHOOD_TESTNET_SYNTHRA = {\n ROUTER: \"0x3Ce954107b1A675826B33bF23060Dd655e3758fE\" as Address,\n QUOTER: \"0x231606c321A99DE81e28fE48B07a93F1ba49e713\" as Address,\n FACTORY: \"0x911b4000D3422F482F4062a913885f7b035382Df\" as Address,\n} as const;\n\n// ── Chainlink AggregatorV3 push feeds ──\n//\n// Data Streams is gone at v1: PortfolioStrategy binds an AggregatorV3 proxy\n// ADDRESS per allocation and there is no verifier proxy to configure.\n\nconst ROBINHOOD_TESTNET_CHAINLINK = {\n WSTETH_ETH_FEED: ZERO,\n // Tokenized-equity push feeds exist only on the mainnet fork. Keyed as ZERO\n // so the registry shape covers both chains and the fork's `<SYM>_USD_FEED`\n // auto-resolve (template-encoder.ts) has a slot.\n ...noneOf(forkStockFeeds()),\n} as const;\n\n// ── Robinhood portfolio-basket route + feed metadata ──\n//\n// Data-driven replacement for the hand-drifting \"known stock\" Set that used to\n// live in strategy-template.ts. Every entry is a VERIFIED-liquidity default\n// swap route for a basket token. Absence from this map means \"no verified\n// default route\" — the CLI fails fast and demands an explicit --swap-routes\n// rather than falling through to a v3 auto-detect that would be dead.\n//\n// `kind: \"v4-native\"` = a Uniswap v4 mode-3 multi-hop USDG → native ETH → stock,\n// consumed by portfolio-template.ts as\n// v4PathExtraData([{currency: ETH, ...native}, {currency: <token>, ...stock}]).\nexport interface RobinhoodStockRoute {\n kind: \"v4-native\";\n nativeFee: number;\n nativeTickSpacing: number;\n stockFee: number;\n stockTickSpacing: number;\n}\n\n// No verified default stock swap routes on the Robinhood testnet — the\n// machinery is retained (see portfolio-template.ts) but the map is empty, so\n// every basket token falls to the existing fail-fast route error until a\n// verified route is added.\n// LOCKSTEP: the app's quote-probe geometry (app/src/lib/price-quote.ts\n// V4_DIRECT_TIERS + via-native path) must stay consistent with any route added\n// here, or the dashboard displays a tier the strategy won't execute.\nexport const ROBINHOOD_STOCK_ROUTES: Record<string, RobinhoodStockRoute> = {};\n\nconst ROBINHOOD_TESTNET_INFRA = {\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as Address, // Deterministic, same everywhere\n} as const;\n\n// ── ENS / Durin ──\n\nconst ROBINHOOD_TESTNET_ENS = {\n L2_REGISTRAR: ZERO,\n L2_REGISTRY: ZERO,\n} as const;\n\n// ── ERC-8004 Agent Identity ──\n//\n// Zero on purpose, not \"pending a deploy\": no ERC-8004 registry exists on the\n// testnet or on the fork, and none should. Identity is a coordination-chain\n// concern — every identity op (mint / load / find / status) runs against 4663\n// via `withNetwork(COORDINATION_NETWORK, …)`, whatever chain the fund is on.\nconst ROBINHOOD_TESTNET_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: ZERO,\n REPUTATION_REGISTRY: ZERO,\n} as const;\n\n// ── Sherwood Protocol (our deployed contracts) ──\n//\n// V2 redeploy (chain 46630): fresh factory/governor/vault-impl/executor plus a\n// full guardian layer (registry + sWOOD + WOOD fixture token) and the V2\n// live-NAV surface (PriceRouter, UniswapSwapAdapter via the Synthra QuoterV2\n// shim, Portfolio template, StrategyFactory). WOOD_TOKEN here is a testnet\n// fixture, not the mainnet OFT.\n//\n// GOVERNOR is the deploy-time bootstrap governor. Governors are per-vault since\n// PR #421 — resolve one at runtime via `factory.governorOf(vault)`\n// (lib/governor.ts `getGovernorOf`), never from this table.\n// Key parity with the SDK book (sdk/src/addresses.ts SherwoodDeployment) is\n// pinned by lib/address-parity.test.ts — add new keys to BOTH books.\nconst ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0xa91AA45AFF32f52b6357044B02a16EBA775feC0b\" as Address,\n GOVERNOR: ZERO, // zeroed since the post-#421 redeploy — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0xA400eFcfFc820C6f812203C58ee00423AeCC0903\" as Address,\n STAKED_WOOD: \"0x21A69A6c9814c0d339C57fDdafed3B283702a739\" as Address,\n WOOD_TOKEN: \"0xCCb4fB59cf40de1E23083037ee81Da1DD747D8d7\" as Address,\n STRATEGY_FACTORY: \"0xb683Bb8EEcBc2419BC3801df6FeA88f96657e670\" as Address,\n MERKL_DISTRIBUTOR: ZERO,\n // Guardian-era contracts from contracts/chains/46630.json (SHE-93).\n VAULT_IMPL: \"0xC57e12d6e2d8Ed49316F0b69c51893CcA44151F7\" as Address,\n BATCH_EXECUTOR_LIB: \"0xF3b8db5aa41c7Ce92478A0Fa9C55a6460533eb86\" as Address,\n GOVERNOR_BEACON: \"0x3D46Ec018cd5893b685b4dfdc3921A4Eb64E11d1\" as Address,\n PROTOCOL_CONFIG: \"0xC104Eb6a522d6718cA28F344B2373B29d57FF2E0\" as Address,\n PRICE_ROUTER: \"0xDd302ffcfA08071780eC1A2f12BccFB9ba6b6731\" as Address,\n TIER_REGISTRY: \"0x99b8068Dc0F6093466964D581f72d947e3e380DB\" as Address,\n // Not in chains/46630.json (econ-security stack not deployed there yet).\n EXPOSURE_LEDGER: ZERO,\n PROPOSER_BOND_ESCROW: ZERO,\n CHALLENGE_GAME: ZERO,\n TOKEN_COURT: ZERO,\n} as const;\n\n// ── Venice (VVV governance + sVVV staking + DIEM compute) ──\n\nconst ROBINHOOD_TESTNET_VENICE = {\n VVV: ZERO,\n STAKING: ZERO,\n DIEM: ZERO,\n} as const;\n\n// ── Aerodrome (Base ve(3,3) DEX) ──\n\nconst ROBINHOOD_TESTNET_AERODROME = {\n ROUTER: ZERO,\n FACTORY: ZERO,\n} as const;\n\n// ── Strategy Templates (ERC-1167 clonable singletons) ──\n// Populated after running script/DeployTemplates.s.sol\n\nconst ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: ZERO as Address,\n AERODROME_LP: ZERO as Address,\n VENICE_INFERENCE: ZERO as Address,\n WSTETH_MOONWELL: ZERO as Address,\n MAMO_YIELD: ZERO as Address,\n HYPERLIQUID_PERP: ZERO as Address,\n HYPERLIQUID_GRID: ZERO as Address,\n // V2 redeploy PORTFOLIO_TEMPLATE (chain 46630).\n PORTFOLIO: \"0x67420Cc504d70a42Adfd8867d878afe0978C7d10\" as Address,\n // v1 templates — deployed on the fork only so far (no 46630 equivalent).\n MORPHO_SUPPLY: ZERO as Address,\n CONCENTRATED_LIQUIDITY: ZERO as Address,\n // sherwood-strategies templates (book: sherwood-strategies\n // deployments/<chainId>.json, keys LAUNCHPAD_TEMPLATE / LIGHTER_PERP_TEMPLATE).\n // No 46630 deployment of either.\n LAUNCHPAD: ZERO as Address,\n LIGHTER_PERP: ZERO as Address,\n} as const;\n\n// ── Launch adapters (sherwood-strategies, LaunchpadStrategy venues) ──\n//\n// ILaunchAdapter implementations a LaunchpadStrategy clone is initialised\n// with — one per launch venue. Book: sherwood-strategies\n// deployments/<chainId>.json (SUSHI_LAUNCH_ADAPTER / STONK_LAUNCH_ADAPTER).\n// Key parity with the SDK (`launchAdapters`) and the strategies book is pinned\n// by lib/address-parity.test.ts.\n\nconst ROBINHOOD_TESTNET_LAUNCH_ADAPTERS = {\n SUSHI: ZERO as Address,\n STONK: ZERO as Address,\n} as const;\n\n// ── Third-party venues the sherwood-strategies templates talk to ──\n//\n// Not Sherwood contracts: the launch venues behind the Sushi / Stonk launch\n// adapters, and the zkLighter core contract behind LighterPerpStrategy.\n// Source: sherwood-strategies script/launchpad/addresses-4663.json and\n// script/lighter/addresses-4663.json (Robinhood mainnet, 4663). The fork\n// (9994663) replays mainnet state, so the SAME addresses are live there —\n// verified by code + pad.quote() on the fork. They are exposed on the fork\n// only: 4663 is coordination-only in the CLI (every Sherwood/strategy address\n// there is ZERO by decision), and 46630 has none of these venues.\n\n/** StonkBrokers SafeLaunchpad V2 quote lanes — one pad per quote token. */\nexport const STONK_LANES = [\"WETH\", \"STONK\", \"USDG\", \"GME\", \"NVDA\", \"AAPL\", \"SPCX\", \"USO\"] as const;\nexport type StonkLane = (typeof STONK_LANES)[number];\n\nexport interface StrategyVenues {\n /** Sushi Launchpad V2 — ERC-1967 UUPS proxy (SUSHI_LAUNCHPAD_V2). */\n SUSHI_LAUNCHPAD_V2: Address;\n /**\n * StonkBrokers SafeLaunchpad V2 pads by quote lane (STONK_SAFE_LAUNCHPAD_V2_<LANE>).\n * `STONK` is the STONKBROKER token lane. V2 pads mint the launch token; the\n * V3 (bring-your-own-token) pads are deliberately not listed.\n */\n STONK_PADS_V2: Record<StonkLane, Address>;\n /** SafeLaunchLensV2 — curve/tax reads, pad as first arg (SAFE_LAUNCH_LENS_V2). */\n STONK_LENS_V2: Address;\n /** zkLighter core contract (ZK_LIGHTER). */\n ZK_LIGHTER: Address;\n /** Morpho Blue singleton (MORPHO_BLUE) — Morpho Supply and CL. */\n MORPHO_BLUE: Address;\n /**\n * Uniswap V3 factory and position manager CL is initialized against\n * (UNISWAP_V3_FACTORY, UNISWAP_V3_POSITION_MANAGER). Resolved on-chain on\n * Robinhood: the canonical Uniswap addresses hold unrelated code there.\n */\n UNISWAP_V3_FACTORY: Address;\n UNISWAP_V3_POSITION_MANAGER: Address;\n}\n\nconst NO_STRATEGY_VENUES: StrategyVenues = {\n SUSHI_LAUNCHPAD_V2: ZERO,\n STONK_PADS_V2: Object.fromEntries(STONK_LANES.map((l) => [l, ZERO])) as Record<StonkLane, Address>,\n STONK_LENS_V2: ZERO,\n ZK_LIGHTER: ZERO,\n MORPHO_BLUE: ZERO,\n UNISWAP_V3_FACTORY: ZERO,\n UNISWAP_V3_POSITION_MANAGER: ZERO,\n};\n\n// ── EAS (Ethereum Attestation Service) ──\n\nconst ROBINHOOD_TESTNET_EAS = {\n EAS: ZERO,\n SCHEMA_REGISTRY: ZERO,\n} as const;\n\n// EAS on Robinhood Chain mainnet (4663). Deployed by Sherwood — EAS is not a\n// predeploy on an Arbitrum Orbit chain. sherwoodagent/sherwood-protocol#278.\nconst ROBINHOOD_MAINNET_EAS = {\n EAS: \"0x7d70441Bb10AcE5d9771dc0b6205D89ddf63205B\" as Address,\n SCHEMA_REGISTRY: \"0xdd7521Ba10773e556Defa6D6c133cB2F663b5c26\" as Address,\n} as const;\n\n/**\n * Schema UIDs are chain-INDEPENDENT: uid = keccak256(schema, resolver,\n * revocable) carries no chainId. With resolver = address(0) these are the same\n * UIDs already registered on Base, and re-registering the same definitions on\n * any chain reproduces them. Verified against Base's live SchemaRegistry.\n */\nconst SHERWOOD_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST: \"0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef\" as Hex,\n AGENT_APPROVED: \"0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607\" as Hex,\n X402_RESEARCH: \"0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708\" as Hex,\n VENICE_PROVISION: \"0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1\" as Hex,\n VENICE_INFERENCE: \"0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14\" as Hex,\n TRADE_EXECUTED: \"0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6\" as Hex,\n} as const;\n\n/**\n * Every non-EAS address book, for the coordination chain. Sherwood core is not\n * deployed on 4663, so these are all zero BY CONSTRUCTION rather than by\n * omission — mapping them to the testnet book would silently hand out 46630\n * addresses during the brief `withNetwork` window an EAS write opens.\n */\nfunction noneOf<T extends Record<string, unknown>>(shape: T): T {\n return Object.fromEntries(Object.keys(shape).map((k) => [k, ZERO])) as T;\n}\n\n// ── EAS Schema UIDs (populated after running scripts/register-eas-schemas.ts) ──\n\nconst ROBINHOOD_TESTNET_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST: ZERO_BYTES32,\n AGENT_APPROVED: ZERO_BYTES32,\n X402_RESEARCH: ZERO_BYTES32,\n VENICE_PROVISION: ZERO_BYTES32,\n VENICE_INFERENCE: ZERO_BYTES32,\n TRADE_EXECUTED: ZERO_BYTES32,\n} as const;\n\n// ── Robinhood Chain mainnet fork (Tenderly vnet, chain 9994663) ──\n//\n// Fork of Robinhood *mainnet*: USDG stablecoin (6-dec), official Uniswap v3+v4,\n// Chainlink PUSH feeds. Core addresses\n// come from sherwood-protocol/chains/9994663.json (fresh deploy). All 11\n// tokenized stocks + their feeds come from lib/fork-tokens.ts (one table, with\n// the measured swap route per token); the feeds are keyed here as\n// `<SYM>_USD_FEED` so a symbol basket auto-resolves its push feed on the fork.\n// Swap routes still need an explicit --swap-routes (ROBINHOOD_STOCK_ROUTES is\n// a different shape and lockstepped with the app's quote probe).\n\nconst ROBINHOOD_FORK_TOKENS: typeof ROBINHOOD_TESTNET_TOKENS = {\n USDC: ZERO,\n USDG: \"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168\" as Address,\n WETH: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\" as Address,\n WETH_CANONICAL: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\" as Address,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n PLTR: ZERO,\n NFLX: ZERO,\n ...forkStockAddresses(),\n};\n\nconst ROBINHOOD_FORK_UNISWAP: typeof ROBINHOOD_TESTNET_UNISWAP = {\n SWAP_ROUTER: \"0xcaf681a66d020601342297493863e78c959e5cb2\" as Address,\n QUOTER_V2: \"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7\" as Address,\n SWAP_ADAPTER: \"0x54E6A7af53143556973493fDeC9d7837A77c67eF\" as Address,\n};\n\n// `<SYM>_USD_FEED` for all 11 stocks so `strategy propose portfolio --tokens\n// AAPL,…` resolves feeds without --feeds (template-encoder.ts auto-resolve).\nconst ROBINHOOD_FORK_CHAINLINK: typeof ROBINHOOD_TESTNET_CHAINLINK = {\n WSTETH_ETH_FEED: ZERO,\n ...forkStockFeeds(),\n};\n\nconst ROBINHOOD_FORK_SHERWOOD: typeof ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0x619af1488F32B4797f6faDa3C3a8De72a5B693E0\" as Address,\n GOVERNOR: ZERO, // per-vault — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0xD8F9E7446E6d6c02198AAaF674A0C5e3d5D1BF72\" as Address,\n STAKED_WOOD: \"0xdDf2B4C52B9575e0e6D03a3A57D75D06a4a9e203\" as Address,\n WOOD_TOKEN: \"0xF8BC08092C06dB6148114DCf82AF881F1085f92b\" as Address,\n STRATEGY_FACTORY: \"0xb06788F027268a9A06c3AD41a88559530D2E54b1\" as Address,\n MERKL_DISTRIBUTOR: ZERO,\n // Guardian-era contracts from sherwood-protocol/chains/9994663.json (SHE-93).\n VAULT_IMPL: \"0xdaB4707c9997a84e931FE98F4688adaFc70b6B95\" as Address,\n BATCH_EXECUTOR_LIB: \"0x899FC2Cac572F64A233344115b488E71E0044f34\" as Address,\n GOVERNOR_BEACON: \"0x3CF45eFE9fBDdd6cB749384Bf5c1bA5Ec96af05d\" as Address,\n PROTOCOL_CONFIG: \"0x8aDb5810B5bF8B9149BE3Ca45Cb441818a9679bB\" as Address,\n // Not in chains/9994663.json (no PriceRouter on the fork).\n PRICE_ROUTER: ZERO,\n TIER_REGISTRY: \"0x4614f058920941A0a9a852e62485fbDE692D75E1\" as Address,\n EXPOSURE_LEDGER: \"0x99D789E7C8E65dB5597dCa692F082B47BE30AB33\" as Address,\n PROPOSER_BOND_ESCROW: \"0x7d25058c891d3AC5C8bc8Da6aA937DFeE648B5cF\" as Address,\n CHALLENGE_GAME: \"0x7046FececcA6c0f5E66Cc998099593ae71A1bbee\" as Address,\n TOKEN_COURT: \"0xC30bA62727be65fd867385Ce27Ff7C78bd66A897\" as Address,\n};\n\nconst ROBINHOOD_FORK_STRATEGY_TEMPLATES: typeof ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: ZERO,\n AERODROME_LP: ZERO,\n VENICE_INFERENCE: ZERO,\n WSTETH_MOONWELL: ZERO,\n MAMO_YIELD: ZERO,\n HYPERLIQUID_PERP: ZERO,\n HYPERLIQUID_GRID: ZERO,\n PORTFOLIO: \"0xAA5872009c527cCb80343E41C52840CEdb095eb0\" as Address,\n // MORPHO_SUPPLY_TEMPLATE / CONCENTRATED_LIQUIDITY_TEMPLATE from\n // sherwood-protocol/chains/9994663.json. Both are live and on the\n // StrategyFactory allowlist; their init encoders live in\n // strategies/morpho-supply-template.ts and concentrated-liquidity-template.ts.\n MORPHO_SUPPLY: \"0x5B55E1Da361573CB0788e750038567D2569BE41d\" as Address,\n CONCENTRATED_LIQUIDITY: \"0xcba9C84F2d382729D1519c5F7f4a9AAaC075f8B5\" as Address,\n // LAUNCHPAD_TEMPLATE from sherwood-strategies deployments/9994663.json\n // (StrategyFactory-approved on the fork).\n LAUNCHPAD: \"0x4435Aae199907f60588902Bcd7c4363a13Bb2951\" as Address,\n // ZERO by decision: Lighter deploys on Robinhood mainnet only (the fork has\n // no Lighter sequencer, so withdrawals never mature), and mainnet is\n // coordination-only in the CLI.\n LIGHTER_PERP: ZERO,\n};\n\n// SUSHI_LAUNCH_ADAPTER / STONK_LAUNCH_ADAPTER from sherwood-strategies\n// deployments/9994663.json.\nconst ROBINHOOD_FORK_LAUNCH_ADAPTERS: typeof ROBINHOOD_TESTNET_LAUNCH_ADAPTERS = {\n SUSHI: \"0x20348e428050031647d671F0e24752C01D4b7379\" as Address,\n STONK: \"0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab\" as Address,\n};\n\nconst ROBINHOOD_FORK_STRATEGY_VENUES: StrategyVenues = {\n SUSHI_LAUNCHPAD_V2: \"0xF1716eBf85836ffE2985db9A50dd29e5814caBe9\" as Address,\n STONK_PADS_V2: {\n WETH: \"0xFCd61B25BbF3AbD6cf0070D6328E351cc30EEC9f\" as Address,\n STONK: \"0x8f6782c5Aa37804d08a9b7bf3984Ff3245Fd6cD4\" as Address,\n USDG: \"0xd4F20033586977A2511f4A2DB4aF7C79a340D70a\" as Address,\n GME: \"0x4B9Dcd6CCFAeF0f6D23065Dd78E79d5E20ec8cFD\" as Address,\n // EIP-55 checksummed here; the source JSON carries a mis-cased form.\n NVDA: \"0xEe96d955d5634813374ecE4C74F2C0ff71B1F9fB\" as Address,\n AAPL: \"0xB0453A81Cbf963903409FFF18AD92941e1c7a864\" as Address,\n SPCX: \"0x0c3b4EDED41696eFF0ed70841f132B519d81c947\" as Address,\n USO: \"0xDb3C81C841ff88db6cDFbDDB0eE049D162A6053B\" as Address,\n },\n STONK_LENS_V2: \"0x25b5Df581f4b2Ed450203f375ad8A28b17F115B3\" as Address,\n ZK_LIGHTER: \"0x94bAB9693Ba2f6358507eFfcbd372b0660AFfF9d\" as Address,\n MORPHO_BLUE: \"0x9D53d5E3bd5E8d4Cbfa6DB1ca238AEA02E651010\" as Address,\n UNISWAP_V3_FACTORY: \"0x1f7d7550B1b028f7571E69A784071F0205FD2EfA\" as Address,\n UNISWAP_V3_POSITION_MANAGER: \"0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3\" as Address,\n};\n\n// ── Registries (map-based lookup) ──\n\nconst TOKEN_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_TOKENS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_TOKENS,\n \"robinhood-fork\": ROBINHOOD_FORK_TOKENS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_TOKENS), // coordination chain — no Sherwood contracts\n};\n\nconst MOONWELL_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_MOONWELL> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_MOONWELL,\n \"robinhood-fork\": ROBINHOOD_TESTNET_MOONWELL,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_MOONWELL), // coordination chain — no Sherwood contracts\n};\n\nconst UNISWAP_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_UNISWAP> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_UNISWAP,\n \"robinhood-fork\": ROBINHOOD_FORK_UNISWAP,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_UNISWAP), // coordination chain — no Sherwood contracts\n};\n\nconst INFRA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_INFRA> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_INFRA,\n \"robinhood-fork\": ROBINHOOD_TESTNET_INFRA,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_INFRA), // coordination chain — no Sherwood contracts\n};\n\nconst ENS_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_ENS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_ENS,\n \"robinhood-fork\": ROBINHOOD_TESTNET_ENS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_ENS), // coordination chain — no Sherwood contracts\n};\n\n// Canonical ERC-8004 registries ARE live on 4663 (verified on-chain) — the\n// same 0x8004… addresses as Base. Like EAS, identity coordinates there:\n// mint/load/find/status all run against the coordination chain regardless of\n// the fund chain, which is why the testnet/fork entries above stay zero.\nconst ROBINHOOD_MAINNET_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\" as Address,\n REPUTATION_REGISTRY: \"0x8004BAa17C55a88189AE136b182e5fdA19dE9b63\" as Address,\n} as const;\n\nconst AGENT_REGISTRY_MAP: Record<Network, typeof ROBINHOOD_TESTNET_AGENT_REGISTRY> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AGENT_REGISTRY,\n \"robinhood-fork\": ROBINHOOD_TESTNET_AGENT_REGISTRY,\n \"robinhood-mainnet\": ROBINHOOD_MAINNET_AGENT_REGISTRY,\n};\n\nconst SHERWOOD_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_SHERWOOD> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SHERWOOD,\n \"robinhood-fork\": ROBINHOOD_FORK_SHERWOOD,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_SHERWOOD), // coordination chain — no Sherwood contracts\n};\n\nconst VENICE_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_VENICE> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_VENICE,\n \"robinhood-fork\": ROBINHOOD_TESTNET_VENICE,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_VENICE), // coordination chain — no Sherwood contracts\n};\n\nconst AERODROME_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_AERODROME> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AERODROME,\n \"robinhood-fork\": ROBINHOOD_TESTNET_AERODROME,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_AERODROME), // coordination chain — no Sherwood contracts\n};\n\nconst STRATEGY_TEMPLATE_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_STRATEGY_TEMPLATES> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES,\n \"robinhood-fork\": ROBINHOOD_FORK_STRATEGY_TEMPLATES,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_STRATEGY_TEMPLATES), // coordination chain — no Sherwood contracts\n};\n\nconst LAUNCH_ADAPTER_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_LAUNCH_ADAPTERS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_LAUNCH_ADAPTERS,\n \"robinhood-fork\": ROBINHOOD_FORK_LAUNCH_ADAPTERS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_LAUNCH_ADAPTERS), // coordination chain — no Sherwood contracts\n};\n\nconst STRATEGY_VENUE_REGISTRY: Record<Network, StrategyVenues> = {\n \"robinhood-testnet\": NO_STRATEGY_VENUES,\n \"robinhood-fork\": ROBINHOOD_FORK_STRATEGY_VENUES,\n \"robinhood-mainnet\": NO_STRATEGY_VENUES, // coordination chain — venues live, but not exposed (decided)\n};\n\nconst SYNTHRA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_SYNTHRA> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SYNTHRA,\n \"robinhood-fork\": ROBINHOOD_TESTNET_SYNTHRA, // unused on the fork (Uniswap, not Synthra)\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_SYNTHRA), // coordination chain — no Sherwood contracts\n};\n\nconst CHAINLINK_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_CHAINLINK> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_CHAINLINK,\n \"robinhood-fork\": ROBINHOOD_FORK_CHAINLINK,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_CHAINLINK), // coordination chain — no Sherwood contracts\n};\n\n// Attestations live on chain 4663 no matter which chain the fund is on,\n// so every network resolves to the same book (spec §5.1).\nconst EAS_CONTRACT_REGISTRY: Record<Network, typeof ROBINHOOD_MAINNET_EAS> = {\n \"robinhood-testnet\": ROBINHOOD_MAINNET_EAS,\n \"robinhood-fork\": ROBINHOOD_MAINNET_EAS,\n \"robinhood-mainnet\": ROBINHOOD_MAINNET_EAS,\n};\n\n// Attestations live on chain 4663 no matter which chain the fund is on,\n// so every network resolves to the same book (spec §5.1).\nconst EAS_SCHEMA_REGISTRY: Record<Network, typeof SHERWOOD_EAS_SCHEMAS> = {\n \"robinhood-testnet\": SHERWOOD_EAS_SCHEMAS,\n \"robinhood-fork\": SHERWOOD_EAS_SCHEMAS,\n \"robinhood-mainnet\": SHERWOOD_EAS_SCHEMAS,\n};\n\n// ── Exports (functions, resolved at call time) ──\n\nexport function TOKENS() {\n return TOKEN_REGISTRY[getNetwork()];\n}\n\nexport function MOONWELL() {\n return MOONWELL_REGISTRY[getNetwork()];\n}\n\nexport function UNISWAP() {\n return { ...UNISWAP_REGISTRY[getNetwork()], ...overridesFor(\"UNISWAP\") };\n}\n\nexport function INFRA() {\n return INFRA_REGISTRY[getNetwork()];\n}\n\nexport function ENS() {\n return { ...ENS_REGISTRY[getNetwork()], ...overridesFor(\"ENS\") };\n}\n\nexport function AGENT_REGISTRY() {\n return AGENT_REGISTRY_MAP[getNetwork()];\n}\n\nexport function VENICE() {\n return VENICE_REGISTRY[getNetwork()];\n}\n\nexport function SHERWOOD() {\n return { ...SHERWOOD_REGISTRY[getNetwork()], ...overridesFor(\"SHERWOOD\") };\n}\n\nexport function AERODROME() {\n return AERODROME_REGISTRY[getNetwork()];\n}\n\nexport function STRATEGY_TEMPLATES() {\n return {\n ...STRATEGY_TEMPLATE_REGISTRY[getNetwork()],\n ...overridesFor(\"STRATEGY_TEMPLATES\"),\n };\n}\n\n/** Launch adapters (ILaunchAdapter implementations) for LaunchpadStrategy: `{ SUSHI, STONK }`. */\nexport function LAUNCH_ADAPTERS() {\n return {\n ...LAUNCH_ADAPTER_REGISTRY[getNetwork()],\n ...overridesFor(\"LAUNCH_ADAPTERS\"),\n };\n}\n\n/**\n * Third-party venues behind the sherwood-strategies templates (Sushi\n * Launchpad V2, StonkBrokers V2 pads by lane + lens, zkLighter). Fork only;\n * ZERO on 46630 and on the coordination-only 4663. See `StrategyVenues`.\n */\nexport function STRATEGY_VENUES(): StrategyVenues {\n return STRATEGY_VENUE_REGISTRY[getNetwork()];\n}\n\nexport function EAS_CONTRACTS() {\n return EAS_CONTRACT_REGISTRY[getNetwork()];\n}\n\nexport function EAS_SCHEMAS() {\n return EAS_SCHEMA_REGISTRY[getNetwork()];\n}\n\nexport function SYNTHRA() {\n return SYNTHRA_REGISTRY[getNetwork()];\n}\n\nexport function CHAINLINK() {\n return CHAINLINK_REGISTRY[getNetwork()];\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  SHERWOOD
3
- } from "./chunk-GYGSKMZE.js";
3
+ } from "./chunk-3R57ETXQ.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-Z53JZORT.js";
9
+ } from "./chunk-I7NYU4JB.js";
10
10
  import {
11
11
  getChain
12
12
  } from "./chunk-LIW6K4OJ.js";
@@ -14,7 +14,7 @@ import {
14
14
  PROTOCOL_CONFIG_ABI,
15
15
  SYNDICATE_FACTORY_ABI,
16
16
  SYNDICATE_GOVERNOR_ABI
17
- } from "./chunk-JCL2DEH3.js";
17
+ } from "./chunk-SCWNKVNW.js";
18
18
 
19
19
  // src/lib/governor.ts
20
20
  import { parseEventLogs } from "viem";
@@ -507,4 +507,4 @@ export {
507
507
  setMgmtSplit,
508
508
  setPerfSplit
509
509
  };
510
- //# sourceMappingURL=chunk-D3GTHAJS.js.map
510
+ //# sourceMappingURL=chunk-5XMQQ4LX.js.map
@@ -5,13 +5,13 @@ import {
5
5
  buildSettleCalls,
6
6
  parseLighterTemplateFlags,
7
7
  usdgToTicks
8
- } from "./chunk-G5FOHSQW.js";
8
+ } from "./chunk-TCUSM4V7.js";
9
9
  import {
10
10
  buildExecuteCalls as buildExecuteCalls2,
11
11
  buildInitData as buildInitData2,
12
12
  buildLaunchpadInitParams,
13
13
  buildSettleCalls as buildSettleCalls2
14
- } from "./chunk-QVXKYT2N.js";
14
+ } from "./chunk-T5NA6KOF.js";
15
15
  import {
16
16
  AERODROME,
17
17
  CHAINLINK,
@@ -22,10 +22,10 @@ import {
22
22
  TOKENS,
23
23
  UNISWAP,
24
24
  VENICE
25
- } from "./chunk-GYGSKMZE.js";
25
+ } from "./chunk-3R57ETXQ.js";
26
26
  import {
27
27
  getPublicClient
28
- } from "./chunk-Z53JZORT.js";
28
+ } from "./chunk-I7NYU4JB.js";
29
29
  import {
30
30
  getNetwork
31
31
  } from "./chunk-LIW6K4OJ.js";
@@ -34,7 +34,7 @@ import {
34
34
  CONCENTRATED_LIQUIDITY_STRATEGY_ABI,
35
35
  ERC20_ABI,
36
36
  UNISWAP_QUOTER_V2_ABI
37
- } from "./chunk-JCL2DEH3.js";
37
+ } from "./chunk-SCWNKVNW.js";
38
38
 
39
39
  // src/lib/swap-router.ts
40
40
  import { encodeFunctionData as encodeFunctionData11, decodeFunctionResult } from "viem";
@@ -2551,4 +2551,4 @@ export {
2551
2551
  applySlippage,
2552
2552
  encodeSwapPath
2553
2553
  };
2554
- //# sourceMappingURL=chunk-WDPA2BYK.js.map
2554
+ //# sourceMappingURL=chunk-6KXITNND.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getAccount
3
- } from "./chunk-Z53JZORT.js";
3
+ } from "./chunk-I7NYU4JB.js";
4
4
  import {
5
5
  getVeniceApiKey,
6
6
  setVeniceApiKey
@@ -186,4 +186,4 @@ export {
186
186
  chatCompletion,
187
187
  listModels
188
188
  };
189
- //# sourceMappingURL=chunk-JLOROS5V.js.map
189
+ //# sourceMappingURL=chunk-74QYNLJE.js.map
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  SHERWOOD
3
- } from "./chunk-GYGSKMZE.js";
3
+ } from "./chunk-3R57ETXQ.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-Z53JZORT.js";
9
+ } from "./chunk-I7NYU4JB.js";
10
10
  import {
11
11
  getChain
12
12
  } from "./chunk-LIW6K4OJ.js";
13
13
  import {
14
14
  SYNDICATE_FACTORY_ABI
15
- } from "./chunk-JCL2DEH3.js";
15
+ } from "./chunk-SCWNKVNW.js";
16
16
 
17
17
  // src/lib/factory.ts
18
18
  import { decodeEventLog } from "viem";
@@ -144,4 +144,4 @@ export {
144
144
  getActiveFunds,
145
145
  updateMetadata
146
146
  };
147
- //# sourceMappingURL=chunk-JRGYI34A.js.map
147
+ //# sourceMappingURL=chunk-DQZJULNP.js.map
@@ -100,12 +100,24 @@ var CONTRACT_ERRORS_ABI = [
100
100
  { type: "error", name: "UpgradesDisabled", inputs: [] },
101
101
  { type: "error", name: "VaultNotDeployed", inputs: [] },
102
102
  { type: "error", name: "StrategyActive", inputs: [] },
103
- // ── BaseStrategy ──
103
+ // ── BaseStrategy (NotVault / AlreadySettled are shared with VaultWithdrawalQueue) ──
104
104
  { type: "error", name: "AlreadyInitialized", inputs: [] },
105
105
  { type: "error", name: "NotVault", inputs: [] },
106
106
  { type: "error", name: "NotExecuted", inputs: [] },
107
107
  { type: "error", name: "AlreadyExecuted", inputs: [] },
108
108
  { type: "error", name: "AlreadySettled", inputs: [] },
109
+ // ── VaultWithdrawalQueue (Lane B) — src/interfaces/IVaultWithdrawalQueue.sol ──
110
+ { type: "error", name: "NotQueueOwner", inputs: [] },
111
+ { type: "error", name: "AlreadyClaimed", inputs: [] },
112
+ { type: "error", name: "AlreadyCancelled", inputs: [] },
113
+ { type: "error", name: "RequestNotFound", inputs: [] },
114
+ { type: "error", name: "VaultLocked", inputs: [] },
115
+ { type: "error", name: "NotSettled", inputs: [] },
116
+ { type: "error", name: "StampOutOfOrder", inputs: [] },
117
+ { type: "error", name: "ZeroShares", inputs: [] },
118
+ { type: "error", name: "ZeroAssets", inputs: [] },
119
+ { type: "error", name: "InsufficientShares", inputs: [] },
120
+ { type: "error", name: "WrongKind", inputs: [] },
109
121
  // ── MoonwellSupplyStrategy / WstETHMoonwellStrategy ──
110
122
  { type: "error", name: "InvalidAmount", inputs: [] },
111
123
  { type: "error", name: "MintFailed", inputs: [] },
@@ -353,10 +365,22 @@ var ERROR_MESSAGES = {
353
365
  StrategyActive: "Cannot perform this action while a strategy is actively executing.",
354
366
  // Strategy — base
355
367
  AlreadyInitialized: "This strategy clone was already initialized. Deploy a fresh clone.",
356
- NotVault: "Only the vault can call this strategy function.",
368
+ NotVault: "Only the vault can call this function (a strategy or withdrawal-queue entrypoint reserved for the vault).",
357
369
  NotExecuted: "Strategy has not been executed yet.",
358
370
  AlreadyExecuted: "Strategy has already been executed.",
359
- AlreadySettled: "Strategy has already been settled.",
371
+ AlreadySettled: "Already settled. From a strategy: the strategy was already settled. From `sherwood queue cancel`: this redeem's settle price is already stamped, so it can no longer be cancelled \u2014 claim it with `sherwood queue claim --vault <v> --id <id>`.",
372
+ // VaultWithdrawalQueue (Lane B)
373
+ NotQueueOwner: "Only the wallet that queued this request can cancel it.",
374
+ AlreadyClaimed: "This queue request has already been claimed.",
375
+ AlreadyCancelled: "This queue request was cancelled \u2014 its escrow was already returned to the owner.",
376
+ RequestNotFound: "No queue request with that id on this vault's withdrawal queue. Check: sherwood queue list --vault <v>",
377
+ VaultLocked: "The vault is locked by an open proposal, so the request cannot be claimed yet. A redeem needs redemptions unlocked, a deposit needs deposits unlocked \u2014 retry once the active proposal settles.",
378
+ NotSettled: "The proposal this redeem is tagged to has not settled, so no claim price is stamped. If it was rejected/expired/cancelled it never will be: run `sherwood queue cancel --vault <v> --id <id>` to get the shares back, then redeem directly. Check: sherwood queue list --vault <v>",
379
+ StampOutOfOrder: "The settle price was stamped for a proposal id below the highest one already stamped (the queue only stamps forward).",
380
+ ZeroShares: "Zero shares \u2014 a queued redeem must escrow at least one share, and a deposit claim must mint at least one.",
381
+ ZeroAssets: "Zero assets \u2014 a queued deposit must escrow a non-zero amount.",
382
+ InsufficientShares: "Share amount must be greater than zero (`sherwood queue request-redeem --shares` takes raw share units).",
383
+ WrongKind: "This operation does not apply to that kind of queue request (Redeem vs Deposit). Declared in the queue interface; the current queue never raises it.",
360
384
  // Strategy — Moonwell / WstETH
361
385
  InvalidAmount: "Invalid amount \u2014 must be greater than zero.",
362
386
  MintFailed: "Moonwell cToken mint failed. The underlying supply may have hit the market cap.",
@@ -751,4 +775,4 @@ export {
751
775
  writeContractWithRetry,
752
776
  waitForReceipt
753
777
  };
754
- //# sourceMappingURL=chunk-Z53JZORT.js.map
778
+ //# sourceMappingURL=chunk-I7NYU4JB.js.map