@sherwoodagent/cli 0.51.0 → 0.52.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.
Files changed (40) hide show
  1. package/dist/{abis-RGCO5GHC.js → abis-Z6M6SRPX.js} +2 -2
  2. package/dist/{addresses-DOWLGXGE.js → addresses-CKPOWDDV.js} +2 -2
  3. package/dist/{agent-ZPAZTJG3.js → agent-E5GHURKJ.js} +2 -2
  4. package/dist/{chat-MRTPUZ3X.js → chat-3IW4XDZJ.js} +6 -6
  5. package/dist/{chunk-IS2CLLUT.js → chunk-D2D6BPBM.js} +3 -3
  6. package/dist/{chunk-R7X33D2S.js → chunk-ENIUCMDV.js} +3 -3
  7. package/dist/{chunk-D77JGXIV.js → chunk-J2FOCXF2.js} +1 -8
  8. package/dist/{chunk-D77JGXIV.js.map → chunk-J2FOCXF2.js.map} +1 -1
  9. package/dist/{chunk-E6LH2FJ6.js → chunk-JEKXXHI5.js} +3 -3
  10. package/dist/{chunk-KJ35EF7N.js → chunk-JY46LEIS.js} +3 -3
  11. package/dist/{chunk-FWC57PT7.js → chunk-LXUNJSB6.js} +9 -5
  12. package/dist/chunk-LXUNJSB6.js.map +1 -0
  13. package/dist/{chunk-WMZEOR5W.js → chunk-ZRU43SUB.js} +3 -3
  14. package/dist/{eas-PEEWGSAO.js → eas-PFIAGWAB.js} +4 -4
  15. package/dist/{governor-MG5VVSU4.js → governor-CQG4LA43.js} +4 -4
  16. package/dist/index.js +132 -54
  17. package/dist/index.js.map +1 -1
  18. package/dist/{price-WCCXWPDM.js → price-UC2W6HYQ.js} +3 -3
  19. package/dist/{research-QBKISW2M.js → research-2GOILSS7.js} +3 -3
  20. package/dist/{session-FPCPCVQX.js → session-ZMEKZRWL.js} +6 -6
  21. package/dist/{trade-NO6CNWCA.js → trade-UXQOCNLJ.js} +7 -7
  22. package/dist/{xmtp-ACB2W573.js → xmtp-KEFA7F24.js} +4 -4
  23. package/package.json +1 -1
  24. package/dist/chunk-FWC57PT7.js.map +0 -1
  25. /package/dist/{abis-RGCO5GHC.js.map → abis-Z6M6SRPX.js.map} +0 -0
  26. /package/dist/{addresses-DOWLGXGE.js.map → addresses-CKPOWDDV.js.map} +0 -0
  27. /package/dist/{agent-ZPAZTJG3.js.map → agent-E5GHURKJ.js.map} +0 -0
  28. /package/dist/{chat-MRTPUZ3X.js.map → chat-3IW4XDZJ.js.map} +0 -0
  29. /package/dist/{chunk-IS2CLLUT.js.map → chunk-D2D6BPBM.js.map} +0 -0
  30. /package/dist/{chunk-R7X33D2S.js.map → chunk-ENIUCMDV.js.map} +0 -0
  31. /package/dist/{chunk-E6LH2FJ6.js.map → chunk-JEKXXHI5.js.map} +0 -0
  32. /package/dist/{chunk-KJ35EF7N.js.map → chunk-JY46LEIS.js.map} +0 -0
  33. /package/dist/{chunk-WMZEOR5W.js.map → chunk-ZRU43SUB.js.map} +0 -0
  34. /package/dist/{eas-PEEWGSAO.js.map → eas-PFIAGWAB.js.map} +0 -0
  35. /package/dist/{governor-MG5VVSU4.js.map → governor-CQG4LA43.js.map} +0 -0
  36. /package/dist/{price-WCCXWPDM.js.map → price-UC2W6HYQ.js.map} +0 -0
  37. /package/dist/{research-QBKISW2M.js.map → research-2GOILSS7.js.map} +0 -0
  38. /package/dist/{session-FPCPCVQX.js.map → session-ZMEKZRWL.js.map} +0 -0
  39. /package/dist/{trade-NO6CNWCA.js.map → trade-UXQOCNLJ.js.map} +0 -0
  40. /package/dist/{xmtp-ACB2W573.js.map → xmtp-KEFA7F24.js.map} +0 -0
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  encodeSwapPath,
14
14
  getMultiHopQuote,
15
15
  getQuote
16
- } from "./chunk-WMZEOR5W.js";
16
+ } from "./chunk-ZRU43SUB.js";
17
17
  import {
18
18
  chatCompletion,
19
19
  checkApiKeyValid,
@@ -30,14 +30,14 @@ import {
30
30
  queryJoinRequests,
31
31
  revokeJoinRequest,
32
32
  stripReferrerPrefix
33
- } from "./chunk-E6LH2FJ6.js";
33
+ } from "./chunk-JEKXXHI5.js";
34
34
  import {
35
35
  createSyndicate,
36
36
  getActiveSyndicates,
37
37
  getSyndicate,
38
38
  subdomainExists,
39
39
  updateMetadata
40
- } from "./chunk-IS2CLLUT.js";
40
+ } from "./chunk-D2D6BPBM.js";
41
41
  import {
42
42
  approveDepositor,
43
43
  deposit,
@@ -61,7 +61,7 @@ import {
61
61
  searchSyndicateAcrossChains,
62
62
  setTextRecord,
63
63
  setVaultAddress
64
- } from "./chunk-R7X33D2S.js";
64
+ } from "./chunk-ENIUCMDV.js";
65
65
  import {
66
66
  PROPOSAL_STATE,
67
67
  PROPOSAL_STATES,
@@ -93,7 +93,7 @@ import {
93
93
  setVotingPeriod,
94
94
  settleProposal,
95
95
  vote
96
- } from "./chunk-KJ35EF7N.js";
96
+ } from "./chunk-JY46LEIS.js";
97
97
  import {
98
98
  AERODROME,
99
99
  AGENT_REGISTRY,
@@ -105,7 +105,7 @@ import {
105
105
  TOKENS,
106
106
  UNISWAP,
107
107
  VENICE
108
- } from "./chunk-FWC57PT7.js";
108
+ } from "./chunk-LXUNJSB6.js";
109
109
  import {
110
110
  formatContractError,
111
111
  getAccount,
@@ -158,7 +158,7 @@ import {
158
158
  SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,
159
159
  SYNDICATE_VAULT_ABI,
160
160
  VENICE_STAKING_ABI
161
- } from "./chunk-D77JGXIV.js";
161
+ } from "./chunk-J2FOCXF2.js";
162
162
  import {
163
163
  fetchMetadata,
164
164
  uploadMetadata
@@ -208,7 +208,7 @@ var MoonwellProvider = class {
208
208
  };
209
209
 
210
210
  // src/commands/strategy-template.ts
211
- import { parseUnits, formatUnits, isAddress, erc20Abi, encodeAbiParameters as encodeAbiParameters8, decodeAbiParameters } from "viem";
211
+ import { parseUnits, formatUnits, isAddress, erc20Abi, encodeAbiParameters as encodeAbiParameters9, decodeAbiParameters } from "viem";
212
212
  import chalk from "chalk";
213
213
  import ora from "ora";
214
214
  import { writeFileSync, mkdirSync } from "fs";
@@ -593,18 +593,17 @@ function buildSettleCalls6(clone) {
593
593
 
594
594
  // src/strategies/hyperliquid-perp-template.ts
595
595
  import { encodeAbiParameters as encodeAbiParameters7, encodeFunctionData as encodeFunctionData7, maxUint256 as maxUint2562 } from "viem";
596
- function buildInitData7(asset, depositAmount, minReturnAmount, perpAssetIndex, leverage, maxPositionSize, maxTradesPerDay) {
596
+ function buildInitData7(asset, depositAmount, perpAssetIndex, leverage, maxPositionSize, maxTradesPerDay) {
597
597
  return encodeAbiParameters7(
598
598
  [
599
599
  { type: "address" },
600
600
  { type: "uint256" },
601
- { type: "uint256" },
602
601
  { type: "uint32" },
603
602
  { type: "uint32" },
604
603
  { type: "uint256" },
605
604
  { type: "uint32" }
606
605
  ],
607
- [asset, depositAmount, minReturnAmount, perpAssetIndex, leverage, maxPositionSize, maxTradesPerDay]
606
+ [asset, depositAmount, perpAssetIndex, leverage, maxPositionSize, maxTradesPerDay]
608
607
  );
609
608
  }
610
609
  function buildExecuteCalls7(clone, asset, amount) {
@@ -651,6 +650,65 @@ function buildSettleCalls7(clone) {
651
650
  ];
652
651
  }
653
652
 
653
+ // src/strategies/hyperliquid-grid-template.ts
654
+ import { encodeAbiParameters as encodeAbiParameters8, encodeFunctionData as encodeFunctionData8, maxUint256 as maxUint2563 } from "viem";
655
+ function buildInitData8(asset, depositAmount, leverage, maxOrderSize, maxOrdersPerTick, assetIndices) {
656
+ return encodeAbiParameters8(
657
+ [
658
+ { type: "address" },
659
+ { type: "uint256" },
660
+ { type: "uint32" },
661
+ { type: "uint256" },
662
+ { type: "uint32" },
663
+ { type: "uint32[]" }
664
+ ],
665
+ [asset, depositAmount, leverage, maxOrderSize, maxOrdersPerTick, assetIndices]
666
+ );
667
+ }
668
+ function buildExecuteCalls8(clone, asset, amount) {
669
+ const approveAmount = amount === 0n ? maxUint2563 : amount;
670
+ return [
671
+ {
672
+ target: asset,
673
+ data: encodeFunctionData8({
674
+ abi: ERC20_ABI,
675
+ functionName: "approve",
676
+ args: [clone, approveAmount]
677
+ }),
678
+ value: 0n
679
+ },
680
+ {
681
+ target: clone,
682
+ data: encodeFunctionData8({
683
+ abi: BASE_STRATEGY_ABI,
684
+ functionName: "execute"
685
+ }),
686
+ value: 0n
687
+ },
688
+ {
689
+ target: asset,
690
+ data: encodeFunctionData8({
691
+ abi: ERC20_ABI,
692
+ functionName: "approve",
693
+ args: [clone, 0n]
694
+ }),
695
+ value: 0n
696
+ }
697
+ ];
698
+ }
699
+ function buildSettleCalls8(clone) {
700
+ return [
701
+ {
702
+ target: clone,
703
+ data: encodeFunctionData8({
704
+ abi: BASE_STRATEGY_ABI,
705
+ functionName: "settle"
706
+ }),
707
+ value: 0n
708
+ }
709
+ ];
710
+ }
711
+
654
712
  // src/commands/strategy-template.ts
655
713
  import { concat as concat2, numberToHex } from "viem";
656
714
  var ZERO = "0x0000000000000000000000000000000000000000";
@@ -667,14 +725,14 @@ function encodeV3Path(tokens, fees) {
667
725
  }
668
726
  function buildSwapExtraData(network, tokenIn, tokenOut, feeTier, hop) {
669
727
  if (network === "robinhood-testnet") {
670
- return encodeAbiParameters8([{ type: "uint24" }], [feeTier]);
728
+ return encodeAbiParameters9([{ type: "uint24" }], [feeTier]);
671
729
  }
672
730
  if (hop) {
673
731
  const path = encodeV3Path([tokenIn, hop.via, tokenOut], [hop.feeIn, hop.feeOut]);
674
- const encoded2 = encodeAbiParameters8([{ type: "bytes" }], [path]);
732
+ const encoded2 = encodeAbiParameters9([{ type: "bytes" }], [path]);
675
733
  return `0x01${encoded2.slice(2)}`;
676
734
  }
677
- const encoded = encodeAbiParameters8([{ type: "uint24" }], [feeTier]);
735
+ const encoded = encodeAbiParameters9([{ type: "uint24" }], [feeTier]);
678
736
  return `0x00${encoded.slice(2)}`;
679
737
  }
680
738
  async function detectSwapRoute(asset, token, preferredFeeTier) {
@@ -813,6 +871,12 @@ var TEMPLATES = [
813
871
  key: "hyperliquid-perp",
814
872
  description: "Leveraged perp trading on Hyperliquid via HyperEVM precompiles",
815
873
  addressKey: "HYPERLIQUID_PERP"
874
+ },
875
+ {
876
+ name: "Hyperliquid Grid",
877
+ key: "hyperliquid-grid",
878
+ description: "ATR-based grid trading on Hyperliquid via HyperEVM precompiles",
879
+ addressKey: "HYPERLIQUID_GRID"
816
880
  }
817
881
  ];
818
882
  function resolveTemplate(key) {
@@ -1070,19 +1134,27 @@ async function buildInitDataForTemplate(templateKey, opts, vault) {
1070
1134
  const asset = resolveToken(token);
1071
1135
  const decimals = token.toUpperCase() === "USDC" ? 6 : 18;
1072
1136
  const depositAmount = opts.amount ? parseUnits(opts.amount, decimals) : 0n;
1073
- if (depositAmount === 0n && !opts.minReturn) {
1074
- console.error(chalk.red(
1075
- "--min-return is required when --amount is omitted (dynamic-all mode).\n The settlement floor can't be derived without a reference deposit \u2014 set it explicitly to the minimum USDC you'll accept back from HyperCore."
1076
- ));
1077
- process.exit(1);
1078
- }
1079
- const minReturn = opts.minReturn ? parseUnits(opts.minReturn, decimals) : opts.amount ? parseUnits(opts.amount, decimals) : 0n;
1080
1137
  const leverage = Number(opts.leverage || "10");
1081
1138
  const assetIndex = Number(opts.assetIndex || "0");
1082
1139
  const maxPosition = parseUnits(opts.maxPosition || "100000", decimals);
1083
1140
  const maxTradesDay = Number(opts.maxTradesPerDay || "50");
1084
1141
  return {
1085
- initData: buildInitData7(asset, depositAmount, minReturn, assetIndex, leverage, maxPosition, maxTradesDay),
1142
+ initData: buildInitData7(asset, depositAmount, assetIndex, leverage, maxPosition, maxTradesDay),
1143
+ asset,
1144
+ assetAmount: depositAmount
1145
+ };
1146
+ }
1147
+ if (templateKey === "hyperliquid-grid") {
1148
+ const token = opts.token || "USDC";
1149
+ const asset = resolveToken(token);
1150
+ const decimals = token.toUpperCase() === "USDC" ? 6 : 18;
1151
+ const depositAmount = opts.amount ? parseUnits(opts.amount, decimals) : 0n;
1152
+ const leverage = Number(opts.leverage || "5");
1153
+ const maxOrderSize = parseUnits(opts.maxOrderSize || "10000", decimals);
1154
+ const maxOrdersPerTick = Number(opts.maxOrdersPerTick || "20");
1155
+ const assetIndices = (opts.assetIndices || "0").split(",").map((s) => Number(s.trim())).filter((n) => !Number.isNaN(n));
1156
+ return {
1157
+ initData: buildInitData8(asset, depositAmount, leverage, maxOrderSize, maxOrdersPerTick, assetIndices),
1086
1158
  asset,
1087
1159
  assetAmount: depositAmount
1088
1160
  };
@@ -1134,6 +1206,12 @@ function buildCallsForTemplate(templateKey, clone, asset, assetAmount, extraAppr
1134
1206
  settleCalls: buildSettleCalls7(clone)
1135
1207
  };
1136
1208
  }
1209
+ if (templateKey === "hyperliquid-grid") {
1210
+ return {
1211
+ executeCalls: buildExecuteCalls8(clone, asset, assetAmount),
1212
+ settleCalls: buildSettleCalls8(clone)
1213
+ };
1214
+ }
1137
1215
  throw new Error(`No call builder for template: ${templateKey}`);
1138
1216
  }
1139
1217
  function resolveSwapAdapter() {
@@ -1228,7 +1306,7 @@ function registerStrategyTemplateCommands(strategy2) {
1228
1306
  console.log(chalk.dim("Full proposal: sherwood strategy propose <template> --vault <addr> ..."));
1229
1307
  console.log();
1230
1308
  });
1231
- strategy2.command("clone").description("Clone a strategy template and initialize it").argument("<template>", "Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp").requiredOption("--vault <address>", "Vault address").option("--amount <n>", "Asset amount to deploy").option("--min-redeem <n>", "Min asset on settlement (Moonwell)").option("--token <symbol>", "Asset token symbol (default: USDC)").option("--asset <symbol>", "Asset token (USDC, VVV, or address)").option("--agent <address>", "Agent wallet (Venice, default: your wallet)").option("--min-vvv <n>", "Min VVV from swap (Venice)").option("--single-hop", "Single-hop Aerodrome swap (Venice)").option("--token-a <address>", "Token A (Aerodrome)").option("--token-b <address>", "Token B (Aerodrome)").option("--amount-a <n>", "Token A amount (Aerodrome)").option("--amount-b <n>", "Token B amount (Aerodrome)").option("--stable", "Stable pool (Aerodrome)").option("--gauge <address>", "Gauge address (Aerodrome)").option("--lp-token <address>", "LP token address (Aerodrome)").option("--min-a-out <n>", "Min token A on settle (Aerodrome)").option("--min-b-out <n>", "Min token B on settle (Aerodrome)").option("--slippage <bps>", "Slippage tolerance in bps (wstETH, default: 500 = 5%)").option("--mamo-factory <address>", "Mamo StrategyFactory address (Mamo)").option("--tokens <list>", "Comma-separated token addresses or symbols (Portfolio)").option("--weights <list>", "Comma-separated weights in bps, must sum to 10000 (Portfolio)").option("--max-slippage <bps>", "Max slippage bps (Portfolio, default: 500)").option("--fee-tier <n>", "Pool fee tier (Portfolio, default: 3000)").option("--swap-adapter <address>", "Swap adapter address (Portfolio)").option("--leverage <number>", "Leverage multiplier (Hyperliquid Perp, default: 10)").option("--asset-index <number>", "Perp asset index (Hyperliquid Perp, default: 0 for BTC)").option("--min-return <n>", "Min return amount on settlement (Hyperliquid Perp)").option("--max-position <amount>", "Max position size in USD (Hyperliquid Perp, default: 100000)").option("--max-trades-per-day <n>", "Max trades per day (Hyperliquid Perp, default: 50)").action(async (templateKey, opts) => {
1309
+ strategy2.command("clone").description("Clone a strategy template and initialize it").argument("<template>", "Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp, hyperliquid-grid").requiredOption("--vault <address>", "Vault address").option("--amount <n>", "Asset amount to deploy").option("--min-redeem <n>", "Min asset on settlement (Moonwell)").option("--token <symbol>", "Asset token symbol (default: USDC)").option("--asset <symbol>", "Asset token (USDC, VVV, or address)").option("--agent <address>", "Agent wallet (Venice, default: your wallet)").option("--min-vvv <n>", "Min VVV from swap (Venice)").option("--single-hop", "Single-hop Aerodrome swap (Venice)").option("--token-a <address>", "Token A (Aerodrome)").option("--token-b <address>", "Token B (Aerodrome)").option("--amount-a <n>", "Token A amount (Aerodrome)").option("--amount-b <n>", "Token B amount (Aerodrome)").option("--stable", "Stable pool (Aerodrome)").option("--gauge <address>", "Gauge address (Aerodrome)").option("--lp-token <address>", "LP token address (Aerodrome)").option("--min-a-out <n>", "Min token A on settle (Aerodrome)").option("--min-b-out <n>", "Min token B on settle (Aerodrome)").option("--slippage <bps>", "Slippage tolerance in bps (wstETH, default: 500 = 5%)").option("--mamo-factory <address>", "Mamo StrategyFactory address (Mamo)").option("--tokens <list>", "Comma-separated token addresses or symbols (Portfolio)").option("--weights <list>", "Comma-separated weights in bps, must sum to 10000 (Portfolio)").option("--max-slippage <bps>", "Max slippage bps (Portfolio, default: 500)").option("--fee-tier <n>", "Pool fee tier (Portfolio, default: 3000)").option("--swap-adapter <address>", "Swap adapter address (Portfolio)").option("--leverage <number>", "Leverage multiplier (Hyperliquid Perp, default: 10)").option("--asset-index <number>", "Perp asset index (Hyperliquid Perp, default: 0 for BTC)").option("--max-position <amount>", "Max position size in USD (Hyperliquid Perp, default: 100000)").option("--max-trades-per-day <n>", "Max trades per day (Hyperliquid Perp, default: 50)").option("--max-order-size <amount>", "Max single-order size in asset units (Hyperliquid Grid, default: 10000)").option("--max-orders-per-tick <n>", "Max orders per tick (Hyperliquid Grid, default: 20)").option("--asset-indices <list>", "Comma-separated perp asset indices (Hyperliquid Grid, default: 0)").action(async (templateKey, opts) => {
1232
1310
  const vault = opts.vault;
1233
1311
  if (!isAddress(vault)) {
1234
1312
  console.error(chalk.red("Invalid vault address"));
@@ -1276,7 +1354,7 @@ function registerStrategyTemplateCommands(strategy2) {
1276
1354
  console.log(chalk.dim("Use this address in your proposal batch calls."));
1277
1355
  console.log();
1278
1356
  });
1279
- strategy2.command("init").description("Initialize an already-deployed but uninitialized strategy clone").argument("<template>", "Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp").requiredOption("--clone <address>", "Clone address to initialize").requiredOption("--vault <address>", "Vault address").option("--amount <n>", "Asset amount to deploy").option("--min-redeem <n>", "Min asset on settlement (Moonwell)").option("--token <symbol>", "Asset token symbol (default: USDC)").option("--asset <symbol>", "Asset token (USDC, VVV, or address)").option("--agent <address>", "Agent wallet (Venice, default: your wallet)").option("--min-vvv <n>", "Min VVV from swap (Venice)").option("--single-hop", "Single-hop Aerodrome swap (Venice)").option("--token-a <address>", "Token A (Aerodrome)").option("--token-b <address>", "Token B (Aerodrome)").option("--amount-a <n>", "Token A amount (Aerodrome)").option("--amount-b <n>", "Token B amount (Aerodrome)").option("--stable", "Stable pool (Aerodrome)").option("--gauge <address>", "Gauge address (Aerodrome)").option("--lp-token <address>", "LP token address (Aerodrome)").option("--min-a-out <n>", "Min token A on settle (Aerodrome)").option("--min-b-out <n>", "Min token B on settle (Aerodrome)").option("--slippage <bps>", "Slippage tolerance in bps (wstETH, default: 500 = 5%)").option("--mamo-factory <address>", "Mamo StrategyFactory address (Mamo)").option("--tokens <list>", "Comma-separated token addresses or symbols (Portfolio)").option("--weights <list>", "Comma-separated weights in bps, must sum to 10000 (Portfolio)").option("--max-slippage <bps>", "Max slippage bps (Portfolio, default: 500)").option("--fee-tier <n>", "Pool fee tier (Portfolio, default: 3000)").option("--swap-adapter <address>", "Swap adapter address (Portfolio)").option("--leverage <number>", "Leverage multiplier (Hyperliquid Perp, default: 10)").option("--asset-index <number>", "Perp asset index (Hyperliquid Perp, default: 0 for BTC)").option("--min-return <n>", "Min return amount on settlement (Hyperliquid Perp)").option("--max-position <amount>", "Max position size in USD (Hyperliquid Perp, default: 100000)").option("--max-trades-per-day <n>", "Max trades per day (Hyperliquid Perp, default: 50)").action(async (templateKey, opts) => {
1357
+ strategy2.command("init").description("Initialize an already-deployed but uninitialized strategy clone").argument("<template>", "Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp, hyperliquid-grid").requiredOption("--clone <address>", "Clone address to initialize").requiredOption("--vault <address>", "Vault address").option("--amount <n>", "Asset amount to deploy").option("--min-redeem <n>", "Min asset on settlement (Moonwell)").option("--token <symbol>", "Asset token symbol (default: USDC)").option("--asset <symbol>", "Asset token (USDC, VVV, or address)").option("--agent <address>", "Agent wallet (Venice, default: your wallet)").option("--min-vvv <n>", "Min VVV from swap (Venice)").option("--single-hop", "Single-hop Aerodrome swap (Venice)").option("--token-a <address>", "Token A (Aerodrome)").option("--token-b <address>", "Token B (Aerodrome)").option("--amount-a <n>", "Token A amount (Aerodrome)").option("--amount-b <n>", "Token B amount (Aerodrome)").option("--stable", "Stable pool (Aerodrome)").option("--gauge <address>", "Gauge address (Aerodrome)").option("--lp-token <address>", "LP token address (Aerodrome)").option("--min-a-out <n>", "Min token A on settle (Aerodrome)").option("--min-b-out <n>", "Min token B on settle (Aerodrome)").option("--slippage <bps>", "Slippage tolerance in bps (wstETH, default: 500 = 5%)").option("--mamo-factory <address>", "Mamo StrategyFactory address (Mamo)").option("--tokens <list>", "Comma-separated token addresses or symbols (Portfolio)").option("--weights <list>", "Comma-separated weights in bps, must sum to 10000 (Portfolio)").option("--max-slippage <bps>", "Max slippage bps (Portfolio, default: 500)").option("--fee-tier <n>", "Pool fee tier (Portfolio, default: 3000)").option("--swap-adapter <address>", "Swap adapter address (Portfolio)").option("--leverage <number>", "Leverage multiplier (Hyperliquid Perp, default: 10)").option("--asset-index <number>", "Perp asset index (Hyperliquid Perp, default: 0 for BTC)").option("--max-position <amount>", "Max position size in USD (Hyperliquid Perp, default: 100000)").option("--max-trades-per-day <n>", "Max trades per day (Hyperliquid Perp, default: 50)").option("--max-order-size <amount>", "Max single-order size in asset units (Hyperliquid Grid, default: 10000)").option("--max-orders-per-tick <n>", "Max orders per tick (Hyperliquid Grid, default: 20)").option("--asset-indices <list>", "Comma-separated perp asset indices (Hyperliquid Grid, default: 0)").action(async (templateKey, opts) => {
1280
1358
  const clone = opts.clone;
1281
1359
  const vault = opts.vault;
1282
1360
  if (!isAddress(clone)) {
@@ -1332,7 +1410,7 @@ function registerStrategyTemplateCommands(strategy2) {
1332
1410
  console.log(` Proposer: ${chalk.green(getAccount().address)}`);
1333
1411
  console.log();
1334
1412
  });
1335
- strategy2.command("propose").description("Clone + init + build calls + submit governance proposal (all-in-one)").argument("<template>", "Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp").requiredOption("--vault <address>", "Vault address").option("--write-calls <dir>", "Write execute/settle JSON to directory (skip proposal submission)").option("--name <name>", "Proposal name").option("--description <text>", "Proposal description").option("--performance-fee <bps>", "Agent fee in bps").option("--duration <duration>", "Strategy duration (7d, 24h, etc.)").option("--amount <n>", "Asset amount to deploy").option("--min-redeem <n>", "Min asset on settlement (Moonwell)").option("--token <symbol>", "Asset token symbol (default: USDC)").option("--asset <symbol>", "Asset token (USDC, VVV, or address)").option("--agent <address>", "Agent wallet (Venice, default: your wallet)").option("--min-vvv <n>", "Min VVV from swap (Venice)").option("--single-hop", "Single-hop Aerodrome swap (Venice)").option("--token-a <address>", "Token A (Aerodrome)").option("--token-b <address>", "Token B (Aerodrome)").option("--amount-a <n>", "Token A amount (Aerodrome)").option("--amount-b <n>", "Token B amount (Aerodrome)").option("--stable", "Stable pool (Aerodrome)").option("--gauge <address>", "Gauge address (Aerodrome)").option("--lp-token <address>", "LP token address (Aerodrome)").option("--min-a-out <n>", "Min token A on settle (Aerodrome)").option("--min-b-out <n>", "Min token B on settle (Aerodrome)").option("--slippage <bps>", "Slippage tolerance in bps (wstETH, default: 500 = 5%)").option("--mamo-factory <address>", "Mamo StrategyFactory address (Mamo)").option("--tokens <list>", "Comma-separated token addresses or symbols (Portfolio)").option("--weights <list>", "Comma-separated weights in bps, must sum to 10000 (Portfolio)").option("--max-slippage <bps>", "Max slippage bps (Portfolio, default: 500)").option("--fee-tier <n>", "Pool fee tier (Portfolio, default: 3000)").option("--swap-adapter <address>", "Swap adapter address (Portfolio)").option("--leverage <number>", "Leverage multiplier (Hyperliquid Perp, default: 10)").option("--asset-index <number>", "Perp asset index (Hyperliquid Perp, default: 0 for BTC)").option("--min-return <n>", "Min return amount on settlement (Hyperliquid Perp)").option("--max-position <amount>", "Max position size in USD (Hyperliquid Perp, default: 100000)").option("--max-trades-per-day <n>", "Max trades per day (Hyperliquid Perp, default: 50)").action(async (templateKey, opts) => {
1413
+ strategy2.command("propose").description("Clone + init + build calls + submit governance proposal (all-in-one)").argument("<template>", "Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell, mamo-yield, portfolio, hyperliquid-perp, hyperliquid-grid").requiredOption("--vault <address>", "Vault address").option("--write-calls <dir>", "Write execute/settle JSON to directory (skip proposal submission)").option("--name <name>", "Proposal name").option("--description <text>", "Proposal description").option("--performance-fee <bps>", "Agent fee in bps").option("--duration <duration>", "Strategy duration (7d, 24h, etc.)").option("--amount <n>", "Asset amount to deploy").option("--min-redeem <n>", "Min asset on settlement (Moonwell)").option("--token <symbol>", "Asset token symbol (default: USDC)").option("--asset <symbol>", "Asset token (USDC, VVV, or address)").option("--agent <address>", "Agent wallet (Venice, default: your wallet)").option("--min-vvv <n>", "Min VVV from swap (Venice)").option("--single-hop", "Single-hop Aerodrome swap (Venice)").option("--token-a <address>", "Token A (Aerodrome)").option("--token-b <address>", "Token B (Aerodrome)").option("--amount-a <n>", "Token A amount (Aerodrome)").option("--amount-b <n>", "Token B amount (Aerodrome)").option("--stable", "Stable pool (Aerodrome)").option("--gauge <address>", "Gauge address (Aerodrome)").option("--lp-token <address>", "LP token address (Aerodrome)").option("--min-a-out <n>", "Min token A on settle (Aerodrome)").option("--min-b-out <n>", "Min token B on settle (Aerodrome)").option("--slippage <bps>", "Slippage tolerance in bps (wstETH, default: 500 = 5%)").option("--mamo-factory <address>", "Mamo StrategyFactory address (Mamo)").option("--tokens <list>", "Comma-separated token addresses or symbols (Portfolio)").option("--weights <list>", "Comma-separated weights in bps, must sum to 10000 (Portfolio)").option("--max-slippage <bps>", "Max slippage bps (Portfolio, default: 500)").option("--fee-tier <n>", "Pool fee tier (Portfolio, default: 3000)").option("--swap-adapter <address>", "Swap adapter address (Portfolio)").option("--leverage <number>", "Leverage multiplier (Hyperliquid Perp, default: 10)").option("--asset-index <number>", "Perp asset index (Hyperliquid Perp, default: 0 for BTC)").option("--max-position <amount>", "Max position size in USD (Hyperliquid Perp, default: 100000)").option("--max-trades-per-day <n>", "Max trades per day (Hyperliquid Perp, default: 50)").option("--max-order-size <amount>", "Max single-order size in asset units (Hyperliquid Grid, default: 10000)").option("--max-orders-per-tick <n>", "Max orders per tick (Hyperliquid Grid, default: 20)").option("--asset-indices <list>", "Comma-separated perp asset indices (Hyperliquid Grid, default: 0)").action(async (templateKey, opts) => {
1336
1414
  const vault = opts.vault;
1337
1415
  if (!isAddress(vault)) {
1338
1416
  console.error(chalk.red("Invalid vault address"));
@@ -1458,9 +1536,9 @@ function registerStrategyTemplateCommands(strategy2) {
1458
1536
  console.error(chalk.red("Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission."));
1459
1537
  process.exit(1);
1460
1538
  }
1461
- const { propose: propose2 } = await import("./governor-MG5VVSU4.js");
1539
+ const { propose: propose2 } = await import("./governor-CQG4LA43.js");
1462
1540
  const { pinJSON } = await import("./ipfs-IGXLLJCF.js");
1463
- const { parseDuration: parseDuration2 } = await import("./governor-MG5VVSU4.js");
1541
+ const { parseDuration: parseDuration2 } = await import("./governor-CQG4LA43.js");
1464
1542
  const performanceFeeBps = BigInt(opts.performanceFee);
1465
1543
  if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {
1466
1544
  console.error(chalk.red("--performance-fee must be 0-10000 (basis points)"));
@@ -1567,7 +1645,7 @@ function registerStrategyTemplateCommands(strategy2) {
1567
1645
  let prices = [];
1568
1646
  let priceSource = null;
1569
1647
  try {
1570
- const { getTokenPricesInAsset } = await import("./price-WCCXWPDM.js");
1648
+ const { getTokenPricesInAsset } = await import("./price-UC2W6HYQ.js");
1571
1649
  prices = await getTokenPricesInAsset({
1572
1650
  tokens: allocations.map((a, i) => ({
1573
1651
  token: a.token,
@@ -1816,7 +1894,7 @@ function registerStrategyTemplateCommands(strategy2) {
1816
1894
  });
1817
1895
  const updateSpinner = ora("Updating target weights...").start();
1818
1896
  try {
1819
- const innerData = encodeAbiParameters8(
1897
+ const innerData = encodeAbiParameters9(
1820
1898
  [{ type: "uint256[]" }, { type: "uint256" }, { type: "bytes[]" }],
1821
1899
  [newWeightsBps.map((w) => BigInt(w)), BigInt(maxSlip), swapData]
1822
1900
  );
@@ -1997,7 +2075,7 @@ function registerVeniceCommands(program2) {
1997
2075
  console.log(chalk2.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));
1998
2076
  console.log(chalk2.dim(" Saved to ~/.sherwood/config.json"));
1999
2077
  try {
2000
- const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-PEEWGSAO.js");
2078
+ const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-PFIAGWAB.js");
2001
2079
  const { uid } = await createVeniceProvisionAttestation(account.address);
2002
2080
  if (uid !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
2003
2081
  console.log(chalk2.dim(` Attested: ${getEasScanUrl2(uid)}`));
@@ -2353,7 +2431,7 @@ ${opts.prompt}`;
2353
2431
  console.log(chalk2.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));
2354
2432
  }
2355
2433
  try {
2356
- const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-PEEWGSAO.js");
2434
+ const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-PFIAGWAB.js");
2357
2435
  const { keccak256: keccak2562, toHex, isAddress: isAddr } = await import("viem");
2358
2436
  const { getChainContracts: getChainContracts2 } = await import("./config-REASKDIK.js");
2359
2437
  const { getChain: getActiveChain } = await import("./network-3ZU7UBDU.js");
@@ -2385,7 +2463,7 @@ import chalk3 from "chalk";
2385
2463
  import ora3 from "ora";
2386
2464
 
2387
2465
  // src/strategies/allowance-disburse.ts
2388
- import { encodeFunctionData as encodeFunctionData8, parseUnits as parseUnits3 } from "viem";
2466
+ import { encodeFunctionData as encodeFunctionData9, parseUnits as parseUnits3 } from "viem";
2389
2467
  function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDecimals, minUsdc, swapPath) {
2390
2468
  const assetAmount = parseUnits3(config.amount, assetDecimals);
2391
2469
  const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();
@@ -2394,7 +2472,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2394
2472
  if (!isUsdc) {
2395
2473
  calls.push({
2396
2474
  target: assetAddress,
2397
- data: encodeFunctionData8({
2475
+ data: encodeFunctionData9({
2398
2476
  abi: ERC20_ABI,
2399
2477
  functionName: "approve",
2400
2478
  args: [UNISWAP().SWAP_ROUTER, assetAmount]
@@ -2404,7 +2482,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2404
2482
  if (isWeth) {
2405
2483
  calls.push({
2406
2484
  target: UNISWAP().SWAP_ROUTER,
2407
- data: encodeFunctionData8({
2485
+ data: encodeFunctionData9({
2408
2486
  abi: SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,
2409
2487
  functionName: "exactInputSingle",
2410
2488
  args: [
@@ -2424,7 +2502,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2424
2502
  } else {
2425
2503
  calls.push({
2426
2504
  target: UNISWAP().SWAP_ROUTER,
2427
- data: encodeFunctionData8({
2505
+ data: encodeFunctionData9({
2428
2506
  abi: SWAP_ROUTER_ABI,
2429
2507
  functionName: "exactInput",
2430
2508
  args: [
@@ -2444,7 +2522,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2444
2522
  for (const agent of agents) {
2445
2523
  calls.push({
2446
2524
  target: TOKENS().USDC,
2447
- data: encodeFunctionData8({
2525
+ data: encodeFunctionData9({
2448
2526
  abi: ERC20_ABI,
2449
2527
  functionName: "transfer",
2450
2528
  args: [agent, perAgent]
@@ -2851,7 +2929,7 @@ function registerIdentityCommands(program2) {
2851
2929
  }
2852
2930
 
2853
2931
  // src/commands/proposal.ts
2854
- import { isAddress as isAddress4, encodeFunctionData as encodeFunctionData10 } from "viem";
2932
+ import { isAddress as isAddress4, encodeFunctionData as encodeFunctionData11 } from "viem";
2855
2933
  import chalk6 from "chalk";
2856
2934
  import ora5 from "ora";
2857
2935
  import { readFileSync as readFileSync2 } from "fs";
@@ -2887,7 +2965,7 @@ function parseBigIntArg(value, name) {
2887
2965
  }
2888
2966
 
2889
2967
  // src/lib/simulate.ts
2890
- import { decodeFunctionData, encodeFunctionData as encodeFunctionData9 } from "viem";
2968
+ import { decodeFunctionData, encodeFunctionData as encodeFunctionData10 } from "viem";
2891
2969
  import chalk5 from "chalk";
2892
2970
  var G = chalk5.green;
2893
2971
  var W = chalk5.white;
@@ -3406,7 +3484,7 @@ async function simulateViaApi(vault, calls) {
3406
3484
  async function simulateViaEthCall(vault, calls) {
3407
3485
  const governor = getGovernorAddress();
3408
3486
  const client = getPublicClient();
3409
- const input2 = encodeFunctionData9({
3487
+ const input2 = encodeFunctionData10({
3410
3488
  abi: SYNDICATE_VAULT_ABI,
3411
3489
  functionName: "executeGovernorBatch",
3412
3490
  args: [calls.map((c) => ({ target: c.target, data: c.data, value: c.value }))]
@@ -3529,7 +3607,7 @@ function printSimulationResult(result, callType) {
3529
3607
  }
3530
3608
  async function sendSimulationAlert(subdomain, proposalId, vault, execResult, settleResult) {
3531
3609
  try {
3532
- const xmtp = await import("./xmtp-ACB2W573.js");
3610
+ const xmtp = await import("./xmtp-KEFA7F24.js");
3533
3611
  const { getAccount: getAccount2 } = await import("./client-UHHCB6EZ.js");
3534
3612
  const group = await xmtp.getGroup("", subdomain);
3535
3613
  const allRisks = [...execResult.risks, ...settleResult?.risks ?? []];
@@ -4038,7 +4116,7 @@ function registerProposalCommands(program2) {
4038
4116
  process.exit(1);
4039
4117
  }
4040
4118
  const asset = await getAssetAddress();
4041
- const noopCalldata = encodeFunctionData10({
4119
+ const noopCalldata = encodeFunctionData11({
4042
4120
  abi: ERC20_ABI,
4043
4121
  functionName: "balanceOf",
4044
4122
  args: [vault]
@@ -5250,13 +5328,13 @@ import chalk12 from "chalk";
5250
5328
  import { mkdir as mkdir3, readFile as readFile3, rename as rename2, writeFile as writeFile3 } from "fs/promises";
5251
5329
  import { dirname as dirname3, join as join3 } from "path";
5252
5330
  import { homedir as homedir3 } from "os";
5253
- import { encodeAbiParameters as encodeAbiParameters10, parseUnits as parseUnits6 } from "viem";
5331
+ import { encodeAbiParameters as encodeAbiParameters11, parseUnits as parseUnits6 } from "viem";
5254
5332
 
5255
5333
  // src/grid/cloid.ts
5256
- import { keccak256, encodeAbiParameters as encodeAbiParameters9 } from "viem";
5334
+ import { keccak256, encodeAbiParameters as encodeAbiParameters10 } from "viem";
5257
5335
  function gridCloid(strategy2, assetIndex, isBuy, levelIndex, nonce) {
5258
5336
  const hash = keccak256(
5259
- encodeAbiParameters9(
5337
+ encodeAbiParameters10(
5260
5338
  [
5261
5339
  { type: "address" },
5262
5340
  { type: "uint32" },
@@ -5448,7 +5526,7 @@ var OnchainGridExecutor = class {
5448
5526
  async placeGrid(token, assetIndex, orders, meta) {
5449
5527
  const nonce = this.bumpNonce(token);
5450
5528
  const { encoded, cloids } = this.encodeOrders(assetIndex, orders, meta, nonce);
5451
- const data = encodeAbiParameters10(
5529
+ const data = encodeAbiParameters11(
5452
5530
  [{ type: "uint8" }, { type: "tuple[]", components: [...GRID_ORDER_COMPONENTS] }],
5453
5531
  [ACTION_PLACE_GRID, encoded]
5454
5532
  );
@@ -5462,7 +5540,7 @@ var OnchainGridExecutor = class {
5462
5540
  this.bumpNonce(token);
5463
5541
  return "0x";
5464
5542
  }
5465
- const data = encodeAbiParameters10(
5543
+ const data = encodeAbiParameters11(
5466
5544
  [{ type: "uint8" }, { type: "uint32" }, { type: "uint128[]" }],
5467
5545
  [ACTION_CANCEL_ALL, assetIndex, cloids]
5468
5546
  );
@@ -5475,7 +5553,7 @@ var OnchainGridExecutor = class {
5475
5553
  const oldCloids = this.placedCloids.get(token) ?? [];
5476
5554
  const newNonce = this.bumpNonce(token);
5477
5555
  const { encoded, cloids: newCloids } = this.encodeOrders(assetIndex, orders, meta, newNonce);
5478
- const data = encodeAbiParameters10(
5556
+ const data = encodeAbiParameters11(
5479
5557
  [
5480
5558
  { type: "uint8" },
5481
5559
  { type: "uint32" },
@@ -5766,7 +5844,7 @@ try {
5766
5844
  var require2 = createRequire(import.meta.url);
5767
5845
  var { version: CLI_VERSION } = require2("../package.json");
5768
5846
  async function loadXmtp() {
5769
- return import("./xmtp-ACB2W573.js");
5847
+ return import("./xmtp-KEFA7F24.js");
5770
5848
  }
5771
5849
  async function loadCron() {
5772
5850
  return import("./cron-EOULYO3R.js");
@@ -6291,7 +6369,7 @@ syndicate.command("add").description("Register an agent on a syndicate vault (cr
6291
6369
  if (opts.agentId) {
6292
6370
  agentId = BigInt(opts.agentId);
6293
6371
  } else {
6294
- const { AGENT_REGISTRY: AGENT_REGISTRY2 } = await import("./addresses-DOWLGXGE.js");
6372
+ const { AGENT_REGISTRY: AGENT_REGISTRY2 } = await import("./addresses-CKPOWDDV.js");
6295
6373
  const registry2 = AGENT_REGISTRY2().IDENTITY_REGISTRY;
6296
6374
  if (registry2 === "0x0000000000000000000000000000000000000000") {
6297
6375
  agentId = 0n;
@@ -6916,7 +6994,7 @@ ${info.name} (${info.type})`);
6916
6994
  }
6917
6995
  });
6918
6996
  try {
6919
- const { registerChatCommands } = await import("./chat-MRTPUZ3X.js");
6997
+ const { registerChatCommands } = await import("./chat-3IW4XDZJ.js");
6920
6998
  registerChatCommands(program);
6921
6999
  } catch {
6922
7000
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -6926,7 +7004,7 @@ try {
6926
7004
  process.exit(1);
6927
7005
  });
6928
7006
  }
6929
- var { registerSessionCommands } = await import("./session-FPCPCVQX.js");
7007
+ var { registerSessionCommands } = await import("./session-ZMEKZRWL.js");
6930
7008
  registerSessionCommands(program);
6931
7009
  registerVeniceCommands(program);
6932
7010
  registerAllowanceCommands(program);
@@ -6934,11 +7012,11 @@ registerIdentityCommands(program);
6934
7012
  registerProposalCommands(program);
6935
7013
  registerGovernorCommands(program);
6936
7014
  registerGuardianCommands(program);
6937
- var { registerResearchCommands } = await import("./research-QBKISW2M.js");
7015
+ var { registerResearchCommands } = await import("./research-2GOILSS7.js");
6938
7016
  registerResearchCommands(program);
6939
- var { registerAgentCommands } = await import("./agent-ZPAZTJG3.js");
7017
+ var { registerAgentCommands } = await import("./agent-E5GHURKJ.js");
6940
7018
  registerAgentCommands(program);
6941
- var { registerTradeCommands } = await import("./trade-NO6CNWCA.js");
7019
+ var { registerTradeCommands } = await import("./trade-UXQOCNLJ.js");
6942
7020
  registerTradeCommands(program);
6943
7021
  registerGridCommand(program);
6944
7022
  var configCmd = program.command("config");