@sherwoodagent/cli 0.59.7 → 0.59.12

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 (36) hide show
  1. package/dist/{abis-ITHGPHGM.js → abis-4HWN2E3H.js} +2 -2
  2. package/dist/{agent-4XQOMAEM.js → agent-QI7GVRJV.js} +2 -2
  3. package/dist/{chat-AH36PC43.js → chat-J5G63PFI.js} +5 -5
  4. package/dist/{chunk-HP5AJE2G.js → chunk-4ZM3QQO7.js} +2 -2
  5. package/dist/{chunk-YW6MGRMQ.js → chunk-7TSAKVAO.js} +2 -2
  6. package/dist/{chunk-NLGMVZMW.js → chunk-GAT77CJE.js} +2 -2
  7. package/dist/{chunk-JW7WMYDW.js → chunk-IKQD5ERV.js} +2 -2
  8. package/dist/{chunk-XDEHIZKT.js → chunk-JE3FON2M.js} +2 -2
  9. package/dist/{chunk-SKOVJ7XM.js → chunk-YZHZSBES.js} +1 -15
  10. package/dist/chunk-YZHZSBES.js.map +1 -0
  11. package/dist/{eas-ZX2YIJG7.js → eas-YJF7L25R.js} +3 -3
  12. package/dist/{governor-IOMICY6I.js → governor-4JUK6HDR.js} +3 -3
  13. package/dist/index.js +95 -20
  14. package/dist/index.js.map +1 -1
  15. package/dist/{price-ZCWGU2OM.js → price-NJBSPQ3M.js} +2 -2
  16. package/dist/{research-PPZIWXSM.js → research-PZRG36KL.js} +3 -3
  17. package/dist/{session-OTI3BWIQ.js → session-U3NEZJ7X.js} +5 -5
  18. package/dist/{trade-3OVB2VX5.js → trade-HSNABOTJ.js} +6 -6
  19. package/dist/{xmtp-54ISDDT4.js → xmtp-54DNJCS5.js} +3 -3
  20. package/package.json +1 -1
  21. package/dist/chunk-SKOVJ7XM.js.map +0 -1
  22. /package/dist/{abis-ITHGPHGM.js.map → abis-4HWN2E3H.js.map} +0 -0
  23. /package/dist/{agent-4XQOMAEM.js.map → agent-QI7GVRJV.js.map} +0 -0
  24. /package/dist/{chat-AH36PC43.js.map → chat-J5G63PFI.js.map} +0 -0
  25. /package/dist/{chunk-HP5AJE2G.js.map → chunk-4ZM3QQO7.js.map} +0 -0
  26. /package/dist/{chunk-YW6MGRMQ.js.map → chunk-7TSAKVAO.js.map} +0 -0
  27. /package/dist/{chunk-NLGMVZMW.js.map → chunk-GAT77CJE.js.map} +0 -0
  28. /package/dist/{chunk-JW7WMYDW.js.map → chunk-IKQD5ERV.js.map} +0 -0
  29. /package/dist/{chunk-XDEHIZKT.js.map → chunk-JE3FON2M.js.map} +0 -0
  30. /package/dist/{eas-ZX2YIJG7.js.map → eas-YJF7L25R.js.map} +0 -0
  31. /package/dist/{governor-IOMICY6I.js.map → governor-4JUK6HDR.js.map} +0 -0
  32. /package/dist/{price-ZCWGU2OM.js.map → price-NJBSPQ3M.js.map} +0 -0
  33. /package/dist/{research-PPZIWXSM.js.map → research-PZRG36KL.js.map} +0 -0
  34. /package/dist/{session-OTI3BWIQ.js.map → session-U3NEZJ7X.js.map} +0 -0
  35. /package/dist/{trade-3OVB2VX5.js.map → trade-HSNABOTJ.js.map} +0 -0
  36. /package/dist/{xmtp-54ISDDT4.js.map → xmtp-54DNJCS5.js.map} +0 -0
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  encodeSwapPath,
16
16
  getMultiHopQuote,
17
17
  getQuote
18
- } from "./chunk-YW6MGRMQ.js";
18
+ } from "./chunk-7TSAKVAO.js";
19
19
  import {
20
20
  chatCompletion,
21
21
  checkApiKeyValid,
@@ -32,14 +32,14 @@ import {
32
32
  queryJoinRequests,
33
33
  revokeJoinRequest,
34
34
  stripReferrerPrefix
35
- } from "./chunk-XDEHIZKT.js";
35
+ } from "./chunk-JE3FON2M.js";
36
36
  import {
37
37
  createSyndicate,
38
38
  getActiveSyndicates,
39
39
  getSyndicate,
40
40
  subdomainExists,
41
41
  updateMetadata
42
- } from "./chunk-NLGMVZMW.js";
42
+ } from "./chunk-GAT77CJE.js";
43
43
  import {
44
44
  approveDepositor,
45
45
  deposit,
@@ -63,7 +63,7 @@ import {
63
63
  searchSyndicateAcrossChains,
64
64
  setTextRecord,
65
65
  setVaultAddress
66
- } from "./chunk-HP5AJE2G.js";
66
+ } from "./chunk-4ZM3QQO7.js";
67
67
  import {
68
68
  PROPOSAL_STATE,
69
69
  PROPOSAL_STATES,
@@ -95,7 +95,7 @@ import {
95
95
  setVotingPeriod,
96
96
  settleProposal,
97
97
  vote
98
- } from "./chunk-JW7WMYDW.js";
98
+ } from "./chunk-IKQD5ERV.js";
99
99
  import {
100
100
  AERODROME,
101
101
  AGENT_REGISTRY,
@@ -161,7 +161,7 @@ import {
161
161
  SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,
162
162
  SYNDICATE_VAULT_ABI,
163
163
  VENICE_STAKING_ABI
164
- } from "./chunk-SKOVJ7XM.js";
164
+ } from "./chunk-YZHZSBES.js";
165
165
  import {
166
166
  fetchMetadata,
167
167
  uploadMetadata
@@ -933,6 +933,50 @@ function resolveTemplate(key) {
933
933
  }
934
934
  return { def, address };
935
935
  }
936
+ function computeProposalAssetChecks(templateKey, opts) {
937
+ if (templateKey === "moonwell-supply" || templateKey === "mamo-yield") {
938
+ if (!opts.amount) return [];
939
+ const token = opts.token || "USDC";
940
+ const asset = resolveToken(token);
941
+ const decimals = token.toUpperCase() === "USDC" ? 6 : 18;
942
+ return [{ asset, amount: parseUnits(opts.amount, decimals), label: token.toUpperCase() }];
943
+ }
944
+ if (templateKey === "venice-inference") {
945
+ if (!opts.amount) return [];
946
+ const assetSymbol = opts.asset || "USDC";
947
+ const asset = resolveToken(assetSymbol);
948
+ const decimals = assetSymbol.toUpperCase() === "USDC" ? 6 : 18;
949
+ return [{ asset, amount: parseUnits(opts.amount, decimals), label: assetSymbol.toUpperCase() }];
950
+ }
951
+ if (templateKey === "aerodrome-lp") {
952
+ if (!opts.tokenA || !opts.tokenB || !opts.amountA || !opts.amountB) return [];
953
+ return [];
954
+ }
955
+ if (templateKey === "wsteth-moonwell") {
956
+ if (!opts.amount) return [];
957
+ return [{
958
+ asset: TOKENS().WETH,
959
+ amount: parseUnits(opts.amount, 18),
960
+ label: "WETH"
961
+ }];
962
+ }
963
+ if (templateKey === "portfolio") {
964
+ if (!opts.amount) return [];
965
+ const defaultAsset = getNetwork() === "robinhood-testnet" ? "WETH" : "USDC";
966
+ const assetSymbol = opts.asset || defaultAsset;
967
+ const asset = resolveToken(assetSymbol);
968
+ const decimals = assetSymbol.toUpperCase() === "USDC" ? 6 : 18;
969
+ return [{ asset, amount: parseUnits(opts.amount, decimals), label: assetSymbol.toUpperCase() }];
970
+ }
971
+ if (templateKey === "hyperliquid-perp" || templateKey === "hyperliquid-grid") {
972
+ if (!opts.amount) return [];
973
+ const token = opts.token || "USDC";
974
+ const asset = resolveToken(token);
975
+ const decimals = token.toUpperCase() === "USDC" ? 6 : 18;
976
+ return [{ asset, amount: parseUnits(opts.amount, decimals), label: token.toUpperCase() }];
977
+ }
978
+ return [];
979
+ }
936
980
  async function buildInitDataForTemplate(templateKey, opts, vault) {
937
981
  if (templateKey === "moonwell-supply") {
938
982
  if (!opts.amount) {
@@ -1513,6 +1557,37 @@ function registerStrategyTemplateCommands(strategy2) {
1513
1557
  console.error(chalk.red(` Vault ${vault} is paused. Cannot propose.`));
1514
1558
  process.exit(1);
1515
1559
  }
1560
+ const checks = computeProposalAssetChecks(templateKey, opts);
1561
+ for (const check of checks) {
1562
+ if (check.amount === 0n) continue;
1563
+ const [balance, decimals] = await Promise.all([
1564
+ publicClient.readContract({
1565
+ address: check.asset,
1566
+ abi: erc20Abi,
1567
+ functionName: "balanceOf",
1568
+ args: [vault]
1569
+ }),
1570
+ publicClient.readContract({
1571
+ address: check.asset,
1572
+ abi: erc20Abi,
1573
+ functionName: "decimals"
1574
+ })
1575
+ ]);
1576
+ if (balance < check.amount) {
1577
+ preflightSpinner.fail("Preflight failed");
1578
+ console.error(
1579
+ chalk.red(
1580
+ ` Vault ${vault} holds ${formatUnits(balance, decimals)} ${check.label} but proposal requires ${formatUnits(check.amount, decimals)} ${check.label}.`
1581
+ )
1582
+ );
1583
+ console.error(
1584
+ chalk.yellow(
1585
+ ` Hint: --amount is in human units (e.g. "10" = 10 ${check.label}), not raw decimals.`
1586
+ )
1587
+ );
1588
+ process.exit(1);
1589
+ }
1590
+ }
1516
1591
  preflightSpinner.succeed("Preflight OK");
1517
1592
  } catch (err) {
1518
1593
  preflightSpinner.fail("Preflight failed");
@@ -1627,9 +1702,9 @@ function registerStrategyTemplateCommands(strategy2) {
1627
1702
  console.error(chalk.red("Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission."));
1628
1703
  process.exit(1);
1629
1704
  }
1630
- const { propose: propose2 } = await import("./governor-IOMICY6I.js");
1705
+ const { propose: propose2 } = await import("./governor-4JUK6HDR.js");
1631
1706
  const { pinJSON } = await import("./ipfs-IGXLLJCF.js");
1632
- const { parseDuration: parseDuration2 } = await import("./governor-IOMICY6I.js");
1707
+ const { parseDuration: parseDuration2 } = await import("./governor-4JUK6HDR.js");
1633
1708
  const performanceFeeBps = BigInt(opts.performanceFee);
1634
1709
  if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {
1635
1710
  console.error(chalk.red("--performance-fee must be 0-10000 (basis points)"));
@@ -1737,7 +1812,7 @@ function registerStrategyTemplateCommands(strategy2) {
1737
1812
  let prices = [];
1738
1813
  let priceSource = null;
1739
1814
  try {
1740
- const { getTokenPricesInAsset } = await import("./price-ZCWGU2OM.js");
1815
+ const { getTokenPricesInAsset } = await import("./price-NJBSPQ3M.js");
1741
1816
  prices = await getTokenPricesInAsset({
1742
1817
  tokens: allocations.map((a, i) => ({
1743
1818
  token: a.token,
@@ -2167,7 +2242,7 @@ function registerVeniceCommands(program2) {
2167
2242
  console.log(chalk2.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));
2168
2243
  console.log(chalk2.dim(" Saved to ~/.sherwood/config.json"));
2169
2244
  try {
2170
- const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-ZX2YIJG7.js");
2245
+ const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-YJF7L25R.js");
2171
2246
  const { uid } = await createVeniceProvisionAttestation(account.address);
2172
2247
  if (uid !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
2173
2248
  console.log(chalk2.dim(` Attested: ${getEasScanUrl2(uid)}`));
@@ -2523,7 +2598,7 @@ ${opts.prompt}`;
2523
2598
  console.log(chalk2.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));
2524
2599
  }
2525
2600
  try {
2526
- const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-ZX2YIJG7.js");
2601
+ const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-YJF7L25R.js");
2527
2602
  const { keccak256: keccak2562, toHex, isAddress: isAddr } = await import("viem");
2528
2603
  const { getChainContracts: getChainContracts2 } = await import("./config-REASKDIK.js");
2529
2604
  const { getChain: getActiveChain } = await import("./network-3ZU7UBDU.js");
@@ -3738,7 +3813,7 @@ function printSimulationResult(result, callType) {
3738
3813
  }
3739
3814
  async function sendSimulationAlert(subdomain, proposalId, vault, execResult, settleResult) {
3740
3815
  try {
3741
- const xmtp = await import("./xmtp-54ISDDT4.js");
3816
+ const xmtp = await import("./xmtp-54DNJCS5.js");
3742
3817
  const { getAccount: getAccount2 } = await import("./client-UHHCB6EZ.js");
3743
3818
  const group = await xmtp.getGroup("", subdomain);
3744
3819
  const allRisks = [...execResult.risks, ...settleResult?.risks ?? []];
@@ -6953,7 +7028,7 @@ function parseTokenSplit(raw, tokens) {
6953
7028
  }
6954
7029
  function registerGridCommand(program2) {
6955
7030
  const grid = program2.command("grid").description("Grid trading strategy \u2014 ATR-based grid on BTC/ETH/SOL");
6956
- grid.command("start").description("Start the grid trading loop").option("--capital <usd>", "Starting capital in USD", "5000").option("--cycle <seconds>", "Cycle interval in seconds", "60").option("--tokens <list>", "Comma-separated token list", "bitcoin,ethereum,solana").option("--leverage <n>", "Leverage multiplier", String(DEFAULT_GRID_CONFIG.leverage)).option("--levels <n>", "Grid levels per side", String(DEFAULT_GRID_CONFIG.levelsPerSide)).option("--live", "enable live execution (places real orders on Hyperliquid)").option("--asset-indices <pairs>", "comma-separated token=index pairs (e.g. bitcoin=3,ethereum=4,solana=5)").option("--strategy <address>", "on-chain strategy contract address (enables on-chain executor)").option("--token-split <pairs>", "Comma-separated token=weight pairs (must sum to 1.0). Default: equal-weight.").option("--state-dir <path>", "Override directory for portfolio.json / hedge.json / cycles.jsonl / onchain-state.json. Defaults to ~/.sherwood/grid. Use a separate dir to run paper and live grids in parallel.").action(async (opts) => {
7031
+ grid.command("start").description("Start the grid trading loop").option("--capital <usd>", "Starting capital in USD", "5000").option("--cycle <seconds>", "Cycle interval in seconds", "60").option("--tokens <list>", "Comma-separated token list", "bitcoin,ethereum,solana").option("--leverage <n>", "Leverage multiplier", String(DEFAULT_GRID_CONFIG.leverage)).option("--levels <n>", "Grid levels per side", String(DEFAULT_GRID_CONFIG.levelsPerSide)).option("--live", "enable live execution (places real orders on Hyperliquid)").option("--asset-indices <pairs>", "comma-separated token=index pairs (mainnet: bitcoin=0,ethereum=1,solana=5)").option("--strategy <address>", "on-chain strategy contract address (enables on-chain executor)").option("--token-split <pairs>", "Comma-separated token=weight pairs (must sum to 1.0). Default: equal-weight.").option("--state-dir <path>", "Override directory for portfolio.json / hedge.json / cycles.jsonl / onchain-state.json. Defaults to ~/.sherwood/grid. Use a separate dir to run paper and live grids in parallel.").action(async (opts) => {
6957
7032
  const capital = parseFloat(opts.capital);
6958
7033
  const cycleMs = parseInt(opts.cycle, 10) * 1e3;
6959
7034
  const tokens = opts.tokens.split(",").map((t) => t.trim());
@@ -6964,7 +7039,7 @@ function registerGridCommand(program2) {
6964
7039
  let assetIndices;
6965
7040
  if (live) {
6966
7041
  if (!opts.assetIndices) {
6967
- throw new Error("--asset-indices required when --live (e.g. --asset-indices bitcoin=3,ethereum=4,solana=5)");
7042
+ throw new Error("--asset-indices required when --live (mainnet: --asset-indices bitcoin=0,ethereum=1,solana=5)");
6968
7043
  }
6969
7044
  assetIndices = {};
6970
7045
  for (const pair of opts.assetIndices.split(",")) {
@@ -7190,7 +7265,7 @@ try {
7190
7265
  var require2 = createRequire(import.meta.url);
7191
7266
  var { version: CLI_VERSION } = require2("../package.json");
7192
7267
  async function loadXmtp() {
7193
- return import("./xmtp-54ISDDT4.js");
7268
+ return import("./xmtp-54DNJCS5.js");
7194
7269
  }
7195
7270
  async function loadCron() {
7196
7271
  return import("./cron-EOULYO3R.js");
@@ -8340,7 +8415,7 @@ ${info.name} (${info.type})`);
8340
8415
  }
8341
8416
  });
8342
8417
  try {
8343
- const { registerChatCommands } = await import("./chat-AH36PC43.js");
8418
+ const { registerChatCommands } = await import("./chat-J5G63PFI.js");
8344
8419
  registerChatCommands(program);
8345
8420
  } catch {
8346
8421
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -8350,7 +8425,7 @@ try {
8350
8425
  process.exit(1);
8351
8426
  });
8352
8427
  }
8353
- var { registerSessionCommands } = await import("./session-OTI3BWIQ.js");
8428
+ var { registerSessionCommands } = await import("./session-U3NEZJ7X.js");
8354
8429
  registerSessionCommands(program);
8355
8430
  registerVeniceCommands(program);
8356
8431
  registerAllowanceCommands(program);
@@ -8358,11 +8433,11 @@ registerIdentityCommands(program);
8358
8433
  registerProposalCommands(program);
8359
8434
  registerGovernorCommands(program);
8360
8435
  registerGuardianCommands(program);
8361
- var { registerResearchCommands } = await import("./research-PPZIWXSM.js");
8436
+ var { registerResearchCommands } = await import("./research-PZRG36KL.js");
8362
8437
  registerResearchCommands(program);
8363
- var { registerAgentCommands } = await import("./agent-4XQOMAEM.js");
8438
+ var { registerAgentCommands } = await import("./agent-QI7GVRJV.js");
8364
8439
  registerAgentCommands(program);
8365
- var { registerTradeCommands } = await import("./trade-3OVB2VX5.js");
8440
+ var { registerTradeCommands } = await import("./trade-HSNABOTJ.js");
8366
8441
  registerTradeCommands(program);
8367
8442
  registerGridCommand(program);
8368
8443
  var configCmd = program.command("config");