@sherwoodagent/cli 0.19.0 → 0.19.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 (46) hide show
  1. package/dist/{chat-MUUC5L5W.js → chat-WKOSUZXO.js} +7 -7
  2. package/dist/{chunk-G2RQLZZI.js → chunk-CTLEZZO7.js} +4 -4
  3. package/dist/{chunk-HRA2KPGW.js → chunk-I7CKBBOG.js} +3 -3
  4. package/dist/{chunk-W76CHVD3.js → chunk-LHDWONBI.js} +2 -2
  5. package/dist/{chunk-WHCXQBPS.js → chunk-P4J6FKAP.js} +4 -4
  6. package/dist/{chunk-VZZ2V6EM.js → chunk-QT7BUKWR.js} +5 -5
  7. package/dist/{chunk-B4BMCXWK.js → chunk-SZ5QQJGA.js} +2 -2
  8. package/dist/chunk-SZ5QQJGA.js.map +1 -0
  9. package/dist/{chunk-FEDSWXSD.js → chunk-TAAEMX3L.js} +2 -2
  10. package/dist/{chunk-ZXV4TBPE.js → chunk-XR2ZUO4R.js} +2 -2
  11. package/dist/{chunk-DCT3IDBS.js → chunk-YJAMY25R.js} +14 -7
  12. package/dist/chunk-YJAMY25R.js.map +1 -0
  13. package/dist/{client-I56MIQAM.js → client-3AAXAX4C.js} +4 -4
  14. package/dist/{config-2VMLHIXD.js → config-IDAHD7S3.js} +2 -2
  15. package/dist/{eas-YZF6MN65.js → eas-JE3NQCXE.js} +6 -6
  16. package/dist/{governor-ZWKGLGMG.js → governor-J3W67NXA.js} +6 -6
  17. package/dist/index.js +29 -22
  18. package/dist/index.js.map +1 -1
  19. package/dist/{network-3MVRM7O4.js → network-DBUZ7GRF.js} +3 -3
  20. package/dist/{research-VZKLOTMU.js → research-47YMVW3N.js} +7 -7
  21. package/dist/research-DZINC4N4.js +14 -0
  22. package/dist/{session-X3QFFCJ7.js → session-Q2WRYXYF.js} +10 -10
  23. package/dist/{trade-YCBFXOB3.js → trade-D6VT5MLQ.js} +10 -10
  24. package/dist/{xmtp-IH57GYSR.js → xmtp-7DF7UG66.js} +6 -6
  25. package/package.json +1 -1
  26. package/dist/chunk-B4BMCXWK.js.map +0 -1
  27. package/dist/chunk-DCT3IDBS.js.map +0 -1
  28. package/dist/research-HC2UOLFT.js +0 -14
  29. /package/dist/{chat-MUUC5L5W.js.map → chat-WKOSUZXO.js.map} +0 -0
  30. /package/dist/{chunk-G2RQLZZI.js.map → chunk-CTLEZZO7.js.map} +0 -0
  31. /package/dist/{chunk-HRA2KPGW.js.map → chunk-I7CKBBOG.js.map} +0 -0
  32. /package/dist/{chunk-W76CHVD3.js.map → chunk-LHDWONBI.js.map} +0 -0
  33. /package/dist/{chunk-WHCXQBPS.js.map → chunk-P4J6FKAP.js.map} +0 -0
  34. /package/dist/{chunk-VZZ2V6EM.js.map → chunk-QT7BUKWR.js.map} +0 -0
  35. /package/dist/{chunk-FEDSWXSD.js.map → chunk-TAAEMX3L.js.map} +0 -0
  36. /package/dist/{chunk-ZXV4TBPE.js.map → chunk-XR2ZUO4R.js.map} +0 -0
  37. /package/dist/{client-I56MIQAM.js.map → client-3AAXAX4C.js.map} +0 -0
  38. /package/dist/{config-2VMLHIXD.js.map → config-IDAHD7S3.js.map} +0 -0
  39. /package/dist/{eas-YZF6MN65.js.map → eas-JE3NQCXE.js.map} +0 -0
  40. /package/dist/{governor-ZWKGLGMG.js.map → governor-J3W67NXA.js.map} +0 -0
  41. /package/dist/{network-3MVRM7O4.js.map → network-DBUZ7GRF.js.map} +0 -0
  42. /package/dist/{research-VZKLOTMU.js.map → research-47YMVW3N.js.map} +0 -0
  43. /package/dist/{research-HC2UOLFT.js.map → research-DZINC4N4.js.map} +0 -0
  44. /package/dist/{session-X3QFFCJ7.js.map → session-Q2WRYXYF.js.map} +0 -0
  45. /package/dist/{trade-YCBFXOB3.js.map → trade-D6VT5MLQ.js.map} +0 -0
  46. /package/dist/{xmtp-IH57GYSR.js.map → xmtp-7DF7UG66.js.map} +0 -0
@@ -2,22 +2,22 @@ import {
2
2
  getTextRecord,
3
3
  resolveSyndicate,
4
4
  setTextRecord
5
- } from "./chunk-VZZ2V6EM.js";
6
- import "./chunk-W76CHVD3.js";
5
+ } from "./chunk-QT7BUKWR.js";
6
+ import "./chunk-LHDWONBI.js";
7
7
  import {
8
8
  getAccount
9
- } from "./chunk-HRA2KPGW.js";
10
- import "./chunk-FEDSWXSD.js";
9
+ } from "./chunk-I7CKBBOG.js";
10
+ import "./chunk-TAAEMX3L.js";
11
11
  import {
12
12
  cacheGroupId,
13
13
  getCachedGroupId
14
- } from "./chunk-B4BMCXWK.js";
14
+ } from "./chunk-SZ5QQJGA.js";
15
15
 
16
16
  // src/commands/chat.ts
17
17
  import chalk from "chalk";
18
18
  import ora from "ora";
19
19
  async function loadXmtp() {
20
- return import("./xmtp-IH57GYSR.js");
20
+ return import("./xmtp-7DF7UG66.js");
21
21
  }
22
22
  function formatTimestamp(date) {
23
23
  return `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}`;
@@ -352,4 +352,4 @@ function registerChatCommands(program) {
352
352
  export {
353
353
  registerChatCommands
354
354
  };
355
- //# sourceMappingURL=chat-MUUC5L5W.js.map
355
+ //# sourceMappingURL=chat-WKOSUZXO.js.map
@@ -2,17 +2,17 @@ import {
2
2
  EAS_ABI,
3
3
  EAS_CONTRACTS,
4
4
  EAS_SCHEMAS
5
- } from "./chunk-W76CHVD3.js";
5
+ } from "./chunk-LHDWONBI.js";
6
6
  import {
7
7
  getAccount,
8
8
  getPublicClient,
9
9
  getWalletClient
10
- } from "./chunk-HRA2KPGW.js";
10
+ } from "./chunk-I7CKBBOG.js";
11
11
  import {
12
12
  getChain,
13
13
  getChainConfig,
14
14
  getNetwork
15
- } from "./chunk-FEDSWXSD.js";
15
+ } from "./chunk-TAAEMX3L.js";
16
16
 
17
17
  // src/lib/eas.ts
18
18
  import { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from "viem";
@@ -399,4 +399,4 @@ export {
399
399
  queryApprovals,
400
400
  queryJoinRequests
401
401
  };
402
- //# sourceMappingURL=chunk-G2RQLZZI.js.map
402
+ //# sourceMappingURL=chunk-CTLEZZO7.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  getChain,
3
3
  getRpcUrl
4
- } from "./chunk-FEDSWXSD.js";
4
+ } from "./chunk-TAAEMX3L.js";
5
5
  import {
6
6
  loadConfig
7
- } from "./chunk-B4BMCXWK.js";
7
+ } from "./chunk-SZ5QQJGA.js";
8
8
 
9
9
  // src/lib/client.ts
10
10
  import { createPublicClient, createWalletClient, http } from "viem";
@@ -126,4 +126,4 @@ export {
126
126
  sendTxWithRetry,
127
127
  writeContractWithRetry
128
128
  };
129
- //# sourceMappingURL=chunk-HRA2KPGW.js.map
129
+ //# sourceMappingURL=chunk-I7CKBBOG.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getNetwork
3
- } from "./chunk-FEDSWXSD.js";
3
+ } from "./chunk-TAAEMX3L.js";
4
4
 
5
5
  // src/lib/addresses.ts
6
6
  var ZERO = "0x0000000000000000000000000000000000000000";
@@ -1463,4 +1463,4 @@ export {
1463
1463
  SYNDICATE_GOVERNOR_ABI,
1464
1464
  BASE_STRATEGY_ABI
1465
1465
  };
1466
- //# sourceMappingURL=chunk-W76CHVD3.js.map
1466
+ //# sourceMappingURL=chunk-LHDWONBI.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  SHERWOOD,
3
3
  SYNDICATE_GOVERNOR_ABI
4
- } from "./chunk-W76CHVD3.js";
4
+ } from "./chunk-LHDWONBI.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  getWalletClient
9
- } from "./chunk-HRA2KPGW.js";
9
+ } from "./chunk-I7CKBBOG.js";
10
10
  import {
11
11
  getChain
12
- } from "./chunk-FEDSWXSD.js";
12
+ } from "./chunk-TAAEMX3L.js";
13
13
 
14
14
  // src/lib/governor.ts
15
15
  import { parseEventLogs } from "viem";
@@ -455,4 +455,4 @@ export {
455
455
  vetoProposal,
456
456
  setProtocolFeeBps
457
457
  };
458
- //# sourceMappingURL=chunk-WHCXQBPS.js.map
458
+ //# sourceMappingURL=chunk-P4J6FKAP.js.map
@@ -5,19 +5,19 @@ import {
5
5
  SHERWOOD,
6
6
  SYNDICATE_FACTORY_ABI,
7
7
  SYNDICATE_VAULT_ABI
8
- } from "./chunk-W76CHVD3.js";
8
+ } from "./chunk-LHDWONBI.js";
9
9
  import {
10
10
  estimateFeesWithBuffer,
11
11
  getAccount,
12
12
  getPublicClient,
13
13
  getWalletClient
14
- } from "./chunk-HRA2KPGW.js";
14
+ } from "./chunk-I7CKBBOG.js";
15
15
  import {
16
16
  getChain
17
- } from "./chunk-FEDSWXSD.js";
17
+ } from "./chunk-TAAEMX3L.js";
18
18
  import {
19
19
  getChainContracts
20
- } from "./chunk-B4BMCXWK.js";
20
+ } from "./chunk-SZ5QQJGA.js";
21
21
 
22
22
  // src/lib/vault.ts
23
23
  import { formatUnits } from "viem";
@@ -329,4 +329,4 @@ export {
329
329
  setTextRecord,
330
330
  getTextRecord
331
331
  };
332
- //# sourceMappingURL=chunk-VZZ2V6EM.js.map
332
+ //# sourceMappingURL=chunk-QT7BUKWR.js.map
@@ -29,7 +29,7 @@ function setVeniceApiKey(apiKey) {
29
29
  saveConfig(config);
30
30
  }
31
31
  function getVeniceApiKey() {
32
- return loadConfig().veniceApiKey;
32
+ return loadConfig().veniceApiKey ?? process.env.VENICE_API_KEY;
33
33
  }
34
34
  function setAgentId(agentId) {
35
35
  const config = loadConfig();
@@ -105,4 +105,4 @@ export {
105
105
  setNotifyTo,
106
106
  setChainContract
107
107
  };
108
- //# sourceMappingURL=chunk-B4BMCXWK.js.map
108
+ //# sourceMappingURL=chunk-SZ5QQJGA.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\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 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}\n\nexport function loadConfig(): SherwoodConfig {\n if (fs.existsSync(CONFIG_PATH)) {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\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"],"mappings":";AAMA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,IAAM,aAAa,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW;AACtD,IAAM,cAAc,KAAK,KAAK,YAAY,aAAa;AAsBhD,SAAS,aAA6B;AAC3C,MAAI,GAAG,WAAW,WAAW,GAAG;AAC9B,WAAO,KAAK,MAAM,GAAG,aAAa,aAAa,OAAO,CAAC;AAAA,EACzD;AAEA,SAAO,EAAE,YAAY,CAAC,EAAE;AAC1B;AAEO,SAAS,WAAW,QAA8B;AACvD,KAAG,UAAU,YAAY,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACzD,KAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAChF;AAEO,SAAS,aAAa,WAAmB,SAAuB;AACrE,QAAM,SAAS,WAAW;AAC1B,SAAO,WAAW,SAAS,IAAI;AAC/B,aAAW,MAAM;AACnB;AAEO,SAAS,iBAAiB,WAAuC;AACtE,QAAM,SAAS,WAAW;AAC1B,SAAO,OAAO,WAAW,SAAS;AACpC;AAEO,SAAS,gBAAgB,QAAsB;AACpD,QAAM,SAAS,WAAW;AAC1B,SAAO,eAAe;AACtB,aAAW,MAAM;AACnB;AAEO,SAAS,kBAAsC;AACpD,SAAO,WAAW,EAAE,gBAAgB,QAAQ,IAAI;AAClD;AAEO,SAAS,WAAW,SAAuB;AAChD,QAAM,SAAS,WAAW;AAC1B,SAAO,UAAU;AACjB,aAAW,MAAM;AACnB;AAEO,SAAS,aAAiC;AAC/C,SAAO,WAAW,EAAE;AACtB;AAEO,SAAS,cAAc,KAAmB;AAC/C,QAAM,SAAS,WAAW;AAC1B,SAAO,aAAa,IAAI,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG;AACzD,aAAW,MAAM;AACnB;AAEO,SAAS,gBAAoC;AAClD,SAAO,WAAW,EAAE;AACtB;AAIO,SAAS,iBAAiB,QAAsB;AACrD,QAAM,SAAS,WAAW;AAC1B,SAAO,gBAAgB;AACvB,aAAW,MAAM;AACnB;AAEO,SAAS,mBAAuC;AACrD,SAAO,WAAW,EAAE,iBAAiB,QAAQ,IAAI;AACnD;AAIO,SAAS,gBAAgB,SAAqC;AACnE,SAAO,WAAW,EAAE,MAAM,OAAO;AACnC;AAEO,SAAS,gBAAgB,SAAiB,KAAmB;AAClE,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,IAAK,QAAO,MAAM,CAAC;AAC/B,SAAO,IAAI,OAAO,IAAI;AACtB,aAAW,MAAM;AACnB;AAIO,SAAS,kBAAkB,SAAiC;AACjE,QAAM,SAAS,WAAW;AAC1B,SAAO,OAAO,YAAY,OAAO,OAAO,CAAC,KAAK,CAAC;AACjD;AAEO,SAAS,cAAkC;AAChD,SAAO,WAAW,EAAE;AACtB;AAEO,SAAS,YAAY,IAAkB;AAC5C,QAAM,SAAS,WAAW;AAC1B,SAAO,WAAW;AAClB,aAAW,MAAM;AACnB;AAEO,SAAS,iBACd,SACA,KACA,OACM;AACN,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,UAAW,QAAO,YAAY,CAAC;AAC3C,QAAM,MAAM,OAAO,OAAO;AAC1B,MAAI,CAAC,OAAO,UAAU,GAAG,EAAG,QAAO,UAAU,GAAG,IAAI,CAAC;AACrD,SAAO,UAAU,GAAG,EAAE,GAAG,IAAI;AAC7B,aAAW,MAAM;AACnB;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getConfigRpcUrl
3
- } from "./chunk-B4BMCXWK.js";
3
+ } from "./chunk-SZ5QQJGA.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-FEDSWXSD.js.map
107
+ //# sourceMappingURL=chunk-TAAEMX3L.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getAccount
3
- } from "./chunk-HRA2KPGW.js";
3
+ } from "./chunk-I7CKBBOG.js";
4
4
 
5
5
  // src/providers/research/messari.ts
6
6
  import { base, baseSepolia } from "viem/chains";
@@ -436,4 +436,4 @@ export {
436
436
  NansenProvider,
437
437
  getResearchProvider
438
438
  };
439
- //# sourceMappingURL=chunk-ZXV4TBPE.js.map
439
+ //# sourceMappingURL=chunk-XR2ZUO4R.js.map
@@ -2,20 +2,20 @@ import {
2
2
  ERC20_ABI,
3
3
  UNISWAP,
4
4
  UNISWAP_QUOTER_V2_ABI
5
- } from "./chunk-W76CHVD3.js";
5
+ } from "./chunk-LHDWONBI.js";
6
6
  import {
7
7
  getAccount,
8
8
  getPublicClient,
9
9
  writeContractWithRetry
10
- } from "./chunk-HRA2KPGW.js";
10
+ } from "./chunk-I7CKBBOG.js";
11
11
  import {
12
12
  getChain
13
- } from "./chunk-FEDSWXSD.js";
13
+ } from "./chunk-TAAEMX3L.js";
14
14
  import {
15
15
  getUniswapApiKey,
16
16
  getVeniceApiKey,
17
17
  setVeniceApiKey
18
- } from "./chunk-B4BMCXWK.js";
18
+ } from "./chunk-SZ5QQJGA.js";
19
19
 
20
20
  // src/providers/uniswap.ts
21
21
  import { isAddress } from "viem";
@@ -175,7 +175,7 @@ var UniswapProvider = class {
175
175
  account,
176
176
  chain: getChain()
177
177
  });
178
- const { getWalletClient } = await import("./client-I56MIQAM.js");
178
+ const { getWalletClient } = await import("./client-3AAXAX4C.js");
179
179
  const wallet = getWalletClient();
180
180
  const approvalHash = await wallet.sendTransaction({
181
181
  to: data.approval.to,
@@ -241,7 +241,7 @@ var UniswapProvider = class {
241
241
  if (!isAddress(swapData.swap.to) || !isAddress(swapData.swap.from)) {
242
242
  throw new Error("Invalid address in swap response");
243
243
  }
244
- const { getWalletClient } = await import("./client-I56MIQAM.js");
244
+ const { getWalletClient } = await import("./client-3AAXAX4C.js");
245
245
  const wallet = getWalletClient();
246
246
  const hash = await wallet.sendTransaction({
247
247
  to: swapData.swap.to,
@@ -263,7 +263,14 @@ var UniswapProvider = class {
263
263
  var VENICE_API_BASE = "https://api.venice.ai/api/v1";
264
264
  async function provisionApiKey() {
265
265
  const account = getAccount();
266
+ const adminKey = process.env.VENICE_ADMIN_KEY;
267
+ if (!adminKey) {
268
+ throw new Error(
269
+ "VENICE_ADMIN_KEY env var required for autonomous provisioning.\n Get an admin key from https://venice.ai/settings/api-keys\n Or set a key manually: sherwood config set --venice-api-key <key>"
270
+ );
271
+ }
266
272
  const tokenRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {
273
+ headers: { Authorization: `Bearer ${adminKey}` },
267
274
  signal: AbortSignal.timeout(15e3)
268
275
  });
269
276
  if (!tokenRes.ok) {
@@ -455,4 +462,4 @@ export {
455
462
  encodeSwapPath,
456
463
  getMultiHopQuote
457
464
  };
458
- //# sourceMappingURL=chunk-DCT3IDBS.js.map
465
+ //# sourceMappingURL=chunk-YJAMY25R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/uniswap.ts","../src/lib/venice.ts","../src/lib/quote.ts"],"sourcesContent":["/**\n * Uniswap Trading API provider — swaps on Base via the hosted API.\n *\n * Uses the 3-step flow:\n * 1. POST /check_approval → check/submit token approval\n * 2. POST /quote → get optimal route + executable quote\n * 3. POST /swap → get transaction calldata to sign\n *\n * API key required — set via `sherwood config set --uniswap-api-key <key>`\n * or UNISWAP_API_KEY env var.\n *\n * Docs: https://docs.uniswap.org/api/trading-api\n * Key: https://developers.uniswap.org/\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { isAddress, isHex, formatUnits } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { TradingProvider, ProviderInfo, SwapParams, SwapQuoteParams, TxResult, SwapQuote } from \"../types.js\";\nimport { getPublicClient, getAccount, writeContractWithRetry } from \"../lib/client.js\";\nimport { getChain } from \"../lib/network.js\";\nimport { getUniswapApiKey } from \"../lib/config.js\";\nimport { ERC20_ABI } from \"../lib/abis.js\";\n\nconst API_BASE = \"https://trade-api.gateway.uniswap.org/v1\";\n\n// ── API Types ──\n\ninterface ApprovalResponse {\n approval: {\n to: Address;\n from: Address;\n data: Hex;\n value: string;\n chainId: number;\n } | null;\n}\n\n// CLASSIC route quote\ninterface ClassicQuote {\n routing: \"CLASSIC\" | \"WRAP\" | \"UNWRAP\";\n quote: {\n input: { token: string; amount: string };\n output: { token: string; amount: string };\n slippage: number;\n route: unknown[];\n gasFee: string;\n gasFeeUSD: string;\n gasUseEstimate: string;\n };\n permitData: Record<string, unknown> | null;\n}\n\n// UniswapX route quote (PRIORITY on Base)\ninterface UniswapXQuote {\n routing: \"DUTCH_V2\" | \"DUTCH_V3\" | \"PRIORITY\";\n quote: {\n orderInfo: {\n outputs: Array<{\n token: string;\n startAmount: string;\n endAmount: string;\n recipient: string;\n }>;\n input: { token: string; startAmount: string; endAmount: string };\n deadline: number;\n nonce: string;\n };\n encodedOrder: string;\n orderHash: string;\n };\n permitData: Record<string, unknown> | null;\n}\n\ntype QuoteResponse = ClassicQuote | UniswapXQuote;\n\ninterface SwapResponse {\n swap: {\n to: Address;\n from: Address;\n data: Hex;\n value: string;\n chainId: number;\n gasLimit?: string;\n };\n}\n\n// ── Helpers ──\n\nfunction getApiKey(): string {\n const key = getUniswapApiKey();\n if (!key) {\n throw new Error(\n \"Uniswap API key not configured. Run 'sherwood config set --uniswap-api-key <key>' \" +\n \"or set UNISWAP_API_KEY env var.\\n\" +\n \"Get your key at https://developers.uniswap.org/\",\n );\n }\n return key;\n}\n\nfunction apiHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": getApiKey(),\n \"x-universal-router-version\": \"2.0\",\n };\n}\n\nfunction isUniswapXRouting(routing: string): boolean {\n return routing === \"DUTCH_V2\" || routing === \"DUTCH_V3\" || routing === \"PRIORITY\";\n}\n\nfunction getOutputAmount(q: QuoteResponse): string {\n if (isUniswapXRouting(q.routing)) {\n const ux = q as UniswapXQuote;\n const firstOutput = ux.quote.orderInfo.outputs[0];\n if (!firstOutput) throw new Error(\"UniswapX quote has no outputs\");\n return firstOutput.startAmount; // best-case fill\n }\n return (q as ClassicQuote).quote.output.amount;\n}\n\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n maxRetries = 3,\n): Promise<Response> {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const response = await fetch(url, {\n ...init,\n signal: AbortSignal.timeout(30_000),\n });\n if (response.status !== 429 && response.status < 500) return response;\n if (attempt === maxRetries) return response;\n\n const delay = Math.min(200 * Math.pow(2, attempt) + Math.random() * 100, 10000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n throw new Error(\"Unreachable\");\n}\n\n// ── Provider ──\n\nexport class UniswapProvider implements TradingProvider {\n info(): ProviderInfo {\n return {\n name: \"uniswap\",\n type: \"trading\",\n capabilities: [\n \"swap.exact-input\",\n \"swap.quote\",\n \"swap.check-approval\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n /**\n * Get a quote from the Uniswap Trading API.\n * Returns the optimal route (CLASSIC, PRIORITY, or UniswapX).\n */\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\n const account = getAccount();\n const chainId = getChain().id;\n\n const body = {\n swapper: account.address,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n tokenInChainId: String(chainId),\n tokenOutChainId: String(chainId),\n amount: params.amountIn.toString(),\n type: \"EXACT_INPUT\",\n slippageTolerance: 0.5,\n routingPreference: \"BEST_PRICE\",\n };\n\n const res = await fetchWithRetry(`${API_BASE}/quote`, {\n method: \"POST\",\n headers: apiHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Uniswap quote failed (${res.status}): ${err}`);\n }\n\n const data = (await res.json()) as QuoteResponse;\n const amountOut = BigInt(getOutputAmount(data));\n\n return {\n amountOut,\n priceImpact: 0,\n route: `${data.routing}: ${params.tokenIn.slice(0, 8)}→${params.tokenOut.slice(0, 8)}`,\n };\n }\n\n /**\n * Get a full quote response (preserving the raw API response for swap execution).\n */\n async fullQuote(params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n slippageTolerance?: number;\n }): Promise<{ quoteResponse: QuoteResponse; amountOut: bigint; routing: string }> {\n const account = getAccount();\n const chainId = getChain().id;\n\n const body = {\n swapper: account.address,\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n tokenInChainId: String(chainId),\n tokenOutChainId: String(chainId),\n amount: params.amountIn.toString(),\n type: \"EXACT_INPUT\",\n slippageTolerance: params.slippageTolerance ?? 0.5,\n routingPreference: \"BEST_PRICE\",\n };\n\n const res = await fetchWithRetry(`${API_BASE}/quote`, {\n method: \"POST\",\n headers: apiHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Uniswap quote failed (${res.status}): ${err}`);\n }\n\n const quoteResponse = (await res.json()) as QuoteResponse;\n const amountOut = BigInt(getOutputAmount(quoteResponse));\n return { quoteResponse, amountOut, routing: quoteResponse.routing };\n }\n\n /**\n * Check and handle token approval for Uniswap.\n * Uses the Trading API's /check_approval endpoint.\n */\n async checkApproval(params: {\n token: Address;\n amount: bigint;\n }): Promise<void> {\n const account = getAccount();\n const chainId = getChain().id;\n const client = getPublicClient();\n\n const res = await fetchWithRetry(`${API_BASE}/check_approval`, {\n method: \"POST\",\n headers: apiHeaders(),\n body: JSON.stringify({\n walletAddress: account.address,\n token: params.token,\n amount: params.amount.toString(),\n chainId,\n }),\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Approval check failed (${res.status}): ${err}`);\n }\n\n const data = (await res.json()) as ApprovalResponse;\n\n if (data.approval) {\n // Submit the approval transaction\n const hash = await writeContractWithRetry({\n address: data.approval.to,\n abi: ERC20_ABI,\n functionName: \"approve\",\n // Decode the approval data — the API returns the full calldata\n // but we need to send the raw transaction\n args: [], // unused — we send raw data\n account,\n chain: getChain(),\n });\n\n // Actually, the API returns a ready-to-send transaction, so use sendTransaction\n // Let's use the wallet client directly\n const { getWalletClient } = await import(\"../lib/client.js\");\n const wallet = getWalletClient();\n const approvalHash = await wallet.sendTransaction({\n to: data.approval.to,\n data: data.approval.data,\n value: BigInt(data.approval.value || \"0\"),\n account,\n chain: getChain(),\n });\n await client.waitForTransactionReceipt({ hash: approvalHash });\n }\n }\n\n /**\n * Execute a swap via the Uniswap Trading API.\n *\n * Full flow: check_approval → quote → swap → sign & broadcast.\n */\n async swap(params: SwapParams): Promise<TxResult> {\n const account = getAccount();\n const client = getPublicClient();\n\n // 1. Check approval (skip for native ETH)\n const ETH_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\n if (params.tokenIn !== ETH_ADDRESS) {\n await this.checkApproval({\n token: params.tokenIn,\n amount: params.amountIn,\n });\n }\n\n // 2. Get quote\n const slippageBps = params.fee; // repurpose fee field for slippage in API mode\n const { quoteResponse } = await this.fullQuote({\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n slippageTolerance: 0.5, // 0.5%\n });\n\n // 3. Prepare swap request — routing-aware permitData handling\n const quoteRaw = quoteResponse as unknown as Record<string, unknown>;\n const { permitData, ...cleanQuote } = quoteRaw;\n const swapRequest: Record<string, unknown> = { ...cleanQuote };\n\n // UniswapX routes: permitData is for local signing only, must NOT be sent to /swap\n // For CLASSIC routes without Permit2: omit both signature and permitData\n // (We use direct approval via /check_approval, not Permit2)\n if (isUniswapXRouting(quoteResponse.routing)) {\n // UniswapX: sign the order with permitData locally\n if (permitData && typeof permitData === \"object\") {\n const typedData = permitData as {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n values: Record<string, unknown>;\n };\n const signature = await account.signTypedData({\n domain: typedData.domain as Record<string, unknown>,\n types: typedData.types as Record<string, Array<{ name: string; type: string }>>,\n primaryType: Object.keys(typedData.types).find((k) => k !== \"EIP712Domain\") ?? \"PermitWitnessTransferFrom\",\n message: typedData.values,\n });\n swapRequest.signature = signature;\n }\n }\n // For CLASSIC: no signature/permitData needed (we use /check_approval)\n\n // 4. Get swap transaction\n const swapRes = await fetchWithRetry(`${API_BASE}/swap`, {\n method: \"POST\",\n headers: apiHeaders(),\n body: JSON.stringify(swapRequest),\n });\n\n if (!swapRes.ok) {\n const err = await swapRes.text();\n throw new Error(`Uniswap swap failed (${swapRes.status}): ${err}`);\n }\n\n const swapData = (await swapRes.json()) as SwapResponse;\n\n // 5. Validate before broadcasting\n if (!swapData.swap?.data || swapData.swap.data === (\"\" as Hex) || swapData.swap.data === \"0x\") {\n throw new Error(\"Empty swap data — quote may have expired. Try again.\");\n }\n if (!isAddress(swapData.swap.to) || !isAddress(swapData.swap.from)) {\n throw new Error(\"Invalid address in swap response\");\n }\n\n // 6. Sign and broadcast\n const { getWalletClient } = await import(\"../lib/client.js\");\n const wallet = getWalletClient();\n const hash = await wallet.sendTransaction({\n to: swapData.swap.to,\n data: swapData.swap.data,\n value: BigInt(swapData.swap.value || \"0\"),\n account,\n chain: getChain(),\n });\n\n const receipt = await client.waitForTransactionReceipt({ hash });\n return {\n hash,\n success: receipt.status === \"success\",\n gasUsed: receipt.gasUsed,\n };\n }\n}\n","/**\n * Venice AI API integration — web3 key generation, validation, and inference.\n *\n * Key provisioning flow:\n * 1. GET /api_keys/generate_web3_key → validation token\n * 2. Sign token with agent wallet (EIP-191)\n * 3. POST /api_keys/generate_web3_key → API key\n *\n * Inference:\n * POST /chat/completions with Bearer auth → chat completion response\n *\n * The API key is stored in ~/.sherwood/config.json.\n * Venice requires the signing wallet to hold staked VVV (sVVV).\n */\n\nimport { getAccount } from \"./client.js\";\nimport { setVeniceApiKey, getVeniceApiKey } from \"./config.js\";\n\nconst VENICE_API_BASE = \"https://api.venice.ai/api/v1\";\n\n/**\n * Provision a Venice API key via web3 wallet signature.\n * The wallet must hold sVVV for this to succeed.\n */\nexport async function provisionApiKey(): Promise<string> {\n const account = getAccount();\n\n // 1. Get validation token (requires admin API key)\n const adminKey = process.env.VENICE_ADMIN_KEY;\n if (!adminKey) {\n throw new Error(\n \"VENICE_ADMIN_KEY env var required for autonomous provisioning.\\n\" +\n \" Get an admin key from https://venice.ai/settings/api-keys\\n\" +\n \" Or set a key manually: sherwood config set --venice-api-key <key>\",\n );\n }\n const tokenRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n headers: { Authorization: `Bearer ${adminKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n if (!tokenRes.ok) {\n throw new Error(`Failed to get validation token: ${tokenRes.status} ${tokenRes.statusText}`);\n }\n const tokenData = await tokenRes.json();\n const token = tokenData?.data?.token;\n if (!token) {\n throw new Error(\"Venice API returned no validation token\");\n }\n\n // 2. Sign token with wallet (EIP-191)\n const signature = await account.signMessage({ message: token });\n\n // 3. Generate API key\n const keyRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n signal: AbortSignal.timeout(15_000),\n body: JSON.stringify({\n address: account.address,\n signature,\n token,\n apiKeyType: \"INFERENCE\",\n description: \"Sherwood syndicate agent\",\n }),\n });\n\n if (!keyRes.ok) {\n const body = await keyRes.text();\n throw new Error(`Failed to generate API key: ${keyRes.status} ${body}`);\n }\n\n const keyData = await keyRes.json();\n const apiKey = keyData?.data?.apiKey;\n if (!apiKey) {\n throw new Error(\"Venice API returned no API key\");\n }\n\n // Store in config\n setVeniceApiKey(apiKey);\n\n return apiKey;\n}\n\n/**\n * Check if the stored Venice API key is still valid.\n */\nexport async function checkApiKeyValid(): Promise<boolean> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) return false;\n\n try {\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n// ── Inference ──\n\nexport interface ChatCompletionMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatCompletionOptions {\n model: string;\n messages: ChatCompletionMessage[];\n temperature?: number;\n maxTokens?: number;\n enableWebSearch?: boolean;\n disableThinking?: boolean;\n}\n\nexport interface ChatCompletionResult {\n content: string;\n model: string;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Call Venice chat completions API for private inference.\n * Requires a provisioned API key (run `sherwood venice provision` first).\n */\nexport async function chatCompletion(opts: ChatCompletionOptions): Promise<ChatCompletionResult> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const body: Record<string, unknown> = {\n model: opts.model,\n messages: opts.messages,\n };\n if (opts.temperature !== undefined) body.temperature = opts.temperature;\n if (opts.maxTokens !== undefined) body.max_tokens = opts.maxTokens;\n\n const veniceParams: Record<string, unknown> = {};\n if (opts.enableWebSearch) veniceParams.enable_web_search = \"on\";\n if (opts.disableThinking) veniceParams.disable_thinking = true;\n if (Object.keys(veniceParams).length > 0) body.venice_parameters = veniceParams;\n\n const res = await fetch(`${VENICE_API_BASE}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n signal: AbortSignal.timeout(120_000), // inference can be slow\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`Venice inference failed: ${res.status} ${errBody}`);\n }\n\n const data = await res.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Venice returned no choices\");\n }\n\n return {\n content: choice.message?.content ?? \"\",\n model: data.model ?? opts.model,\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n}\n\n/**\n * List available Venice models.\n * Requires a provisioned API key.\n */\nexport async function listModels(): Promise<string[]> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Failed to list Venice models: ${res.status} ${res.statusText}`);\n }\n\n const data = await res.json();\n return (data.data ?? []).map((m: { id: string }) => m.id);\n}\n","/**\n * Uniswap V3 Quoter V2 integration for swap quotes.\n *\n * quoteExactInputSingle is NOT a view function — it reverts internally\n * after computing the quote. Must use eth_call to get the return data.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult, concat, pad, numberToHex } from \"viem\";\nimport { getPublicClient } from \"./client.js\";\nimport { UNISWAP_QUOTER_V2_ABI } from \"./abis.js\";\nimport { UNISWAP } from \"./addresses.js\";\n\nexport interface QuoteResult {\n amountOut: bigint;\n sqrtPriceX96After: bigint;\n gasEstimate: bigint;\n}\n\n/**\n * Get a swap quote from Uniswap Quoter V2.\n */\nexport async function getQuote(params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n fee: number;\n}): Promise<QuoteResult> {\n const client = getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n const { data } = await client.call({\n to: UNISWAP().QUOTER_V2,\n data: calldata,\n });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this pair/fee\");\n }\n\n const [amountOut, sqrtPriceX96After, , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n data,\n }) as [bigint, bigint, number, bigint];\n\n return { amountOut, sqrtPriceX96After, gasEstimate };\n}\n\n/**\n * Apply slippage tolerance to a quote amount.\n * Returns the minimum acceptable output amount.\n */\nexport function applySlippage(amountOut: bigint, slippageBps: number): bigint {\n return (amountOut * BigInt(10000 - slippageBps)) / 10000n;\n}\n\n/**\n * Encode a Uniswap V3 multi-hop swap path.\n * Format: abi.encodePacked(address, uint24, address, uint24, address, ...)\n */\nexport function encodeSwapPath(tokens: Address[], fees: number[]): Hex {\n if (tokens.length < 2 || fees.length !== tokens.length - 1) {\n throw new Error(\"Invalid path: need at least 2 tokens and (tokens-1) fees\");\n }\n\n const parts: Hex[] = [];\n for (let i = 0; i < tokens.length; i++) {\n // Address: 20 bytes (no padding)\n parts.push(tokens[i].toLowerCase() as Hex);\n if (i < fees.length) {\n // Fee: 3 bytes (uint24), left-padded to 3 bytes\n parts.push(pad(numberToHex(fees[i]), { size: 3 }) as Hex);\n }\n }\n return concat(parts);\n}\n\n/**\n * Get a multi-hop swap quote from Uniswap Quoter V2.\n */\nexport async function getMultiHopQuote(params: {\n path: Hex;\n amountIn: bigint;\n}): Promise<QuoteResult> {\n const client = getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n args: [params.path, params.amountIn],\n });\n\n const { data } = await client.call({\n to: UNISWAP().QUOTER_V2,\n data: calldata,\n });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this path\");\n }\n\n const [amountOut, , , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n data,\n }) as [bigint, bigint[], number[], bigint];\n\n return { amountOut, sqrtPriceX96After: 0n, gasEstimate };\n}\n\n/** Token decimals for display purposes. */\nexport const TOKEN_DECIMALS: Record<string, number> = {\n USDC: 6,\n WETH: 18,\n cbETH: 18,\n wstETH: 18,\n cbBTC: 8,\n DAI: 18,\n AERO: 18,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAgBA,SAAS,iBAAqC;AAC9C,SAAS,MAAM,mBAAmB;AAOlC,IAAM,WAAW;AAiEjB,SAAS,YAAoB;AAC3B,QAAM,MAAM,iBAAiB;AAC7B,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAqC;AAC5C,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,aAAa,UAAU;AAAA,IACvB,8BAA8B;AAAA,EAChC;AACF;AAEA,SAAS,kBAAkB,SAA0B;AACnD,SAAO,YAAY,cAAc,YAAY,cAAc,YAAY;AACzE;AAEA,SAAS,gBAAgB,GAA0B;AACjD,MAAI,kBAAkB,EAAE,OAAO,GAAG;AAChC,UAAM,KAAK;AACX,UAAM,cAAc,GAAG,MAAM,UAAU,QAAQ,CAAC;AAChD,QAAI,CAAC,YAAa,OAAM,IAAI,MAAM,+BAA+B;AACjE,WAAO,YAAY;AAAA,EACrB;AACA,SAAQ,EAAmB,MAAM,OAAO;AAC1C;AAEA,eAAe,eACb,KACA,MACA,aAAa,GACM;AACnB,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,GAAG;AAAA,MACH,QAAQ,YAAY,QAAQ,GAAM;AAAA,IACpC,CAAC;AACD,QAAI,SAAS,WAAW,OAAO,SAAS,SAAS,IAAK,QAAO;AAC7D,QAAI,YAAY,WAAY,QAAO;AAEnC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,KAAK,OAAO,IAAI,KAAK,GAAK;AAC9E,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AAAA,EAC3D;AACA,QAAM,IAAI,MAAM,aAAa;AAC/B;AAIO,IAAM,kBAAN,MAAiD;AAAA,EACtD,OAAqB;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAiB,CAAC,MAAM,WAAW;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,QAA6C;AACvD,UAAM,UAAU,WAAW;AAC3B,UAAM,UAAU,SAAS,EAAE;AAE3B,UAAM,OAAO;AAAA,MACX,SAAS,QAAQ;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO,OAAO;AAAA,MAC9B,iBAAiB,OAAO,OAAO;AAAA,MAC/B,QAAQ,OAAO,SAAS,SAAS;AAAA,MACjC,MAAM;AAAA,MACN,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,IACrB;AAEA,UAAM,MAAM,MAAM,eAAe,GAAG,QAAQ,UAAU;AAAA,MACpD,QAAQ;AAAA,MACR,SAAS,WAAW;AAAA,MACpB,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,YAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,MAAM,GAAG,EAAE;AAAA,IAChE;AAEA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAM,YAAY,OAAO,gBAAgB,IAAI,CAAC;AAE9C,WAAO;AAAA,MACL;AAAA,MACA,aAAa;AAAA,MACb,OAAO,GAAG,KAAK,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG,CAAC,CAAC,SAAI,OAAO,SAAS,MAAM,GAAG,CAAC,CAAC;AAAA,IACtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAKkE;AAChF,UAAM,UAAU,WAAW;AAC3B,UAAM,UAAU,SAAS,EAAE;AAE3B,UAAM,OAAO;AAAA,MACX,SAAS,QAAQ;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO,OAAO;AAAA,MAC9B,iBAAiB,OAAO,OAAO;AAAA,MAC/B,QAAQ,OAAO,SAAS,SAAS;AAAA,MACjC,MAAM;AAAA,MACN,mBAAmB,OAAO,qBAAqB;AAAA,MAC/C,mBAAmB;AAAA,IACrB;AAEA,UAAM,MAAM,MAAM,eAAe,GAAG,QAAQ,UAAU;AAAA,MACpD,QAAQ;AAAA,MACR,SAAS,WAAW;AAAA,MACpB,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,YAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,MAAM,GAAG,EAAE;AAAA,IAChE;AAEA,UAAM,gBAAiB,MAAM,IAAI,KAAK;AACtC,UAAM,YAAY,OAAO,gBAAgB,aAAa,CAAC;AACvD,WAAO,EAAE,eAAe,WAAW,SAAS,cAAc,QAAQ;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,QAGF;AAChB,UAAM,UAAU,WAAW;AAC3B,UAAM,UAAU,SAAS,EAAE;AAC3B,UAAM,SAAS,gBAAgB;AAE/B,UAAM,MAAM,MAAM,eAAe,GAAG,QAAQ,mBAAmB;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,WAAW;AAAA,MACpB,MAAM,KAAK,UAAU;AAAA,QACnB,eAAe,QAAQ;AAAA,QACvB,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO,OAAO,SAAS;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,YAAM,IAAI,MAAM,0BAA0B,IAAI,MAAM,MAAM,GAAG,EAAE;AAAA,IACjE;AAEA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,QAAI,KAAK,UAAU;AAEjB,YAAM,OAAO,MAAM,uBAAuB;AAAA,QACxC,SAAS,KAAK,SAAS;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA;AAAA;AAAA,QAGd,MAAM,CAAC;AAAA;AAAA,QACP;AAAA,QACA,OAAO,SAAS;AAAA,MAClB,CAAC;AAID,YAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,sBAAkB;AAC3D,YAAM,SAAS,gBAAgB;AAC/B,YAAM,eAAe,MAAM,OAAO,gBAAgB;AAAA,QAChD,IAAI,KAAK,SAAS;AAAA,QAClB,MAAM,KAAK,SAAS;AAAA,QACpB,OAAO,OAAO,KAAK,SAAS,SAAS,GAAG;AAAA,QACxC;AAAA,QACA,OAAO,SAAS;AAAA,MAClB,CAAC;AACD,YAAM,OAAO,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,QAAuC;AAChD,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,gBAAgB;AAG/B,UAAM,cAAc;AACpB,QAAI,OAAO,YAAY,aAAa;AAClC,YAAM,KAAK,cAAc;AAAA,QACvB,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AAGA,UAAM,cAAc,OAAO;AAC3B,UAAM,EAAE,cAAc,IAAI,MAAM,KAAK,UAAU;AAAA,MAC7C,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,mBAAmB;AAAA;AAAA,IACrB,CAAC;AAGD,UAAM,WAAW;AACjB,UAAM,EAAE,YAAY,GAAG,WAAW,IAAI;AACtC,UAAM,cAAuC,EAAE,GAAG,WAAW;AAK7D,QAAI,kBAAkB,cAAc,OAAO,GAAG;AAE5C,UAAI,cAAc,OAAO,eAAe,UAAU;AAChD,cAAM,YAAY;AAKlB,cAAM,YAAY,MAAM,QAAQ,cAAc;AAAA,UAC5C,QAAQ,UAAU;AAAA,UAClB,OAAO,UAAU;AAAA,UACjB,aAAa,OAAO,KAAK,UAAU,KAAK,EAAE,KAAK,CAAC,MAAM,MAAM,cAAc,KAAK;AAAA,UAC/E,SAAS,UAAU;AAAA,QACrB,CAAC;AACD,oBAAY,YAAY;AAAA,MAC1B;AAAA,IACF;AAIA,UAAM,UAAU,MAAM,eAAe,GAAG,QAAQ,SAAS;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS,WAAW;AAAA,MACpB,MAAM,KAAK,UAAU,WAAW;AAAA,IAClC,CAAC;AAED,QAAI,CAAC,QAAQ,IAAI;AACf,YAAM,MAAM,MAAM,QAAQ,KAAK;AAC/B,YAAM,IAAI,MAAM,wBAAwB,QAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IACnE;AAEA,UAAM,WAAY,MAAM,QAAQ,KAAK;AAGrC,QAAI,CAAC,SAAS,MAAM,QAAQ,SAAS,KAAK,SAAU,MAAc,SAAS,KAAK,SAAS,MAAM;AAC7F,YAAM,IAAI,MAAM,2DAAsD;AAAA,IACxE;AACA,QAAI,CAAC,UAAU,SAAS,KAAK,EAAE,KAAK,CAAC,UAAU,SAAS,KAAK,IAAI,GAAG;AAClE,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAGA,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,sBAAkB;AAC3D,UAAM,SAAS,gBAAgB;AAC/B,UAAM,OAAO,MAAM,OAAO,gBAAgB;AAAA,MACxC,IAAI,SAAS,KAAK;AAAA,MAClB,MAAM,SAAS,KAAK;AAAA,MACpB,OAAO,OAAO,SAAS,KAAK,SAAS,GAAG;AAAA,MACxC;AAAA,MACA,OAAO,SAAS;AAAA,IAClB,CAAC;AAED,UAAM,UAAU,MAAM,OAAO,0BAA0B,EAAE,KAAK,CAAC;AAC/D,WAAO;AAAA,MACL;AAAA,MACA,SAAS,QAAQ,WAAW;AAAA,MAC5B,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;;;ACrXA,IAAM,kBAAkB;AAMxB,eAAsB,kBAAmC;AACvD,QAAM,UAAU,WAAW;AAG3B,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AACA,QAAM,WAAW,MAAM,MAAM,GAAG,eAAe,+BAA+B;AAAA,IAC5E,SAAS,EAAE,eAAe,UAAU,QAAQ,GAAG;AAAA,IAC/C,QAAQ,YAAY,QAAQ,IAAM;AAAA,EACpC,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,mCAAmC,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EAC7F;AACA,QAAM,YAAY,MAAM,SAAS,KAAK;AACtC,QAAM,QAAQ,WAAW,MAAM;AAC/B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAGA,QAAM,YAAY,MAAM,QAAQ,YAAY,EAAE,SAAS,MAAM,CAAC;AAG9D,QAAM,SAAS,MAAM,MAAM,GAAG,eAAe,+BAA+B;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,QAAQ,YAAY,QAAQ,IAAM;AAAA,IAClC,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,aAAa;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,IAAI,IAAI,EAAE;AAAA,EACxE;AAEA,QAAM,UAAU,MAAM,OAAO,KAAK;AAClC,QAAM,SAAS,SAAS,MAAM;AAC9B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAGA,kBAAgB,MAAM;AAEtB,SAAO;AACT;AAKA,eAAsB,mBAAqC;AACzD,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,eAAe,WAAW;AAAA,MACnD,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,MAC7C,QAAQ,YAAY,QAAQ,IAAM;AAAA,IACpC,CAAC;AACD,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAgCA,eAAsB,eAAe,MAA4D;AAC/F,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,QAAM,OAAgC;AAAA,IACpC,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,EACjB;AACA,MAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,KAAK;AAC5D,MAAI,KAAK,cAAc,OAAW,MAAK,aAAa,KAAK;AAEzD,QAAM,eAAwC,CAAC;AAC/C,MAAI,KAAK,gBAAiB,cAAa,oBAAoB;AAC3D,MAAI,KAAK,gBAAiB,cAAa,mBAAmB;AAC1D,MAAI,OAAO,KAAK,YAAY,EAAE,SAAS,EAAG,MAAK,oBAAoB;AAEnE,QAAM,MAAM,MAAM,MAAM,GAAG,eAAe,qBAAqB;AAAA,IAC7D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,QAAQ,YAAY,QAAQ,IAAO;AAAA;AAAA,IACnC,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,UAAM,IAAI,MAAM,4BAA4B,IAAI,MAAM,IAAI,OAAO,EAAE;AAAA,EACrE;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,SAAS,WAAW;AAAA,IACpC,OAAO,KAAK,SAAS,KAAK;AAAA,IAC1B,OAAO;AAAA,MACL,cAAc,KAAK,OAAO,iBAAiB;AAAA,MAC3C,kBAAkB,KAAK,OAAO,qBAAqB;AAAA,MACnD,aAAa,KAAK,OAAO,gBAAgB;AAAA,IAC3C;AAAA,EACF;AACF;AAMA,eAAsB,aAAgC;AACpD,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,QAAM,MAAM,MAAM,MAAM,GAAG,eAAe,WAAW;AAAA,IACnD,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,IAC7C,QAAQ,YAAY,QAAQ,IAAM;AAAA,EACpC,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,iCAAiC,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,EACjF;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAsB,EAAE,EAAE;AAC1D;;;ACrMA,SAAS,oBAAoB,sBAAsB,QAAQ,KAAK,mBAAmB;AAcnF,eAAsB,SAAS,QAKN;AACvB,QAAM,SAAS,gBAAgB;AAE/B,QAAM,WAAW,mBAAmB;AAAA,IAClC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ;AAAA,QACE,SAAS,OAAO;AAAA,QAChB,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,KAAK,OAAO;AAAA,QACZ,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK;AAAA,IACjC,IAAI,QAAQ,EAAE;AAAA,IACd,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,qEAAgE;AAAA,EAClF;AAEA,QAAM,CAAC,WAAW,mBAAmB,EAAE,WAAW,IAAI,qBAAqB;AAAA,IACzE,KAAK;AAAA,IACL,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO,EAAE,WAAW,mBAAmB,YAAY;AACrD;AAMO,SAAS,cAAc,WAAmB,aAA6B;AAC5E,SAAQ,YAAY,OAAO,MAAQ,WAAW,IAAK;AACrD;AAMO,SAAS,eAAe,QAAmB,MAAqB;AACrE,MAAI,OAAO,SAAS,KAAK,KAAK,WAAW,OAAO,SAAS,GAAG;AAC1D,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,QAAM,QAAe,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AAEtC,UAAM,KAAK,OAAO,CAAC,EAAE,YAAY,CAAQ;AACzC,QAAI,IAAI,KAAK,QAAQ;AAEnB,YAAM,KAAK,IAAI,YAAY,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAQ;AAAA,IAC1D;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAKA,eAAsB,iBAAiB,QAGd;AACvB,QAAM,SAAS,gBAAgB;AAE/B,QAAM,WAAW,mBAAmB;AAAA,IAClC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,OAAO,MAAM,OAAO,QAAQ;AAAA,EACrC,CAAC;AAED,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK;AAAA,IACjC,IAAI,QAAQ,EAAE;AAAA,IACd,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iEAA4D;AAAA,EAC9E;AAEA,QAAM,CAAC,WAAW,EAAE,EAAE,WAAW,IAAI,qBAAqB;AAAA,IACxD,KAAK;AAAA,IACL,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO,EAAE,WAAW,mBAAmB,IAAI,YAAY;AACzD;","names":[]}
@@ -6,9 +6,9 @@ import {
6
6
  resetClients,
7
7
  sendTxWithRetry,
8
8
  writeContractWithRetry
9
- } from "./chunk-HRA2KPGW.js";
10
- import "./chunk-FEDSWXSD.js";
11
- import "./chunk-B4BMCXWK.js";
9
+ } from "./chunk-I7CKBBOG.js";
10
+ import "./chunk-TAAEMX3L.js";
11
+ import "./chunk-SZ5QQJGA.js";
12
12
  export {
13
13
  estimateFeesWithBuffer,
14
14
  getAccount,
@@ -18,4 +18,4 @@ export {
18
18
  sendTxWithRetry,
19
19
  writeContractWithRetry
20
20
  };
21
- //# sourceMappingURL=client-I56MIQAM.js.map
21
+ //# sourceMappingURL=client-3AAXAX4C.js.map
@@ -17,7 +17,7 @@ import {
17
17
  setPrivateKey,
18
18
  setUniswapApiKey,
19
19
  setVeniceApiKey
20
- } from "./chunk-B4BMCXWK.js";
20
+ } from "./chunk-SZ5QQJGA.js";
21
21
  export {
22
22
  cacheGroupId,
23
23
  getAgentId,
@@ -38,4 +38,4 @@ export {
38
38
  setUniswapApiKey,
39
39
  setVeniceApiKey
40
40
  };
41
- //# sourceMappingURL=config-2VMLHIXD.js.map
41
+ //# sourceMappingURL=config-IDAHD7S3.js.map
@@ -9,11 +9,11 @@ import {
9
9
  queryApprovals,
10
10
  queryJoinRequests,
11
11
  revokeAttestation
12
- } from "./chunk-G2RQLZZI.js";
13
- import "./chunk-W76CHVD3.js";
14
- import "./chunk-HRA2KPGW.js";
15
- import "./chunk-FEDSWXSD.js";
16
- import "./chunk-B4BMCXWK.js";
12
+ } from "./chunk-CTLEZZO7.js";
13
+ import "./chunk-LHDWONBI.js";
14
+ import "./chunk-I7CKBBOG.js";
15
+ import "./chunk-TAAEMX3L.js";
16
+ import "./chunk-SZ5QQJGA.js";
17
17
  export {
18
18
  createApproval,
19
19
  createJoinRequest,
@@ -26,4 +26,4 @@ export {
26
26
  queryJoinRequests,
27
27
  revokeAttestation
28
28
  };
29
- //# sourceMappingURL=eas-YZF6MN65.js.map
29
+ //# sourceMappingURL=eas-JE3NQCXE.js.map
@@ -34,11 +34,11 @@ import {
34
34
  settleProposal,
35
35
  vetoProposal,
36
36
  vote
37
- } from "./chunk-WHCXQBPS.js";
38
- import "./chunk-W76CHVD3.js";
39
- import "./chunk-HRA2KPGW.js";
40
- import "./chunk-FEDSWXSD.js";
41
- import "./chunk-B4BMCXWK.js";
37
+ } from "./chunk-P4J6FKAP.js";
38
+ import "./chunk-LHDWONBI.js";
39
+ import "./chunk-I7CKBBOG.js";
40
+ import "./chunk-TAAEMX3L.js";
41
+ import "./chunk-SZ5QQJGA.js";
42
42
  export {
43
43
  PROPOSAL_STATE,
44
44
  PROPOSAL_STATES,
@@ -76,4 +76,4 @@ export {
76
76
  vetoProposal,
77
77
  vote
78
78
  };
79
- //# sourceMappingURL=governor-ZWKGLGMG.js.map
79
+ //# sourceMappingURL=governor-J3W67NXA.js.map
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  getQuote,
10
10
  listModels,
11
11
  provisionApiKey
12
- } from "./chunk-DCT3IDBS.js";
12
+ } from "./chunk-YJAMY25R.js";
13
13
  import {
14
14
  PROPOSAL_STATE,
15
15
  PROPOSAL_STATES,
@@ -40,7 +40,7 @@ import {
40
40
  setVotingPeriod,
41
41
  settleProposal,
42
42
  vote
43
- } from "./chunk-WHCXQBPS.js";
43
+ } from "./chunk-P4J6FKAP.js";
44
44
  import {
45
45
  fetchMetadata,
46
46
  uploadMetadata
@@ -52,7 +52,7 @@ import {
52
52
  queryApprovals,
53
53
  queryJoinRequests,
54
54
  revokeAttestation
55
- } from "./chunk-G2RQLZZI.js";
55
+ } from "./chunk-CTLEZZO7.js";
56
56
  import {
57
57
  approveDepositor,
58
58
  deposit,
@@ -68,7 +68,7 @@ import {
68
68
  resolveVaultSyndicate,
69
69
  setTextRecord,
70
70
  setVaultAddress
71
- } from "./chunk-VZZ2V6EM.js";
71
+ } from "./chunk-QT7BUKWR.js";
72
72
  import {
73
73
  AERODROME,
74
74
  AGENT_REGISTRY,
@@ -86,14 +86,14 @@ import {
86
86
  UNISWAP,
87
87
  VENICE,
88
88
  VENICE_STAKING_ABI
89
- } from "./chunk-W76CHVD3.js";
89
+ } from "./chunk-LHDWONBI.js";
90
90
  import {
91
91
  getAccount,
92
92
  getPublicClient,
93
93
  getWalletClient,
94
94
  sendTxWithRetry,
95
95
  writeContractWithRetry
96
- } from "./chunk-HRA2KPGW.js";
96
+ } from "./chunk-I7CKBBOG.js";
97
97
  import {
98
98
  VALID_NETWORKS,
99
99
  getChain,
@@ -102,7 +102,7 @@ import {
102
102
  getRpcUrl,
103
103
  isTestnet,
104
104
  setNetwork
105
- } from "./chunk-FEDSWXSD.js";
105
+ } from "./chunk-TAAEMX3L.js";
106
106
  import {
107
107
  cacheGroupId,
108
108
  getAgentId,
@@ -116,8 +116,9 @@ import {
116
116
  setConfigRpcUrl,
117
117
  setNotifyTo,
118
118
  setPrivateKey,
119
- setUniswapApiKey
120
- } from "./chunk-B4BMCXWK.js";
119
+ setUniswapApiKey,
120
+ setVeniceApiKey
121
+ } from "./chunk-SZ5QQJGA.js";
121
122
 
122
123
  // src/index.ts
123
124
  import { config as loadDotenv } from "dotenv";
@@ -873,9 +874,9 @@ function registerStrategyTemplateCommands(strategy2) {
873
874
  console.error(chalk.red("Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission."));
874
875
  process.exit(1);
875
876
  }
876
- const { propose: propose2 } = await import("./governor-ZWKGLGMG.js");
877
+ const { propose: propose2 } = await import("./governor-J3W67NXA.js");
877
878
  const { pinJSON } = await import("./ipfs-22YLNQ2C.js");
878
- const { parseDuration: parseDuration2 } = await import("./governor-ZWKGLGMG.js");
879
+ const { parseDuration: parseDuration2 } = await import("./governor-J3W67NXA.js");
879
880
  const performanceFeeBps = BigInt(opts.performanceFee);
880
881
  if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {
881
882
  console.error(chalk.red("--performance-fee must be 0-10000 (basis points)"));
@@ -1148,7 +1149,7 @@ function registerVeniceCommands(program2) {
1148
1149
  console.log(chalk2.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));
1149
1150
  console.log(chalk2.dim(" Saved to ~/.sherwood/config.json"));
1150
1151
  try {
1151
- const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-YZF6MN65.js");
1152
+ const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-JE3NQCXE.js");
1152
1153
  const { uid } = await createVeniceProvisionAttestation(account.address);
1153
1154
  if (uid !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
1154
1155
  console.log(chalk2.dim(` Attested: ${getEasScanUrl2(uid)}`));
@@ -1299,7 +1300,7 @@ ${opts.prompt}`;
1299
1300
  console.log(chalk2.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));
1300
1301
  }
1301
1302
  try {
1302
- const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-YZF6MN65.js");
1303
+ const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-JE3NQCXE.js");
1303
1304
  const { keccak256, toHex } = await import("viem");
1304
1305
  const promptHash = keccak256(toHex(userContent)).slice(0, 18);
1305
1306
  const { uid } = await createVeniceInferenceAttestation(
@@ -2282,7 +2283,7 @@ try {
2282
2283
  var require2 = createRequire(import.meta.url);
2283
2284
  var { version: CLI_VERSION } = require2("../package.json");
2284
2285
  async function loadXmtp() {
2285
- return import("./xmtp-IH57GYSR.js");
2286
+ return import("./xmtp-7DF7UG66.js");
2286
2287
  }
2287
2288
  async function loadCron() {
2288
2289
  return import("./cron-SKYKVZ6K.js");
@@ -3014,7 +3015,7 @@ vaultCmd.command("balance").description("Show LP share balance and asset value")
3014
3015
  var strategy = program.command("strategy").description("Strategy templates \u2014 list, clone, propose");
3015
3016
  registerStrategyTemplateCommands(strategy);
3016
3017
  program.command("providers").description("List available DeFi providers").action(async () => {
3017
- const { MessariProvider, NansenProvider } = await import("./research-HC2UOLFT.js");
3018
+ const { MessariProvider, NansenProvider } = await import("./research-DZINC4N4.js");
3018
3019
  const providers = [new MoonwellProvider(), new UniswapProvider(), new MessariProvider(), new NansenProvider()];
3019
3020
  for (const p of providers) {
3020
3021
  const info = p.info();
@@ -3025,7 +3026,7 @@ ${info.name} (${info.type})`);
3025
3026
  }
3026
3027
  });
3027
3028
  try {
3028
- const { registerChatCommands } = await import("./chat-MUUC5L5W.js");
3029
+ const { registerChatCommands } = await import("./chat-WKOSUZXO.js");
3029
3030
  registerChatCommands(program);
3030
3031
  } catch {
3031
3032
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -3035,19 +3036,19 @@ try {
3035
3036
  process.exit(1);
3036
3037
  });
3037
3038
  }
3038
- var { registerSessionCommands } = await import("./session-X3QFFCJ7.js");
3039
+ var { registerSessionCommands } = await import("./session-Q2WRYXYF.js");
3039
3040
  registerSessionCommands(program);
3040
3041
  registerVeniceCommands(program);
3041
3042
  registerAllowanceCommands(program);
3042
3043
  registerIdentityCommands(program);
3043
3044
  registerProposalCommands(program);
3044
3045
  registerGovernorCommands(program);
3045
- var { registerResearchCommands } = await import("./research-VZKLOTMU.js");
3046
+ var { registerResearchCommands } = await import("./research-47YMVW3N.js");
3046
3047
  registerResearchCommands(program);
3047
- var { registerTradeCommands } = await import("./trade-YCBFXOB3.js");
3048
+ var { registerTradeCommands } = await import("./trade-D6VT5MLQ.js");
3048
3049
  registerTradeCommands(program);
3049
3050
  var configCmd = program.command("config");
3050
- configCmd.command("set").description("Save settings to ~/.sherwood/config.json (persists across sessions)").option("--private-key <key>", "Wallet private key (0x-prefixed)").option("--vault <address>", "Default SyndicateVault address").option("--rpc <url>", "Custom RPC URL for the active --chain network").option("--notify-to <id>", "Destination for cron summaries (Telegram chat ID, phone, etc.)").option("--uniswap-api-key <key>", "Uniswap Trading API key (from developers.uniswap.org)").action((opts) => {
3051
+ configCmd.command("set").description("Save settings to ~/.sherwood/config.json (persists across sessions)").option("--private-key <key>", "Wallet private key (0x-prefixed)").option("--vault <address>", "Default SyndicateVault address").option("--rpc <url>", "Custom RPC URL for the active --chain network").option("--notify-to <id>", "Destination for cron summaries (Telegram chat ID, phone, etc.)").option("--uniswap-api-key <key>", "Uniswap Trading API key (from developers.uniswap.org)").option("--venice-api-key <key>", "Venice AI inference API key").action((opts) => {
3051
3052
  let saved = false;
3052
3053
  if (opts.privateKey) {
3053
3054
  setPrivateKey(opts.privateKey);
@@ -3081,8 +3082,13 @@ configCmd.command("set").description("Save settings to ~/.sherwood/config.json (
3081
3082
  console.log(chalk7.green("Uniswap API key saved to ~/.sherwood/config.json"));
3082
3083
  saved = true;
3083
3084
  }
3085
+ if (opts.veniceApiKey) {
3086
+ setVeniceApiKey(opts.veniceApiKey);
3087
+ console.log(chalk7.green("Venice API key saved to ~/.sherwood/config.json"));
3088
+ saved = true;
3089
+ }
3084
3090
  if (!saved) {
3085
- console.log(chalk7.red("Provide at least one of: --private-key, --vault, --rpc, --notify-to, --uniswap-api-key"));
3091
+ console.log(chalk7.red("Provide at least one of: --private-key, --vault, --rpc, --notify-to, --uniswap-api-key, --venice-api-key"));
3086
3092
  process.exit(1);
3087
3093
  }
3088
3094
  });
@@ -3100,7 +3106,8 @@ configCmd.command("show").description("Display current config for the active net
3100
3106
  console.log(` Wallet: ${config.privateKey ? chalk7.green("configured") : chalk7.dim("not set")}`);
3101
3107
  console.log(` Agent ID: ${config.agentId ?? chalk7.dim("not set")}`);
3102
3108
  console.log(` Vault: ${contracts.vault ?? chalk7.dim("not set")}`);
3103
- console.log(` Uniswap: ${getUniswapApiKey() ? chalk7.green("API key configured") : chalk7.dim("not set")}`);
3109
+ console.log(` Uniswap: ${getUniswapApiKey() ? chalk7.green("API key configured") : chalk7.dim("not set")}`);
3110
+ console.log(` Venice: ${getVeniceApiKey() ? chalk7.green("API key configured") : chalk7.dim("not set")}`);
3104
3111
  console.log();
3105
3112
  console.log(chalk7.dim(" Config file: ~/.sherwood/config.json"));
3106
3113
  console.log();