@sherwoodagent/cli 0.51.1 → 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 (34) hide show
  1. package/dist/{addresses-DOWLGXGE.js → addresses-CKPOWDDV.js} +2 -2
  2. package/dist/{chat-TD6V5LFD.js → chat-3IW4XDZJ.js} +5 -5
  3. package/dist/{chunk-UYL6Q7BS.js → chunk-D2D6BPBM.js} +2 -2
  4. package/dist/{chunk-4OF4IZ6M.js → chunk-ENIUCMDV.js} +2 -2
  5. package/dist/{chunk-ME6MUKGZ.js → chunk-JEKXXHI5.js} +2 -2
  6. package/dist/{chunk-T464VNRC.js → chunk-JY46LEIS.js} +2 -2
  7. package/dist/{chunk-FWC57PT7.js → chunk-LXUNJSB6.js} +9 -5
  8. package/dist/chunk-LXUNJSB6.js.map +1 -0
  9. package/dist/{chunk-2HNUJ7XH.js → chunk-ZRU43SUB.js} +2 -2
  10. package/dist/{eas-LHJF2UCG.js → eas-PFIAGWAB.js} +3 -3
  11. package/dist/{governor-JD4KZXDA.js → governor-CQG4LA43.js} +3 -3
  12. package/dist/index.js +127 -41
  13. package/dist/index.js.map +1 -1
  14. package/dist/{price-2PNKWY4D.js → price-UC2W6HYQ.js} +2 -2
  15. package/dist/{research-WBZU4QNU.js → research-2GOILSS7.js} +3 -3
  16. package/dist/{session-IYT3N7MG.js → session-ZMEKZRWL.js} +5 -5
  17. package/dist/{trade-PTYLNJBU.js → trade-UXQOCNLJ.js} +6 -6
  18. package/dist/{xmtp-ZACWHUI5.js → xmtp-KEFA7F24.js} +3 -3
  19. package/package.json +1 -1
  20. package/dist/chunk-FWC57PT7.js.map +0 -1
  21. /package/dist/{addresses-DOWLGXGE.js.map → addresses-CKPOWDDV.js.map} +0 -0
  22. /package/dist/{chat-TD6V5LFD.js.map → chat-3IW4XDZJ.js.map} +0 -0
  23. /package/dist/{chunk-UYL6Q7BS.js.map → chunk-D2D6BPBM.js.map} +0 -0
  24. /package/dist/{chunk-4OF4IZ6M.js.map → chunk-ENIUCMDV.js.map} +0 -0
  25. /package/dist/{chunk-ME6MUKGZ.js.map → chunk-JEKXXHI5.js.map} +0 -0
  26. /package/dist/{chunk-T464VNRC.js.map → chunk-JY46LEIS.js.map} +0 -0
  27. /package/dist/{chunk-2HNUJ7XH.js.map → chunk-ZRU43SUB.js.map} +0 -0
  28. /package/dist/{eas-LHJF2UCG.js.map → eas-PFIAGWAB.js.map} +0 -0
  29. /package/dist/{governor-JD4KZXDA.js.map → governor-CQG4LA43.js.map} +0 -0
  30. /package/dist/{price-2PNKWY4D.js.map → price-UC2W6HYQ.js.map} +0 -0
  31. /package/dist/{research-WBZU4QNU.js.map → research-2GOILSS7.js.map} +0 -0
  32. /package/dist/{session-IYT3N7MG.js.map → session-ZMEKZRWL.js.map} +0 -0
  33. /package/dist/{trade-PTYLNJBU.js.map → trade-UXQOCNLJ.js.map} +0 -0
  34. /package/dist/{xmtp-ZACWHUI5.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-2HNUJ7XH.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-ME6MUKGZ.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-UYL6Q7BS.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-4OF4IZ6M.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-T464VNRC.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,
@@ -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";
@@ -650,6 +650,65 @@ function buildSettleCalls7(clone) {
650
650
  ];
651
651
  }
652
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
+
653
712
  // src/commands/strategy-template.ts
654
713
  import { concat as concat2, numberToHex } from "viem";
655
714
  var ZERO = "0x0000000000000000000000000000000000000000";
@@ -666,14 +725,14 @@ function encodeV3Path(tokens, fees) {
666
725
  }
667
726
  function buildSwapExtraData(network, tokenIn, tokenOut, feeTier, hop) {
668
727
  if (network === "robinhood-testnet") {
669
- return encodeAbiParameters8([{ type: "uint24" }], [feeTier]);
728
+ return encodeAbiParameters9([{ type: "uint24" }], [feeTier]);
670
729
  }
671
730
  if (hop) {
672
731
  const path = encodeV3Path([tokenIn, hop.via, tokenOut], [hop.feeIn, hop.feeOut]);
673
- const encoded2 = encodeAbiParameters8([{ type: "bytes" }], [path]);
732
+ const encoded2 = encodeAbiParameters9([{ type: "bytes" }], [path]);
674
733
  return `0x01${encoded2.slice(2)}`;
675
734
  }
676
- const encoded = encodeAbiParameters8([{ type: "uint24" }], [feeTier]);
735
+ const encoded = encodeAbiParameters9([{ type: "uint24" }], [feeTier]);
677
736
  return `0x00${encoded.slice(2)}`;
678
737
  }
679
738
  async function detectSwapRoute(asset, token, preferredFeeTier) {
@@ -812,6 +871,12 @@ var TEMPLATES = [
812
871
  key: "hyperliquid-perp",
813
872
  description: "Leveraged perp trading on Hyperliquid via HyperEVM precompiles",
814
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"
815
880
  }
816
881
  ];
817
882
  function resolveTemplate(key) {
@@ -1079,6 +1144,21 @@ async function buildInitDataForTemplate(templateKey, opts, vault) {
1079
1144
  assetAmount: depositAmount
1080
1145
  };
1081
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),
1158
+ asset,
1159
+ assetAmount: depositAmount
1160
+ };
1161
+ }
1082
1162
  throw new Error(`No init builder for template: ${templateKey}`);
1083
1163
  }
1084
1164
  function buildCallsForTemplate(templateKey, clone, asset, assetAmount, extraApprovals) {
@@ -1126,6 +1206,12 @@ function buildCallsForTemplate(templateKey, clone, asset, assetAmount, extraAppr
1126
1206
  settleCalls: buildSettleCalls7(clone)
1127
1207
  };
1128
1208
  }
1209
+ if (templateKey === "hyperliquid-grid") {
1210
+ return {
1211
+ executeCalls: buildExecuteCalls8(clone, asset, assetAmount),
1212
+ settleCalls: buildSettleCalls8(clone)
1213
+ };
1214
+ }
1129
1215
  throw new Error(`No call builder for template: ${templateKey}`);
1130
1216
  }
1131
1217
  function resolveSwapAdapter() {
@@ -1220,7 +1306,7 @@ function registerStrategyTemplateCommands(strategy2) {
1220
1306
  console.log(chalk.dim("Full proposal: sherwood strategy propose <template> --vault <addr> ..."));
1221
1307
  console.log();
1222
1308
  });
1223
- 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("--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) => {
1224
1310
  const vault = opts.vault;
1225
1311
  if (!isAddress(vault)) {
1226
1312
  console.error(chalk.red("Invalid vault address"));
@@ -1268,7 +1354,7 @@ function registerStrategyTemplateCommands(strategy2) {
1268
1354
  console.log(chalk.dim("Use this address in your proposal batch calls."));
1269
1355
  console.log();
1270
1356
  });
1271
- 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("--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) => {
1272
1358
  const clone = opts.clone;
1273
1359
  const vault = opts.vault;
1274
1360
  if (!isAddress(clone)) {
@@ -1324,7 +1410,7 @@ function registerStrategyTemplateCommands(strategy2) {
1324
1410
  console.log(` Proposer: ${chalk.green(getAccount().address)}`);
1325
1411
  console.log();
1326
1412
  });
1327
- 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("--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) => {
1328
1414
  const vault = opts.vault;
1329
1415
  if (!isAddress(vault)) {
1330
1416
  console.error(chalk.red("Invalid vault address"));
@@ -1450,9 +1536,9 @@ function registerStrategyTemplateCommands(strategy2) {
1450
1536
  console.error(chalk.red("Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission."));
1451
1537
  process.exit(1);
1452
1538
  }
1453
- const { propose: propose2 } = await import("./governor-JD4KZXDA.js");
1539
+ const { propose: propose2 } = await import("./governor-CQG4LA43.js");
1454
1540
  const { pinJSON } = await import("./ipfs-IGXLLJCF.js");
1455
- const { parseDuration: parseDuration2 } = await import("./governor-JD4KZXDA.js");
1541
+ const { parseDuration: parseDuration2 } = await import("./governor-CQG4LA43.js");
1456
1542
  const performanceFeeBps = BigInt(opts.performanceFee);
1457
1543
  if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {
1458
1544
  console.error(chalk.red("--performance-fee must be 0-10000 (basis points)"));
@@ -1559,7 +1645,7 @@ function registerStrategyTemplateCommands(strategy2) {
1559
1645
  let prices = [];
1560
1646
  let priceSource = null;
1561
1647
  try {
1562
- const { getTokenPricesInAsset } = await import("./price-2PNKWY4D.js");
1648
+ const { getTokenPricesInAsset } = await import("./price-UC2W6HYQ.js");
1563
1649
  prices = await getTokenPricesInAsset({
1564
1650
  tokens: allocations.map((a, i) => ({
1565
1651
  token: a.token,
@@ -1808,7 +1894,7 @@ function registerStrategyTemplateCommands(strategy2) {
1808
1894
  });
1809
1895
  const updateSpinner = ora("Updating target weights...").start();
1810
1896
  try {
1811
- const innerData = encodeAbiParameters8(
1897
+ const innerData = encodeAbiParameters9(
1812
1898
  [{ type: "uint256[]" }, { type: "uint256" }, { type: "bytes[]" }],
1813
1899
  [newWeightsBps.map((w) => BigInt(w)), BigInt(maxSlip), swapData]
1814
1900
  );
@@ -1989,7 +2075,7 @@ function registerVeniceCommands(program2) {
1989
2075
  console.log(chalk2.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));
1990
2076
  console.log(chalk2.dim(" Saved to ~/.sherwood/config.json"));
1991
2077
  try {
1992
- const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-LHJF2UCG.js");
2078
+ const { createVeniceProvisionAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-PFIAGWAB.js");
1993
2079
  const { uid } = await createVeniceProvisionAttestation(account.address);
1994
2080
  if (uid !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
1995
2081
  console.log(chalk2.dim(` Attested: ${getEasScanUrl2(uid)}`));
@@ -2345,7 +2431,7 @@ ${opts.prompt}`;
2345
2431
  console.log(chalk2.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));
2346
2432
  }
2347
2433
  try {
2348
- const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-LHJF2UCG.js");
2434
+ const { createVeniceInferenceAttestation, getEasScanUrl: getEasScanUrl2 } = await import("./eas-PFIAGWAB.js");
2349
2435
  const { keccak256: keccak2562, toHex, isAddress: isAddr } = await import("viem");
2350
2436
  const { getChainContracts: getChainContracts2 } = await import("./config-REASKDIK.js");
2351
2437
  const { getChain: getActiveChain } = await import("./network-3ZU7UBDU.js");
@@ -2377,7 +2463,7 @@ import chalk3 from "chalk";
2377
2463
  import ora3 from "ora";
2378
2464
 
2379
2465
  // src/strategies/allowance-disburse.ts
2380
- import { encodeFunctionData as encodeFunctionData8, parseUnits as parseUnits3 } from "viem";
2466
+ import { encodeFunctionData as encodeFunctionData9, parseUnits as parseUnits3 } from "viem";
2381
2467
  function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDecimals, minUsdc, swapPath) {
2382
2468
  const assetAmount = parseUnits3(config.amount, assetDecimals);
2383
2469
  const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();
@@ -2386,7 +2472,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2386
2472
  if (!isUsdc) {
2387
2473
  calls.push({
2388
2474
  target: assetAddress,
2389
- data: encodeFunctionData8({
2475
+ data: encodeFunctionData9({
2390
2476
  abi: ERC20_ABI,
2391
2477
  functionName: "approve",
2392
2478
  args: [UNISWAP().SWAP_ROUTER, assetAmount]
@@ -2396,7 +2482,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2396
2482
  if (isWeth) {
2397
2483
  calls.push({
2398
2484
  target: UNISWAP().SWAP_ROUTER,
2399
- data: encodeFunctionData8({
2485
+ data: encodeFunctionData9({
2400
2486
  abi: SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,
2401
2487
  functionName: "exactInputSingle",
2402
2488
  args: [
@@ -2416,7 +2502,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2416
2502
  } else {
2417
2503
  calls.push({
2418
2504
  target: UNISWAP().SWAP_ROUTER,
2419
- data: encodeFunctionData8({
2505
+ data: encodeFunctionData9({
2420
2506
  abi: SWAP_ROUTER_ABI,
2421
2507
  functionName: "exactInput",
2422
2508
  args: [
@@ -2436,7 +2522,7 @@ function buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDec
2436
2522
  for (const agent of agents) {
2437
2523
  calls.push({
2438
2524
  target: TOKENS().USDC,
2439
- data: encodeFunctionData8({
2525
+ data: encodeFunctionData9({
2440
2526
  abi: ERC20_ABI,
2441
2527
  functionName: "transfer",
2442
2528
  args: [agent, perAgent]
@@ -2843,7 +2929,7 @@ function registerIdentityCommands(program2) {
2843
2929
  }
2844
2930
 
2845
2931
  // src/commands/proposal.ts
2846
- import { isAddress as isAddress4, encodeFunctionData as encodeFunctionData10 } from "viem";
2932
+ import { isAddress as isAddress4, encodeFunctionData as encodeFunctionData11 } from "viem";
2847
2933
  import chalk6 from "chalk";
2848
2934
  import ora5 from "ora";
2849
2935
  import { readFileSync as readFileSync2 } from "fs";
@@ -2879,7 +2965,7 @@ function parseBigIntArg(value, name) {
2879
2965
  }
2880
2966
 
2881
2967
  // src/lib/simulate.ts
2882
- import { decodeFunctionData, encodeFunctionData as encodeFunctionData9 } from "viem";
2968
+ import { decodeFunctionData, encodeFunctionData as encodeFunctionData10 } from "viem";
2883
2969
  import chalk5 from "chalk";
2884
2970
  var G = chalk5.green;
2885
2971
  var W = chalk5.white;
@@ -3398,7 +3484,7 @@ async function simulateViaApi(vault, calls) {
3398
3484
  async function simulateViaEthCall(vault, calls) {
3399
3485
  const governor = getGovernorAddress();
3400
3486
  const client = getPublicClient();
3401
- const input2 = encodeFunctionData9({
3487
+ const input2 = encodeFunctionData10({
3402
3488
  abi: SYNDICATE_VAULT_ABI,
3403
3489
  functionName: "executeGovernorBatch",
3404
3490
  args: [calls.map((c) => ({ target: c.target, data: c.data, value: c.value }))]
@@ -3521,7 +3607,7 @@ function printSimulationResult(result, callType) {
3521
3607
  }
3522
3608
  async function sendSimulationAlert(subdomain, proposalId, vault, execResult, settleResult) {
3523
3609
  try {
3524
- const xmtp = await import("./xmtp-ZACWHUI5.js");
3610
+ const xmtp = await import("./xmtp-KEFA7F24.js");
3525
3611
  const { getAccount: getAccount2 } = await import("./client-UHHCB6EZ.js");
3526
3612
  const group = await xmtp.getGroup("", subdomain);
3527
3613
  const allRisks = [...execResult.risks, ...settleResult?.risks ?? []];
@@ -4030,7 +4116,7 @@ function registerProposalCommands(program2) {
4030
4116
  process.exit(1);
4031
4117
  }
4032
4118
  const asset = await getAssetAddress();
4033
- const noopCalldata = encodeFunctionData10({
4119
+ const noopCalldata = encodeFunctionData11({
4034
4120
  abi: ERC20_ABI,
4035
4121
  functionName: "balanceOf",
4036
4122
  args: [vault]
@@ -5242,13 +5328,13 @@ import chalk12 from "chalk";
5242
5328
  import { mkdir as mkdir3, readFile as readFile3, rename as rename2, writeFile as writeFile3 } from "fs/promises";
5243
5329
  import { dirname as dirname3, join as join3 } from "path";
5244
5330
  import { homedir as homedir3 } from "os";
5245
- import { encodeAbiParameters as encodeAbiParameters10, parseUnits as parseUnits6 } from "viem";
5331
+ import { encodeAbiParameters as encodeAbiParameters11, parseUnits as parseUnits6 } from "viem";
5246
5332
 
5247
5333
  // src/grid/cloid.ts
5248
- import { keccak256, encodeAbiParameters as encodeAbiParameters9 } from "viem";
5334
+ import { keccak256, encodeAbiParameters as encodeAbiParameters10 } from "viem";
5249
5335
  function gridCloid(strategy2, assetIndex, isBuy, levelIndex, nonce) {
5250
5336
  const hash = keccak256(
5251
- encodeAbiParameters9(
5337
+ encodeAbiParameters10(
5252
5338
  [
5253
5339
  { type: "address" },
5254
5340
  { type: "uint32" },
@@ -5440,7 +5526,7 @@ var OnchainGridExecutor = class {
5440
5526
  async placeGrid(token, assetIndex, orders, meta) {
5441
5527
  const nonce = this.bumpNonce(token);
5442
5528
  const { encoded, cloids } = this.encodeOrders(assetIndex, orders, meta, nonce);
5443
- const data = encodeAbiParameters10(
5529
+ const data = encodeAbiParameters11(
5444
5530
  [{ type: "uint8" }, { type: "tuple[]", components: [...GRID_ORDER_COMPONENTS] }],
5445
5531
  [ACTION_PLACE_GRID, encoded]
5446
5532
  );
@@ -5454,7 +5540,7 @@ var OnchainGridExecutor = class {
5454
5540
  this.bumpNonce(token);
5455
5541
  return "0x";
5456
5542
  }
5457
- const data = encodeAbiParameters10(
5543
+ const data = encodeAbiParameters11(
5458
5544
  [{ type: "uint8" }, { type: "uint32" }, { type: "uint128[]" }],
5459
5545
  [ACTION_CANCEL_ALL, assetIndex, cloids]
5460
5546
  );
@@ -5467,7 +5553,7 @@ var OnchainGridExecutor = class {
5467
5553
  const oldCloids = this.placedCloids.get(token) ?? [];
5468
5554
  const newNonce = this.bumpNonce(token);
5469
5555
  const { encoded, cloids: newCloids } = this.encodeOrders(assetIndex, orders, meta, newNonce);
5470
- const data = encodeAbiParameters10(
5556
+ const data = encodeAbiParameters11(
5471
5557
  [
5472
5558
  { type: "uint8" },
5473
5559
  { type: "uint32" },
@@ -5758,7 +5844,7 @@ try {
5758
5844
  var require2 = createRequire(import.meta.url);
5759
5845
  var { version: CLI_VERSION } = require2("../package.json");
5760
5846
  async function loadXmtp() {
5761
- return import("./xmtp-ZACWHUI5.js");
5847
+ return import("./xmtp-KEFA7F24.js");
5762
5848
  }
5763
5849
  async function loadCron() {
5764
5850
  return import("./cron-EOULYO3R.js");
@@ -6283,7 +6369,7 @@ syndicate.command("add").description("Register an agent on a syndicate vault (cr
6283
6369
  if (opts.agentId) {
6284
6370
  agentId = BigInt(opts.agentId);
6285
6371
  } else {
6286
- const { AGENT_REGISTRY: AGENT_REGISTRY2 } = await import("./addresses-DOWLGXGE.js");
6372
+ const { AGENT_REGISTRY: AGENT_REGISTRY2 } = await import("./addresses-CKPOWDDV.js");
6287
6373
  const registry2 = AGENT_REGISTRY2().IDENTITY_REGISTRY;
6288
6374
  if (registry2 === "0x0000000000000000000000000000000000000000") {
6289
6375
  agentId = 0n;
@@ -6908,7 +6994,7 @@ ${info.name} (${info.type})`);
6908
6994
  }
6909
6995
  });
6910
6996
  try {
6911
- const { registerChatCommands } = await import("./chat-TD6V5LFD.js");
6997
+ const { registerChatCommands } = await import("./chat-3IW4XDZJ.js");
6912
6998
  registerChatCommands(program);
6913
6999
  } catch {
6914
7000
  program.command("chat <name> [action] [actionArgs...]").description("Syndicate chat (XMTP) \u2014 requires @xmtp/cli").action(() => {
@@ -6918,7 +7004,7 @@ try {
6918
7004
  process.exit(1);
6919
7005
  });
6920
7006
  }
6921
- var { registerSessionCommands } = await import("./session-IYT3N7MG.js");
7007
+ var { registerSessionCommands } = await import("./session-ZMEKZRWL.js");
6922
7008
  registerSessionCommands(program);
6923
7009
  registerVeniceCommands(program);
6924
7010
  registerAllowanceCommands(program);
@@ -6926,11 +7012,11 @@ registerIdentityCommands(program);
6926
7012
  registerProposalCommands(program);
6927
7013
  registerGovernorCommands(program);
6928
7014
  registerGuardianCommands(program);
6929
- var { registerResearchCommands } = await import("./research-WBZU4QNU.js");
7015
+ var { registerResearchCommands } = await import("./research-2GOILSS7.js");
6930
7016
  registerResearchCommands(program);
6931
7017
  var { registerAgentCommands } = await import("./agent-E5GHURKJ.js");
6932
7018
  registerAgentCommands(program);
6933
- var { registerTradeCommands } = await import("./trade-PTYLNJBU.js");
7019
+ var { registerTradeCommands } = await import("./trade-UXQOCNLJ.js");
6934
7020
  registerTradeCommands(program);
6935
7021
  registerGridCommand(program);
6936
7022
  var configCmd = program.command("config");