@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.
- package/dist/{addresses-DOWLGXGE.js → addresses-CKPOWDDV.js} +2 -2
- package/dist/{chat-TD6V5LFD.js → chat-3IW4XDZJ.js} +5 -5
- package/dist/{chunk-UYL6Q7BS.js → chunk-D2D6BPBM.js} +2 -2
- package/dist/{chunk-4OF4IZ6M.js → chunk-ENIUCMDV.js} +2 -2
- package/dist/{chunk-ME6MUKGZ.js → chunk-JEKXXHI5.js} +2 -2
- package/dist/{chunk-T464VNRC.js → chunk-JY46LEIS.js} +2 -2
- package/dist/{chunk-FWC57PT7.js → chunk-LXUNJSB6.js} +9 -5
- package/dist/chunk-LXUNJSB6.js.map +1 -0
- package/dist/{chunk-2HNUJ7XH.js → chunk-ZRU43SUB.js} +2 -2
- package/dist/{eas-LHJF2UCG.js → eas-PFIAGWAB.js} +3 -3
- package/dist/{governor-JD4KZXDA.js → governor-CQG4LA43.js} +3 -3
- package/dist/index.js +127 -41
- package/dist/index.js.map +1 -1
- package/dist/{price-2PNKWY4D.js → price-UC2W6HYQ.js} +2 -2
- package/dist/{research-WBZU4QNU.js → research-2GOILSS7.js} +3 -3
- package/dist/{session-IYT3N7MG.js → session-ZMEKZRWL.js} +5 -5
- package/dist/{trade-PTYLNJBU.js → trade-UXQOCNLJ.js} +6 -6
- package/dist/{xmtp-ZACWHUI5.js → xmtp-KEFA7F24.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-FWC57PT7.js.map +0 -1
- /package/dist/{addresses-DOWLGXGE.js.map → addresses-CKPOWDDV.js.map} +0 -0
- /package/dist/{chat-TD6V5LFD.js.map → chat-3IW4XDZJ.js.map} +0 -0
- /package/dist/{chunk-UYL6Q7BS.js.map → chunk-D2D6BPBM.js.map} +0 -0
- /package/dist/{chunk-4OF4IZ6M.js.map → chunk-ENIUCMDV.js.map} +0 -0
- /package/dist/{chunk-ME6MUKGZ.js.map → chunk-JEKXXHI5.js.map} +0 -0
- /package/dist/{chunk-T464VNRC.js.map → chunk-JY46LEIS.js.map} +0 -0
- /package/dist/{chunk-2HNUJ7XH.js.map → chunk-ZRU43SUB.js.map} +0 -0
- /package/dist/{eas-LHJF2UCG.js.map → eas-PFIAGWAB.js.map} +0 -0
- /package/dist/{governor-JD4KZXDA.js.map → governor-CQG4LA43.js.map} +0 -0
- /package/dist/{price-2PNKWY4D.js.map → price-UC2W6HYQ.js.map} +0 -0
- /package/dist/{research-WBZU4QNU.js.map → research-2GOILSS7.js.map} +0 -0
- /package/dist/{session-IYT3N7MG.js.map → session-ZMEKZRWL.js.map} +0 -0
- /package/dist/{trade-PTYLNJBU.js.map → trade-UXQOCNLJ.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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 =
|
|
732
|
+
const encoded2 = encodeAbiParameters9([{ type: "bytes" }], [path]);
|
|
674
733
|
return `0x01${encoded2.slice(2)}`;
|
|
675
734
|
}
|
|
676
|
-
const encoded =
|
|
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-
|
|
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-
|
|
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-
|
|
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 =
|
|
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-
|
|
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-
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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 =
|
|
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-
|
|
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 =
|
|
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
|
|
5331
|
+
import { encodeAbiParameters as encodeAbiParameters11, parseUnits as parseUnits6 } from "viem";
|
|
5246
5332
|
|
|
5247
5333
|
// src/grid/cloid.ts
|
|
5248
|
-
import { keccak256, encodeAbiParameters as
|
|
5334
|
+
import { keccak256, encodeAbiParameters as encodeAbiParameters10 } from "viem";
|
|
5249
5335
|
function gridCloid(strategy2, assetIndex, isBuy, levelIndex, nonce) {
|
|
5250
5336
|
const hash = keccak256(
|
|
5251
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
7019
|
+
var { registerTradeCommands } = await import("./trade-UXQOCNLJ.js");
|
|
6934
7020
|
registerTradeCommands(program);
|
|
6935
7021
|
registerGridCommand(program);
|
|
6936
7022
|
var configCmd = program.command("config");
|