@sherwoodagent/cli 0.22.8 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/{chat-JYAJMP4D.js → chat-52PWNH7Y.js} +7 -7
  2. package/dist/{chunk-4YIE7GHL.js → chunk-66VFSLPS.js} +2 -2
  3. package/dist/{chunk-VO6DCRWV.js → chunk-7PCI3WHQ.js} +4 -4
  4. package/dist/{chunk-LVPBJ7MI.js → chunk-GWIW6DDG.js} +2 -2
  5. package/dist/{chunk-4Y6Y4SVH.js → chunk-JEVBC7DV.js} +4 -4
  6. package/dist/{chunk-G7JQRLQE.js → chunk-QBNWBWD3.js} +5 -5
  7. package/dist/{chunk-B42ZCCZ7.js → chunk-RGOTBJIN.js} +28 -3
  8. package/dist/chunk-RGOTBJIN.js.map +1 -0
  9. package/dist/{chunk-ASJTFFZH.js → chunk-SBVHGUQJ.js} +3 -3
  10. package/dist/{chunk-Y7LS6DEF.js → chunk-VQIFAXUY.js} +5 -5
  11. package/dist/{chunk-JR5K5WVR.js → chunk-ZPLUJT4V.js} +169 -13
  12. package/dist/chunk-ZPLUJT4V.js.map +1 -0
  13. package/dist/{client-SCIY6SUP.js → client-CWQFYZ5Z.js} +4 -4
  14. package/dist/{config-BGS5MX4D.js → config-YXZKPSZB.js} +8 -2
  15. package/dist/{eas-X5UIEM6D.js → eas-YZIHYQAI.js} +6 -6
  16. package/dist/{governor-ZKRSAHG4.js → governor-YPDAOT3S.js} +6 -6
  17. package/dist/index.js +741 -74
  18. package/dist/index.js.map +1 -1
  19. package/dist/{network-UTSOP7EF.js → network-QEMP3DSP.js} +3 -3
  20. package/dist/price-SWNEGWO4.js +156 -0
  21. package/dist/price-SWNEGWO4.js.map +1 -0
  22. package/dist/{research-EWH43HFN.js → research-PH77VSE4.js} +9 -9
  23. package/dist/research-ZX7T2ZIJ.js +14 -0
  24. package/dist/{session-XZNKLK3I.js → session-NMA4RLKC.js} +12 -12
  25. package/dist/{trade-VKSXEHWW.js → trade-N2A74UPX.js} +16 -16
  26. package/dist/{xmtp-XKHXATPQ.js → xmtp-YNOGIZ4G.js} +6 -6
  27. package/package.json +1 -1
  28. package/dist/chunk-B42ZCCZ7.js.map +0 -1
  29. package/dist/chunk-JR5K5WVR.js.map +0 -1
  30. package/dist/research-W3M3VZBD.js +0 -14
  31. /package/dist/{chat-JYAJMP4D.js.map → chat-52PWNH7Y.js.map} +0 -0
  32. /package/dist/{chunk-4YIE7GHL.js.map → chunk-66VFSLPS.js.map} +0 -0
  33. /package/dist/{chunk-VO6DCRWV.js.map → chunk-7PCI3WHQ.js.map} +0 -0
  34. /package/dist/{chunk-LVPBJ7MI.js.map → chunk-GWIW6DDG.js.map} +0 -0
  35. /package/dist/{chunk-4Y6Y4SVH.js.map → chunk-JEVBC7DV.js.map} +0 -0
  36. /package/dist/{chunk-G7JQRLQE.js.map → chunk-QBNWBWD3.js.map} +0 -0
  37. /package/dist/{chunk-ASJTFFZH.js.map → chunk-SBVHGUQJ.js.map} +0 -0
  38. /package/dist/{chunk-Y7LS6DEF.js.map → chunk-VQIFAXUY.js.map} +0 -0
  39. /package/dist/{client-SCIY6SUP.js.map → client-CWQFYZ5Z.js.map} +0 -0
  40. /package/dist/{config-BGS5MX4D.js.map → config-YXZKPSZB.js.map} +0 -0
  41. /package/dist/{eas-X5UIEM6D.js.map → eas-YZIHYQAI.js.map} +0 -0
  42. /package/dist/{governor-ZKRSAHG4.js.map → governor-YPDAOT3S.js.map} +0 -0
  43. /package/dist/{network-UTSOP7EF.js.map → network-QEMP3DSP.js.map} +0 -0
  44. /package/dist/{research-EWH43HFN.js.map → research-PH77VSE4.js.map} +0 -0
  45. /package/dist/{research-W3M3VZBD.js.map → research-ZX7T2ZIJ.js.map} +0 -0
  46. /package/dist/{session-XZNKLK3I.js.map → session-NMA4RLKC.js.map} +0 -0
  47. /package/dist/{trade-VKSXEHWW.js.map → trade-N2A74UPX.js.map} +0 -0
  48. /package/dist/{xmtp-XKHXATPQ.js.map → xmtp-YNOGIZ4G.js.map} +0 -0
@@ -2,23 +2,23 @@ import {
2
2
  getTextRecord,
3
3
  resolveSyndicate,
4
4
  setTextRecord
5
- } from "./chunk-G7JQRLQE.js";
6
- import "./chunk-JR5K5WVR.js";
5
+ } from "./chunk-QBNWBWD3.js";
6
+ import "./chunk-ZPLUJT4V.js";
7
7
  import {
8
8
  formatContractError,
9
9
  getAccount
10
- } from "./chunk-ASJTFFZH.js";
11
- import "./chunk-LVPBJ7MI.js";
10
+ } from "./chunk-SBVHGUQJ.js";
11
+ import "./chunk-GWIW6DDG.js";
12
12
  import {
13
13
  cacheGroupId,
14
14
  getCachedGroupId
15
- } from "./chunk-B42ZCCZ7.js";
15
+ } from "./chunk-RGOTBJIN.js";
16
16
 
17
17
  // src/commands/chat.ts
18
18
  import chalk from "chalk";
19
19
  import ora from "ora";
20
20
  async function loadXmtp() {
21
- return import("./xmtp-XKHXATPQ.js");
21
+ return import("./xmtp-YNOGIZ4G.js");
22
22
  }
23
23
  function formatTimestamp(date) {
24
24
  return `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}`;
@@ -378,4 +378,4 @@ function registerChatCommands(program) {
378
378
  export {
379
379
  registerChatCommands
380
380
  };
381
- //# sourceMappingURL=chat-JYAJMP4D.js.map
381
+ //# sourceMappingURL=chat-52PWNH7Y.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getAccount
3
- } from "./chunk-ASJTFFZH.js";
3
+ } from "./chunk-SBVHGUQJ.js";
4
4
 
5
5
  // src/providers/research/messari.ts
6
6
  import { base, baseSepolia } from "viem/chains";
@@ -445,4 +445,4 @@ export {
445
445
  NansenProvider,
446
446
  getResearchProvider
447
447
  };
448
- //# sourceMappingURL=chunk-4YIE7GHL.js.map
448
+ //# sourceMappingURL=chunk-66VFSLPS.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  SHERWOOD,
3
3
  SYNDICATE_GOVERNOR_ABI
4
- } from "./chunk-JR5K5WVR.js";
4
+ } from "./chunk-ZPLUJT4V.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  waitForReceipt,
9
9
  writeContractWithRetry
10
- } from "./chunk-ASJTFFZH.js";
10
+ } from "./chunk-SBVHGUQJ.js";
11
11
  import {
12
12
  getChain
13
- } from "./chunk-LVPBJ7MI.js";
13
+ } from "./chunk-GWIW6DDG.js";
14
14
 
15
15
  // src/lib/governor.ts
16
16
  import { parseEventLogs } from "viem";
@@ -427,4 +427,4 @@ export {
427
427
  vetoProposal,
428
428
  setProtocolFeeBps
429
429
  };
430
- //# sourceMappingURL=chunk-VO6DCRWV.js.map
430
+ //# sourceMappingURL=chunk-7PCI3WHQ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfigRpcUrl
3
- } from "./chunk-B42ZCCZ7.js";
3
+ } from "./chunk-RGOTBJIN.js";
4
4
 
5
5
  // src/lib/network.ts
6
6
  import { defineChain } from "viem";
@@ -104,4 +104,4 @@ export {
104
104
  getExplorerUrl,
105
105
  isTestnet
106
106
  };
107
- //# sourceMappingURL=chunk-LVPBJ7MI.js.map
107
+ //# sourceMappingURL=chunk-GWIW6DDG.js.map
@@ -2,18 +2,18 @@ import {
2
2
  EAS_ABI,
3
3
  EAS_CONTRACTS,
4
4
  EAS_SCHEMAS
5
- } from "./chunk-JR5K5WVR.js";
5
+ } from "./chunk-ZPLUJT4V.js";
6
6
  import {
7
7
  getAccount,
8
8
  getPublicClient,
9
9
  waitForReceipt,
10
10
  writeContractWithRetry
11
- } from "./chunk-ASJTFFZH.js";
11
+ } from "./chunk-SBVHGUQJ.js";
12
12
  import {
13
13
  getChain,
14
14
  getChainConfig,
15
15
  getNetwork
16
- } from "./chunk-LVPBJ7MI.js";
16
+ } from "./chunk-GWIW6DDG.js";
17
17
 
18
18
  // src/lib/eas.ts
19
19
  import { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from "viem";
@@ -409,4 +409,4 @@ export {
409
409
  queryApprovals,
410
410
  queryJoinRequests
411
411
  };
412
- //# sourceMappingURL=chunk-4Y6Y4SVH.js.map
412
+ //# sourceMappingURL=chunk-JEVBC7DV.js.map
@@ -6,20 +6,20 @@ import {
6
6
  SYNDICATE_FACTORY_ABI,
7
7
  SYNDICATE_VAULT_ABI,
8
8
  TOKENS
9
- } from "./chunk-JR5K5WVR.js";
9
+ } from "./chunk-ZPLUJT4V.js";
10
10
  import {
11
11
  getAccount,
12
12
  getPublicClient,
13
13
  getWalletClient,
14
14
  waitForReceipt,
15
15
  writeContractWithRetry
16
- } from "./chunk-ASJTFFZH.js";
16
+ } from "./chunk-SBVHGUQJ.js";
17
17
  import {
18
18
  getChain
19
- } from "./chunk-LVPBJ7MI.js";
19
+ } from "./chunk-GWIW6DDG.js";
20
20
  import {
21
21
  getChainContracts
22
- } from "./chunk-B42ZCCZ7.js";
22
+ } from "./chunk-RGOTBJIN.js";
23
23
 
24
24
  // src/lib/vault.ts
25
25
  import { formatUnits, parseEther } from "viem";
@@ -433,4 +433,4 @@ export {
433
433
  setTextRecord,
434
434
  getTextRecord
435
435
  };
436
- //# sourceMappingURL=chunk-G7JQRLQE.js.map
436
+ //# sourceMappingURL=chunk-QBNWBWD3.js.map
@@ -6,7 +6,9 @@ var CONFIG_DIR = path.join(os.homedir(), ".sherwood");
6
6
  var CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
7
7
  function loadConfig() {
8
8
  if (fs.existsSync(CONFIG_PATH)) {
9
- return JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
9
+ const config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
10
+ if (!config.groupCache) config.groupCache = {};
11
+ return config;
10
12
  }
11
13
  return { groupCache: {} };
12
14
  }
@@ -132,6 +134,26 @@ function getPrimarySyndicate(chainId) {
132
134
  }
133
135
  return void 0;
134
136
  }
137
+ function swapRouteKey(asset, token) {
138
+ return `${asset.toLowerCase()}\u2192${token.toLowerCase()}`;
139
+ }
140
+ function getCachedSwapRoute(chainId, asset, token) {
141
+ const config = loadConfig();
142
+ return config.swapRoutes?.[String(chainId)]?.[swapRouteKey(asset, token)];
143
+ }
144
+ function cacheSwapRoute(chainId, asset, token, route) {
145
+ const config = loadConfig();
146
+ const cid = String(chainId);
147
+ if (!config.swapRoutes) config.swapRoutes = {};
148
+ if (!config.swapRoutes[cid]) config.swapRoutes[cid] = {};
149
+ config.swapRoutes[cid][swapRouteKey(asset, token)] = route;
150
+ saveConfig(config);
151
+ }
152
+ function clearSwapRoutes(chainId) {
153
+ const config = loadConfig();
154
+ delete config.swapRoutes?.[String(chainId)];
155
+ saveConfig(config);
156
+ }
135
157
 
136
158
  export {
137
159
  loadConfig,
@@ -155,6 +177,9 @@ export {
155
177
  addSyndicate,
156
178
  getSyndicates,
157
179
  setPrimarySyndicate,
158
- getPrimarySyndicate
180
+ getPrimarySyndicate,
181
+ getCachedSwapRoute,
182
+ cacheSwapRoute,
183
+ clearSwapRoutes
159
184
  };
160
- //# sourceMappingURL=chunk-B42ZCCZ7.js.map
185
+ //# sourceMappingURL=chunk-RGOTBJIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/config.ts"],"sourcesContent":["/**\n * Local config management — ~/.sherwood/config.json\n *\n * Stores group ID cache, per-chain contract addresses, and wallet config.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".sherwood\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\n/** Per-chain user-specific addresses (stored by chainId). */\nexport interface ChainContracts {\n vault?: string; // user's default vault address\n}\n\n/** A syndicate the agent belongs to (creator or member). */\nexport interface SyndicateMembership {\n subdomain: string;\n vault: string;\n role: \"creator\" | \"agent\";\n}\n\nexport interface SherwoodConfig {\n dbEncryptionKey?: string; // legacy — no longer used, XMTP CLI manages its own DB\n privateKey?: string; // wallet private key (0x-prefixed)\n xmtpInboxId?: string;\n groupCache: Record<string, string>; // subdomain → XMTP group ID\n veniceApiKey?: string; // Venice AI inference API key\n agentId?: number; // ERC-8004 identity token ID\n contracts?: Record<string, ChainContracts>; // chainId → user addresses\n syndicates?: Record<string, SyndicateMembership[]>; // chainId → syndicate memberships\n primarySyndicate?: Record<string, string>; // chainId → subdomain of the active syndicate\n rpc?: Record<string, string>; // network name → custom RPC URL\n notifyTo?: string; // destination for cron summaries (Telegram chat ID, phone, etc.)\n uniswapApiKey?: string; // Uniswap Trading API key (from developers.uniswap.org)\n positions?: unknown[]; // open trade positions (typed in positions.ts)\n closedPositions?: unknown[]; // historical closed positions\n _xmtpMigrated?: boolean; // one-time flag: revoked stale installations from ~/.xmtp/ era\n /** Cached swap routes per chain: chainId → { tokenPair → SwapRoute } */\n swapRoutes?: Record<string, Record<string, SwapRoute>>;\n}\n\n/** Persisted swap route detected by the CLI during portfolio strategy proposal. */\nexport interface SwapRoute {\n mode: \"direct\" | \"multi-hop\";\n feeTier: number; // direct pool fee tier\n hop?: { via: string; feeIn: number; feeOut: number }; // multi-hop details\n detectedAt: number; // unix timestamp\n}\n\nexport function loadConfig(): SherwoodConfig {\n if (fs.existsSync(CONFIG_PATH)) {\n const config = JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n if (!config.groupCache) config.groupCache = {};\n return config;\n }\n\n return { groupCache: {} };\n}\n\nexport function saveConfig(config: SherwoodConfig): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport function cacheGroupId(subdomain: string, groupId: string): void {\n const config = loadConfig();\n config.groupCache[subdomain] = groupId;\n saveConfig(config);\n}\n\nexport function getCachedGroupId(subdomain: string): string | undefined {\n const config = loadConfig();\n return config.groupCache[subdomain];\n}\n\nexport function setVeniceApiKey(apiKey: string): void {\n const config = loadConfig();\n config.veniceApiKey = apiKey;\n saveConfig(config);\n}\n\nexport function getVeniceApiKey(): string | undefined {\n return loadConfig().veniceApiKey ?? process.env.VENICE_API_KEY;\n}\n\nexport function setAgentId(agentId: number): void {\n const config = loadConfig();\n config.agentId = agentId;\n saveConfig(config);\n}\n\nexport function getAgentId(): number | undefined {\n return loadConfig().agentId;\n}\n\nexport function setPrivateKey(key: string): void {\n const config = loadConfig();\n config.privateKey = key.startsWith(\"0x\") ? key : `0x${key}`;\n saveConfig(config);\n}\n\nexport function getPrivateKey(): string | undefined {\n return loadConfig().privateKey;\n}\n\n// ── Uniswap Trading API Key ──\n\nexport function setUniswapApiKey(apiKey: string): void {\n const config = loadConfig();\n config.uniswapApiKey = apiKey;\n saveConfig(config);\n}\n\nexport function getUniswapApiKey(): string | undefined {\n return loadConfig().uniswapApiKey ?? process.env.UNISWAP_API_KEY;\n}\n\n// ── Per-network RPC URLs ──\n\nexport function getConfigRpcUrl(network: string): string | undefined {\n return loadConfig().rpc?.[network];\n}\n\nexport function setConfigRpcUrl(network: string, url: string): void {\n const config = loadConfig();\n if (!config.rpc) config.rpc = {};\n config.rpc[network] = url;\n saveConfig(config);\n}\n\n// ── Per-chain contract addresses ──\n\nexport function getChainContracts(chainId: number): ChainContracts {\n const config = loadConfig();\n return config.contracts?.[String(chainId)] ?? {};\n}\n\nexport function getNotifyTo(): string | undefined {\n return loadConfig().notifyTo;\n}\n\nexport function setNotifyTo(id: string): void {\n const config = loadConfig();\n config.notifyTo = id;\n saveConfig(config);\n}\n\nexport function setChainContract(\n chainId: number,\n key: keyof ChainContracts,\n value: string,\n): void {\n const config = loadConfig();\n if (!config.contracts) config.contracts = {};\n const cid = String(chainId);\n if (!config.contracts[cid]) config.contracts[cid] = {};\n config.contracts[cid][key] = value;\n saveConfig(config);\n}\n\n// ── Syndicate Membership ──\n\n/**\n * Add (or update) a syndicate membership. Deduplicates by subdomain.\n * Automatically sets it as primary if it's the first syndicate on this chain.\n */\nexport function addSyndicate(\n chainId: number,\n membership: SyndicateMembership,\n): void {\n const config = loadConfig();\n const cid = String(chainId);\n if (!config.syndicates) config.syndicates = {};\n if (!config.syndicates[cid]) config.syndicates[cid] = [];\n\n // Upsert — replace existing entry with same subdomain\n const idx = config.syndicates[cid].findIndex(\n (s) => s.subdomain === membership.subdomain,\n );\n if (idx >= 0) {\n config.syndicates[cid][idx] = membership;\n } else {\n config.syndicates[cid].push(membership);\n }\n\n // Auto-set as primary if it's the first syndicate (or no primary set)\n if (!config.primarySyndicate) config.primarySyndicate = {};\n if (!config.primarySyndicate[cid]) {\n config.primarySyndicate[cid] = membership.subdomain;\n }\n\n saveConfig(config);\n}\n\n/** Get all syndicate memberships for a chain. */\nexport function getSyndicates(chainId: number): SyndicateMembership[] {\n const config = loadConfig();\n return config.syndicates?.[String(chainId)] ?? [];\n}\n\n/** Set which syndicate is the active/primary one for CLI commands. */\nexport function setPrimarySyndicate(\n chainId: number,\n subdomain: string,\n): void {\n const config = loadConfig();\n if (!config.primarySyndicate) config.primarySyndicate = {};\n config.primarySyndicate[String(chainId)] = subdomain;\n saveConfig(config);\n}\n\n/**\n * Get the primary syndicate for this chain.\n * Falls back to ChainContracts.vault for backwards compat with older configs.\n */\nexport function getPrimarySyndicate(\n chainId: number,\n): SyndicateMembership | undefined {\n const config = loadConfig();\n const cid = String(chainId);\n\n // Check new syndicates store first\n const primarySubdomain = config.primarySyndicate?.[cid];\n if (primarySubdomain && config.syndicates?.[cid]) {\n const found = config.syndicates[cid].find(\n (s) => s.subdomain === primarySubdomain,\n );\n if (found) return found;\n }\n\n // Backwards compat: if syndicates list has entries but no primary, use the first one\n if (config.syndicates?.[cid]?.length) {\n return config.syndicates[cid][0];\n }\n\n // Legacy fallback: config only has a vault address, no subdomain\n const vault = config.contracts?.[cid]?.vault;\n if (vault) {\n return { subdomain: \"\", vault, role: \"creator\" };\n }\n\n return undefined;\n}\n\n// ── Swap Route Cache ──\n\nfunction swapRouteKey(asset: string, token: string): string {\n return `${asset.toLowerCase()}→${token.toLowerCase()}`;\n}\n\n/** Get a cached swap route for a token pair on a chain. */\nexport function getCachedSwapRoute(chainId: number, asset: string, token: string): SwapRoute | undefined {\n const config = loadConfig();\n return config.swapRoutes?.[String(chainId)]?.[swapRouteKey(asset, token)];\n}\n\n/** Save a detected swap route to the config cache. */\nexport function cacheSwapRoute(chainId: number, asset: string, token: string, route: SwapRoute): void {\n const config = loadConfig();\n const cid = String(chainId);\n if (!config.swapRoutes) config.swapRoutes = {};\n if (!config.swapRoutes[cid]) config.swapRoutes[cid] = {};\n config.swapRoutes[cid][swapRouteKey(asset, token)] = route;\n saveConfig(config);\n}\n\n/** Clear all cached swap routes for a chain (e.g. after pool migration). */\nexport function clearSwapRoutes(chainId: number): void {\n const config = loadConfig();\n delete config.swapRoutes?.[String(chainId)];\n saveConfig(config);\n}\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  getChain,
3
3
  getRpcUrl
4
- } from "./chunk-LVPBJ7MI.js";
4
+ } from "./chunk-GWIW6DDG.js";
5
5
  import {
6
6
  loadConfig
7
- } from "./chunk-B42ZCCZ7.js";
7
+ } from "./chunk-RGOTBJIN.js";
8
8
 
9
9
  // src/lib/client.ts
10
10
  import { createPublicClient, createWalletClient, http } from "viem";
@@ -482,4 +482,4 @@ export {
482
482
  writeContractWithRetry,
483
483
  waitForReceipt
484
484
  };
485
- //# sourceMappingURL=chunk-ASJTFFZH.js.map
485
+ //# sourceMappingURL=chunk-SBVHGUQJ.js.map
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  UNISWAP,
3
3
  UNISWAP_QUOTER_V2_ABI
4
- } from "./chunk-JR5K5WVR.js";
4
+ } from "./chunk-ZPLUJT4V.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  sendTxWithRetry,
9
9
  waitForReceipt
10
- } from "./chunk-ASJTFFZH.js";
10
+ } from "./chunk-SBVHGUQJ.js";
11
11
  import {
12
12
  getChain
13
- } from "./chunk-LVPBJ7MI.js";
13
+ } from "./chunk-GWIW6DDG.js";
14
14
  import {
15
15
  getUniswapApiKey,
16
16
  getVeniceApiKey,
17
17
  setVeniceApiKey
18
- } from "./chunk-B42ZCCZ7.js";
18
+ } from "./chunk-RGOTBJIN.js";
19
19
 
20
20
  // src/providers/uniswap.ts
21
21
  import { isAddress } from "viem";
@@ -449,4 +449,4 @@ export {
449
449
  encodeSwapPath,
450
450
  getMultiHopQuote
451
451
  };
452
- //# sourceMappingURL=chunk-Y7LS6DEF.js.map
452
+ //# sourceMappingURL=chunk-VQIFAXUY.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getNetwork
3
- } from "./chunk-LVPBJ7MI.js";
3
+ } from "./chunk-GWIW6DDG.js";
4
4
 
5
5
  // src/lib/addresses.ts
6
6
  var ZERO = "0x0000000000000000000000000000000000000000";
@@ -26,7 +26,8 @@ var BASE_MOONWELL = {
26
26
  };
27
27
  var BASE_UNISWAP = {
28
28
  SWAP_ROUTER: "0x2626664c2603336E57B271c5C0b26F421741e481",
29
- QUOTER_V2: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a"
29
+ QUOTER_V2: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
30
+ SWAP_ADAPTER: "0x121AaC2B96Ec365e457fcCc1C2ED5a6142064069"
30
31
  };
31
32
  var BASE_SEPOLIA_TOKENS = {
32
33
  USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
@@ -52,18 +53,23 @@ var BASE_SEPOLIA_MOONWELL = {
52
53
  var BASE_SEPOLIA_UNISWAP = {
53
54
  SWAP_ROUTER: "0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4",
54
55
  // Uniswap V3 SwapRouter02
55
- QUOTER_V2: "0xC5290058841028F1614F3A6F0F5816cAd0df5E27"
56
+ QUOTER_V2: "0xC5290058841028F1614F3A6F0F5816cAd0df5E27",
56
57
  // Uniswap V3 QuoterV2
58
+ SWAP_ADAPTER: ZERO
57
59
  };
58
60
  var ROBINHOOD_TESTNET_TOKENS = {
59
61
  USDC: ZERO,
60
- // no Circle USDC on Robinhood L2
61
62
  WETH: "0x7943e237c7F95DA44E0301572D358911207852Fa",
62
63
  cbETH: ZERO,
63
64
  wstETH: ZERO,
64
65
  cbBTC: ZERO,
65
66
  DAI: ZERO,
66
- AERO: ZERO
67
+ AERO: ZERO,
68
+ TSLA: "0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E",
69
+ AMZN: "0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02",
70
+ PLTR: "0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0",
71
+ NFLX: "0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93",
72
+ AMD: "0x71178BAc73cBeb415514eB542a8995b82669778d"
67
73
  };
68
74
  var ROBINHOOD_TESTNET_MOONWELL = {
69
75
  COMPTROLLER: ZERO,
@@ -77,7 +83,20 @@ var ROBINHOOD_TESTNET_MOONWELL = {
77
83
  };
78
84
  var ROBINHOOD_TESTNET_UNISWAP = {
79
85
  SWAP_ROUTER: ZERO,
80
- QUOTER_V2: ZERO
86
+ QUOTER_V2: ZERO,
87
+ SWAP_ADAPTER: ZERO
88
+ };
89
+ var BASE_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
90
+ var BASE_SEPOLIA_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
91
+ var ROBINHOOD_TESTNET_SYNTHRA = {
92
+ ROUTER: "0x3Ce954107b1A675826B33bF23060Dd655e3758fE",
93
+ QUOTER: "0x231606c321A99DE81e28fE48B07a93F1ba49e713",
94
+ FACTORY: "0x911b4000D3422F482F4062a913885f7b035382Df"
95
+ };
96
+ var BASE_CHAINLINK = { VERIFIER_PROXY: "0xDE1A28D87Afd0f546505B28AB50410A5c3a7387a" };
97
+ var BASE_SEPOLIA_CHAINLINK = { VERIFIER_PROXY: ZERO };
98
+ var ROBINHOOD_TESTNET_CHAINLINK = {
99
+ VERIFIER_PROXY: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64"
81
100
  };
82
101
  var BASE_ENS = {
83
102
  L2_REGISTRAR: "0x866996c808E6244216a3d0df15464FCF5d495394",
@@ -112,8 +131,8 @@ var BASE_SEPOLIA_SHERWOOD = {
112
131
  GOVERNOR: "0xE5ecf2B06E3f3e298B632C0cf6575f9d9422F55E"
113
132
  };
114
133
  var ROBINHOOD_TESTNET_SHERWOOD = {
115
- FACTORY: "0xd5C4eE2E4c5B606b9401E69A3B3FeE169037C284",
116
- GOVERNOR: "0x358AD8B492BcC710BE0D7c902D8702164c35DC34"
134
+ FACTORY: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
135
+ GOVERNOR: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C"
117
136
  };
118
137
  var BASE_VENICE = {
119
138
  VVV: "0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf",
@@ -148,21 +167,24 @@ var BASE_STRATEGY_TEMPLATES = {
148
167
  AERODROME_LP: "0x1c61c740702690B86b874ab929A6F04A4Ec56C1c",
149
168
  VENICE_INFERENCE: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C",
150
169
  WSTETH_MOONWELL: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
151
- MAMO_YIELD: "0x5c98808Ce5e51767ba2d969F75312eEFF0b14a6A"
170
+ MAMO_YIELD: "0x5c98808Ce5e51767ba2d969F75312eEFF0b14a6A",
171
+ PORTFOLIO: "0x7865eEA4063c22d0F55FdD412D345495c7b73f64"
152
172
  };
153
173
  var BASE_SEPOLIA_STRATEGY_TEMPLATES = {
154
174
  MOONWELL_SUPPLY: ZERO,
155
175
  AERODROME_LP: ZERO,
156
176
  VENICE_INFERENCE: ZERO,
157
177
  WSTETH_MOONWELL: ZERO,
158
- MAMO_YIELD: ZERO
178
+ MAMO_YIELD: ZERO,
179
+ PORTFOLIO: ZERO
159
180
  };
160
181
  var ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {
161
182
  MOONWELL_SUPPLY: ZERO,
162
183
  AERODROME_LP: ZERO,
163
184
  VENICE_INFERENCE: ZERO,
164
185
  WSTETH_MOONWELL: ZERO,
165
- MAMO_YIELD: ZERO
186
+ MAMO_YIELD: ZERO,
187
+ PORTFOLIO: "0xAe981882923E0C76A7F10E7cAa3782023c0abd9B"
166
188
  };
167
189
  var BASE_EAS = {
168
190
  EAS: "0x4200000000000000000000000000000000000021",
@@ -245,6 +267,16 @@ var STRATEGY_TEMPLATE_REGISTRY = {
245
267
  "base-sepolia": BASE_SEPOLIA_STRATEGY_TEMPLATES,
246
268
  "robinhood-testnet": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES
247
269
  };
270
+ var SYNTHRA_REGISTRY = {
271
+ base: BASE_SYNTHRA,
272
+ "base-sepolia": BASE_SEPOLIA_SYNTHRA,
273
+ "robinhood-testnet": ROBINHOOD_TESTNET_SYNTHRA
274
+ };
275
+ var CHAINLINK_REGISTRY = {
276
+ base: BASE_CHAINLINK,
277
+ "base-sepolia": BASE_SEPOLIA_CHAINLINK,
278
+ "robinhood-testnet": ROBINHOOD_TESTNET_CHAINLINK
279
+ };
248
280
  var EAS_CONTRACT_REGISTRY = {
249
281
  base: BASE_EAS,
250
282
  "base-sepolia": BASE_SEPOLIA_EAS,
@@ -288,6 +320,12 @@ function EAS_CONTRACTS() {
288
320
  function EAS_SCHEMAS() {
289
321
  return EAS_SCHEMA_REGISTRY[getNetwork()];
290
322
  }
323
+ function SYNTHRA() {
324
+ return SYNTHRA_REGISTRY[getNetwork()];
325
+ }
326
+ function CHAINLINK() {
327
+ return CHAINLINK_REGISTRY[getNetwork()];
328
+ }
291
329
 
292
330
  // src/lib/abis.ts
293
331
  var SYNDICATE_VAULT_ABI = [
@@ -1477,6 +1515,121 @@ var BASE_STRATEGY_ABI = [
1477
1515
  outputs: [{ name: "", type: "uint8" }]
1478
1516
  }
1479
1517
  ];
1518
+ var PORTFOLIO_STRATEGY_ABI = [
1519
+ // Inherited from BaseStrategy
1520
+ ...BASE_STRATEGY_ABI,
1521
+ // Rebalancing
1522
+ {
1523
+ name: "rebalance",
1524
+ type: "function",
1525
+ stateMutability: "nonpayable",
1526
+ inputs: [],
1527
+ outputs: []
1528
+ },
1529
+ {
1530
+ name: "rebalanceDelta",
1531
+ type: "function",
1532
+ stateMutability: "nonpayable",
1533
+ inputs: [{ name: "priceReports", type: "bytes[]" }],
1534
+ outputs: []
1535
+ },
1536
+ // View functions
1537
+ {
1538
+ name: "getAllocations",
1539
+ type: "function",
1540
+ stateMutability: "view",
1541
+ inputs: [],
1542
+ outputs: [
1543
+ {
1544
+ name: "",
1545
+ type: "tuple[]",
1546
+ components: [
1547
+ { name: "token", type: "address" },
1548
+ { name: "targetWeightBps", type: "uint256" },
1549
+ { name: "tokenAmount", type: "uint256" },
1550
+ { name: "investedAmount", type: "uint256" }
1551
+ ]
1552
+ }
1553
+ ]
1554
+ },
1555
+ {
1556
+ name: "allocationCount",
1557
+ type: "function",
1558
+ stateMutability: "view",
1559
+ inputs: [],
1560
+ outputs: [{ name: "", type: "uint256" }]
1561
+ },
1562
+ {
1563
+ name: "asset",
1564
+ type: "function",
1565
+ stateMutability: "view",
1566
+ inputs: [],
1567
+ outputs: [{ name: "", type: "address" }]
1568
+ },
1569
+ {
1570
+ name: "totalAmount",
1571
+ type: "function",
1572
+ stateMutability: "view",
1573
+ inputs: [],
1574
+ outputs: [{ name: "", type: "uint256" }]
1575
+ },
1576
+ {
1577
+ name: "maxSlippageBps",
1578
+ type: "function",
1579
+ stateMutability: "view",
1580
+ inputs: [],
1581
+ outputs: [{ name: "", type: "uint256" }]
1582
+ },
1583
+ {
1584
+ name: "swapAdapter",
1585
+ type: "function",
1586
+ stateMutability: "view",
1587
+ inputs: [],
1588
+ outputs: [{ name: "", type: "address" }]
1589
+ },
1590
+ {
1591
+ name: "getSwapExtraData",
1592
+ type: "function",
1593
+ stateMutability: "view",
1594
+ inputs: [],
1595
+ outputs: [{ name: "", type: "bytes[]" }]
1596
+ },
1597
+ // Events
1598
+ {
1599
+ name: "WeightsUpdated",
1600
+ type: "event",
1601
+ inputs: [
1602
+ { name: "tokens", type: "address[]", indexed: false },
1603
+ { name: "oldWeights", type: "uint256[]", indexed: false },
1604
+ { name: "newWeights", type: "uint256[]", indexed: false }
1605
+ ]
1606
+ },
1607
+ {
1608
+ name: "Rebalanced",
1609
+ type: "event",
1610
+ inputs: [
1611
+ { name: "tokens", type: "address[]", indexed: false },
1612
+ { name: "oldWeights", type: "uint256[]", indexed: false },
1613
+ { name: "newWeights", type: "uint256[]", indexed: false },
1614
+ { name: "oldBalances", type: "uint256[]", indexed: false },
1615
+ { name: "newBalances", type: "uint256[]", indexed: false },
1616
+ { name: "totalAssetValue", type: "uint256", indexed: false }
1617
+ ]
1618
+ },
1619
+ {
1620
+ name: "RebalancedDelta",
1621
+ type: "event",
1622
+ inputs: [
1623
+ { name: "tokens", type: "address[]", indexed: false },
1624
+ { name: "oldWeights", type: "uint256[]", indexed: false },
1625
+ { name: "newWeights", type: "uint256[]", indexed: false },
1626
+ { name: "oldBalances", type: "uint256[]", indexed: false },
1627
+ { name: "newBalances", type: "uint256[]", indexed: false },
1628
+ { name: "totalAssetValue", type: "uint256", indexed: false },
1629
+ { name: "swapsExecuted", type: "uint256", indexed: false }
1630
+ ]
1631
+ }
1632
+ ];
1480
1633
 
1481
1634
  export {
1482
1635
  TOKENS,
@@ -1490,6 +1643,8 @@ export {
1490
1643
  STRATEGY_TEMPLATES,
1491
1644
  EAS_CONTRACTS,
1492
1645
  EAS_SCHEMAS,
1646
+ SYNTHRA,
1647
+ CHAINLINK,
1493
1648
  SYNDICATE_VAULT_ABI,
1494
1649
  UNISWAP_QUOTER_V2_ABI,
1495
1650
  SWAP_ROUTER_ABI,
@@ -1500,6 +1655,7 @@ export {
1500
1655
  VENICE_STAKING_ABI,
1501
1656
  EAS_ABI,
1502
1657
  SYNDICATE_GOVERNOR_ABI,
1503
- BASE_STRATEGY_ABI
1658
+ BASE_STRATEGY_ABI,
1659
+ PORTFOLIO_STRATEGY_ABI
1504
1660
  };
1505
- //# sourceMappingURL=chunk-JR5K5WVR.js.map
1661
+ //# sourceMappingURL=chunk-ZPLUJT4V.js.map