@sherwoodagent/cli 0.6.1 → 0.7.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.
@@ -1,25 +1,6 @@
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
- }
1
+ import {
2
+ getNetwork
3
+ } from "./chunk-QMWMT6EH.js";
23
4
 
24
5
  // src/lib/addresses.ts
25
6
  var BASE_TOKENS = {
@@ -124,11 +105,13 @@ var BASE_SEPOLIA_EAS = {
124
105
  };
125
106
  var BASE_EAS_SCHEMAS = {
126
107
  SYNDICATE_JOIN_REQUEST: "0x0000000000000000000000000000000000000000000000000000000000000000",
127
- AGENT_APPROVED: "0x0000000000000000000000000000000000000000000000000000000000000000"
108
+ AGENT_APPROVED: "0x0000000000000000000000000000000000000000000000000000000000000000",
109
+ X402_RESEARCH: "0x0000000000000000000000000000000000000000000000000000000000000000"
128
110
  };
129
111
  var BASE_SEPOLIA_EAS_SCHEMAS = {
130
112
  SYNDICATE_JOIN_REQUEST: "0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef",
131
- AGENT_APPROVED: "0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607"
113
+ AGENT_APPROVED: "0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607",
114
+ X402_RESEARCH: "0x0000000000000000000000000000000000000000000000000000000000000000"
132
115
  };
133
116
  function TOKENS() {
134
117
  return getNetwork() === "base" ? BASE_TOKENS : BASE_SEPOLIA_TOKENS;
@@ -158,110 +141,6 @@ function EAS_SCHEMAS() {
158
141
  return getNetwork() === "base" ? BASE_EAS_SCHEMAS : BASE_SEPOLIA_EAS_SCHEMAS;
159
142
  }
160
143
 
161
- // src/lib/config.ts
162
- import fs from "fs";
163
- import path from "path";
164
- var CONFIG_DIR = path.join(process.env.HOME || "~", ".sherwood");
165
- var CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
166
- function loadConfig() {
167
- if (fs.existsSync(CONFIG_PATH)) {
168
- return JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
169
- }
170
- const config = { groupCache: {} };
171
- fs.mkdirSync(CONFIG_DIR, { recursive: true });
172
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
173
- return config;
174
- }
175
- function saveConfig(config) {
176
- fs.mkdirSync(CONFIG_DIR, { recursive: true });
177
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
178
- }
179
- function cacheGroupId(subdomain, groupId) {
180
- const config = loadConfig();
181
- config.groupCache[subdomain] = groupId;
182
- saveConfig(config);
183
- }
184
- function getCachedGroupId(subdomain) {
185
- const config = loadConfig();
186
- return config.groupCache[subdomain];
187
- }
188
- function setVeniceApiKey(apiKey) {
189
- const config = loadConfig();
190
- config.veniceApiKey = apiKey;
191
- saveConfig(config);
192
- }
193
- function getVeniceApiKey() {
194
- return loadConfig().veniceApiKey;
195
- }
196
- function setAgentId(agentId) {
197
- const config = loadConfig();
198
- config.agentId = agentId;
199
- saveConfig(config);
200
- }
201
- function getAgentId() {
202
- return loadConfig().agentId;
203
- }
204
- function setPrivateKey(key) {
205
- const config = loadConfig();
206
- config.privateKey = key.startsWith("0x") ? key : `0x${key}`;
207
- saveConfig(config);
208
- }
209
- function getChainContracts(chainId) {
210
- const config = loadConfig();
211
- return config.contracts?.[String(chainId)] ?? {};
212
- }
213
- function setChainContract(chainId, key, value) {
214
- const config = loadConfig();
215
- if (!config.contracts) config.contracts = {};
216
- const cid = String(chainId);
217
- if (!config.contracts[cid]) config.contracts[cid] = {};
218
- config.contracts[cid][key] = value;
219
- saveConfig(config);
220
- }
221
-
222
- // src/lib/client.ts
223
- import { createPublicClient, createWalletClient, http } from "viem";
224
- import { privateKeyToAccount } from "viem/accounts";
225
- var _publicClient = null;
226
- var _walletClient = null;
227
- function getPrivateKey() {
228
- const config = loadConfig();
229
- if (config.privateKey) {
230
- const k = config.privateKey;
231
- return k.startsWith("0x") ? k : `0x${k}`;
232
- }
233
- const env = process.env.PRIVATE_KEY;
234
- if (env) {
235
- return env.startsWith("0x") ? env : `0x${env}`;
236
- }
237
- throw new Error(
238
- "Private key not found. Run 'sherwood config set --private-key <key>' or set PRIVATE_KEY env var."
239
- );
240
- }
241
- function getPublicClient() {
242
- if (!_publicClient) {
243
- _publicClient = createPublicClient({
244
- chain: getChain(),
245
- transport: http(getRpcUrl())
246
- });
247
- }
248
- return _publicClient;
249
- }
250
- function getWalletClient() {
251
- if (!_walletClient) {
252
- const account = privateKeyToAccount(getPrivateKey());
253
- _walletClient = createWalletClient({
254
- account,
255
- chain: getChain(),
256
- transport: http(getRpcUrl())
257
- });
258
- }
259
- return _walletClient;
260
- }
261
- function getAccount() {
262
- return privateKeyToAccount(getPrivateKey());
263
- }
264
-
265
144
  // src/lib/abis.ts
266
145
  var SYNDICATE_VAULT_ABI = [
267
146
  // ERC-4626
@@ -1041,371 +920,23 @@ var EAS_ABI = [
1041
920
  }
1042
921
  ];
1043
922
 
1044
- // src/lib/vault.ts
1045
- import { formatUnits, encodeFunctionData, decodeFunctionResult } from "viem";
1046
- var _vaultOverride = null;
1047
- function setVaultAddress(addr) {
1048
- _vaultOverride = addr;
1049
- }
1050
- function getVaultAddress() {
1051
- if (_vaultOverride) return _vaultOverride;
1052
- const chainId = getChain().id;
1053
- const fromConfig = getChainContracts(chainId).vault;
1054
- if (fromConfig) return fromConfig;
1055
- throw new Error(
1056
- "Vault address not found. Pass --vault <addr> or run 'sherwood config set --vault <addr>'."
1057
- );
1058
- }
1059
- async function getAssetAddress() {
1060
- const client = getPublicClient();
1061
- return client.readContract({
1062
- address: getVaultAddress(),
1063
- abi: SYNDICATE_VAULT_ABI,
1064
- functionName: "asset"
1065
- });
1066
- }
1067
- async function getAssetDecimals() {
1068
- const client = getPublicClient();
1069
- const asset = await getAssetAddress();
1070
- return client.readContract({
1071
- address: asset,
1072
- abi: ERC20_ABI,
1073
- functionName: "decimals"
1074
- });
1075
- }
1076
- async function deposit(amount) {
1077
- const wallet = getWalletClient();
1078
- const client = getPublicClient();
1079
- const vaultAddress = getVaultAddress();
1080
- const account = getAccount();
1081
- const asset = await getAssetAddress();
1082
- const approveHash = await wallet.writeContract({
1083
- account: getAccount(),
1084
- chain: getChain(),
1085
- address: asset,
1086
- abi: ERC20_ABI,
1087
- functionName: "approve",
1088
- args: [vaultAddress, amount]
1089
- });
1090
- await client.waitForTransactionReceipt({ hash: approveHash });
1091
- return wallet.writeContract({
1092
- account: getAccount(),
1093
- chain: getChain(),
1094
- address: vaultAddress,
1095
- abi: SYNDICATE_VAULT_ABI,
1096
- functionName: "deposit",
1097
- args: [amount, account.address]
1098
- });
1099
- }
1100
- async function ragequit() {
1101
- const wallet = getWalletClient();
1102
- const account = getAccount();
1103
- return wallet.writeContract({
1104
- account: getAccount(),
1105
- chain: getChain(),
1106
- address: getVaultAddress(),
1107
- abi: SYNDICATE_VAULT_ABI,
1108
- functionName: "ragequit",
1109
- args: [account.address]
1110
- });
1111
- }
1112
- async function executeBatch(calls) {
1113
- const wallet = getWalletClient();
1114
- return wallet.writeContract({
1115
- account: getAccount(),
1116
- chain: getChain(),
1117
- address: getVaultAddress(),
1118
- abi: SYNDICATE_VAULT_ABI,
1119
- functionName: "executeBatch",
1120
- args: [
1121
- calls.map((c) => ({
1122
- target: c.target,
1123
- data: c.data,
1124
- value: c.value
1125
- }))
1126
- ]
1127
- });
1128
- }
1129
- async function simulateBatch(calls) {
1130
- const client = getPublicClient();
1131
- const vaultAddress = getVaultAddress();
1132
- const calldata = encodeFunctionData({
1133
- abi: SYNDICATE_VAULT_ABI,
1134
- functionName: "simulateBatch",
1135
- args: [
1136
- calls.map((c) => ({
1137
- target: c.target,
1138
- data: c.data,
1139
- value: c.value
1140
- }))
1141
- ]
1142
- });
1143
- const { data } = await client.call({
1144
- to: vaultAddress,
1145
- data: calldata
1146
- });
1147
- if (!data) {
1148
- throw new Error("simulateBatch returned no data");
1149
- }
1150
- const decoded = decodeFunctionResult({
1151
- abi: SYNDICATE_VAULT_ABI,
1152
- functionName: "simulateBatch",
1153
- data
1154
- });
1155
- return decoded.map((r) => ({
1156
- success: r.success,
1157
- returnData: r.returnData
1158
- }));
1159
- }
1160
- async function approveDepositor(depositor) {
1161
- const wallet = getWalletClient();
1162
- return wallet.writeContract({
1163
- account: getAccount(),
1164
- chain: getChain(),
1165
- address: getVaultAddress(),
1166
- abi: SYNDICATE_VAULT_ABI,
1167
- functionName: "approveDepositor",
1168
- args: [depositor]
1169
- });
1170
- }
1171
- async function removeDepositor(depositor) {
1172
- const wallet = getWalletClient();
1173
- return wallet.writeContract({
1174
- account: getAccount(),
1175
- chain: getChain(),
1176
- address: getVaultAddress(),
1177
- abi: SYNDICATE_VAULT_ABI,
1178
- functionName: "removeDepositor",
1179
- args: [depositor]
1180
- });
1181
- }
1182
- async function isAgent(pkpAddress) {
1183
- const client = getPublicClient();
1184
- return client.readContract({
1185
- address: getVaultAddress(),
1186
- abi: SYNDICATE_VAULT_ABI,
1187
- functionName: "isAgent",
1188
- args: [pkpAddress]
1189
- });
1190
- }
1191
- async function getBalance(address) {
1192
- const client = getPublicClient();
1193
- const vaultAddress = getVaultAddress();
1194
- const account = address || getAccount().address;
1195
- const [shares, totalSupply] = await Promise.all([
1196
- client.readContract({
1197
- address: vaultAddress,
1198
- abi: SYNDICATE_VAULT_ABI,
1199
- functionName: "balanceOf",
1200
- args: [account]
1201
- }),
1202
- client.readContract({
1203
- address: vaultAddress,
1204
- abi: SYNDICATE_VAULT_ABI,
1205
- functionName: "totalSupply"
1206
- })
1207
- ]);
1208
- let assetsValue = 0n;
1209
- if (shares > 0n) {
1210
- assetsValue = await client.readContract({
1211
- address: vaultAddress,
1212
- abi: SYNDICATE_VAULT_ABI,
1213
- functionName: "convertToAssets",
1214
- args: [shares]
1215
- });
1216
- }
1217
- const percent = totalSupply > 0n ? (Number(shares) / Number(totalSupply) * 100).toFixed(2) : "0.00";
1218
- const decimals = await getAssetDecimals();
1219
- return {
1220
- shares,
1221
- assetsValue: formatUnits(assetsValue, decimals),
1222
- percentOfVault: `${percent}%`
1223
- };
1224
- }
1225
- async function registerAgent(agentId, pkpAddress, operatorEOA) {
1226
- const wallet = getWalletClient();
1227
- const client = getPublicClient();
1228
- const hash = await wallet.writeContract({
1229
- account: getAccount(),
1230
- chain: getChain(),
1231
- address: getVaultAddress(),
1232
- abi: SYNDICATE_VAULT_ABI,
1233
- functionName: "registerAgent",
1234
- args: [agentId, pkpAddress, operatorEOA]
1235
- });
1236
- await client.waitForTransactionReceipt({ hash });
1237
- return hash;
1238
- }
1239
- async function getVaultInfo() {
1240
- const client = getPublicClient();
1241
- const vaultAddress = getVaultAddress();
1242
- const [totalAssets, agentCount, redemptionsLocked, managementFeeBps, decimals] = await Promise.all([
1243
- client.readContract({
1244
- address: vaultAddress,
1245
- abi: SYNDICATE_VAULT_ABI,
1246
- functionName: "totalAssets"
1247
- }),
1248
- client.readContract({
1249
- address: vaultAddress,
1250
- abi: SYNDICATE_VAULT_ABI,
1251
- functionName: "getAgentCount"
1252
- }),
1253
- client.readContract({
1254
- address: vaultAddress,
1255
- abi: SYNDICATE_VAULT_ABI,
1256
- functionName: "redemptionsLocked"
1257
- }),
1258
- client.readContract({
1259
- address: vaultAddress,
1260
- abi: SYNDICATE_VAULT_ABI,
1261
- functionName: "managementFeeBps"
1262
- }),
1263
- getAssetDecimals()
1264
- ]);
1265
- return {
1266
- address: vaultAddress,
1267
- totalAssets: formatUnits(totalAssets, decimals),
1268
- agentCount,
1269
- redemptionsLocked,
1270
- managementFeeBps
1271
- };
1272
- }
1273
-
1274
- // src/lib/ens.ts
1275
- import { encodeFunctionData as encodeFunctionData2 } from "viem";
1276
- import { namehash } from "viem/ens";
1277
- var ENS_DOMAIN = "sherwoodagent.eth";
1278
- function getFactoryAddress() {
1279
- return SHERWOOD().FACTORY;
1280
- }
1281
- async function resolveSyndicate(subdomain) {
1282
- const client = getPublicClient();
1283
- const factory = getFactoryAddress();
1284
- const syndicateId = await client.readContract({
1285
- address: factory,
1286
- abi: SYNDICATE_FACTORY_ABI,
1287
- functionName: "subdomainToSyndicate",
1288
- args: [subdomain]
1289
- });
1290
- if (syndicateId === 0n) {
1291
- throw new Error(`Syndicate "${subdomain}" not found`);
1292
- }
1293
- const result = await client.readContract({
1294
- address: factory,
1295
- abi: SYNDICATE_FACTORY_ABI,
1296
- functionName: "syndicates",
1297
- args: [syndicateId]
1298
- });
1299
- return {
1300
- id: result[0],
1301
- vault: result[1],
1302
- creator: result[2],
1303
- subdomain: result[6]
1304
- };
1305
- }
1306
- async function resolveVaultSyndicate(vaultAddress) {
1307
- const client = getPublicClient();
1308
- const factory = getFactoryAddress();
1309
- const syndicateId = await client.readContract({
1310
- address: factory,
1311
- abi: SYNDICATE_FACTORY_ABI,
1312
- functionName: "vaultToSyndicate",
1313
- args: [vaultAddress]
1314
- });
1315
- if (syndicateId === 0n) {
1316
- throw new Error(`No syndicate found for vault ${vaultAddress}`);
1317
- }
1318
- const result = await client.readContract({
1319
- address: factory,
1320
- abi: SYNDICATE_FACTORY_ABI,
1321
- functionName: "syndicates",
1322
- args: [syndicateId]
1323
- });
1324
- return {
1325
- id: result[0],
1326
- vault: result[1],
1327
- creator: result[2],
1328
- subdomain: result[6]
1329
- };
1330
- }
1331
- function getSubdomainNode(subdomain) {
1332
- return namehash(`${subdomain}.${ENS_DOMAIN}`);
1333
- }
1334
- async function setTextRecord(subdomain, key, value, vaultAddress) {
1335
- const l2Registry = ENS().L2_REGISTRY;
1336
- const node = getSubdomainNode(subdomain);
1337
- setVaultAddress(vaultAddress);
1338
- const setTextData = encodeFunctionData2({
1339
- abi: L2_REGISTRY_ABI,
1340
- functionName: "setText",
1341
- args: [node, key, value]
1342
- });
1343
- return executeBatch(
1344
- [{ target: l2Registry, data: setTextData, value: 0n }]
1345
- );
1346
- }
1347
- async function getTextRecord(subdomain, key) {
1348
- const client = getPublicClient();
1349
- const node = getSubdomainNode(subdomain);
1350
- return client.readContract({
1351
- address: ENS().L2_REGISTRY,
1352
- abi: L2_REGISTRY_ABI,
1353
- functionName: "text",
1354
- args: [node, key]
1355
- });
1356
- }
1357
-
1358
923
  export {
1359
- setNetwork,
1360
- getNetwork,
1361
- getChain,
1362
- getRpcUrl,
1363
- getExplorerUrl,
1364
924
  TOKENS,
1365
925
  MOONWELL,
1366
926
  UNISWAP,
927
+ ENS,
1367
928
  AGENT_REGISTRY,
1368
929
  VENICE,
1369
930
  SHERWOOD,
1370
931
  EAS_CONTRACTS,
1371
932
  EAS_SCHEMAS,
1372
- loadConfig,
1373
- saveConfig,
1374
- cacheGroupId,
1375
- getCachedGroupId,
1376
- setVeniceApiKey,
1377
- getVeniceApiKey,
1378
- setAgentId,
1379
- getAgentId,
1380
- setPrivateKey,
1381
- getChainContracts,
1382
- setChainContract,
1383
- getPublicClient,
1384
- getWalletClient,
1385
- getAccount,
1386
933
  SYNDICATE_VAULT_ABI,
1387
934
  UNISWAP_QUOTER_V2_ABI,
1388
935
  ERC20_ABI,
1389
936
  SYNDICATE_FACTORY_ABI,
937
+ L2_REGISTRY_ABI,
1390
938
  STRATEGY_REGISTRY_ABI,
1391
939
  VENICE_STAKING_ABI,
1392
- EAS_ABI,
1393
- setVaultAddress,
1394
- getVaultAddress,
1395
- getAssetDecimals,
1396
- deposit,
1397
- ragequit,
1398
- executeBatch,
1399
- simulateBatch,
1400
- approveDepositor,
1401
- removeDepositor,
1402
- isAgent,
1403
- getBalance,
1404
- registerAgent,
1405
- getVaultInfo,
1406
- resolveSyndicate,
1407
- resolveVaultSyndicate,
1408
- setTextRecord,
1409
- getTextRecord
940
+ EAS_ABI
1410
941
  };
1411
- //# sourceMappingURL=chunk-WAJ6T64Y.js.map
942
+ //# sourceMappingURL=chunk-FGSXRXCZ.js.map