@sherwoodagent/cli 0.7.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chat-BSLMAYM5.js → chat-O34BTHII.js} +5 -5
- package/dist/{chunk-EDR5AHSC.js → chunk-4MTHXGTK.js} +2 -2
- package/dist/{chunk-QMWMT6EH.js → chunk-5ADWTXNT.js} +115 -31
- package/dist/chunk-5ADWTXNT.js.map +1 -0
- package/dist/{chunk-B7XDUFI3.js → chunk-ARZIQ7YZ.js} +3 -3
- package/dist/{chunk-6MEYSN2W.js → chunk-BXUNWV52.js} +480 -36
- package/dist/chunk-BXUNWV52.js.map +1 -0
- package/dist/{chunk-P3GYAMGZ.js → chunk-VQP4XR67.js} +15 -5
- package/dist/chunk-VQP4XR67.js.map +1 -0
- package/dist/{eas-TMHFTX43.js → eas-TI4XI5VU.js} +4 -4
- package/dist/index.js +1064 -210
- package/dist/index.js.map +1 -1
- package/dist/{research-ILKLSHVP.js → research-GX32VMP7.js} +5 -5
- package/dist/{research-5QALNYVS.js → research-ZR7HXITG.js} +3 -3
- package/dist/{session-XUOMZWOT.js → session-QEIVURQO.js} +5 -5
- package/dist/{xmtp-4XTQQ7RE.js → xmtp-A6F63GZH.js} +6 -6
- package/dist/xmtp-A6F63GZH.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-6MEYSN2W.js.map +0 -1
- package/dist/chunk-P3GYAMGZ.js.map +0 -1
- package/dist/chunk-QMWMT6EH.js.map +0 -1
- package/dist/xmtp-4XTQQ7RE.js.map +0 -1
- /package/dist/{chat-BSLMAYM5.js.map → chat-O34BTHII.js.map} +0 -0
- /package/dist/{chunk-EDR5AHSC.js.map → chunk-4MTHXGTK.js.map} +0 -0
- /package/dist/{chunk-B7XDUFI3.js.map → chunk-ARZIQ7YZ.js.map} +0 -0
- /package/dist/{eas-TMHFTX43.js.map → eas-TI4XI5VU.js.map} +0 -0
- /package/dist/{research-ILKLSHVP.js.map → research-GX32VMP7.js.map} +0 -0
- /package/dist/{research-5QALNYVS.js.map → research-ZR7HXITG.js.map} +0 -0
- /package/dist/{session-XUOMZWOT.js.map → session-QEIVURQO.js.map} +0 -0
|
@@ -2,19 +2,19 @@ import {
|
|
|
2
2
|
getTextRecord,
|
|
3
3
|
resolveSyndicate,
|
|
4
4
|
setTextRecord
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-ARZIQ7YZ.js";
|
|
6
|
+
import "./chunk-BXUNWV52.js";
|
|
7
7
|
import {
|
|
8
8
|
cacheGroupId,
|
|
9
9
|
getAccount,
|
|
10
10
|
getCachedGroupId
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-5ADWTXNT.js";
|
|
12
12
|
|
|
13
13
|
// src/commands/chat.ts
|
|
14
14
|
import chalk from "chalk";
|
|
15
15
|
import ora from "ora";
|
|
16
16
|
async function loadXmtp() {
|
|
17
|
-
return import("./xmtp-
|
|
17
|
+
return import("./xmtp-A6F63GZH.js");
|
|
18
18
|
}
|
|
19
19
|
function formatTimestamp(date) {
|
|
20
20
|
return `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}`;
|
|
@@ -349,4 +349,4 @@ function registerChatCommands(program) {
|
|
|
349
349
|
export {
|
|
350
350
|
registerChatCommands
|
|
351
351
|
};
|
|
352
|
-
//# sourceMappingURL=chat-
|
|
352
|
+
//# sourceMappingURL=chat-O34BTHII.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getAccount
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-5ADWTXNT.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-4MTHXGTK.js.map
|
|
@@ -1,26 +1,3 @@
|
|
|
1
|
-
// src/lib/network.ts
|
|
2
|
-
import { base, baseSepolia } from "viem/chains";
|
|
3
|
-
var _network = "base";
|
|
4
|
-
function setNetwork(n) {
|
|
5
|
-
_network = n;
|
|
6
|
-
}
|
|
7
|
-
function getNetwork() {
|
|
8
|
-
return _network;
|
|
9
|
-
}
|
|
10
|
-
function getChain() {
|
|
11
|
-
return _network === "base" ? base : baseSepolia;
|
|
12
|
-
}
|
|
13
|
-
function getRpcUrl() {
|
|
14
|
-
if (_network === "base-sepolia") {
|
|
15
|
-
return process.env.BASE_SEPOLIA_RPC_URL || "https://sepolia.base.org";
|
|
16
|
-
}
|
|
17
|
-
return process.env.BASE_RPC_URL || "https://mainnet.base.org";
|
|
18
|
-
}
|
|
19
|
-
function getExplorerUrl(txHash) {
|
|
20
|
-
const host = _network === "base" ? "basescan.org" : "sepolia.basescan.org";
|
|
21
|
-
return `https://${host}/tx/${txHash}`;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
1
|
// src/lib/config.ts
|
|
25
2
|
import fs from "fs";
|
|
26
3
|
import path from "path";
|
|
@@ -69,6 +46,15 @@ function setPrivateKey(key) {
|
|
|
69
46
|
config.privateKey = key.startsWith("0x") ? key : `0x${key}`;
|
|
70
47
|
saveConfig(config);
|
|
71
48
|
}
|
|
49
|
+
function getConfigRpcUrl(network) {
|
|
50
|
+
return loadConfig().rpc?.[network];
|
|
51
|
+
}
|
|
52
|
+
function setConfigRpcUrl(network, url) {
|
|
53
|
+
const config = loadConfig();
|
|
54
|
+
if (!config.rpc) config.rpc = {};
|
|
55
|
+
config.rpc[network] = url;
|
|
56
|
+
saveConfig(config);
|
|
57
|
+
}
|
|
72
58
|
function getChainContracts(chainId) {
|
|
73
59
|
const config = loadConfig();
|
|
74
60
|
return config.contracts?.[String(chainId)] ?? {};
|
|
@@ -82,6 +68,93 @@ function setChainContract(chainId, key, value) {
|
|
|
82
68
|
saveConfig(config);
|
|
83
69
|
}
|
|
84
70
|
|
|
71
|
+
// src/lib/network.ts
|
|
72
|
+
import { defineChain } from "viem";
|
|
73
|
+
import { base, baseSepolia } from "viem/chains";
|
|
74
|
+
var robinhoodTestnet = defineChain({
|
|
75
|
+
id: 46630,
|
|
76
|
+
name: "Robinhood Chain Testnet",
|
|
77
|
+
nativeCurrency: { name: "Ethereum", symbol: "ETH", decimals: 18 },
|
|
78
|
+
rpcUrls: {
|
|
79
|
+
default: { http: ["https://rpc.testnet.chain.robinhood.com"] }
|
|
80
|
+
},
|
|
81
|
+
blockExplorers: {
|
|
82
|
+
default: {
|
|
83
|
+
name: "Blockscout",
|
|
84
|
+
url: "https://explorer.testnet.chain.robinhood.com"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
testnet: true
|
|
88
|
+
});
|
|
89
|
+
var CHAIN_REGISTRY = {
|
|
90
|
+
base: {
|
|
91
|
+
chain: base,
|
|
92
|
+
rpcFallback: "https://mainnet.base.org",
|
|
93
|
+
rpcEnvVar: "BASE_RPC_URL",
|
|
94
|
+
explorerHost: "basescan.org",
|
|
95
|
+
easGraphqlUrl: "https://base.easscan.org/graphql",
|
|
96
|
+
easScanHost: "base.easscan.org",
|
|
97
|
+
xmtpEnv: "production",
|
|
98
|
+
isTestnet: false
|
|
99
|
+
},
|
|
100
|
+
"base-sepolia": {
|
|
101
|
+
chain: baseSepolia,
|
|
102
|
+
rpcFallback: "https://sepolia.base.org",
|
|
103
|
+
rpcEnvVar: "BASE_SEPOLIA_RPC_URL",
|
|
104
|
+
explorerHost: "sepolia.basescan.org",
|
|
105
|
+
easGraphqlUrl: "https://base-sepolia.easscan.org/graphql",
|
|
106
|
+
easScanHost: "base-sepolia.easscan.org",
|
|
107
|
+
xmtpEnv: "dev",
|
|
108
|
+
isTestnet: true
|
|
109
|
+
},
|
|
110
|
+
"robinhood-testnet": {
|
|
111
|
+
chain: robinhoodTestnet,
|
|
112
|
+
rpcFallback: "https://rpc.testnet.chain.robinhood.com",
|
|
113
|
+
explorerHost: "explorer.testnet.chain.robinhood.com",
|
|
114
|
+
easGraphqlUrl: null,
|
|
115
|
+
easScanHost: null,
|
|
116
|
+
xmtpEnv: "dev",
|
|
117
|
+
isTestnet: true
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
var VALID_NETWORKS = Object.keys(CHAIN_REGISTRY);
|
|
121
|
+
var _network = "base";
|
|
122
|
+
function setNetwork(n) {
|
|
123
|
+
const config = CHAIN_REGISTRY[n];
|
|
124
|
+
if (!config) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
`Unknown network: ${n}. Valid: ${VALID_NETWORKS.join(", ")}`
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
if (config.isTestnet && process.env.ENABLE_TESTNET !== "true") {
|
|
130
|
+
throw new Error(
|
|
131
|
+
`Testnet "${n}" is disabled. Set ENABLE_TESTNET=true to enable.`
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
_network = n;
|
|
135
|
+
}
|
|
136
|
+
function getNetwork() {
|
|
137
|
+
return _network;
|
|
138
|
+
}
|
|
139
|
+
function getChainConfig() {
|
|
140
|
+
return CHAIN_REGISTRY[_network];
|
|
141
|
+
}
|
|
142
|
+
function getChain() {
|
|
143
|
+
return CHAIN_REGISTRY[_network].chain;
|
|
144
|
+
}
|
|
145
|
+
function getRpcUrl() {
|
|
146
|
+
const fromConfig = getConfigRpcUrl(_network);
|
|
147
|
+
if (fromConfig) return fromConfig;
|
|
148
|
+
const cfg = CHAIN_REGISTRY[_network];
|
|
149
|
+
if (cfg.rpcEnvVar && process.env[cfg.rpcEnvVar]) {
|
|
150
|
+
return process.env[cfg.rpcEnvVar];
|
|
151
|
+
}
|
|
152
|
+
return cfg.rpcFallback;
|
|
153
|
+
}
|
|
154
|
+
function getExplorerUrl(txHash) {
|
|
155
|
+
return `https://${CHAIN_REGISTRY[_network].explorerHost}/tx/${txHash}`;
|
|
156
|
+
}
|
|
157
|
+
|
|
85
158
|
// src/lib/client.ts
|
|
86
159
|
import { createPublicClient, createWalletClient, http } from "viem";
|
|
87
160
|
import { privateKeyToAccount } from "viem/accounts";
|
|
@@ -102,20 +175,28 @@ function getPrivateKey() {
|
|
|
102
175
|
);
|
|
103
176
|
}
|
|
104
177
|
function getPublicClient() {
|
|
178
|
+
const chain = getChain();
|
|
179
|
+
if (_publicClient && _publicClient.chain?.id !== chain.id) {
|
|
180
|
+
_publicClient = null;
|
|
181
|
+
}
|
|
105
182
|
if (!_publicClient) {
|
|
106
183
|
_publicClient = createPublicClient({
|
|
107
|
-
chain
|
|
184
|
+
chain,
|
|
108
185
|
transport: http(getRpcUrl())
|
|
109
186
|
});
|
|
110
187
|
}
|
|
111
188
|
return _publicClient;
|
|
112
189
|
}
|
|
113
190
|
function getWalletClient() {
|
|
191
|
+
const chain = getChain();
|
|
192
|
+
if (_walletClient && _walletClient.chain?.id !== chain.id) {
|
|
193
|
+
_walletClient = null;
|
|
194
|
+
}
|
|
114
195
|
if (!_walletClient) {
|
|
115
196
|
const account = privateKeyToAccount(getPrivateKey());
|
|
116
197
|
_walletClient = createWalletClient({
|
|
117
198
|
account,
|
|
118
|
-
chain
|
|
199
|
+
chain,
|
|
119
200
|
transport: http(getRpcUrl())
|
|
120
201
|
});
|
|
121
202
|
}
|
|
@@ -126,11 +207,6 @@ function getAccount() {
|
|
|
126
207
|
}
|
|
127
208
|
|
|
128
209
|
export {
|
|
129
|
-
setNetwork,
|
|
130
|
-
getNetwork,
|
|
131
|
-
getChain,
|
|
132
|
-
getRpcUrl,
|
|
133
|
-
getExplorerUrl,
|
|
134
210
|
loadConfig,
|
|
135
211
|
saveConfig,
|
|
136
212
|
cacheGroupId,
|
|
@@ -140,10 +216,18 @@ export {
|
|
|
140
216
|
setAgentId,
|
|
141
217
|
getAgentId,
|
|
142
218
|
setPrivateKey,
|
|
219
|
+
setConfigRpcUrl,
|
|
143
220
|
getChainContracts,
|
|
144
221
|
setChainContract,
|
|
222
|
+
VALID_NETWORKS,
|
|
223
|
+
setNetwork,
|
|
224
|
+
getNetwork,
|
|
225
|
+
getChainConfig,
|
|
226
|
+
getChain,
|
|
227
|
+
getRpcUrl,
|
|
228
|
+
getExplorerUrl,
|
|
145
229
|
getPublicClient,
|
|
146
230
|
getWalletClient,
|
|
147
231
|
getAccount
|
|
148
232
|
};
|
|
149
|
-
//# sourceMappingURL=chunk-
|
|
233
|
+
//# sourceMappingURL=chunk-5ADWTXNT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/config.ts","../src/lib/network.ts","../src/lib/client.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 path from \"node:path\";\n\nconst CONFIG_DIR = path.join(process.env.HOME || \"~\", \".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}\n\nexport function loadConfig(): SherwoodConfig {\n if (fs.existsSync(CONFIG_PATH)) {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n }\n\n const config: SherwoodConfig = { groupCache: {} };\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\n return config;\n}\n\nexport function saveConfig(config: SherwoodConfig): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));\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;\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// ── 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 setChainContract(\n chainId: number,\n key: keyof ChainContracts,\n value: string,\n): void {\n const config = loadConfig();\n if (!config.contracts) config.contracts = {};\n const cid = String(chainId);\n if (!config.contracts[cid]) config.contracts[cid] = {};\n config.contracts[cid][key] = value;\n saveConfig(config);\n}\n","/**\n * Network state singleton.\n *\n * Called once at CLI startup via the --chain flag's preAction hook.\n * Every other module reads from here — never hardcodes a chain.\n */\n\nimport { type Chain, defineChain } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport { getConfigRpcUrl } from \"./config.js\";\n\n// ── Robinhood L2 Testnet (Arbitrum Orbit, chain ID 46630) ──\n\nexport const robinhoodTestnet = defineChain({\n id: 46630,\n name: \"Robinhood Chain Testnet\",\n nativeCurrency: { name: \"Ethereum\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: [\"https://rpc.testnet.chain.robinhood.com\"] },\n },\n blockExplorers: {\n default: {\n name: \"Blockscout\",\n url: \"https://explorer.testnet.chain.robinhood.com\",\n },\n },\n testnet: true,\n});\n\n// ── Types ──\n\nexport type Network = \"base\" | \"base-sepolia\" | \"robinhood-testnet\";\n\nexport interface ChainConfig {\n chain: Chain;\n rpcFallback: string;\n /** Legacy env var for backwards compat (base / base-sepolia only) */\n rpcEnvVar?: string;\n explorerHost: string;\n /** EAS GraphQL endpoint — null if EAS is not available on this chain */\n easGraphqlUrl: string | null;\n /** EAS scan host — null if unavailable */\n easScanHost: string | null;\n xmtpEnv: \"production\" | \"dev\";\n isTestnet: boolean;\n}\n\n// ── Chain Registry ──\n\nexport const CHAIN_REGISTRY: Record<Network, ChainConfig> = {\n base: {\n chain: base,\n rpcFallback: \"https://mainnet.base.org\",\n rpcEnvVar: \"BASE_RPC_URL\",\n explorerHost: \"basescan.org\",\n easGraphqlUrl: \"https://base.easscan.org/graphql\",\n easScanHost: \"base.easscan.org\",\n xmtpEnv: \"production\",\n isTestnet: false,\n },\n \"base-sepolia\": {\n chain: baseSepolia,\n rpcFallback: \"https://sepolia.base.org\",\n rpcEnvVar: \"BASE_SEPOLIA_RPC_URL\",\n explorerHost: \"sepolia.basescan.org\",\n easGraphqlUrl: \"https://base-sepolia.easscan.org/graphql\",\n easScanHost: \"base-sepolia.easscan.org\",\n xmtpEnv: \"dev\",\n isTestnet: true,\n },\n \"robinhood-testnet\": {\n chain: robinhoodTestnet,\n rpcFallback: \"https://rpc.testnet.chain.robinhood.com\",\n explorerHost: \"explorer.testnet.chain.robinhood.com\",\n easGraphqlUrl: null,\n easScanHost: null,\n xmtpEnv: \"dev\",\n isTestnet: true,\n },\n};\n\nexport const VALID_NETWORKS = Object.keys(CHAIN_REGISTRY) as Network[];\n\n// ── Singleton state ──\n\nlet _network: Network = \"base\";\n\nexport function setNetwork(n: Network) {\n const config = CHAIN_REGISTRY[n];\n if (!config) {\n throw new Error(\n `Unknown network: ${n}. Valid: ${VALID_NETWORKS.join(\", \")}`,\n );\n }\n if (config.isTestnet && process.env.ENABLE_TESTNET !== \"true\") {\n throw new Error(\n `Testnet \"${n}\" is disabled. Set ENABLE_TESTNET=true to enable.`,\n );\n }\n _network = n;\n}\n\nexport function getNetwork(): Network {\n return _network;\n}\n\nexport function getChainConfig(): ChainConfig {\n return CHAIN_REGISTRY[_network];\n}\n\nexport function getChain(): Chain {\n return CHAIN_REGISTRY[_network].chain;\n}\n\nexport function getRpcUrl(): string {\n // 1. User config (~/.sherwood/config.json)\n const fromConfig = getConfigRpcUrl(_network);\n if (fromConfig) return fromConfig;\n\n // 2. Legacy env var (backwards compat for base / base-sepolia)\n const cfg = CHAIN_REGISTRY[_network];\n if (cfg.rpcEnvVar && process.env[cfg.rpcEnvVar]) {\n return process.env[cfg.rpcEnvVar]!;\n }\n\n // 3. Public fallback\n return cfg.rpcFallback;\n}\n\nexport function getExplorerUrl(txHash: string): string {\n return `https://${CHAIN_REGISTRY[_network].explorerHost}/tx/${txHash}`;\n}\n\nexport function isTestnet(): boolean {\n return CHAIN_REGISTRY[_network].isTestnet;\n}\n","/**\n * viem client factory — resolves chain and RPC from the network module.\n * Private key is read from ~/.sherwood/config.json (set via `sherwood config set --private-key`),\n * with PRIVATE_KEY env var as fallback.\n */\n\n// dotenv loaded at entrypoint\nimport { createPublicClient, createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { getChain, getRpcUrl } from \"./network.js\";\nimport { loadConfig } from \"./config.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet _publicClient: any = null;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet _walletClient: any = null;\n\n/**\n * Resolve the private key: config → env → error.\n */\nfunction getPrivateKey(): `0x${string}` {\n // 1. Config (~/.sherwood/config.json)\n const config = loadConfig();\n if (config.privateKey) {\n const k = config.privateKey;\n return (k.startsWith(\"0x\") ? k : `0x${k}`) as `0x${string}`;\n }\n\n // 2. Env var fallback\n const env = process.env.PRIVATE_KEY;\n if (env) {\n return (env.startsWith(\"0x\") ? env : `0x${env}`) as `0x${string}`;\n }\n\n throw new Error(\n \"Private key not found. Run 'sherwood config set --private-key <key>' or set PRIVATE_KEY env var.\",\n );\n}\n\nexport function getPublicClient() {\n const chain = getChain();\n // Auto-invalidate if network changed since last creation\n if (_publicClient && _publicClient.chain?.id !== chain.id) {\n _publicClient = null;\n }\n if (!_publicClient) {\n _publicClient = createPublicClient({\n chain,\n transport: http(getRpcUrl()),\n });\n }\n return _publicClient as ReturnType<typeof createPublicClient>;\n}\n\nexport function getWalletClient() {\n const chain = getChain();\n // Auto-invalidate if network changed since last creation\n if (_walletClient && _walletClient.chain?.id !== chain.id) {\n _walletClient = null;\n }\n if (!_walletClient) {\n const account = privateKeyToAccount(getPrivateKey());\n _walletClient = createWalletClient({\n account,\n chain,\n transport: http(getRpcUrl()),\n });\n }\n return _walletClient as ReturnType<typeof createWalletClient>;\n}\n\n/**\n * Reset cached clients. Required for tests that call setNetwork()\n * after a client was already created.\n */\nexport function resetClients() {\n _publicClient = null;\n _walletClient = null;\n}\n\nexport function getAccount() {\n return privateKeyToAccount(getPrivateKey());\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
SHERWOOD,
|
|
6
6
|
SYNDICATE_FACTORY_ABI,
|
|
7
7
|
SYNDICATE_VAULT_ABI
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BXUNWV52.js";
|
|
9
9
|
import {
|
|
10
10
|
getAccount,
|
|
11
11
|
getChain,
|
|
12
12
|
getChainContracts,
|
|
13
13
|
getPublicClient,
|
|
14
14
|
getWalletClient
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-5ADWTXNT.js";
|
|
16
16
|
|
|
17
17
|
// src/lib/vault.ts
|
|
18
18
|
import { formatUnits, encodeFunctionData, decodeFunctionResult } from "viem";
|
|
@@ -347,4 +347,4 @@ export {
|
|
|
347
347
|
setTextRecord,
|
|
348
348
|
getTextRecord
|
|
349
349
|
};
|
|
350
|
-
//# sourceMappingURL=chunk-
|
|
350
|
+
//# sourceMappingURL=chunk-ARZIQ7YZ.js.map
|