@sherwoodagent/cli 0.78.0 → 0.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/{addresses-JJPQTF6S.js → addresses-EF5OQSKV.js} +3 -3
  2. package/dist/{agent-FYRYTKYM.js → agent-VLYILEUP.js} +6 -6
  3. package/dist/{chat-CO244AHH.js → chat-56DDAGA2.js} +7 -7
  4. package/dist/{chunk-M7CGUYUX.js → chunk-2LUTKS24.js} +5 -5
  5. package/dist/{chunk-TI64P5R4.js → chunk-54WMDJTL.js} +4 -4
  6. package/dist/{chunk-FP5DZCOM.js → chunk-BJ4G3TPP.js} +2 -2
  7. package/dist/{chunk-WCX7DKLQ.js → chunk-K2NEFUEP.js} +4 -4
  8. package/dist/{chunk-MEMYGZWQ.js → chunk-MAG63U53.js} +3 -3
  9. package/dist/{chunk-TN7J5LXW.js → chunk-QK3FUTVI.js} +4 -4
  10. package/dist/{chunk-RGFA732Z.js → chunk-QSYLZA4Z.js} +2 -2
  11. package/dist/{chunk-WGXZ623D.js → chunk-RFJSV3EZ.js} +4 -4
  12. package/dist/{chunk-EVTDWMXQ.js → chunk-UO4UITOY.js} +4 -4
  13. package/dist/{chunk-LSVCF24W.js → chunk-VJKZDHH3.js} +36 -1
  14. package/dist/chunk-VJKZDHH3.js.map +1 -0
  15. package/dist/{chunk-T2HVR3O6.js → chunk-XDWYX5ZM.js} +2 -2
  16. package/dist/{chunk-I6X6NL65.js → chunk-XW6NDXBA.js} +79 -16
  17. package/dist/chunk-XW6NDXBA.js.map +1 -0
  18. package/dist/{client-GRPJRISD.js → client-25LF2O4P.js} +3 -3
  19. package/dist/{eas-4RIW3IS4.js → eas-HHMRO37P.js} +5 -5
  20. package/dist/{governor-7KETSN47.js → governor-AL2XUGBE.js} +5 -5
  21. package/dist/index.js +71 -38
  22. package/dist/index.js.map +1 -1
  23. package/dist/{network-UP2X5XDW.js → network-R45QDUYO.js} +4 -2
  24. package/dist/{price-LAQSXN7M.js → price-QO22NF5Q.js} +5 -5
  25. package/dist/{providers-2J6LL67W.js → providers-ALMXBRNW.js} +4 -4
  26. package/dist/{research-FHQCSLTZ.js → research-ICDDAAGV.js} +7 -7
  27. package/dist/{session-JQ3IF3IV.js → session-RSWSCMM5.js} +9 -9
  28. package/dist/{trade-5EYPZN7M.js → trade-YNQVWUYZ.js} +14 -14
  29. package/dist/{vault-5YYTHS5W.js → vault-QKURBBSL.js} +7 -7
  30. package/dist/{xmtp-OZ5PJFCT.js → xmtp-M2OBCCNR.js} +5 -5
  31. package/package.json +1 -1
  32. package/dist/chunk-I6X6NL65.js.map +0 -1
  33. package/dist/chunk-LSVCF24W.js.map +0 -1
  34. /package/dist/{addresses-JJPQTF6S.js.map → addresses-EF5OQSKV.js.map} +0 -0
  35. /package/dist/{agent-FYRYTKYM.js.map → agent-VLYILEUP.js.map} +0 -0
  36. /package/dist/{chat-CO244AHH.js.map → chat-56DDAGA2.js.map} +0 -0
  37. /package/dist/{chunk-M7CGUYUX.js.map → chunk-2LUTKS24.js.map} +0 -0
  38. /package/dist/{chunk-TI64P5R4.js.map → chunk-54WMDJTL.js.map} +0 -0
  39. /package/dist/{chunk-FP5DZCOM.js.map → chunk-BJ4G3TPP.js.map} +0 -0
  40. /package/dist/{chunk-WCX7DKLQ.js.map → chunk-K2NEFUEP.js.map} +0 -0
  41. /package/dist/{chunk-MEMYGZWQ.js.map → chunk-MAG63U53.js.map} +0 -0
  42. /package/dist/{chunk-TN7J5LXW.js.map → chunk-QK3FUTVI.js.map} +0 -0
  43. /package/dist/{chunk-RGFA732Z.js.map → chunk-QSYLZA4Z.js.map} +0 -0
  44. /package/dist/{chunk-WGXZ623D.js.map → chunk-RFJSV3EZ.js.map} +0 -0
  45. /package/dist/{chunk-EVTDWMXQ.js.map → chunk-UO4UITOY.js.map} +0 -0
  46. /package/dist/{chunk-T2HVR3O6.js.map → chunk-XDWYX5ZM.js.map} +0 -0
  47. /package/dist/{client-GRPJRISD.js.map → client-25LF2O4P.js.map} +0 -0
  48. /package/dist/{eas-4RIW3IS4.js.map → eas-HHMRO37P.js.map} +0 -0
  49. /package/dist/{governor-7KETSN47.js.map → governor-AL2XUGBE.js.map} +0 -0
  50. /package/dist/{network-UP2X5XDW.js.map → network-R45QDUYO.js.map} +0 -0
  51. /package/dist/{price-LAQSXN7M.js.map → price-QO22NF5Q.js.map} +0 -0
  52. /package/dist/{providers-2J6LL67W.js.map → providers-ALMXBRNW.js.map} +0 -0
  53. /package/dist/{research-FHQCSLTZ.js.map → research-ICDDAAGV.js.map} +0 -0
  54. /package/dist/{session-JQ3IF3IV.js.map → session-RSWSCMM5.js.map} +0 -0
  55. /package/dist/{trade-5EYPZN7M.js.map → trade-YNQVWUYZ.js.map} +0 -0
  56. /package/dist/{vault-5YYTHS5W.js.map → vault-QKURBBSL.js.map} +0 -0
  57. /package/dist/{xmtp-OZ5PJFCT.js.map → xmtp-M2OBCCNR.js.map} +0 -0
@@ -18,8 +18,8 @@ import {
18
18
  isRobinhoodEquityFeed,
19
19
  robinhoodEquityMaxAge,
20
20
  symbolForTokenAddress
21
- } from "./chunk-I6X6NL65.js";
22
- import "./chunk-LSVCF24W.js";
21
+ } from "./chunk-XW6NDXBA.js";
22
+ import "./chunk-VJKZDHH3.js";
23
23
  import "./chunk-3TZIOAPH.js";
24
24
  export {
25
25
  AERODROME,
@@ -42,4 +42,4 @@ export {
42
42
  robinhoodEquityMaxAge,
43
43
  symbolForTokenAddress
44
44
  };
45
- //# sourceMappingURL=addresses-JJPQTF6S.js.map
45
+ //# sourceMappingURL=addresses-EF5OQSKV.js.map
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  getResearchProvider,
14
14
  isX402WalletFunded
15
- } from "./chunk-T2HVR3O6.js";
15
+ } from "./chunk-XDWYX5ZM.js";
16
16
  import {
17
17
  HyperliquidProvider,
18
18
  calculateATR,
@@ -29,9 +29,9 @@ import {
29
29
  } from "./chunk-DBOINZYU.js";
30
30
  import {
31
31
  chatCompletion
32
- } from "./chunk-RGFA732Z.js";
33
- import "./chunk-FP5DZCOM.js";
34
- import "./chunk-LSVCF24W.js";
32
+ } from "./chunk-QSYLZA4Z.js";
33
+ import "./chunk-BJ4G3TPP.js";
34
+ import "./chunk-VJKZDHH3.js";
35
35
  import {
36
36
  getVeniceApiKey
37
37
  } from "./chunk-3TZIOAPH.js";
@@ -5573,7 +5573,7 @@ var PortfolioTracker = class {
5573
5573
  }
5574
5574
  try {
5575
5575
  const { createPublicClient, http } = await import("viem");
5576
- const { getChain } = await import("./network-UP2X5XDW.js");
5576
+ const { getChain } = await import("./network-R45QDUYO.js");
5577
5577
  const { BASE_STRATEGY_ABI, SYNDICATE_VAULT_ABI } = await import("./abis-OLIDCWDS.js");
5578
5578
  void chain;
5579
5579
  const client = createPublicClient({
@@ -9550,4 +9550,4 @@ function formatFearGreed(value) {
9550
9550
  export {
9551
9551
  registerAgentCommands
9552
9552
  };
9553
- //# sourceMappingURL=agent-FYRYTKYM.js.map
9553
+ //# sourceMappingURL=agent-VLYILEUP.js.map
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  getFund,
3
3
  updateMetadata
4
- } from "./chunk-WGXZ623D.js";
4
+ } from "./chunk-RFJSV3EZ.js";
5
5
  import {
6
6
  getTextRecord,
7
7
  resolveFund,
8
8
  setTextRecord
9
- } from "./chunk-TN7J5LXW.js";
9
+ } from "./chunk-QK3FUTVI.js";
10
10
  import {
11
11
  ENS
12
- } from "./chunk-I6X6NL65.js";
12
+ } from "./chunk-XW6NDXBA.js";
13
13
  import {
14
14
  formatContractError,
15
15
  getAccount
16
- } from "./chunk-FP5DZCOM.js";
17
- import "./chunk-LSVCF24W.js";
16
+ } from "./chunk-BJ4G3TPP.js";
17
+ import "./chunk-VJKZDHH3.js";
18
18
  import {
19
19
  cacheGroupId,
20
20
  getCachedGroupId
@@ -29,7 +29,7 @@ import {
29
29
  import chalk from "chalk";
30
30
  import ora from "ora";
31
31
  async function loadXmtp() {
32
- return import("./xmtp-OZ5PJFCT.js");
32
+ return import("./xmtp-M2OBCCNR.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-CO244AHH.js.map
566
+ //# sourceMappingURL=chat-56DDAGA2.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  getLogsChunked
3
- } from "./chunk-MEMYGZWQ.js";
3
+ } from "./chunk-MAG63U53.js";
4
4
  import {
5
5
  TOKENS
6
- } from "./chunk-I6X6NL65.js";
6
+ } from "./chunk-XW6NDXBA.js";
7
7
  import {
8
8
  GAS_UNITS,
9
9
  estimateGasCushion,
@@ -12,10 +12,10 @@ import {
12
12
  getWalletClient,
13
13
  waitForReceipt,
14
14
  writeContractWithRetry
15
- } from "./chunk-FP5DZCOM.js";
15
+ } from "./chunk-BJ4G3TPP.js";
16
16
  import {
17
17
  getChain
18
- } from "./chunk-LSVCF24W.js";
18
+ } from "./chunk-VJKZDHH3.js";
19
19
  import {
20
20
  getChainContracts
21
21
  } from "./chunk-3TZIOAPH.js";
@@ -557,4 +557,4 @@ export {
557
557
  registerAgent,
558
558
  getVaultInfo
559
559
  };
560
- //# sourceMappingURL=chunk-M7CGUYUX.js.map
560
+ //# sourceMappingURL=chunk-2LUTKS24.js.map
@@ -8,13 +8,13 @@ import {
8
8
  UNISWAP,
9
9
  VENICE,
10
10
  robinhoodEquityMaxAge
11
- } from "./chunk-I6X6NL65.js";
11
+ } from "./chunk-XW6NDXBA.js";
12
12
  import {
13
13
  getPublicClient
14
- } from "./chunk-FP5DZCOM.js";
14
+ } from "./chunk-BJ4G3TPP.js";
15
15
  import {
16
16
  getNetwork
17
- } from "./chunk-LSVCF24W.js";
17
+ } from "./chunk-VJKZDHH3.js";
18
18
  import {
19
19
  BASE_STRATEGY_ABI,
20
20
  ERC20_ABI,
@@ -1250,4 +1250,4 @@ export {
1250
1250
  applySlippage,
1251
1251
  encodeSwapPath
1252
1252
  };
1253
- //# sourceMappingURL=chunk-TI64P5R4.js.map
1253
+ //# sourceMappingURL=chunk-54WMDJTL.js.map
@@ -2,7 +2,7 @@ import {
2
2
  getChain,
3
3
  getMinGasReserve,
4
4
  getRpcUrls
5
- } from "./chunk-LSVCF24W.js";
5
+ } from "./chunk-VJKZDHH3.js";
6
6
  import {
7
7
  requirePrivateKey
8
8
  } from "./chunk-3TZIOAPH.js";
@@ -524,4 +524,4 @@ export {
524
524
  writeContractWithRetry,
525
525
  waitForReceipt
526
526
  };
527
- //# sourceMappingURL=chunk-FP5DZCOM.js.map
527
+ //# sourceMappingURL=chunk-BJ4G3TPP.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  EAS_CONTRACTS,
3
3
  EAS_SCHEMAS
4
- } from "./chunk-I6X6NL65.js";
4
+ } from "./chunk-XW6NDXBA.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  waitForReceipt,
9
9
  writeContractWithRetry
10
- } from "./chunk-FP5DZCOM.js";
10
+ } from "./chunk-BJ4G3TPP.js";
11
11
  import {
12
12
  CHAIN_REGISTRY,
13
13
  getChain,
@@ -15,7 +15,7 @@ import {
15
15
  getNetwork,
16
16
  isTestnet,
17
17
  withNetwork
18
- } from "./chunk-LSVCF24W.js";
18
+ } from "./chunk-VJKZDHH3.js";
19
19
  import {
20
20
  EAS_ABI
21
21
  } from "./chunk-TU655ZTV.js";
@@ -453,4 +453,4 @@ export {
453
453
  queryApprovals,
454
454
  queryJoinRequests
455
455
  };
456
- //# sourceMappingURL=chunk-WCX7DKLQ.js.map
456
+ //# sourceMappingURL=chunk-K2NEFUEP.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  PROPOSAL_STATES,
3
3
  getProposal
4
- } from "./chunk-EVTDWMXQ.js";
4
+ } from "./chunk-UO4UITOY.js";
5
5
  import {
6
6
  getPublicClient
7
- } from "./chunk-FP5DZCOM.js";
7
+ } from "./chunk-BJ4G3TPP.js";
8
8
  import {
9
9
  resolveMetadataSummary
10
10
  } from "./chunk-XDGCHURW.js";
@@ -170,4 +170,4 @@ export {
170
170
  getCurrentBlock,
171
171
  enrichProposalEvents
172
172
  };
173
- //# sourceMappingURL=chunk-MEMYGZWQ.js.map
173
+ //# sourceMappingURL=chunk-MAG63U53.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  ENS,
3
3
  SHERWOOD
4
- } from "./chunk-I6X6NL65.js";
4
+ } from "./chunk-XW6NDXBA.js";
5
5
  import {
6
6
  getPublicClient
7
- } from "./chunk-FP5DZCOM.js";
7
+ } from "./chunk-BJ4G3TPP.js";
8
8
  import {
9
9
  VALID_NETWORKS,
10
10
  withNetwork
11
- } from "./chunk-LSVCF24W.js";
11
+ } from "./chunk-VJKZDHH3.js";
12
12
  import {
13
13
  L2_REGISTRY_ABI,
14
14
  SYNDICATE_FACTORY_ABI
@@ -111,4 +111,4 @@ export {
111
111
  setTextRecord,
112
112
  getTextRecord
113
113
  };
114
- //# sourceMappingURL=chunk-TN7J5LXW.js.map
114
+ //# sourceMappingURL=chunk-QK3FUTVI.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getAccount
3
- } from "./chunk-FP5DZCOM.js";
3
+ } from "./chunk-BJ4G3TPP.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-RGFA732Z.js.map
189
+ //# sourceMappingURL=chunk-QSYLZA4Z.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  SHERWOOD
3
- } from "./chunk-I6X6NL65.js";
3
+ } from "./chunk-XW6NDXBA.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-FP5DZCOM.js";
9
+ } from "./chunk-BJ4G3TPP.js";
10
10
  import {
11
11
  getChain
12
- } from "./chunk-LSVCF24W.js";
12
+ } from "./chunk-VJKZDHH3.js";
13
13
  import {
14
14
  SYNDICATE_FACTORY_ABI
15
15
  } from "./chunk-TU655ZTV.js";
@@ -144,4 +144,4 @@ export {
144
144
  getActiveFunds,
145
145
  updateMetadata
146
146
  };
147
- //# sourceMappingURL=chunk-WGXZ623D.js.map
147
+ //# sourceMappingURL=chunk-RFJSV3EZ.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  SHERWOOD
3
- } from "./chunk-I6X6NL65.js";
3
+ } from "./chunk-XW6NDXBA.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-FP5DZCOM.js";
9
+ } from "./chunk-BJ4G3TPP.js";
10
10
  import {
11
11
  getChain
12
- } from "./chunk-LSVCF24W.js";
12
+ } from "./chunk-VJKZDHH3.js";
13
13
  import {
14
14
  PROTOCOL_CONFIG_ABI,
15
15
  SYNDICATE_FACTORY_ABI,
@@ -429,4 +429,4 @@ export {
429
429
  vetoProposal,
430
430
  setProtocolFeeBps
431
431
  };
432
- //# sourceMappingURL=chunk-EVTDWMXQ.js.map
432
+ //# sourceMappingURL=chunk-UO4UITOY.js.map
@@ -19,6 +19,25 @@ var robinhoodTestnet = defineChain({
19
19
  },
20
20
  testnet: true
21
21
  });
22
+ var robinhoodFork = defineChain({
23
+ id: 9994663,
24
+ name: "Robinhood Chain (fork)",
25
+ nativeCurrency: { name: "Ethereum", symbol: "ETH", decimals: 18 },
26
+ rpcUrls: {
27
+ default: {
28
+ http: [
29
+ "https://virtual.robinhood-chain.eu.rpc.tenderly.co/moonwell/wormhole-bridge/f4e186"
30
+ ]
31
+ }
32
+ },
33
+ blockExplorers: {
34
+ default: {
35
+ name: "Tenderly",
36
+ url: "https://dashboard.tenderly.co"
37
+ }
38
+ },
39
+ testnet: true
40
+ });
22
41
  var DEFAULT_MIN_GAS_RESERVE = parseEther("0.0005");
23
42
  var CHAIN_REGISTRY = {
24
43
  "robinhood-testnet": {
@@ -34,6 +53,21 @@ var CHAIN_REGISTRY = {
34
53
  // million wei (~1e-11 ETH). 0.00002 ETH is a generous floor that still
35
54
  // leaves a 0.00058-ETH wallet room to wrap 0.0005 and deposit.
36
55
  minGasReserve: parseEther("0.00002")
56
+ },
57
+ "robinhood-fork": {
58
+ chain: robinhoodFork,
59
+ rpcFallbacks: [
60
+ "https://virtual.robinhood-chain.eu.rpc.tenderly.co/moonwell/wormhole-bridge/f4e186"
61
+ ],
62
+ rpcEnvVar: "ROBINHOOD_FORK_RPC_URL",
63
+ explorerHost: "dashboard.tenderly.co",
64
+ easGraphqlUrl: null,
65
+ easScanHost: null,
66
+ xmtpEnv: "production",
67
+ isTestnet: true,
68
+ // Robinhood-mainnet-fork gas (~0.17 gwei) is higher than testnet's ~14 wei —
69
+ // keep a modest reserve so the ETH-wrap deposit path isn't rejected.
70
+ minGasReserve: parseEther("0.0005")
37
71
  }
38
72
  };
39
73
  var VALID_NETWORKS = Object.keys(CHAIN_REGISTRY);
@@ -102,6 +136,7 @@ function isTestnet() {
102
136
 
103
137
  export {
104
138
  robinhoodTestnet,
139
+ robinhoodFork,
105
140
  DEFAULT_MIN_GAS_RESERVE,
106
141
  CHAIN_REGISTRY,
107
142
  VALID_NETWORKS,
@@ -118,4 +153,4 @@ export {
118
153
  getExplorerUrl,
119
154
  isTestnet
120
155
  };
121
- //# sourceMappingURL=chunk-LSVCF24W.js.map
156
+ //# sourceMappingURL=chunk-VJKZDHH3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/network.ts"],"sourcesContent":["/**\n * Network state singleton.\n *\n * Called once at CLI startup via the --chain flag's preAction hook.\n * Every other module reads from here — never hardcodes a chain.\n *\n * Current deployment target: Robinhood L2 testnet (chain 46630) only. Sherwood\n * launches on Robinhood first; other chains may be added back later, at which\n * point they re-enter the Network union + CHAIN_REGISTRY below.\n */\n\nimport { type Chain, defineChain, parseEther } from \"viem\";\nimport { getConfigRpcUrl } from \"./config.js\";\n\n// ── Robinhood L2 Testnet (Arbitrum Orbit, chain ID 46630) ──\n\nexport const robinhoodTestnet = defineChain({\n id: 46630,\n name: \"Robinhood Chain Testnet\",\n nativeCurrency: { name: \"Ethereum\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: [\"https://rpc.testnet.chain.robinhood.com\"] },\n },\n blockExplorers: {\n default: {\n name: \"Blockscout\",\n url: \"https://explorer.testnet.chain.robinhood.com\",\n },\n },\n testnet: true,\n});\n\n// ── Robinhood Chain mainnet fork (Tenderly Virtual TestNet, chain ID 9994663) ──\n//\n// A fork of Robinhood Chain *mainnet* (USDG stablecoin, official Uniswap v3+v4,\n// Chainlink push feeds, tokenized-stock liquidity). Used for mainnet-faithful\n// e2e + guardian-network simulations. Ephemeral: Tenderly vnets expire — the RPC\n// is overridable via ROBINHOOD_FORK_RPC_URL when a new vnet is minted.\n\nexport const robinhoodFork = defineChain({\n id: 9994663,\n name: \"Robinhood Chain (fork)\",\n nativeCurrency: { name: \"Ethereum\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: {\n http: [\n \"https://virtual.robinhood-chain.eu.rpc.tenderly.co/moonwell/wormhole-bridge/f4e186\",\n ],\n },\n },\n blockExplorers: {\n default: {\n name: \"Tenderly\",\n url: \"https://dashboard.tenderly.co\",\n },\n },\n testnet: true,\n});\n\n// ── Types ──\n\nexport type Network = \"robinhood-testnet\" | \"robinhood-fork\";\n\nexport interface ChainConfig {\n chain: Chain;\n /**\n * Ordered list of public RPC URLs tried in sequence when no user RPC is set.\n * First entry is the primary; the rest are fallbacks used transparently via\n * viem's `fallback` transport on rate-limit / network errors.\n */\n rpcFallbacks: string[];\n /** Legacy env var for backwards compat (optional per chain) */\n rpcEnvVar?: string;\n explorerHost: string;\n /** EAS GraphQL endpoint — null if EAS is not available on this chain */\n easGraphqlUrl: string | null;\n /** EAS scan host — null if unavailable */\n easScanHost: string | null;\n xmtpEnv: \"production\" | \"dev\";\n isTestnet: boolean;\n /**\n * ETH held back for gas in the native-ETH-wrap deposit path — the floor and\n * fallback for the live per-tx cushion estimate (`estimateGasCushion` in\n * client.ts), NOT a fixed requirement. High-fee chains (Base) want a\n * Base-scale reserve; near-zero-fee chains (Robinhood testnet, ~14-wei base\n * fee) want a tiny one so a valid deposit isn't rejected client-side. Unset →\n * `DEFAULT_MIN_GAS_RESERVE`.\n */\n minGasReserve?: bigint;\n}\n\n/**\n * Base-scale default reserve, used when a chain omits `minGasReserve`. Matches\n * the old hardcoded 0.0005-ETH cushion so higher-fee chains keep prior behavior.\n */\nexport const DEFAULT_MIN_GAS_RESERVE = parseEther(\"0.0005\");\n\n// ── Chain Registry ──\n\nexport const CHAIN_REGISTRY: Record<Network, ChainConfig> = {\n \"robinhood-testnet\": {\n chain: robinhoodTestnet,\n rpcFallbacks: [\"https://rpc.testnet.chain.robinhood.com\"],\n rpcEnvVar: \"ROBINHOOD_TESTNET_RPC_URL\",\n explorerHost: \"explorer.testnet.chain.robinhood.com\",\n easGraphqlUrl: null,\n easScanHost: null,\n xmtpEnv: \"production\",\n isTestnet: true,\n // ~14-wei base fee: a full wrap+approve+deposit sequence costs a few\n // million wei (~1e-11 ETH). 0.00002 ETH is a generous floor that still\n // leaves a 0.00058-ETH wallet room to wrap 0.0005 and deposit.\n minGasReserve: parseEther(\"0.00002\"),\n },\n \"robinhood-fork\": {\n chain: robinhoodFork,\n rpcFallbacks: [\n \"https://virtual.robinhood-chain.eu.rpc.tenderly.co/moonwell/wormhole-bridge/f4e186\",\n ],\n rpcEnvVar: \"ROBINHOOD_FORK_RPC_URL\",\n explorerHost: \"dashboard.tenderly.co\",\n easGraphqlUrl: null,\n easScanHost: null,\n xmtpEnv: \"production\",\n isTestnet: true,\n // Robinhood-mainnet-fork gas (~0.17 gwei) is higher than testnet's ~14 wei —\n // keep a modest reserve so the ETH-wrap deposit path isn't rejected.\n minGasReserve: parseEther(\"0.0005\"),\n },\n};\n\nexport const VALID_NETWORKS = Object.keys(CHAIN_REGISTRY) as Network[];\n\nexport const DEFAULT_NETWORK: Network = \"robinhood-testnet\";\n\n// ── Singleton state ──\n\nlet _network: Network = DEFAULT_NETWORK;\n\nexport function setNetwork(n: Network) {\n const config = CHAIN_REGISTRY[n];\n if (!config) {\n throw new Error(\n `Unknown network: ${n}. Valid: ${VALID_NETWORKS.join(\", \")}`,\n );\n }\n _network = n;\n}\n\nexport function getNetwork(): Network {\n return _network;\n}\n\n/**\n * Run `fn` with the network singleton temporarily switched to `network`,\n * restoring the previous network in `finally`.\n *\n * The viem clients (`getPublicClient`, `getWalletClient`) auto-invalidate on\n * chain change, so callers get fresh per-chain RPC + chain context inside the\n * block. Used for cross-chain fund resolution.\n */\nexport async function withNetwork<T>(\n network: Network,\n fn: () => Promise<T>,\n): Promise<T> {\n const previous = _network;\n _network = network;\n try {\n return await fn();\n } finally {\n _network = previous;\n }\n}\n\nexport function getChainConfig(): ChainConfig {\n return CHAIN_REGISTRY[_network];\n}\n\n/**\n * Per-chain ETH gas reserve floor/fallback for the ETH-wrap deposit path.\n * Falls back to the Base-scale default when the active chain doesn't set one.\n */\nexport function getMinGasReserve(): bigint {\n return CHAIN_REGISTRY[_network].minGasReserve ?? DEFAULT_MIN_GAS_RESERVE;\n}\n\n/**\n * Dev/CI-only chain-id override (`SIM_CHAIN_ID`) for custom-chainId vnet forks.\n * viem asserts the node's chainId matches the chain definition on every write,\n * so signing for such a fork requires the id to be swapped at the source.\n *\n * Interlock: honored ONLY while `SIM_ADDRESSES_FILE` is also set (the vnet\n * e2e harness's address override). A bare SIM_CHAIN_ID does nothing, so this\n * can never redirect signing on a real network run.\n */\nexport function applyChainIdOverride(chain: Chain): Chain {\n const raw = process.env.SIM_CHAIN_ID;\n if (!raw || !process.env.SIM_ADDRESSES_FILE) return chain;\n const id = Number(raw);\n if (!Number.isInteger(id) || id <= 0) return chain;\n return { ...chain, id };\n}\n\nexport function getChain(): Chain {\n return applyChainIdOverride(CHAIN_REGISTRY[_network].chain);\n}\n\n/**\n * Ordered list of RPC URLs to try, deduped:\n * 1. User config (~/.sherwood/config.json) — honored first\n * 2. Legacy env var (ROBINHOOD_TESTNET_RPC_URL)\n * 3. Public fallback list from CHAIN_REGISTRY\n *\n * Fed to viem's `fallback()` transport so rate-limited RPCs transparently\n * advance to the next entry. See issue #182.\n */\nexport function getRpcUrls(): string[] {\n const cfg = CHAIN_REGISTRY[_network];\n const urls: string[] = [];\n\n const fromConfig = getConfigRpcUrl(_network);\n if (fromConfig) urls.push(fromConfig);\n\n if (cfg.rpcEnvVar && process.env[cfg.rpcEnvVar]) {\n urls.push(process.env[cfg.rpcEnvVar]!);\n }\n\n // Vnet harness (SIM_CHAIN_ID + SIM_ADDRESSES_FILE interlock): the fork RPC\n // is the ONLY valid endpoint — the public fallbacks point at the real\n // network. viem's fallback() otherwise rotates there on a vnet hiccup and\n // silently estimates gas/fees against MAINNET state (live finding: an\n // approve estimated at 21.9k gas on mainnet — no code at that address —\n // reverted out-of-gas on the vnet where it needs ~46k). A vnet call must\n // fail loudly, never retarget the real chain.\n if (process.env.SIM_CHAIN_ID && process.env.SIM_ADDRESSES_FILE && urls.length > 0) {\n return Array.from(new Set(urls));\n }\n\n urls.push(...cfg.rpcFallbacks);\n\n return Array.from(new Set(urls));\n}\n\nexport function getRpcUrl(): string {\n return getRpcUrls()[0];\n}\n\nexport function getExplorerUrl(txHash: string): string {\n return `https://${CHAIN_REGISTRY[_network].explorerHost}/tx/${txHash}`;\n}\n\nexport function isTestnet(): boolean {\n return CHAIN_REGISTRY[_network].isTestnet;\n}\n"],"mappings":";;;;;AAWA,SAAqB,aAAa,kBAAkB;AAK7C,IAAM,mBAAmB,YAAY;AAAA,EAC1C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,EAAE,MAAM,YAAY,QAAQ,OAAO,UAAU,GAAG;AAAA,EAChE,SAAS;AAAA,IACP,SAAS,EAAE,MAAM,CAAC,yCAAyC,EAAE;AAAA,EAC/D;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAS;AACX,CAAC;AASM,IAAM,gBAAgB,YAAY;AAAA,EACvC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,gBAAgB,EAAE,MAAM,YAAY,QAAQ,OAAO,UAAU,GAAG;AAAA,EAChE,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAS;AACX,CAAC;AAsCM,IAAM,0BAA0B,WAAW,QAAQ;AAInD,IAAM,iBAA+C;AAAA,EAC1D,qBAAqB;AAAA,IACnB,OAAO;AAAA,IACP,cAAc,CAAC,yCAAyC;AAAA,IACxD,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,IACf,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA;AAAA;AAAA;AAAA,IAIX,eAAe,WAAW,SAAS;AAAA,EACrC;AAAA,EACA,kBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,cAAc;AAAA,MACZ;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,IACf,aAAa;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA;AAAA;AAAA,IAGX,eAAe,WAAW,QAAQ;AAAA,EACpC;AACF;AAEO,IAAM,iBAAiB,OAAO,KAAK,cAAc;AAEjD,IAAM,kBAA2B;AAIxC,IAAI,WAAoB;AAEjB,SAAS,WAAW,GAAY;AACrC,QAAM,SAAS,eAAe,CAAC;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,oBAAoB,CAAC,YAAY,eAAe,KAAK,IAAI,CAAC;AAAA,IAC5D;AAAA,EACF;AACA,aAAW;AACb;AAEO,SAAS,aAAsB;AACpC,SAAO;AACT;AAUA,eAAsB,YACpB,SACA,IACY;AACZ,QAAM,WAAW;AACjB,aAAW;AACX,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,UAAE;AACA,eAAW;AAAA,EACb;AACF;AAEO,SAAS,iBAA8B;AAC5C,SAAO,eAAe,QAAQ;AAChC;AAMO,SAAS,mBAA2B;AACzC,SAAO,eAAe,QAAQ,EAAE,iBAAiB;AACnD;AAWO,SAAS,qBAAqB,OAAqB;AACxD,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,mBAAoB,QAAO;AACpD,QAAM,KAAK,OAAO,GAAG;AACrB,MAAI,CAAC,OAAO,UAAU,EAAE,KAAK,MAAM,EAAG,QAAO;AAC7C,SAAO,EAAE,GAAG,OAAO,GAAG;AACxB;AAEO,SAAS,WAAkB;AAChC,SAAO,qBAAqB,eAAe,QAAQ,EAAE,KAAK;AAC5D;AAWO,SAAS,aAAuB;AACrC,QAAM,MAAM,eAAe,QAAQ;AACnC,QAAM,OAAiB,CAAC;AAExB,QAAM,aAAa,gBAAgB,QAAQ;AAC3C,MAAI,WAAY,MAAK,KAAK,UAAU;AAEpC,MAAI,IAAI,aAAa,QAAQ,IAAI,IAAI,SAAS,GAAG;AAC/C,SAAK,KAAK,QAAQ,IAAI,IAAI,SAAS,CAAE;AAAA,EACvC;AASA,MAAI,QAAQ,IAAI,gBAAgB,QAAQ,IAAI,sBAAsB,KAAK,SAAS,GAAG;AACjF,WAAO,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,EACjC;AAEA,OAAK,KAAK,GAAG,IAAI,YAAY;AAE7B,SAAO,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AACjC;AAEO,SAAS,YAAoB;AAClC,SAAO,WAAW,EAAE,CAAC;AACvB;AAEO,SAAS,eAAe,QAAwB;AACrD,SAAO,WAAW,eAAe,QAAQ,EAAE,YAAY,OAAO,MAAM;AACtE;AAEO,SAAS,YAAqB;AACnC,SAAO,eAAe,QAAQ,EAAE;AAClC;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getAccount
3
- } from "./chunk-FP5DZCOM.js";
3
+ } from "./chunk-BJ4G3TPP.js";
4
4
 
5
5
  // src/lib/x402.ts
6
6
  var _x402Fetch = null;
@@ -635,4 +635,4 @@ export {
635
635
  NansenProvider,
636
636
  getResearchProvider
637
637
  };
638
- //# sourceMappingURL=chunk-T2HVR3O6.js.map
638
+ //# sourceMappingURL=chunk-XDWYX5ZM.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getNetwork
3
- } from "./chunk-LSVCF24W.js";
3
+ } from "./chunk-VJKZDHH3.js";
4
4
 
5
5
  // src/lib/addresses.ts
6
6
  import { isAddress } from "viem";
@@ -74,6 +74,9 @@ var ZERO = "0x0000000000000000000000000000000000000000";
74
74
  var ZERO_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000";
75
75
  var ROBINHOOD_TESTNET_TOKENS = {
76
76
  USDC: ZERO,
77
+ // USDG (Robinhood-chain stablecoin, 6-dec). Zero on testnet (Synthra WETH-quoted);
78
+ // real on the mainnet fork. Keyed so `--asset USDG` resolves + decimals=6.
79
+ USDG: ZERO,
77
80
  // WETH resolves to Synthra's WETH9 (SYNTHRA_WETH): ALL stock DEX liquidity is
78
81
  // denominated in it (e.g. the TSLA fee-3000 pool holds ~37.8 WETH here vs
79
82
  // ~0.0003 in the canonical WETH pool). It is WETH9-style (payable deposit()),
@@ -196,47 +199,107 @@ var ROBINHOOD_TESTNET_EAS_SCHEMAS = {
196
199
  VENICE_INFERENCE: ZERO_BYTES32,
197
200
  TRADE_EXECUTED: ZERO_BYTES32
198
201
  };
202
+ var ROBINHOOD_FORK_TOKENS = {
203
+ USDC: ZERO,
204
+ USDG: "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
205
+ WETH: "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73",
206
+ WETH_CANONICAL: "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73",
207
+ cbETH: ZERO,
208
+ wstETH: ZERO,
209
+ cbBTC: ZERO,
210
+ DAI: ZERO,
211
+ AERO: ZERO,
212
+ TSLA: "0x322F0929c4625eD5bAd873c95208D54E1c003b2d",
213
+ AMZN: "0x12f190a9F9d7D37a250758b26824B97CE941bF54",
214
+ PLTR: ZERO,
215
+ NFLX: ZERO,
216
+ AMD: "0x86923f96303D656E4aa86D9d42D1e57ad2023fdC"
217
+ };
218
+ var ROBINHOOD_FORK_UNISWAP = {
219
+ SWAP_ROUTER: "0xcaf681a66d020601342297493863e78c959e5cb2",
220
+ QUOTER_V2: "0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7",
221
+ SWAP_ADAPTER: "0x9176C63C8269add92690aE02A45f75B72863cE2B"
222
+ };
223
+ var ROBINHOOD_FORK_CHAINLINK = {
224
+ VERIFIER_PROXY: ZERO,
225
+ WSTETH_ETH_FEED: ZERO
226
+ };
227
+ var ROBINHOOD_FORK_SHERWOOD = {
228
+ FACTORY: "0xD9E2F732cc30bC87303E2b9E9fD2f19966D9eDc2",
229
+ GOVERNOR: ZERO,
230
+ // per-vault — always factory.governorOf(vault)
231
+ GUARDIAN_REGISTRY: "0x8Cc7E69708B551221B831e1C2BAc473860DffA1A",
232
+ STAKED_WOOD: "0xfaEde5DE0572f0Bc84eD0AD11fC79de40c3730eF",
233
+ WOOD_TOKEN: "0xF8BC08092C06dB6148114DCf82AF881F1085f92b",
234
+ STRATEGY_FACTORY: "0x8599ECDdEC4C969ec9E1f3AEE894afd70365AaC2",
235
+ MERKL_DISTRIBUTOR: ZERO
236
+ };
237
+ var ROBINHOOD_FORK_STRATEGY_TEMPLATES = {
238
+ MOONWELL_SUPPLY: ZERO,
239
+ AERODROME_LP: ZERO,
240
+ VENICE_INFERENCE: ZERO,
241
+ WSTETH_MOONWELL: ZERO,
242
+ MAMO_YIELD: ZERO,
243
+ HYPERLIQUID_PERP: ZERO,
244
+ HYPERLIQUID_GRID: ZERO,
245
+ PORTFOLIO: "0xe1e6D7DE0BED412664eEf07074898Cfa19829f40"
246
+ };
199
247
  var TOKEN_REGISTRY = {
200
- "robinhood-testnet": ROBINHOOD_TESTNET_TOKENS
248
+ "robinhood-testnet": ROBINHOOD_TESTNET_TOKENS,
249
+ "robinhood-fork": ROBINHOOD_FORK_TOKENS
201
250
  };
202
251
  var MOONWELL_REGISTRY = {
203
- "robinhood-testnet": ROBINHOOD_TESTNET_MOONWELL
252
+ "robinhood-testnet": ROBINHOOD_TESTNET_MOONWELL,
253
+ "robinhood-fork": ROBINHOOD_TESTNET_MOONWELL
204
254
  };
205
255
  var UNISWAP_REGISTRY = {
206
- "robinhood-testnet": ROBINHOOD_TESTNET_UNISWAP
256
+ "robinhood-testnet": ROBINHOOD_TESTNET_UNISWAP,
257
+ "robinhood-fork": ROBINHOOD_FORK_UNISWAP
207
258
  };
208
259
  var INFRA_REGISTRY = {
209
- "robinhood-testnet": ROBINHOOD_TESTNET_INFRA
260
+ "robinhood-testnet": ROBINHOOD_TESTNET_INFRA,
261
+ "robinhood-fork": ROBINHOOD_TESTNET_INFRA
210
262
  };
211
263
  var ENS_REGISTRY = {
212
- "robinhood-testnet": ROBINHOOD_TESTNET_ENS
264
+ "robinhood-testnet": ROBINHOOD_TESTNET_ENS,
265
+ "robinhood-fork": ROBINHOOD_TESTNET_ENS
213
266
  };
214
267
  var AGENT_REGISTRY_MAP = {
215
- "robinhood-testnet": ROBINHOOD_TESTNET_AGENT_REGISTRY
268
+ "robinhood-testnet": ROBINHOOD_TESTNET_AGENT_REGISTRY,
269
+ "robinhood-fork": ROBINHOOD_TESTNET_AGENT_REGISTRY
216
270
  };
217
271
  var SHERWOOD_REGISTRY = {
218
- "robinhood-testnet": ROBINHOOD_TESTNET_SHERWOOD
272
+ "robinhood-testnet": ROBINHOOD_TESTNET_SHERWOOD,
273
+ "robinhood-fork": ROBINHOOD_FORK_SHERWOOD
219
274
  };
220
275
  var VENICE_REGISTRY = {
221
- "robinhood-testnet": ROBINHOOD_TESTNET_VENICE
276
+ "robinhood-testnet": ROBINHOOD_TESTNET_VENICE,
277
+ "robinhood-fork": ROBINHOOD_TESTNET_VENICE
222
278
  };
223
279
  var AERODROME_REGISTRY = {
224
- "robinhood-testnet": ROBINHOOD_TESTNET_AERODROME
280
+ "robinhood-testnet": ROBINHOOD_TESTNET_AERODROME,
281
+ "robinhood-fork": ROBINHOOD_TESTNET_AERODROME
225
282
  };
226
283
  var STRATEGY_TEMPLATE_REGISTRY = {
227
- "robinhood-testnet": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES
284
+ "robinhood-testnet": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES,
285
+ "robinhood-fork": ROBINHOOD_FORK_STRATEGY_TEMPLATES
228
286
  };
229
287
  var SYNTHRA_REGISTRY = {
230
- "robinhood-testnet": ROBINHOOD_TESTNET_SYNTHRA
288
+ "robinhood-testnet": ROBINHOOD_TESTNET_SYNTHRA,
289
+ "robinhood-fork": ROBINHOOD_TESTNET_SYNTHRA
290
+ // unused on the fork (Uniswap, not Synthra)
231
291
  };
232
292
  var CHAINLINK_REGISTRY = {
233
- "robinhood-testnet": ROBINHOOD_TESTNET_CHAINLINK
293
+ "robinhood-testnet": ROBINHOOD_TESTNET_CHAINLINK,
294
+ "robinhood-fork": ROBINHOOD_FORK_CHAINLINK
234
295
  };
235
296
  var EAS_CONTRACT_REGISTRY = {
236
- "robinhood-testnet": ROBINHOOD_TESTNET_EAS
297
+ "robinhood-testnet": ROBINHOOD_TESTNET_EAS,
298
+ "robinhood-fork": ROBINHOOD_TESTNET_EAS
237
299
  };
238
300
  var EAS_SCHEMA_REGISTRY = {
239
- "robinhood-testnet": ROBINHOOD_TESTNET_EAS_SCHEMAS
301
+ "robinhood-testnet": ROBINHOOD_TESTNET_EAS_SCHEMAS,
302
+ "robinhood-fork": ROBINHOOD_TESTNET_EAS_SCHEMAS
240
303
  };
241
304
  function TOKENS() {
242
305
  return TOKEN_REGISTRY[getNetwork()];
@@ -305,4 +368,4 @@ export {
305
368
  SYNTHRA,
306
369
  CHAINLINK
307
370
  };
308
- //# sourceMappingURL=chunk-I6X6NL65.js.map
371
+ //# sourceMappingURL=chunk-XW6NDXBA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/addresses.ts","../src/lib/address-overrides.ts"],"sourcesContent":["/**\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 } from \"viem\";\nimport { isAddress } from \"viem\";\nimport { type Network, getNetwork } from \"./network.js\";\nimport { overridesFor } from \"./address-overrides.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} 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: \"0xb3C009aECAeDd5ccC62Ec12eDAAA55F19C4A1eFb\" 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 (Data Streams verifier proxy + AggregatorV3 feeds) ──\n\nconst ROBINHOOD_TESTNET_CHAINLINK = {\n VERIFIER_PROXY: \"0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64\" as Address,\n WSTETH_ETH_FEED: ZERO,\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 machinery\n// is retained (see robinhoodEquityMaxAge / portfolio-template.ts) but the map is\n// empty, so every basket token falls to the existing fail-fast route error until\n// a 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\n// Chainlink push-feed classification. Every `*_USD_FEED` is an EQUITY feed\n// (needs the extended 96h max-price-age over holiday weekends) EXCEPT these —\n// crypto/FX/stable feeds keep the contract default (26h). Encoded here (not an\n// inline list in the command) so route/feed metadata lives in one registry.\n//\n// WETH is listed alongside ETH because feed auto-resolve normalizes WETH →\n// ETH_USD_FEED (there is no WETH_USD_FEED — the two share the 24h crypto feed).\n// The classification helper below MUST agree with that normalization for every\n// symbol the feed-resolution path accepts, or a WETH allocation packs the 96h\n// equity max-age onto a 24h crypto feed and accepts ~4-day-stale ETH prices.\nexport const ROBINHOOD_NON_EQUITY_FEEDS = new Set([\"ETH\", \"WETH\", \"BTC\", \"LINK\", \"USDG\", \"USDC\"]);\n\n/** True if `symbol`'s Robinhood push feed is a tokenized-equity feed. */\nexport function isRobinhoodEquityFeed(symbol: string): boolean {\n return !ROBINHOOD_NON_EQUITY_FEEDS.has(symbol.toUpperCase());\n}\n\n/**\n * Reverse-lookup a token address against a `TOKENS()` registry to recover its\n * symbol (case-insensitive). Returns undefined for the zero address or an\n * address that isn't registered. Used so a raw-address token spec can still be\n * classified as an equity feed (→ 96h max-price-age) the same way a symbol spec\n * is — otherwise a stock token passed by address silently falls back to the\n * contract's 26h default and trips `StalePrice` over long weekends.\n */\nexport function symbolForTokenAddress(\n address: string,\n tokens: Record<string, Address>,\n): string | undefined {\n if (!address || address.toLowerCase() === ZERO.toLowerCase()) return undefined;\n const want = address.toLowerCase();\n for (const [symbol, addr] of Object.entries(tokens)) {\n if (addr && addr !== ZERO && addr.toLowerCase() === want) return symbol;\n }\n return undefined;\n}\n\n/**\n * Resolve the equity max-price-age (seconds) for a Robinhood push-feed token\n * spec, which may be a SYMBOL or a raw 0x address. Returns the 96h equity\n * default for equity feeds, 0 (contract default) for crypto/stable feeds, and\n * `{ maxPriceAge: 0, unknownAddress: true }` when a raw address isn't in the\n * registry (caller should warn — we can't classify what we can't identify).\n *\n * `equityMaxAgeSeconds` is injected (from the portfolio builder's\n * EQUITY_MAX_PRICE_AGE_SECONDS) to avoid a cross-module import cycle.\n */\nexport function robinhoodEquityMaxAge(\n tokenSpec: string,\n tokens: Record<string, Address>,\n equityMaxAgeSeconds: number,\n): { maxPriceAge: number; unknownAddress: boolean } {\n let symbol: string | undefined;\n if (isAddress(tokenSpec)) {\n symbol = symbolForTokenAddress(tokenSpec, tokens);\n if (!symbol) return { maxPriceAge: 0, unknownAddress: true };\n } else {\n symbol = tokenSpec;\n }\n return {\n maxPriceAge: isRobinhoodEquityFeed(symbol) ? equityMaxAgeSeconds : 0,\n unknownAddress: false,\n };\n}\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\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.\nconst ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0xB9E71Fb33075328d6e94eCFFf8a8629D6d057cce\" as Address,\n GOVERNOR: ZERO, // zeroed since the post-#421 redeploy — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0x57f0fa384d0d7e2F234535d1235440312866872B\" as Address,\n STAKED_WOOD: \"0x15F48A9f24c8ECaa8f03c28Ecd1a3b4784CdCb3c\" as Address,\n WOOD_TOKEN: \"0xCCb4fB59cf40de1E23083037ee81Da1DD747D8d7\" as Address,\n STRATEGY_FACTORY: \"0xE1D082ef1CE17f9C6a46e97928337267BFF0C309\" as Address,\n MERKL_DISTRIBUTOR: 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} as const;\n\n// ── EAS (Ethereum Attestation Service) ──\n\nconst ROBINHOOD_TESTNET_EAS = {\n EAS: ZERO,\n SCHEMA_REGISTRY: ZERO,\n} as const;\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. VERIFIER_PROXY = 0 makes PortfolioStrategy run in\n// push-feed mode (feedIds are AggregatorV3 proxy addresses). Core addresses\n// come from sherwood-protocol/chains/9994663.json (fresh deploy). USDG is passed\n// as a raw --asset address (not a token-shape key); stock baskets use raw token\n// addresses + explicit --feed-ids/--swap-routes until the symbol registry lands.\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 TSLA: \"0x322F0929c4625eD5bAd873c95208D54E1c003b2d\" as Address,\n AMZN: \"0x12f190a9F9d7D37a250758b26824B97CE941bF54\" as Address,\n PLTR: ZERO,\n NFLX: ZERO,\n AMD: \"0x86923f96303D656E4aa86D9d42D1e57ad2023fdC\" as Address,\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: \"0x9176C63C8269add92690aE02A45f75B72863cE2B\" as Address,\n};\n\n// VERIFIER_PROXY = 0 ⇒ PortfolioStrategy push-feed mode (Robinhood-mainnet-style).\nconst ROBINHOOD_FORK_CHAINLINK: typeof ROBINHOOD_TESTNET_CHAINLINK = {\n VERIFIER_PROXY: ZERO,\n WSTETH_ETH_FEED: ZERO,\n};\n\nconst ROBINHOOD_FORK_SHERWOOD: typeof ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0xD9E2F732cc30bC87303E2b9E9fD2f19966D9eDc2\" as Address,\n GOVERNOR: ZERO, // per-vault — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0x8Cc7E69708B551221B831e1C2BAc473860DffA1A\" as Address,\n STAKED_WOOD: \"0xfaEde5DE0572f0Bc84eD0AD11fC79de40c3730eF\" as Address,\n WOOD_TOKEN: \"0xF8BC08092C06dB6148114DCf82AF881F1085f92b\" as Address,\n STRATEGY_FACTORY: \"0x8599ECDdEC4C969ec9E1f3AEE894afd70365AaC2\" as Address,\n MERKL_DISTRIBUTOR: ZERO,\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: \"0xe1e6D7DE0BED412664eEf07074898Cfa19829f40\" 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};\n\nconst MOONWELL_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_MOONWELL> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_MOONWELL,\n \"robinhood-fork\": ROBINHOOD_TESTNET_MOONWELL,\n};\n\nconst UNISWAP_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_UNISWAP> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_UNISWAP,\n \"robinhood-fork\": ROBINHOOD_FORK_UNISWAP,\n};\n\nconst INFRA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_INFRA> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_INFRA,\n \"robinhood-fork\": ROBINHOOD_TESTNET_INFRA,\n};\n\nconst ENS_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_ENS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_ENS,\n \"robinhood-fork\": ROBINHOOD_TESTNET_ENS,\n};\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};\n\nconst SHERWOOD_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_SHERWOOD> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SHERWOOD,\n \"robinhood-fork\": ROBINHOOD_FORK_SHERWOOD,\n};\n\nconst VENICE_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_VENICE> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_VENICE,\n \"robinhood-fork\": ROBINHOOD_TESTNET_VENICE,\n};\n\nconst AERODROME_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_AERODROME> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AERODROME,\n \"robinhood-fork\": ROBINHOOD_TESTNET_AERODROME,\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};\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};\n\nconst CHAINLINK_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_CHAINLINK> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_CHAINLINK,\n \"robinhood-fork\": ROBINHOOD_FORK_CHAINLINK,\n};\n\nconst EAS_CONTRACT_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_EAS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_EAS,\n \"robinhood-fork\": ROBINHOOD_TESTNET_EAS,\n};\n\nconst EAS_SCHEMA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_EAS_SCHEMAS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_EAS_SCHEMAS,\n \"robinhood-fork\": ROBINHOOD_TESTNET_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\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","/**\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\" | \"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 },\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"],"mappings":"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","names":[]}
@@ -12,8 +12,8 @@ import {
12
12
  unstickWallet,
13
13
  waitForReceipt,
14
14
  writeContractWithRetry
15
- } from "./chunk-FP5DZCOM.js";
16
- import "./chunk-LSVCF24W.js";
15
+ } from "./chunk-BJ4G3TPP.js";
16
+ import "./chunk-VJKZDHH3.js";
17
17
  import "./chunk-3TZIOAPH.js";
18
18
  export {
19
19
  GAS_UNITS,
@@ -30,4 +30,4 @@ export {
30
30
  waitForReceipt,
31
31
  writeContractWithRetry
32
32
  };
33
- //# sourceMappingURL=client-GRPJRISD.js.map
33
+ //# sourceMappingURL=client-25LF2O4P.js.map