@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.
- package/dist/{chat-MUUC5L5W.js → chat-WKOSUZXO.js} +7 -7
- package/dist/{chunk-G2RQLZZI.js → chunk-CTLEZZO7.js} +4 -4
- package/dist/{chunk-HRA2KPGW.js → chunk-I7CKBBOG.js} +3 -3
- package/dist/{chunk-W76CHVD3.js → chunk-LHDWONBI.js} +2 -2
- package/dist/{chunk-WHCXQBPS.js → chunk-P4J6FKAP.js} +4 -4
- package/dist/{chunk-VZZ2V6EM.js → chunk-QT7BUKWR.js} +5 -5
- package/dist/{chunk-B4BMCXWK.js → chunk-SZ5QQJGA.js} +2 -2
- package/dist/chunk-SZ5QQJGA.js.map +1 -0
- package/dist/{chunk-FEDSWXSD.js → chunk-TAAEMX3L.js} +2 -2
- package/dist/{chunk-ZXV4TBPE.js → chunk-XR2ZUO4R.js} +2 -2
- package/dist/{chunk-DCT3IDBS.js → chunk-YJAMY25R.js} +14 -7
- package/dist/chunk-YJAMY25R.js.map +1 -0
- package/dist/{client-I56MIQAM.js → client-3AAXAX4C.js} +4 -4
- package/dist/{config-2VMLHIXD.js → config-IDAHD7S3.js} +2 -2
- package/dist/{eas-YZF6MN65.js → eas-JE3NQCXE.js} +6 -6
- package/dist/{governor-ZWKGLGMG.js → governor-J3W67NXA.js} +6 -6
- package/dist/index.js +29 -22
- package/dist/index.js.map +1 -1
- package/dist/{network-3MVRM7O4.js → network-DBUZ7GRF.js} +3 -3
- package/dist/{research-VZKLOTMU.js → research-47YMVW3N.js} +7 -7
- package/dist/research-DZINC4N4.js +14 -0
- package/dist/{session-X3QFFCJ7.js → session-Q2WRYXYF.js} +10 -10
- package/dist/{trade-YCBFXOB3.js → trade-D6VT5MLQ.js} +10 -10
- package/dist/{xmtp-IH57GYSR.js → xmtp-7DF7UG66.js} +6 -6
- package/package.json +1 -1
- package/dist/chunk-B4BMCXWK.js.map +0 -1
- package/dist/chunk-DCT3IDBS.js.map +0 -1
- package/dist/research-HC2UOLFT.js +0 -14
- /package/dist/{chat-MUUC5L5W.js.map → chat-WKOSUZXO.js.map} +0 -0
- /package/dist/{chunk-G2RQLZZI.js.map → chunk-CTLEZZO7.js.map} +0 -0
- /package/dist/{chunk-HRA2KPGW.js.map → chunk-I7CKBBOG.js.map} +0 -0
- /package/dist/{chunk-W76CHVD3.js.map → chunk-LHDWONBI.js.map} +0 -0
- /package/dist/{chunk-WHCXQBPS.js.map → chunk-P4J6FKAP.js.map} +0 -0
- /package/dist/{chunk-VZZ2V6EM.js.map → chunk-QT7BUKWR.js.map} +0 -0
- /package/dist/{chunk-FEDSWXSD.js.map → chunk-TAAEMX3L.js.map} +0 -0
- /package/dist/{chunk-ZXV4TBPE.js.map → chunk-XR2ZUO4R.js.map} +0 -0
- /package/dist/{client-I56MIQAM.js.map → client-3AAXAX4C.js.map} +0 -0
- /package/dist/{config-2VMLHIXD.js.map → config-IDAHD7S3.js.map} +0 -0
- /package/dist/{eas-YZF6MN65.js.map → eas-JE3NQCXE.js.map} +0 -0
- /package/dist/{governor-ZWKGLGMG.js.map → governor-J3W67NXA.js.map} +0 -0
- /package/dist/{network-3MVRM7O4.js.map → network-DBUZ7GRF.js.map} +0 -0
- /package/dist/{research-VZKLOTMU.js.map → research-47YMVW3N.js.map} +0 -0
- /package/dist/{research-HC2UOLFT.js.map → research-DZINC4N4.js.map} +0 -0
- /package/dist/{session-X3QFFCJ7.js.map → session-Q2WRYXYF.js.map} +0 -0
- /package/dist/{trade-YCBFXOB3.js.map → trade-D6VT5MLQ.js.map} +0 -0
- /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-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-QT7BUKWR.js";
|
|
6
|
+
import "./chunk-LHDWONBI.js";
|
|
7
7
|
import {
|
|
8
8
|
getAccount
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-I7CKBBOG.js";
|
|
10
|
+
import "./chunk-TAAEMX3L.js";
|
|
11
11
|
import {
|
|
12
12
|
cacheGroupId,
|
|
13
13
|
getCachedGroupId
|
|
14
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
5
|
+
} from "./chunk-LHDWONBI.js";
|
|
6
6
|
import {
|
|
7
7
|
getAccount,
|
|
8
8
|
getPublicClient,
|
|
9
9
|
getWalletClient
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-I7CKBBOG.js";
|
|
11
11
|
import {
|
|
12
12
|
getChain,
|
|
13
13
|
getChainConfig,
|
|
14
14
|
getNetwork
|
|
15
|
-
} from "./chunk-
|
|
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-
|
|
402
|
+
//# sourceMappingURL=chunk-CTLEZZO7.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getChain,
|
|
3
3
|
getRpcUrl
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TAAEMX3L.js";
|
|
5
5
|
import {
|
|
6
6
|
loadConfig
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
129
|
+
//# sourceMappingURL=chunk-I7CKBBOG.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getNetwork
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
1466
|
+
//# sourceMappingURL=chunk-LHDWONBI.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SHERWOOD,
|
|
3
3
|
SYNDICATE_GOVERNOR_ABI
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LHDWONBI.js";
|
|
5
5
|
import {
|
|
6
6
|
getAccount,
|
|
7
7
|
getPublicClient,
|
|
8
8
|
getWalletClient
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-I7CKBBOG.js";
|
|
10
10
|
import {
|
|
11
11
|
getChain
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
8
|
+
} from "./chunk-LHDWONBI.js";
|
|
9
9
|
import {
|
|
10
10
|
estimateFeesWithBuffer,
|
|
11
11
|
getAccount,
|
|
12
12
|
getPublicClient,
|
|
13
13
|
getWalletClient
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-I7CKBBOG.js";
|
|
15
15
|
import {
|
|
16
16
|
getChain
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-TAAEMX3L.js";
|
|
18
18
|
import {
|
|
19
19
|
getChainContracts
|
|
20
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
107
|
+
//# sourceMappingURL=chunk-TAAEMX3L.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getAccount
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
5
|
+
} from "./chunk-LHDWONBI.js";
|
|
6
6
|
import {
|
|
7
7
|
getAccount,
|
|
8
8
|
getPublicClient,
|
|
9
9
|
writeContractWithRetry
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-I7CKBBOG.js";
|
|
11
11
|
import {
|
|
12
12
|
getChain
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-TAAEMX3L.js";
|
|
14
14
|
import {
|
|
15
15
|
getUniswapApiKey,
|
|
16
16
|
getVeniceApiKey,
|
|
17
17
|
setVeniceApiKey
|
|
18
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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":"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","names":[]}
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
resetClients,
|
|
7
7
|
sendTxWithRetry,
|
|
8
8
|
writeContractWithRetry
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
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-
|
|
21
|
+
//# sourceMappingURL=client-3AAXAX4C.js.map
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
setPrivateKey,
|
|
18
18
|
setUniswapApiKey,
|
|
19
19
|
setVeniceApiKey
|
|
20
|
-
} from "./chunk-
|
|
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-
|
|
41
|
+
//# sourceMappingURL=config-IDAHD7S3.js.map
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
queryApprovals,
|
|
10
10
|
queryJoinRequests,
|
|
11
11
|
revokeAttestation
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
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-
|
|
29
|
+
//# sourceMappingURL=eas-JE3NQCXE.js.map
|
|
@@ -34,11 +34,11 @@ import {
|
|
|
34
34
|
settleProposal,
|
|
35
35
|
vetoProposal,
|
|
36
36
|
vote
|
|
37
|
-
} from "./chunk-
|
|
38
|
-
import "./chunk-
|
|
39
|
-
import "./chunk-
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
3046
|
+
var { registerResearchCommands } = await import("./research-47YMVW3N.js");
|
|
3046
3047
|
registerResearchCommands(program);
|
|
3047
|
-
var { registerTradeCommands } = await import("./trade-
|
|
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:
|
|
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();
|