@sherwoodagent/cli 0.22.7 → 0.24.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 (49) hide show
  1. package/dist/{chat-JYAJMP4D.js → chat-3SAX4VRO.js} +7 -7
  2. package/dist/{chunk-LVPBJ7MI.js → chunk-35536GNW.js} +2 -2
  3. package/dist/{chunk-4Y6Y4SVH.js → chunk-5NN424VN.js} +4 -4
  4. package/dist/{chunk-B42ZCCZ7.js → chunk-5S2TBADL.js} +4 -2
  5. package/dist/chunk-5S2TBADL.js.map +1 -0
  6. package/dist/{chunk-VO6DCRWV.js → chunk-LMDHM36X.js} +4 -4
  7. package/dist/{chunk-QGZUMIVO.js → chunk-NGET2RWT.js} +16 -7
  8. package/dist/chunk-NGET2RWT.js.map +1 -0
  9. package/dist/{chunk-Y7LS6DEF.js → chunk-PEJPTKLK.js} +5 -5
  10. package/dist/{chunk-JR5K5WVR.js → chunk-R75DM3VL.js} +163 -10
  11. package/dist/chunk-R75DM3VL.js.map +1 -0
  12. package/dist/{chunk-ASJTFFZH.js → chunk-R7Q2L6VV.js} +3 -3
  13. package/dist/{chunk-G7JQRLQE.js → chunk-ZIH3SCFJ.js} +5 -5
  14. package/dist/{client-SCIY6SUP.js → client-XG6LL6TS.js} +4 -4
  15. package/dist/{config-BGS5MX4D.js → config-EHCEKT2B.js} +2 -2
  16. package/dist/{eas-X5UIEM6D.js → eas-ZMTIOZH6.js} +6 -6
  17. package/dist/{governor-ZKRSAHG4.js → governor-JIXAG6WU.js} +6 -6
  18. package/dist/index.js +609 -74
  19. package/dist/index.js.map +1 -1
  20. package/dist/{network-UTSOP7EF.js → network-UVMYTKQX.js} +3 -3
  21. package/dist/price-AGCWXLZ6.js +156 -0
  22. package/dist/price-AGCWXLZ6.js.map +1 -0
  23. package/dist/research-2I6AA3BI.js +14 -0
  24. package/dist/{research-ZW6XVTGZ.js → research-KUIZM6AK.js} +9 -9
  25. package/dist/{session-XZNKLK3I.js → session-2FIR4LJP.js} +12 -12
  26. package/dist/{trade-OJM5HNHL.js → trade-UTM3DSO3.js} +16 -16
  27. package/dist/{xmtp-XKHXATPQ.js → xmtp-B2XFVPIV.js} +6 -6
  28. package/package.json +1 -1
  29. package/dist/chunk-B42ZCCZ7.js.map +0 -1
  30. package/dist/chunk-JR5K5WVR.js.map +0 -1
  31. package/dist/chunk-QGZUMIVO.js.map +0 -1
  32. package/dist/research-SJ6D3L2B.js +0 -14
  33. /package/dist/{chat-JYAJMP4D.js.map → chat-3SAX4VRO.js.map} +0 -0
  34. /package/dist/{chunk-LVPBJ7MI.js.map → chunk-35536GNW.js.map} +0 -0
  35. /package/dist/{chunk-4Y6Y4SVH.js.map → chunk-5NN424VN.js.map} +0 -0
  36. /package/dist/{chunk-VO6DCRWV.js.map → chunk-LMDHM36X.js.map} +0 -0
  37. /package/dist/{chunk-Y7LS6DEF.js.map → chunk-PEJPTKLK.js.map} +0 -0
  38. /package/dist/{chunk-ASJTFFZH.js.map → chunk-R7Q2L6VV.js.map} +0 -0
  39. /package/dist/{chunk-G7JQRLQE.js.map → chunk-ZIH3SCFJ.js.map} +0 -0
  40. /package/dist/{client-SCIY6SUP.js.map → client-XG6LL6TS.js.map} +0 -0
  41. /package/dist/{config-BGS5MX4D.js.map → config-EHCEKT2B.js.map} +0 -0
  42. /package/dist/{eas-X5UIEM6D.js.map → eas-ZMTIOZH6.js.map} +0 -0
  43. /package/dist/{governor-ZKRSAHG4.js.map → governor-JIXAG6WU.js.map} +0 -0
  44. /package/dist/{network-UTSOP7EF.js.map → network-UVMYTKQX.js.map} +0 -0
  45. /package/dist/{research-SJ6D3L2B.js.map → research-2I6AA3BI.js.map} +0 -0
  46. /package/dist/{research-ZW6XVTGZ.js.map → research-KUIZM6AK.js.map} +0 -0
  47. /package/dist/{session-XZNKLK3I.js.map → session-2FIR4LJP.js.map} +0 -0
  48. /package/dist/{trade-OJM5HNHL.js.map → trade-UTM3DSO3.js.map} +0 -0
  49. /package/dist/{xmtp-XKHXATPQ.js.map → xmtp-B2XFVPIV.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-ZIH3SCFJ.js";
6
+ import "./chunk-R75DM3VL.js";
7
7
  import {
8
8
  formatContractError,
9
9
  getAccount
10
- } from "./chunk-ASJTFFZH.js";
11
- import "./chunk-LVPBJ7MI.js";
10
+ } from "./chunk-R7Q2L6VV.js";
11
+ import "./chunk-35536GNW.js";
12
12
  import {
13
13
  cacheGroupId,
14
14
  getCachedGroupId
15
- } from "./chunk-B42ZCCZ7.js";
15
+ } from "./chunk-5S2TBADL.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-B2XFVPIV.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-3SAX4VRO.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfigRpcUrl
3
- } from "./chunk-B42ZCCZ7.js";
3
+ } from "./chunk-5S2TBADL.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-35536GNW.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-R75DM3VL.js";
6
6
  import {
7
7
  getAccount,
8
8
  getPublicClient,
9
9
  waitForReceipt,
10
10
  writeContractWithRetry
11
- } from "./chunk-ASJTFFZH.js";
11
+ } from "./chunk-R7Q2L6VV.js";
12
12
  import {
13
13
  getChain,
14
14
  getChainConfig,
15
15
  getNetwork
16
- } from "./chunk-LVPBJ7MI.js";
16
+ } from "./chunk-35536GNW.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-5NN424VN.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
  }
@@ -157,4 +159,4 @@ export {
157
159
  setPrimarySyndicate,
158
160
  getPrimarySyndicate
159
161
  };
160
- //# sourceMappingURL=chunk-B42ZCCZ7.js.map
162
+ //# sourceMappingURL=chunk-5S2TBADL.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}\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"],"mappings":"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","names":[]}
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  SHERWOOD,
3
3
  SYNDICATE_GOVERNOR_ABI
4
- } from "./chunk-JR5K5WVR.js";
4
+ } from "./chunk-R75DM3VL.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  waitForReceipt,
9
9
  writeContractWithRetry
10
- } from "./chunk-ASJTFFZH.js";
10
+ } from "./chunk-R7Q2L6VV.js";
11
11
  import {
12
12
  getChain
13
- } from "./chunk-LVPBJ7MI.js";
13
+ } from "./chunk-35536GNW.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-LMDHM36X.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getAccount
3
- } from "./chunk-ASJTFFZH.js";
3
+ } from "./chunk-R7Q2L6VV.js";
4
4
 
5
5
  // src/providers/research/messari.ts
6
6
  import { base, baseSepolia } from "viem/chains";
@@ -331,17 +331,26 @@ var NansenProvider = class {
331
331
  };
332
332
  }
333
333
  /**
334
- * Wallet Profile — PnL history, transaction patterns, counterparties.
335
- * Endpoint: POST /api/v1/profiler/wallet-pnl
334
+ * Wallet Profile — PnL summary, realized/unrealized gains, token breakdown.
335
+ * Endpoint: POST /api/v1/profiler/address/pnl-summary
336
336
  * Cost: ~$0.01 (basic tier)
337
+ *
338
+ * Note: /api/v1/profiler/wallet-pnl requires an API key and does not support x402.
339
+ * The correct x402 endpoint is /api/v1/profiler/address/pnl-summary.
337
340
  */
338
341
  async walletProfile(address) {
339
342
  const fetchWithPay = await getX402Fetch();
343
+ const now = /* @__PURE__ */ new Date();
344
+ const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1e3);
340
345
  const body = {
341
- chains: ["base"],
342
- address
346
+ address,
347
+ chain: "base",
348
+ date: {
349
+ from: thirtyDaysAgo.toISOString().replace(/\.\d{3}Z$/, "Z"),
350
+ to: now.toISOString().replace(/\.\d{3}Z$/, "Z")
351
+ }
343
352
  };
344
- const res = await fetchWithPay(`${BASE_URL2}/api/v1/profiler/wallet-pnl`, {
353
+ const res = await fetchWithPay(`${BASE_URL2}/api/v1/profiler/address/pnl-summary`, {
345
354
  method: "POST",
346
355
  headers: { "Content-Type": "application/json" },
347
356
  body: JSON.stringify(body)
@@ -436,4 +445,4 @@ export {
436
445
  NansenProvider,
437
446
  getResearchProvider
438
447
  };
439
- //# sourceMappingURL=chunk-QGZUMIVO.js.map
448
+ //# sourceMappingURL=chunk-NGET2RWT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/research/messari.ts","../src/lib/x402.ts","../src/providers/research/nansen.ts","../src/providers/research/index.ts"],"sourcesContent":["/**\n * Messari research provider — x402 micropayments for crypto market data.\n *\n * Docs: https://docs.messari.io\n * Payment: x402 (USDC on Base) — no API key required\n * Data: 34,000+ assets, market metrics, asset profiles\n * Pricing: $0.10/call for asset details, ROI, ATH. $0.15–$0.35 for timeseries.\n * $0.55 for news/signals. Full pricing: https://docs.messari.io/api-reference/x402-payments\n *\n * Supports:\n * token → asset details (description, category, sector, links, market snapshot)\n * market → market metrics + ATH (price, volume, market cap, ROI, ATH, cycle low)\n *\n * Not supported (use --provider nansen instead):\n * smart-money → on-chain analytics not available in Messari x402 API\n * wallet → wallet profiling not available in Messari x402 API\n */\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { ProviderInfo } from \"../../types.js\";\nimport type { ResearchProvider, ResearchQuery, ResearchResult } from \"./index.js\";\nimport { getX402Fetch } from \"../../lib/x402.js\";\n\nconst BASE_URL = \"https://api.messari.io\";\n\n/** Known x402 cost per Messari query (approximate). */\nexport const MESSARI_COST_ESTIMATE: Record<string, string> = {\n token: \"~$0.10\",\n market: \"~$0.20\",\n};\n\nexport class MessariProvider implements ResearchProvider {\n info(): ProviderInfo {\n return {\n name: \"messari\",\n type: \"research\",\n capabilities: [\n \"research.token\",\n \"research.market\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async query(params: ResearchQuery): Promise<ResearchResult> {\n switch (params.type) {\n case \"token\":\n return this.tokenReport(params.target);\n case \"market\":\n return this.marketOverview(params.target);\n case \"smart-money\":\n throw new Error(\n \"Messari x402 API does not support on-chain analytics. Use --provider nansen for smart money data.\",\n );\n case \"wallet\":\n throw new Error(\n \"Messari does not support wallet analytics. Use --provider nansen for wallet profiling.\",\n );\n default:\n throw new Error(`Unsupported query type: ${params.type}`);\n }\n }\n\n /**\n * Resolve any user input (symbol, name, slug, address) to a Messari asset slug.\n * Uses the free /metrics/v2/assets endpoint ($0.00) to search.\n */\n private async resolveSlug(target: string): Promise<string> {\n const fetchWithPay = await getX402Fetch();\n const params = new URLSearchParams({\n search: target,\n limit: \"1\",\n });\n const url = `${BASE_URL}/metrics/v2/assets?${params}`;\n\n const res = await fetchWithPay(url, { method: \"GET\" });\n if (!res.ok) {\n throw new Error(\n `Messari asset lookup failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as {\n data?: Array<{ slug?: string }>;\n };\n\n const slug = json.data?.[0]?.slug;\n if (!slug) {\n throw new Error(\n `No Messari asset found for \"${target}\". Try a different name, symbol, or slug.`,\n );\n }\n return slug;\n }\n\n /**\n * Get asset details: description, category, sector, links, market snapshot.\n * Endpoint: GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)\n */\n private async tokenReport(target: string): Promise<ResearchResult> {\n const slug = await this.resolveSlug(target);\n const fetchWithPay = await getX402Fetch();\n const url = `${BASE_URL}/metrics/v2/assets/details?assetIDs=${encodeURIComponent(slug)}`;\n\n const res = await fetchWithPay(url, { method: \"GET\" });\n if (!res.ok) {\n throw new Error(\n `Messari token query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n const costUsdc = this.extractCost(res, \"token\");\n const asset = json.data?.[0] ?? {};\n\n return {\n provider: \"messari\",\n queryType: \"token\",\n target,\n data: asset,\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Get market metrics + ATH: price, volume, market cap, ROI, all-time high, cycle low.\n * Makes two parallel calls:\n * GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)\n * GET /metrics/v2/assets/ath?assetIDs={slug} ($0.10)\n * Total: ~$0.20\n */\n private async marketOverview(target: string): Promise<ResearchResult> {\n const slug = await this.resolveSlug(target);\n const fetchWithPay = await getX402Fetch();\n const assetParam = encodeURIComponent(slug);\n\n const [detailsRes, athRes] = await Promise.all([\n fetchWithPay(`${BASE_URL}/metrics/v2/assets/details?assetIDs=${assetParam}`, { method: \"GET\" }),\n fetchWithPay(`${BASE_URL}/metrics/v2/assets/ath?assetIDs=${assetParam}`, { method: \"GET\" }),\n ]);\n\n if (!detailsRes.ok) {\n throw new Error(\n `Messari market query failed: ${detailsRes.status} ${detailsRes.statusText}`,\n );\n }\n if (!athRes.ok) {\n throw new Error(\n `Messari ATH query failed: ${athRes.status} ${athRes.statusText}`,\n );\n }\n\n const detailsJson = (await detailsRes.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n const athJson = (await athRes.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n\n // Sum costs from both responses\n const cost1 = this.extractCostRaw(detailsRes);\n const cost2 = this.extractCostRaw(athRes);\n const totalCost = cost1 + cost2;\n const costUsdc = totalCost > 0\n ? totalCost.toFixed(4)\n : MESSARI_COST_ESTIMATE[\"market\"]?.replace(\"~$\", \"\") ?? \"unknown\";\n\n const details = detailsJson.data?.[0] ?? {};\n const ath = athJson.data?.[0] ?? {};\n\n return {\n provider: \"messari\",\n queryType: \"market\",\n target,\n data: {\n ...details,\n allTimeHigh: ath.allTimeHigh ?? null,\n },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Extract cost from x402 response headers as a number (USDC).\n * Returns 0 if no payment info found.\n */\n private extractCostRaw(res: Response): number {\n const paymentResponse = res.headers.get(\"payment-response\");\n if (paymentResponse) {\n try {\n const parsed = JSON.parse(paymentResponse) as { amount?: string };\n if (parsed.amount) {\n return Number(parsed.amount) / 1e6;\n }\n } catch {\n // Fall through\n }\n }\n return 0;\n }\n\n /**\n * Extract cost from x402 response headers as a formatted string.\n * Falls back to the known estimate for the query type when headers are absent.\n */\n private extractCost(res: Response, queryType: string = \"token\"): string {\n const cost = this.extractCostRaw(res);\n if (cost > 0) return cost.toFixed(4);\n\n // Fall back to known estimate (strip \"~$\" prefix)\n const est = MESSARI_COST_ESTIMATE[queryType];\n if (est) return est.replace(\"~$\", \"\");\n\n return \"unknown\";\n }\n}\n","/**\n * x402 fetch wrapper — wraps native fetch with automatic USDC micropayments.\n *\n * Uses the Coinbase x402 protocol: when a server responds 402 Payment Required,\n * the wrapper automatically signs a USDC payment on Base and retries the request.\n * The agent pays from its own wallet — no vault interaction needed.\n *\n * Singleton pattern matching client.ts — cached after first creation.\n */\n\nimport { getAccount } from \"./client.js\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n/**\n * Returns a fetch function that automatically handles x402 (402 Payment Required)\n * responses by signing USDC micropayments on Base.\n *\n * Lazily initializes the x402 client on first call and caches it.\n * Uses dynamic imports so @x402 packages are only loaded when research commands run.\n */\nexport async function getX402Fetch(): Promise<typeof fetch> {\n if (_x402Fetch) return _x402Fetch;\n\n const { x402Client, wrapFetchWithPayment } = await import(\"@x402/fetch\");\n const { registerExactEvmScheme } = await import(\"@x402/evm/exact/client\");\n\n const signer = getAccount();\n const client = new x402Client();\n registerExactEvmScheme(client, { signer });\n\n _x402Fetch = wrapFetchWithPayment(fetch, client) as typeof fetch;\n return _x402Fetch;\n}\n\n/**\n * Reset cached x402 fetch. Required for tests that change accounts.\n */\nexport function resetX402Fetch(): void {\n _x402Fetch = null;\n}\n","/**\n * Nansen research provider — x402 micropayments for on-chain analytics.\n *\n * Docs: https://docs.nansen.ai\n * Payment: x402 (USDC on Base) — no API key required\n * Pricing: Basic $0.01/call (Token Screener, Wallet Balances, PnL, Transactions)\n * Smart Money $0.05/call (SM Net Flow, SM Holdings, SM DEX Trades)\n * Premium $0.05/call (Counterparties, Holders, PnL Leaderboard)\n *\n * Supports all query types:\n * token → token screener (on-chain metrics, holder quality)\n * market → token screener sorted by market cap / volume\n * smart-money → smart money net flow from labeled wallets\n * wallet → wallet profiler (PnL, tx patterns, counterparties)\n */\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { ProviderInfo } from \"../../types.js\";\nimport type { ResearchProvider, ResearchQuery, ResearchResult } from \"./index.js\";\nimport { getX402Fetch } from \"../../lib/x402.js\";\n\nconst BASE_URL = \"https://api.nansen.ai\";\n\n/** Known x402 cost per Nansen query type. */\nexport const NANSEN_COST_ESTIMATE: Record<string, string> = {\n token: \"~$0.01\",\n market: \"~$0.01\",\n \"smart-money\": \"~$0.06\",\n wallet: \"~$0.01\",\n};\n\nexport class NansenProvider implements ResearchProvider {\n info(): ProviderInfo {\n return {\n name: \"nansen\",\n type: \"research\",\n capabilities: [\n \"research.token\",\n \"research.market\",\n \"research.smart-money\",\n \"research.wallet\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async query(params: ResearchQuery): Promise<ResearchResult> {\n switch (params.type) {\n case \"token\":\n return this.tokenScreener(params.target);\n case \"market\":\n return this.marketScreener(params.target);\n case \"smart-money\":\n return this.smartMoneyNetflow(params.options?.token ?? params.target);\n case \"wallet\":\n return this.walletProfile(params.target);\n default:\n throw new Error(`Unsupported query type: ${params.type}`);\n }\n }\n\n /**\n * Token Screener — comprehensive token discovery with on-chain metrics.\n * Endpoint: POST /api/v1/token-screener\n * Cost: ~$0.01 (basic tier)\n */\n private async tokenScreener(target: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n // Determine if target is an address or symbol\n const isAddr = target.startsWith(\"0x\") && target.length === 42;\n const filters: Record<string, unknown> = isAddr\n ? { token_address: [target] }\n : { token_symbol: [target.toUpperCase()] };\n\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters,\n pagination: { page: 1, records_per_page: 10 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen token query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res, \"token\");\n\n return {\n provider: \"nansen\",\n queryType: \"token\",\n target,\n data: { tokens: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Market Screener — token screener sorted by volume/market cap for market overview.\n * Endpoint: POST /api/v1/token-screener\n * Cost: ~$0.01 (basic tier)\n */\n private async marketScreener(asset: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n const isAddr = asset.startsWith(\"0x\") && asset.length === 42;\n const filters: Record<string, unknown> = isAddr\n ? { token_address: [asset] }\n : { token_symbol: [asset.toUpperCase()] };\n\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters,\n order_by: [{ field: \"buy_volume\", direction: \"desc\" }],\n pagination: { page: 1, records_per_page: 10 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen market query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res, \"market\");\n\n return {\n provider: \"nansen\",\n queryType: \"market\",\n target: asset,\n data: { tokens: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Smart Money Net Flow — capital flow analysis from labeled wallets.\n * Endpoint: POST /api/v1/smart-money/netflow\n * Cost: ~$0.05 (premium tier)\n *\n * The netflow endpoint only accepts `token_address` filters (not `token_symbol`).\n * If the target is a symbol, we resolve it to an address via the token screener first.\n */\n private async smartMoneyNetflow(\n target: string,\n ): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n // Resolve symbol → address if needed (token screener is $0.01)\n const tokenAddress = await this.resolveTokenAddress(target);\n\n const body: Record<string, unknown> = {\n chains: [\"base\"],\n pagination: { page: 1, records_per_page: 10 },\n };\n\n if (tokenAddress) {\n body.filters = { token_address: [tokenAddress] };\n }\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/smart-money/netflow`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen smart-money query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res, \"smart-money\");\n\n return {\n provider: \"nansen\",\n queryType: \"smart-money\",\n target,\n data: { flows: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Wallet Profile — PnL summary, realized/unrealized gains, token breakdown.\n * Endpoint: POST /api/v1/profiler/address/pnl-summary\n * Cost: ~$0.01 (basic tier)\n *\n * Note: /api/v1/profiler/wallet-pnl requires an API key and does not support x402.\n * The correct x402 endpoint is /api/v1/profiler/address/pnl-summary.\n */\n private async walletProfile(address: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n // pnl-summary uses `chain` (singular) + a date range, not `chains` array\n const now = new Date();\n const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n const body = {\n address,\n chain: \"base\",\n date: {\n from: thirtyDaysAgo.toISOString().replace(/\\.\\d{3}Z$/, \"Z\"),\n to: now.toISOString().replace(/\\.\\d{3}Z$/, \"Z\"),\n },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/profiler/address/pnl-summary`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen wallet query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: Record<string, unknown> };\n const costUsdc = this.extractCost(res, \"wallet\");\n\n return {\n provider: \"nansen\",\n queryType: \"wallet\",\n target: address,\n data: json.data ?? (json as Record<string, unknown>),\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Resolve a token symbol or name to its contract address on Base.\n * Uses the token screener endpoint ($0.01) to look up the address.\n * If the target is already an address (0x...), returns it as-is.\n */\n private async resolveTokenAddress(target: string): Promise<string | null> {\n if (target.startsWith(\"0x\") && target.length === 42) {\n return target;\n }\n\n const fetchWithPay = await getX402Fetch();\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters: { token_symbol: [target.toUpperCase()] },\n pagination: { page: 1, records_per_page: 1 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) return null;\n\n const json = (await res.json()) as {\n data?: Array<{ token_address?: string }>;\n };\n return json.data?.[0]?.token_address ?? null;\n }\n\n /**\n * Extract cost from x402 response headers.\n * Falls back to the known estimate for the query type when headers are absent.\n */\n private extractCost(res: Response, queryType: string): string {\n // Check Nansen-specific credit header\n const creditsUsed = res.headers.get(\"x-nansen-credits-used\");\n if (creditsUsed) {\n return creditsUsed;\n }\n\n // Fall back to x402 payment-response header\n const paymentResponse = res.headers.get(\"payment-response\");\n if (paymentResponse) {\n try {\n const parsed = JSON.parse(paymentResponse) as { amount?: string };\n if (parsed.amount) {\n const cents = Number(parsed.amount) / 1e6;\n return cents.toFixed(4);\n }\n } catch {\n // Fall through\n }\n }\n\n // Fall back to known estimate (strip \"~$\" prefix)\n const est = NANSEN_COST_ESTIMATE[queryType];\n if (est) {\n return est.replace(\"~$\", \"\");\n }\n\n return \"unknown\";\n }\n}\n","/**\n * Research providers — pluggable interface for DeFi research data via x402 micropayments.\n *\n * Same pattern as DeFi providers (Moonwell, Uniswap). Each research provider\n * implements ResearchProvider and uses x402-wrapped fetch for automatic USDC payments.\n */\n\nimport type { Provider } from \"../../types.js\";\nimport { MessariProvider } from \"./messari.js\";\nimport { NansenProvider } from \"./nansen.js\";\n\n// ── Types ──\n\nexport interface ResearchQuery {\n /** Query type determines which API endpoint is called */\n type: \"token\" | \"smart-money\" | \"market\" | \"wallet\";\n /** Token address, asset symbol, or wallet address depending on type */\n target: string;\n /** Additional query params (e.g. token symbol for smart-money queries) */\n options?: Record<string, string>;\n}\n\nexport interface ResearchResult {\n provider: string;\n queryType: string;\n target: string;\n /** Structured response data from the provider */\n data: Record<string, unknown>;\n /** Cost paid in USDC (human-readable, e.g. \"0.05\") */\n costUsdc: string;\n timestamp: number;\n}\n\nexport interface ResearchProvider extends Provider {\n /** Query the research provider. Payment is handled automatically via x402. */\n query(params: ResearchQuery): Promise<ResearchResult>;\n}\n\n// ── Factory ──\n\nexport function getResearchProvider(name: string): ResearchProvider {\n switch (name) {\n case \"messari\":\n return new MessariProvider();\n case \"nansen\":\n return new NansenProvider();\n default:\n throw new Error(\n `Unknown research provider: ${name}. Valid providers: messari, nansen`,\n );\n }\n}\n\n// ── Re-exports ──\n\nexport { MessariProvider, NansenProvider };\n"],"mappings":"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","names":["base","baseSepolia","BASE_URL","base","baseSepolia"]}
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  UNISWAP,
3
3
  UNISWAP_QUOTER_V2_ABI
4
- } from "./chunk-JR5K5WVR.js";
4
+ } from "./chunk-R75DM3VL.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  sendTxWithRetry,
9
9
  waitForReceipt
10
- } from "./chunk-ASJTFFZH.js";
10
+ } from "./chunk-R7Q2L6VV.js";
11
11
  import {
12
12
  getChain
13
- } from "./chunk-LVPBJ7MI.js";
13
+ } from "./chunk-35536GNW.js";
14
14
  import {
15
15
  getUniswapApiKey,
16
16
  getVeniceApiKey,
17
17
  setVeniceApiKey
18
- } from "./chunk-B42ZCCZ7.js";
18
+ } from "./chunk-5S2TBADL.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-PEJPTKLK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getNetwork
3
- } from "./chunk-LVPBJ7MI.js";
3
+ } from "./chunk-35536GNW.js";
4
4
 
5
5
  // src/lib/addresses.ts
6
6
  var ZERO = "0x0000000000000000000000000000000000000000";
@@ -57,13 +57,17 @@ var BASE_SEPOLIA_UNISWAP = {
57
57
  };
58
58
  var ROBINHOOD_TESTNET_TOKENS = {
59
59
  USDC: ZERO,
60
- // no Circle USDC on Robinhood L2
61
60
  WETH: "0x7943e237c7F95DA44E0301572D358911207852Fa",
62
61
  cbETH: ZERO,
63
62
  wstETH: ZERO,
64
63
  cbBTC: ZERO,
65
64
  DAI: ZERO,
66
- AERO: ZERO
65
+ AERO: ZERO,
66
+ TSLA: "0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E",
67
+ AMZN: "0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02",
68
+ PLTR: "0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0",
69
+ NFLX: "0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93",
70
+ AMD: "0x71178BAc73cBeb415514eB542a8995b82669778d"
67
71
  };
68
72
  var ROBINHOOD_TESTNET_MOONWELL = {
69
73
  COMPTROLLER: ZERO,
@@ -79,6 +83,18 @@ var ROBINHOOD_TESTNET_UNISWAP = {
79
83
  SWAP_ROUTER: ZERO,
80
84
  QUOTER_V2: ZERO
81
85
  };
86
+ var BASE_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
87
+ var BASE_SEPOLIA_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
88
+ var ROBINHOOD_TESTNET_SYNTHRA = {
89
+ ROUTER: "0x3Ce954107b1A675826B33bF23060Dd655e3758fE",
90
+ QUOTER: "0x231606c321A99DE81e28fE48B07a93F1ba49e713",
91
+ FACTORY: "0x911b4000D3422F482F4062a913885f7b035382Df"
92
+ };
93
+ var BASE_CHAINLINK = { VERIFIER_PROXY: ZERO };
94
+ var BASE_SEPOLIA_CHAINLINK = { VERIFIER_PROXY: ZERO };
95
+ var ROBINHOOD_TESTNET_CHAINLINK = {
96
+ VERIFIER_PROXY: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64"
97
+ };
82
98
  var BASE_ENS = {
83
99
  L2_REGISTRAR: "0x866996c808E6244216a3d0df15464FCF5d495394",
84
100
  L2_REGISTRY: "0x7a019ce699e27b0ad1e5b51344a58116b9f3b9b1"
@@ -112,8 +128,8 @@ var BASE_SEPOLIA_SHERWOOD = {
112
128
  GOVERNOR: "0xE5ecf2B06E3f3e298B632C0cf6575f9d9422F55E"
113
129
  };
114
130
  var ROBINHOOD_TESTNET_SHERWOOD = {
115
- FACTORY: "0xd5C4eE2E4c5B606b9401E69A3B3FeE169037C284",
116
- GOVERNOR: "0x358AD8B492BcC710BE0D7c902D8702164c35DC34"
131
+ FACTORY: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
132
+ GOVERNOR: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C"
117
133
  };
118
134
  var BASE_VENICE = {
119
135
  VVV: "0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf",
@@ -148,21 +164,24 @@ var BASE_STRATEGY_TEMPLATES = {
148
164
  AERODROME_LP: "0x1c61c740702690B86b874ab929A6F04A4Ec56C1c",
149
165
  VENICE_INFERENCE: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C",
150
166
  WSTETH_MOONWELL: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
151
- MAMO_YIELD: "0x5c98808Ce5e51767ba2d969F75312eEFF0b14a6A"
167
+ MAMO_YIELD: "0x5c98808Ce5e51767ba2d969F75312eEFF0b14a6A",
168
+ PORTFOLIO: ZERO
152
169
  };
153
170
  var BASE_SEPOLIA_STRATEGY_TEMPLATES = {
154
171
  MOONWELL_SUPPLY: ZERO,
155
172
  AERODROME_LP: ZERO,
156
173
  VENICE_INFERENCE: ZERO,
157
174
  WSTETH_MOONWELL: ZERO,
158
- MAMO_YIELD: ZERO
175
+ MAMO_YIELD: ZERO,
176
+ PORTFOLIO: ZERO
159
177
  };
160
178
  var ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {
161
179
  MOONWELL_SUPPLY: ZERO,
162
180
  AERODROME_LP: ZERO,
163
181
  VENICE_INFERENCE: ZERO,
164
182
  WSTETH_MOONWELL: ZERO,
165
- MAMO_YIELD: ZERO
183
+ MAMO_YIELD: ZERO,
184
+ PORTFOLIO: "0xAe981882923E0C76A7F10E7cAa3782023c0abd9B"
166
185
  };
167
186
  var BASE_EAS = {
168
187
  EAS: "0x4200000000000000000000000000000000000021",
@@ -245,6 +264,16 @@ var STRATEGY_TEMPLATE_REGISTRY = {
245
264
  "base-sepolia": BASE_SEPOLIA_STRATEGY_TEMPLATES,
246
265
  "robinhood-testnet": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES
247
266
  };
267
+ var SYNTHRA_REGISTRY = {
268
+ base: BASE_SYNTHRA,
269
+ "base-sepolia": BASE_SEPOLIA_SYNTHRA,
270
+ "robinhood-testnet": ROBINHOOD_TESTNET_SYNTHRA
271
+ };
272
+ var CHAINLINK_REGISTRY = {
273
+ base: BASE_CHAINLINK,
274
+ "base-sepolia": BASE_SEPOLIA_CHAINLINK,
275
+ "robinhood-testnet": ROBINHOOD_TESTNET_CHAINLINK
276
+ };
248
277
  var EAS_CONTRACT_REGISTRY = {
249
278
  base: BASE_EAS,
250
279
  "base-sepolia": BASE_SEPOLIA_EAS,
@@ -288,6 +317,12 @@ function EAS_CONTRACTS() {
288
317
  function EAS_SCHEMAS() {
289
318
  return EAS_SCHEMA_REGISTRY[getNetwork()];
290
319
  }
320
+ function SYNTHRA() {
321
+ return SYNTHRA_REGISTRY[getNetwork()];
322
+ }
323
+ function CHAINLINK() {
324
+ return CHAINLINK_REGISTRY[getNetwork()];
325
+ }
291
326
 
292
327
  // src/lib/abis.ts
293
328
  var SYNDICATE_VAULT_ABI = [
@@ -1477,6 +1512,121 @@ var BASE_STRATEGY_ABI = [
1477
1512
  outputs: [{ name: "", type: "uint8" }]
1478
1513
  }
1479
1514
  ];
1515
+ var PORTFOLIO_STRATEGY_ABI = [
1516
+ // Inherited from BaseStrategy
1517
+ ...BASE_STRATEGY_ABI,
1518
+ // Rebalancing
1519
+ {
1520
+ name: "rebalance",
1521
+ type: "function",
1522
+ stateMutability: "nonpayable",
1523
+ inputs: [],
1524
+ outputs: []
1525
+ },
1526
+ {
1527
+ name: "rebalanceDelta",
1528
+ type: "function",
1529
+ stateMutability: "nonpayable",
1530
+ inputs: [{ name: "priceReports", type: "bytes[]" }],
1531
+ outputs: []
1532
+ },
1533
+ // View functions
1534
+ {
1535
+ name: "getAllocations",
1536
+ type: "function",
1537
+ stateMutability: "view",
1538
+ inputs: [],
1539
+ outputs: [
1540
+ {
1541
+ name: "",
1542
+ type: "tuple[]",
1543
+ components: [
1544
+ { name: "token", type: "address" },
1545
+ { name: "targetWeightBps", type: "uint256" },
1546
+ { name: "tokenAmount", type: "uint256" },
1547
+ { name: "investedAmount", type: "uint256" }
1548
+ ]
1549
+ }
1550
+ ]
1551
+ },
1552
+ {
1553
+ name: "allocationCount",
1554
+ type: "function",
1555
+ stateMutability: "view",
1556
+ inputs: [],
1557
+ outputs: [{ name: "", type: "uint256" }]
1558
+ },
1559
+ {
1560
+ name: "asset",
1561
+ type: "function",
1562
+ stateMutability: "view",
1563
+ inputs: [],
1564
+ outputs: [{ name: "", type: "address" }]
1565
+ },
1566
+ {
1567
+ name: "totalAmount",
1568
+ type: "function",
1569
+ stateMutability: "view",
1570
+ inputs: [],
1571
+ outputs: [{ name: "", type: "uint256" }]
1572
+ },
1573
+ {
1574
+ name: "maxSlippageBps",
1575
+ type: "function",
1576
+ stateMutability: "view",
1577
+ inputs: [],
1578
+ outputs: [{ name: "", type: "uint256" }]
1579
+ },
1580
+ {
1581
+ name: "swapAdapter",
1582
+ type: "function",
1583
+ stateMutability: "view",
1584
+ inputs: [],
1585
+ outputs: [{ name: "", type: "address" }]
1586
+ },
1587
+ {
1588
+ name: "getSwapExtraData",
1589
+ type: "function",
1590
+ stateMutability: "view",
1591
+ inputs: [],
1592
+ outputs: [{ name: "", type: "bytes[]" }]
1593
+ },
1594
+ // Events
1595
+ {
1596
+ name: "WeightsUpdated",
1597
+ type: "event",
1598
+ inputs: [
1599
+ { name: "tokens", type: "address[]", indexed: false },
1600
+ { name: "oldWeights", type: "uint256[]", indexed: false },
1601
+ { name: "newWeights", type: "uint256[]", indexed: false }
1602
+ ]
1603
+ },
1604
+ {
1605
+ name: "Rebalanced",
1606
+ type: "event",
1607
+ inputs: [
1608
+ { name: "tokens", type: "address[]", indexed: false },
1609
+ { name: "oldWeights", type: "uint256[]", indexed: false },
1610
+ { name: "newWeights", type: "uint256[]", indexed: false },
1611
+ { name: "oldBalances", type: "uint256[]", indexed: false },
1612
+ { name: "newBalances", type: "uint256[]", indexed: false },
1613
+ { name: "totalAssetValue", type: "uint256", indexed: false }
1614
+ ]
1615
+ },
1616
+ {
1617
+ name: "RebalancedDelta",
1618
+ type: "event",
1619
+ inputs: [
1620
+ { name: "tokens", type: "address[]", indexed: false },
1621
+ { name: "oldWeights", type: "uint256[]", indexed: false },
1622
+ { name: "newWeights", type: "uint256[]", indexed: false },
1623
+ { name: "oldBalances", type: "uint256[]", indexed: false },
1624
+ { name: "newBalances", type: "uint256[]", indexed: false },
1625
+ { name: "totalAssetValue", type: "uint256", indexed: false },
1626
+ { name: "swapsExecuted", type: "uint256", indexed: false }
1627
+ ]
1628
+ }
1629
+ ];
1480
1630
 
1481
1631
  export {
1482
1632
  TOKENS,
@@ -1490,6 +1640,8 @@ export {
1490
1640
  STRATEGY_TEMPLATES,
1491
1641
  EAS_CONTRACTS,
1492
1642
  EAS_SCHEMAS,
1643
+ SYNTHRA,
1644
+ CHAINLINK,
1493
1645
  SYNDICATE_VAULT_ABI,
1494
1646
  UNISWAP_QUOTER_V2_ABI,
1495
1647
  SWAP_ROUTER_ABI,
@@ -1500,6 +1652,7 @@ export {
1500
1652
  VENICE_STAKING_ABI,
1501
1653
  EAS_ABI,
1502
1654
  SYNDICATE_GOVERNOR_ABI,
1503
- BASE_STRATEGY_ABI
1655
+ BASE_STRATEGY_ABI,
1656
+ PORTFOLIO_STRATEGY_ABI
1504
1657
  };
1505
- //# sourceMappingURL=chunk-JR5K5WVR.js.map
1658
+ //# sourceMappingURL=chunk-R75DM3VL.js.map