@sherwoodagent/cli 0.19.2 → 0.22.7
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/{chat-WKOSUZXO.js → chat-JYAJMP4D.js} +42 -16
- package/dist/chat-JYAJMP4D.js.map +1 -0
- package/dist/{chunk-WWH4GD3N.js → chunk-4Y6Y4SVH.js} +37 -27
- package/dist/chunk-4Y6Y4SVH.js.map +1 -0
- package/dist/chunk-ASJTFFZH.js +485 -0
- package/dist/chunk-ASJTFFZH.js.map +1 -0
- package/dist/{chunk-SZ5QQJGA.js → chunk-B42ZCCZ7.js} +54 -2
- package/dist/chunk-B42ZCCZ7.js.map +1 -0
- package/dist/{chunk-QT7BUKWR.js → chunk-G7JQRLQE.js} +141 -37
- package/dist/chunk-G7JQRLQE.js.map +1 -0
- package/dist/{chunk-LHDWONBI.js → chunk-JR5K5WVR.js} +45 -6
- package/dist/chunk-JR5K5WVR.js.map +1 -0
- package/dist/{chunk-TAAEMX3L.js → chunk-LVPBJ7MI.js} +2 -2
- package/dist/{chunk-XR2ZUO4R.js → chunk-QGZUMIVO.js} +2 -2
- package/dist/{chunk-P4J6FKAP.js → chunk-VO6DCRWV.js} +36 -64
- package/dist/chunk-VO6DCRWV.js.map +1 -0
- package/dist/chunk-W2ZUPR3W.js +64 -0
- package/dist/chunk-W2ZUPR3W.js.map +1 -0
- package/dist/{chunk-YJAMY25R.js → chunk-Y7LS6DEF.js} +26 -39
- package/dist/chunk-Y7LS6DEF.js.map +1 -0
- package/dist/{client-3AAXAX4C.js → client-SCIY6SUP.js} +12 -4
- package/dist/{config-IDAHD7S3.js → config-BGS5MX4D.js} +10 -2
- package/dist/{cron-SKYKVZ6K.js → cron-EOULYO3R.js} +8 -3
- package/dist/cron-EOULYO3R.js.map +1 -0
- package/dist/{eas-MPDYDPJK.js → eas-X5UIEM6D.js} +14 -8
- package/dist/{governor-J3W67NXA.js → governor-ZKRSAHG4.js} +6 -6
- package/dist/index.js +1594 -391
- package/dist/index.js.map +1 -1
- package/dist/{network-DBUZ7GRF.js → network-UTSOP7EF.js} +3 -3
- package/dist/research-SJ6D3L2B.js +14 -0
- package/dist/{research-LOSOHKOJ.js → research-ZW6XVTGZ.js} +17 -16
- package/dist/research-ZW6XVTGZ.js.map +1 -0
- package/dist/session-XAW5UIXP.js +17 -0
- package/dist/session-XAW5UIXP.js.map +1 -0
- package/dist/{session-Q2WRYXYF.js → session-XZNKLK3I.js} +17 -66
- package/dist/session-XZNKLK3I.js.map +1 -0
- package/dist/{trade-JLQPIA5W.js → trade-OJM5HNHL.js} +133 -70
- package/dist/trade-OJM5HNHL.js.map +1 -0
- package/dist/xmtp-XKHXATPQ.js +278 -0
- package/dist/xmtp-XKHXATPQ.js.map +1 -0
- package/package.json +7 -2
- package/dist/chat-WKOSUZXO.js.map +0 -1
- package/dist/chunk-I7CKBBOG.js +0 -129
- package/dist/chunk-I7CKBBOG.js.map +0 -1
- package/dist/chunk-LHDWONBI.js.map +0 -1
- package/dist/chunk-P4J6FKAP.js.map +0 -1
- package/dist/chunk-QT7BUKWR.js.map +0 -1
- package/dist/chunk-SZ5QQJGA.js.map +0 -1
- package/dist/chunk-WWH4GD3N.js.map +0 -1
- package/dist/chunk-YJAMY25R.js.map +0 -1
- package/dist/cron-SKYKVZ6K.js.map +0 -1
- package/dist/research-DZINC4N4.js +0 -14
- package/dist/research-LOSOHKOJ.js.map +0 -1
- package/dist/session-Q2WRYXYF.js.map +0 -1
- package/dist/trade-JLQPIA5W.js.map +0 -1
- package/dist/xmtp-7DF7UG66.js +0 -367
- package/dist/xmtp-7DF7UG66.js.map +0 -1
- /package/dist/{chunk-TAAEMX3L.js.map → chunk-LVPBJ7MI.js.map} +0 -0
- /package/dist/{chunk-XR2ZUO4R.js.map → chunk-QGZUMIVO.js.map} +0 -0
- /package/dist/{client-3AAXAX4C.js.map → client-SCIY6SUP.js.map} +0 -0
- /package/dist/{config-IDAHD7S3.js.map → config-BGS5MX4D.js.map} +0 -0
- /package/dist/{eas-MPDYDPJK.js.map → eas-X5UIEM6D.js.map} +0 -0
- /package/dist/{governor-J3W67NXA.js.map → governor-ZKRSAHG4.js.map} +0 -0
- /package/dist/{network-DBUZ7GRF.js.map → network-UTSOP7EF.js.map} +0 -0
- /package/dist/{research-DZINC4N4.js.map → research-SJ6D3L2B.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/config.ts"],"sourcesContent":["/**\n * Local config management — ~/.sherwood/config.json\n *\n * Stores group ID cache, per-chain contract addresses, and wallet config.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".sherwood\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\n/** Per-chain user-specific addresses (stored by chainId). */\nexport interface ChainContracts {\n vault?: string; // user's default vault address\n}\n\n/** A syndicate the agent belongs to (creator or member). */\nexport interface SyndicateMembership {\n subdomain: string;\n vault: string;\n role: \"creator\" | \"agent\";\n}\n\nexport interface SherwoodConfig {\n dbEncryptionKey?: string; // legacy — no longer used, XMTP CLI manages its own DB\n privateKey?: string; // wallet private key (0x-prefixed)\n xmtpInboxId?: string;\n groupCache: Record<string, string>; // subdomain → XMTP group ID\n veniceApiKey?: string; // Venice AI inference API key\n agentId?: number; // ERC-8004 identity token ID\n contracts?: Record<string, ChainContracts>; // chainId → user addresses\n syndicates?: Record<string, SyndicateMembership[]>; // chainId → syndicate memberships\n primarySyndicate?: Record<string, string>; // chainId → subdomain of the active syndicate\n rpc?: Record<string, string>; // network name → custom RPC URL\n notifyTo?: string; // destination for cron summaries (Telegram chat ID, phone, etc.)\n uniswapApiKey?: string; // Uniswap Trading API key (from developers.uniswap.org)\n positions?: unknown[]; // open trade positions (typed in positions.ts)\n closedPositions?: unknown[]; // historical closed positions\n _xmtpMigrated?: boolean; // one-time flag: revoked stale installations from ~/.xmtp/ era\n}\n\nexport function loadConfig(): SherwoodConfig {\n if (fs.existsSync(CONFIG_PATH)) {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n }\n\n return { groupCache: {} };\n}\n\nexport function saveConfig(config: SherwoodConfig): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport function cacheGroupId(subdomain: string, groupId: string): void {\n const config = loadConfig();\n config.groupCache[subdomain] = groupId;\n saveConfig(config);\n}\n\nexport function getCachedGroupId(subdomain: string): string | undefined {\n const config = loadConfig();\n return config.groupCache[subdomain];\n}\n\nexport function setVeniceApiKey(apiKey: string): void {\n const config = loadConfig();\n config.veniceApiKey = apiKey;\n saveConfig(config);\n}\n\nexport function getVeniceApiKey(): string | undefined {\n return loadConfig().veniceApiKey ?? process.env.VENICE_API_KEY;\n}\n\nexport function setAgentId(agentId: number): void {\n const config = loadConfig();\n config.agentId = agentId;\n saveConfig(config);\n}\n\nexport function getAgentId(): number | undefined {\n return loadConfig().agentId;\n}\n\nexport function setPrivateKey(key: string): void {\n const config = loadConfig();\n config.privateKey = key.startsWith(\"0x\") ? key : `0x${key}`;\n saveConfig(config);\n}\n\nexport function getPrivateKey(): string | undefined {\n return loadConfig().privateKey;\n}\n\n// ── Uniswap Trading API Key ──\n\nexport function setUniswapApiKey(apiKey: string): void {\n const config = loadConfig();\n config.uniswapApiKey = apiKey;\n saveConfig(config);\n}\n\nexport function getUniswapApiKey(): string | undefined {\n return loadConfig().uniswapApiKey ?? process.env.UNISWAP_API_KEY;\n}\n\n// ── Per-network RPC URLs ──\n\nexport function getConfigRpcUrl(network: string): string | undefined {\n return loadConfig().rpc?.[network];\n}\n\nexport function setConfigRpcUrl(network: string, url: string): void {\n const config = loadConfig();\n if (!config.rpc) config.rpc = {};\n config.rpc[network] = url;\n saveConfig(config);\n}\n\n// ── Per-chain contract addresses ──\n\nexport function getChainContracts(chainId: number): ChainContracts {\n const config = loadConfig();\n return config.contracts?.[String(chainId)] ?? {};\n}\n\nexport function getNotifyTo(): string | undefined {\n return loadConfig().notifyTo;\n}\n\nexport function setNotifyTo(id: string): void {\n const config = loadConfig();\n config.notifyTo = id;\n saveConfig(config);\n}\n\nexport function setChainContract(\n chainId: number,\n key: keyof ChainContracts,\n value: string,\n): void {\n const config = loadConfig();\n if (!config.contracts) config.contracts = {};\n const cid = String(chainId);\n if (!config.contracts[cid]) config.contracts[cid] = {};\n config.contracts[cid][key] = value;\n saveConfig(config);\n}\n\n// ── Syndicate Membership ──\n\n/**\n * Add (or update) a syndicate membership. Deduplicates by subdomain.\n * Automatically sets it as primary if it's the first syndicate on this chain.\n */\nexport function addSyndicate(\n chainId: number,\n membership: SyndicateMembership,\n): void {\n const config = loadConfig();\n const cid = String(chainId);\n if (!config.syndicates) config.syndicates = {};\n if (!config.syndicates[cid]) config.syndicates[cid] = [];\n\n // Upsert — replace existing entry with same subdomain\n const idx = config.syndicates[cid].findIndex(\n (s) => s.subdomain === membership.subdomain,\n );\n if (idx >= 0) {\n config.syndicates[cid][idx] = membership;\n } else {\n config.syndicates[cid].push(membership);\n }\n\n // Auto-set as primary if it's the first syndicate (or no primary set)\n if (!config.primarySyndicate) config.primarySyndicate = {};\n if (!config.primarySyndicate[cid]) {\n config.primarySyndicate[cid] = membership.subdomain;\n }\n\n saveConfig(config);\n}\n\n/** Get all syndicate memberships for a chain. */\nexport function getSyndicates(chainId: number): SyndicateMembership[] {\n const config = loadConfig();\n return config.syndicates?.[String(chainId)] ?? [];\n}\n\n/** Set which syndicate is the active/primary one for CLI commands. */\nexport function setPrimarySyndicate(\n chainId: number,\n subdomain: string,\n): void {\n const config = loadConfig();\n if (!config.primarySyndicate) config.primarySyndicate = {};\n config.primarySyndicate[String(chainId)] = subdomain;\n saveConfig(config);\n}\n\n/**\n * Get the primary syndicate for this chain.\n * Falls back to ChainContracts.vault for backwards compat with older configs.\n */\nexport function getPrimarySyndicate(\n chainId: number,\n): SyndicateMembership | undefined {\n const config = loadConfig();\n const cid = String(chainId);\n\n // Check new syndicates store first\n const primarySubdomain = config.primarySyndicate?.[cid];\n if (primarySubdomain && config.syndicates?.[cid]) {\n const found = config.syndicates[cid].find(\n (s) => s.subdomain === primarySubdomain,\n );\n if (found) return found;\n }\n\n // Backwards compat: if syndicates list has entries but no primary, use the first one\n if (config.syndicates?.[cid]?.length) {\n return config.syndicates[cid][0];\n }\n\n // Legacy fallback: config only has a vault address, no subdomain\n const vault = config.contracts?.[cid]?.vault;\n if (vault) {\n return { subdomain: \"\", vault, role: \"creator\" };\n }\n\n return undefined;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -4,23 +4,25 @@ import {
|
|
|
4
4
|
L2_REGISTRY_ABI,
|
|
5
5
|
SHERWOOD,
|
|
6
6
|
SYNDICATE_FACTORY_ABI,
|
|
7
|
-
SYNDICATE_VAULT_ABI
|
|
8
|
-
|
|
7
|
+
SYNDICATE_VAULT_ABI,
|
|
8
|
+
TOKENS
|
|
9
|
+
} from "./chunk-JR5K5WVR.js";
|
|
9
10
|
import {
|
|
10
|
-
estimateFeesWithBuffer,
|
|
11
11
|
getAccount,
|
|
12
12
|
getPublicClient,
|
|
13
|
-
getWalletClient
|
|
14
|
-
|
|
13
|
+
getWalletClient,
|
|
14
|
+
waitForReceipt,
|
|
15
|
+
writeContractWithRetry
|
|
16
|
+
} from "./chunk-ASJTFFZH.js";
|
|
15
17
|
import {
|
|
16
18
|
getChain
|
|
17
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-LVPBJ7MI.js";
|
|
18
20
|
import {
|
|
19
21
|
getChainContracts
|
|
20
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-B42ZCCZ7.js";
|
|
21
23
|
|
|
22
24
|
// src/lib/vault.ts
|
|
23
|
-
import { formatUnits } from "viem";
|
|
25
|
+
import { formatUnits, parseEther } from "viem";
|
|
24
26
|
var _vaultOverride = null;
|
|
25
27
|
function setVaultAddress(addr) {
|
|
26
28
|
_vaultOverride = addr;
|
|
@@ -51,13 +53,123 @@ async function getAssetDecimals() {
|
|
|
51
53
|
functionName: "decimals"
|
|
52
54
|
});
|
|
53
55
|
}
|
|
56
|
+
var WETH_ABI = [
|
|
57
|
+
{
|
|
58
|
+
name: "deposit",
|
|
59
|
+
type: "function",
|
|
60
|
+
stateMutability: "payable",
|
|
61
|
+
inputs: [],
|
|
62
|
+
outputs: []
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
async function preflightDeposit(amount) {
|
|
66
|
+
const client = getPublicClient();
|
|
67
|
+
const vaultAddress = getVaultAddress();
|
|
68
|
+
const account = getAccount();
|
|
69
|
+
const asset = await getAssetAddress();
|
|
70
|
+
const decimals = await getAssetDecimals();
|
|
71
|
+
const balance = await client.readContract({
|
|
72
|
+
address: asset,
|
|
73
|
+
abi: ERC20_ABI,
|
|
74
|
+
functionName: "balanceOf",
|
|
75
|
+
args: [account.address]
|
|
76
|
+
});
|
|
77
|
+
if (balance < amount) {
|
|
78
|
+
const symbol = await client.readContract({
|
|
79
|
+
address: asset,
|
|
80
|
+
abi: ERC20_ABI,
|
|
81
|
+
functionName: "symbol"
|
|
82
|
+
});
|
|
83
|
+
throw new Error(
|
|
84
|
+
`Insufficient ${symbol}. Have ${formatUnits(balance, decimals)}, need ${formatUnits(amount, decimals)}.`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
const ethBalance = await client.getBalance({ address: account.address });
|
|
88
|
+
const minGas = parseEther("0.0005");
|
|
89
|
+
if (ethBalance < minGas) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
`Insufficient ETH for gas. Have ${formatUnits(ethBalance, 18)} ETH, need at least 0.0005 ETH. Top up your wallet with ETH on Base.`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
const paused = await client.readContract({
|
|
95
|
+
address: vaultAddress,
|
|
96
|
+
abi: SYNDICATE_VAULT_ABI,
|
|
97
|
+
functionName: "paused"
|
|
98
|
+
});
|
|
99
|
+
if (paused) {
|
|
100
|
+
throw new Error("Vault is paused \u2014 deposits are temporarily disabled.");
|
|
101
|
+
}
|
|
102
|
+
const locked = await client.readContract({
|
|
103
|
+
address: vaultAddress,
|
|
104
|
+
abi: SYNDICATE_VAULT_ABI,
|
|
105
|
+
functionName: "redemptionsLocked"
|
|
106
|
+
});
|
|
107
|
+
if (locked) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
"Deposits are locked while a strategy is executing. Wait for the proposal to be settled."
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const openDeposits = await client.readContract({
|
|
113
|
+
address: vaultAddress,
|
|
114
|
+
abi: SYNDICATE_VAULT_ABI,
|
|
115
|
+
functionName: "openDeposits"
|
|
116
|
+
});
|
|
117
|
+
if (!openDeposits) {
|
|
118
|
+
const approved = await client.readContract({
|
|
119
|
+
address: vaultAddress,
|
|
120
|
+
abi: SYNDICATE_VAULT_ABI,
|
|
121
|
+
functionName: "isApprovedDepositor",
|
|
122
|
+
args: [account.address]
|
|
123
|
+
});
|
|
124
|
+
if (!approved) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
"Your address is not an approved depositor. Ask the vault creator to approve you:\n sherwood syndicate approve-depositor --depositor " + account.address
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async function depositWithEthWrap(amount) {
|
|
132
|
+
const client = getPublicClient();
|
|
133
|
+
const account = getAccount();
|
|
134
|
+
const asset = await getAssetAddress();
|
|
135
|
+
const wethAddress = TOKENS().WETH;
|
|
136
|
+
if (asset.toLowerCase() !== wethAddress.toLowerCase()) {
|
|
137
|
+
throw new Error("--use-eth is only supported for WETH vaults.");
|
|
138
|
+
}
|
|
139
|
+
const wethBalance = await client.readContract({
|
|
140
|
+
address: wethAddress,
|
|
141
|
+
abi: ERC20_ABI,
|
|
142
|
+
functionName: "balanceOf",
|
|
143
|
+
args: [account.address]
|
|
144
|
+
});
|
|
145
|
+
if (wethBalance < amount) {
|
|
146
|
+
const shortfall = amount - wethBalance;
|
|
147
|
+
const ethBalance = await client.getBalance({ address: account.address });
|
|
148
|
+
const minGas = parseEther("0.0005");
|
|
149
|
+
if (ethBalance < shortfall + minGas) {
|
|
150
|
+
throw new Error(
|
|
151
|
+
`Insufficient ETH. Have ${formatUnits(ethBalance, 18)} ETH, need ${formatUnits(shortfall, 18)} to wrap + gas.`
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
const wallet = getWalletClient();
|
|
155
|
+
const wrapHash = await wallet.writeContract({
|
|
156
|
+
address: wethAddress,
|
|
157
|
+
abi: WETH_ABI,
|
|
158
|
+
functionName: "deposit",
|
|
159
|
+
args: [],
|
|
160
|
+
value: shortfall,
|
|
161
|
+
account,
|
|
162
|
+
chain: getChain()
|
|
163
|
+
});
|
|
164
|
+
await client.waitForTransactionReceipt({ hash: wrapHash });
|
|
165
|
+
}
|
|
166
|
+
return deposit(amount);
|
|
167
|
+
}
|
|
54
168
|
async function deposit(amount) {
|
|
55
|
-
const wallet = getWalletClient();
|
|
56
169
|
const client = getPublicClient();
|
|
57
170
|
const vaultAddress = getVaultAddress();
|
|
58
171
|
const account = getAccount();
|
|
59
172
|
const asset = await getAssetAddress();
|
|
60
|
-
const fees = await estimateFeesWithBuffer();
|
|
61
173
|
const currentAllowance = await client.readContract({
|
|
62
174
|
address: asset,
|
|
63
175
|
abi: ERC20_ABI,
|
|
@@ -65,33 +177,29 @@ async function deposit(amount) {
|
|
|
65
177
|
args: [account.address, vaultAddress]
|
|
66
178
|
});
|
|
67
179
|
if (currentAllowance < amount) {
|
|
68
|
-
const approveHash = await
|
|
69
|
-
account
|
|
180
|
+
const approveHash = await writeContractWithRetry({
|
|
181
|
+
account,
|
|
70
182
|
chain: getChain(),
|
|
71
183
|
address: asset,
|
|
72
184
|
abi: ERC20_ABI,
|
|
73
185
|
functionName: "approve",
|
|
74
|
-
args: [vaultAddress, amount]
|
|
75
|
-
...fees
|
|
186
|
+
args: [vaultAddress, amount]
|
|
76
187
|
});
|
|
77
|
-
await
|
|
188
|
+
await waitForReceipt(approveHash);
|
|
78
189
|
}
|
|
79
|
-
const depositHash = await
|
|
80
|
-
account
|
|
190
|
+
const depositHash = await writeContractWithRetry({
|
|
191
|
+
account,
|
|
81
192
|
chain: getChain(),
|
|
82
193
|
address: vaultAddress,
|
|
83
194
|
abi: SYNDICATE_VAULT_ABI,
|
|
84
195
|
functionName: "deposit",
|
|
85
|
-
args: [amount, account.address]
|
|
86
|
-
...fees
|
|
196
|
+
args: [amount, account.address]
|
|
87
197
|
});
|
|
88
|
-
await
|
|
198
|
+
await waitForReceipt(depositHash);
|
|
89
199
|
return depositHash;
|
|
90
200
|
}
|
|
91
201
|
async function executeBatch(calls) {
|
|
92
|
-
const
|
|
93
|
-
const client = getPublicClient();
|
|
94
|
-
const hash = await wallet.writeContract({
|
|
202
|
+
const hash = await writeContractWithRetry({
|
|
95
203
|
account: getAccount(),
|
|
96
204
|
chain: getChain(),
|
|
97
205
|
address: getVaultAddress(),
|
|
@@ -105,13 +213,11 @@ async function executeBatch(calls) {
|
|
|
105
213
|
}))
|
|
106
214
|
]
|
|
107
215
|
});
|
|
108
|
-
await
|
|
216
|
+
await waitForReceipt(hash);
|
|
109
217
|
return hash;
|
|
110
218
|
}
|
|
111
219
|
async function approveDepositor(depositor) {
|
|
112
|
-
const
|
|
113
|
-
const client = getPublicClient();
|
|
114
|
-
const hash = await wallet.writeContract({
|
|
220
|
+
const hash = await writeContractWithRetry({
|
|
115
221
|
account: getAccount(),
|
|
116
222
|
chain: getChain(),
|
|
117
223
|
address: getVaultAddress(),
|
|
@@ -119,13 +225,11 @@ async function approveDepositor(depositor) {
|
|
|
119
225
|
functionName: "approveDepositor",
|
|
120
226
|
args: [depositor]
|
|
121
227
|
});
|
|
122
|
-
await
|
|
228
|
+
await waitForReceipt(hash);
|
|
123
229
|
return hash;
|
|
124
230
|
}
|
|
125
231
|
async function removeDepositor(depositor) {
|
|
126
|
-
const
|
|
127
|
-
const client = getPublicClient();
|
|
128
|
-
const hash = await wallet.writeContract({
|
|
232
|
+
const hash = await writeContractWithRetry({
|
|
129
233
|
account: getAccount(),
|
|
130
234
|
chain: getChain(),
|
|
131
235
|
address: getVaultAddress(),
|
|
@@ -133,7 +237,7 @@ async function removeDepositor(depositor) {
|
|
|
133
237
|
functionName: "removeDepositor",
|
|
134
238
|
args: [depositor]
|
|
135
239
|
});
|
|
136
|
-
await
|
|
240
|
+
await waitForReceipt(hash);
|
|
137
241
|
return hash;
|
|
138
242
|
}
|
|
139
243
|
async function isAgent(agentAddress) {
|
|
@@ -180,9 +284,7 @@ async function getBalance(address) {
|
|
|
180
284
|
};
|
|
181
285
|
}
|
|
182
286
|
async function registerAgent(agentId, agentAddress) {
|
|
183
|
-
const
|
|
184
|
-
const client = getPublicClient();
|
|
185
|
-
const hash = await wallet.writeContract({
|
|
287
|
+
const hash = await writeContractWithRetry({
|
|
186
288
|
account: getAccount(),
|
|
187
289
|
chain: getChain(),
|
|
188
290
|
address: getVaultAddress(),
|
|
@@ -190,7 +292,7 @@ async function registerAgent(agentId, agentAddress) {
|
|
|
190
292
|
functionName: "registerAgent",
|
|
191
293
|
args: [agentId, agentAddress]
|
|
192
294
|
});
|
|
193
|
-
await
|
|
295
|
+
await waitForReceipt(hash);
|
|
194
296
|
return hash;
|
|
195
297
|
}
|
|
196
298
|
async function getVaultInfo() {
|
|
@@ -316,6 +418,8 @@ export {
|
|
|
316
418
|
setVaultAddress,
|
|
317
419
|
getVaultAddress,
|
|
318
420
|
getAssetDecimals,
|
|
421
|
+
preflightDeposit,
|
|
422
|
+
depositWithEthWrap,
|
|
319
423
|
deposit,
|
|
320
424
|
executeBatch,
|
|
321
425
|
approveDepositor,
|
|
@@ -329,4 +433,4 @@ export {
|
|
|
329
433
|
setTextRecord,
|
|
330
434
|
getTextRecord
|
|
331
435
|
};
|
|
332
|
-
//# sourceMappingURL=chunk-
|
|
436
|
+
//# sourceMappingURL=chunk-G7JQRLQE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/vault.ts","../src/lib/ens.ts"],"sourcesContent":["/**\n * SyndicateVault contract wrapper.\n *\n * The vault is the onchain identity — it holds all positions via delegatecall\n * to a shared BatchExecutorLib. No separate executor contract needed.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { formatUnits, parseEther } from \"viem\";\nimport { getChain } from \"./network.js\";\nimport {\n getPublicClient,\n getAccount,\n getWalletClient,\n writeContractWithRetry,\n waitForReceipt,\n} from \"./client.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI } from \"./abis.js\";\nimport type { BatchCall } from \"./batch.js\";\nimport { getChainContracts } from \"./config.js\";\nimport { TOKENS } from \"./addresses.js\";\n\n// Per-command override (set by --vault flag in index.ts)\nlet _vaultOverride: Address | null = null;\n\nexport function setVaultAddress(addr: Address): void {\n _vaultOverride = addr;\n}\n\nexport function getVaultAddress(): Address {\n // 1. Per-command override (--vault flag)\n if (_vaultOverride) return _vaultOverride;\n\n // 2. Config (~/.sherwood/config.json) — default vault\n const chainId = getChain().id;\n const fromConfig = getChainContracts(chainId).vault;\n if (fromConfig) return fromConfig as Address;\n\n throw new Error(\n \"Vault address not found. Pass --vault <addr> or run 'sherwood config set --vault <addr>'.\",\n );\n}\n\n// ── Asset Helpers ──\n\n/**\n * Read the vault's underlying ERC-20 asset address.\n */\nexport async function getAssetAddress(): Promise<Address> {\n const client = getPublicClient();\n return client.readContract({\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"asset\",\n }) as Promise<Address>;\n}\n\n/**\n * Read decimals from the vault's underlying asset.\n * Works with any ERC-20 (USDC=6, WETH=18, WBTC=8, etc.).\n */\nexport async function getAssetDecimals(): Promise<number> {\n const client = getPublicClient();\n const asset = await getAssetAddress();\n return client.readContract({\n address: asset,\n abi: ERC20_ABI,\n functionName: \"decimals\",\n }) as Promise<number>;\n}\n\n// ── WETH ABI (for auto-wrapping ETH) ──\n\nconst WETH_ABI = [\n {\n name: \"deposit\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [],\n outputs: [],\n },\n] as const;\n\n// ── Pre-flight Checks ──\n\n/**\n * Validate that a deposit can succeed before submitting any transactions.\n * Throws descriptive errors if any pre-condition fails.\n */\nexport async function preflightDeposit(amount: bigint): Promise<void> {\n const client = getPublicClient();\n const vaultAddress = getVaultAddress();\n const account = getAccount();\n const asset = await getAssetAddress();\n const decimals = await getAssetDecimals();\n\n // 1. Check asset balance\n const balance = (await client.readContract({\n address: asset,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n })) as bigint;\n\n if (balance < amount) {\n const symbol = (await client.readContract({\n address: asset,\n abi: ERC20_ABI,\n functionName: \"symbol\",\n })) as string;\n throw new Error(\n `Insufficient ${symbol}. Have ${formatUnits(balance, decimals)}, need ${formatUnits(amount, decimals)}.`,\n );\n }\n\n // 2. Check ETH for gas\n const ethBalance = await client.getBalance({ address: account.address });\n const minGas = parseEther(\"0.0005\");\n if (ethBalance < minGas) {\n throw new Error(\n `Insufficient ETH for gas. Have ${formatUnits(ethBalance, 18)} ETH, need at least 0.0005 ETH. Top up your wallet with ETH on Base.`,\n );\n }\n\n // 3. Check vault not paused\n const paused = (await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"paused\",\n })) as boolean;\n if (paused) {\n throw new Error(\"Vault is paused — deposits are temporarily disabled.\");\n }\n\n // 4. Check deposits not locked (active proposal blocks deposits)\n const locked = (await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"redemptionsLocked\",\n })) as boolean;\n if (locked) {\n throw new Error(\n \"Deposits are locked while a strategy is executing. Wait for the proposal to be settled.\",\n );\n }\n\n // 5. Check depositor approval (if whitelist vault)\n const openDeposits = (await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"openDeposits\",\n })) as boolean;\n if (!openDeposits) {\n const approved = (await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"isApprovedDepositor\",\n args: [account.address],\n })) as boolean;\n if (!approved) {\n throw new Error(\n \"Your address is not an approved depositor. Ask the vault creator to approve you:\\n sherwood syndicate approve-depositor --depositor \" +\n account.address,\n );\n }\n }\n}\n\n// ── LP Functions ──\n\n/**\n * Deposit into the vault with optional ETH auto-wrapping for WETH vaults.\n * When `useEth` is true and the vault asset is WETH, wraps ETH first.\n */\nexport async function depositWithEthWrap(amount: bigint): Promise<Hex> {\n const client = getPublicClient();\n const account = getAccount();\n const asset = await getAssetAddress();\n const wethAddress = TOKENS().WETH;\n\n if (asset.toLowerCase() !== wethAddress.toLowerCase()) {\n throw new Error(\"--use-eth is only supported for WETH vaults.\");\n }\n\n // Check current WETH balance — only wrap the shortfall\n const wethBalance = (await client.readContract({\n address: wethAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n })) as bigint;\n\n if (wethBalance < amount) {\n const shortfall = amount - wethBalance;\n\n // Verify sufficient ETH to cover shortfall + gas\n const ethBalance = await client.getBalance({ address: account.address });\n const minGas = parseEther(\"0.0005\");\n if (ethBalance < shortfall + minGas) {\n throw new Error(\n `Insufficient ETH. Have ${formatUnits(ethBalance, 18)} ETH, need ${formatUnits(shortfall, 18)} to wrap + gas.`,\n );\n }\n\n // Wrap ETH → WETH\n const wallet = getWalletClient();\n const wrapHash = await wallet.writeContract({\n address: wethAddress,\n abi: WETH_ABI,\n functionName: \"deposit\",\n args: [],\n value: shortfall,\n account,\n chain: getChain(),\n });\n await client.waitForTransactionReceipt({ hash: wrapHash });\n }\n\n // Proceed with normal deposit\n return deposit(amount);\n}\n\n/**\n * Deposit into the vault. Handles approval + deposit for the vault's asset.\n */\nexport async function deposit(amount: bigint): Promise<Hex> {\n const client = getPublicClient();\n const vaultAddress = getVaultAddress();\n const account = getAccount();\n const asset = await getAssetAddress();\n\n // Check existing allowance — skip approve if sufficient\n const currentAllowance = (await client.readContract({\n address: asset,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [account.address, vaultAddress],\n })) as bigint;\n\n if (currentAllowance < amount) {\n const approveHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: asset,\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [vaultAddress, amount],\n });\n // Wait for approve to confirm before deposit — prevents nonce collision\n await waitForReceipt(approveHash);\n }\n\n // Deposit — retry wrapper handles nonce/gas automatically\n const depositHash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"deposit\",\n args: [amount, account.address],\n });\n await waitForReceipt(depositHash);\n return depositHash;\n}\n\n// ── Batch Execution ──\n\n/**\n * Execute a batch of protocol calls through the vault (owner only).\n * The vault delegatecalls to the executor lib.\n * All calls execute as the vault — positions live on the vault.\n */\nexport async function executeBatch(calls: BatchCall[]): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"executeBatch\",\n args: [\n calls.map((c) => ({\n target: c.target,\n data: c.data,\n value: c.value,\n })),\n ],\n });\n await waitForReceipt(hash);\n return hash;\n}\n\n// ── Depositor Management ──\n\n/**\n * Approve a depositor address (owner only).\n */\nexport async function approveDepositor(depositor: Address): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"approveDepositor\",\n args: [depositor],\n });\n await waitForReceipt(hash);\n return hash;\n}\n\n/**\n * Remove a depositor from the whitelist (owner only).\n */\nexport async function removeDepositor(depositor: Address): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"removeDepositor\",\n args: [depositor],\n });\n await waitForReceipt(hash);\n return hash;\n}\n\n/**\n * Approve multiple depositors in a batch (owner only).\n */\nexport async function approveDepositors(depositors: Address[]): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"approveDepositors\",\n args: [depositors],\n });\n await waitForReceipt(hash);\n return hash;\n}\n\n/**\n * Check if an address is a registered agent on the vault.\n */\nexport async function isAgent(agentAddress: Address): Promise<boolean> {\n const client = getPublicClient();\n return client.readContract({\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"isAgent\",\n args: [agentAddress],\n }) as Promise<boolean>;\n}\n\n/**\n * Check if an address is an approved depositor.\n */\nexport async function isApprovedDepositor(depositor: Address): Promise<boolean> {\n const client = getPublicClient();\n return client.readContract({\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"isApprovedDepositor\",\n args: [depositor],\n }) as Promise<boolean>;\n}\n\n/**\n * Get LP share balance and asset value.\n */\nexport async function getBalance(address?: Address): Promise<{\n shares: bigint;\n assetsValue: string;\n percentOfVault: string;\n}> {\n const client = getPublicClient();\n const vaultAddress = getVaultAddress();\n const account = address || getAccount().address;\n\n const [shares, totalSupply] = await Promise.all([\n client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"balanceOf\",\n args: [account],\n }) as Promise<bigint>,\n client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"totalSupply\",\n }) as Promise<bigint>,\n ]);\n\n let assetsValue = 0n;\n if (shares > 0n) {\n assetsValue = (await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"convertToAssets\",\n args: [shares],\n })) as bigint;\n }\n\n const percent =\n totalSupply > 0n ? ((Number(shares) / Number(totalSupply)) * 100).toFixed(2) : \"0.00\";\n\n const decimals = await getAssetDecimals();\n\n return {\n shares,\n assetsValue: formatUnits(assetsValue, decimals),\n percentOfVault: `${percent}%`,\n };\n}\n\n// ── Agent Management ──\n\n/**\n * Register a new agent (owner only). Requires ERC-8004 agent identity.\n */\nexport async function registerAgent(\n agentId: bigint,\n agentAddress: Address,\n): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"registerAgent\",\n args: [agentId, agentAddress],\n });\n await waitForReceipt(hash);\n return hash;\n}\n\n// ── Views ──\n\nexport interface VaultInfo {\n address: Address;\n totalAssets: string;\n agentCount: bigint;\n redemptionsLocked: boolean;\n managementFeeBps: bigint;\n}\n\n/**\n * Get vault overview info.\n */\nexport async function getVaultInfo(): Promise<VaultInfo> {\n const client = getPublicClient();\n const vaultAddress = getVaultAddress();\n\n const [totalAssets, agentCount, redemptionsLocked, managementFeeBps, decimals] =\n await Promise.all([\n client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"totalAssets\",\n }) as Promise<bigint>,\n client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"getAgentCount\",\n }) as Promise<bigint>,\n client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"redemptionsLocked\",\n }) as Promise<boolean>,\n client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"managementFeeBps\",\n }) as Promise<bigint>,\n getAssetDecimals(),\n ]);\n\n return {\n address: vaultAddress,\n totalAssets: formatUnits(totalAssets, decimals),\n agentCount,\n redemptionsLocked,\n managementFeeBps,\n };\n}\n","/**\n * ENS resolution + text records via Durin L2Registry on Base.\n *\n * Two responsibilities:\n * 1. Resolve syndicate subdomain → on-chain syndicate data (via factory)\n * 2. Read/write ENS text records (via L2Registry, routed through vault's executeBatch)\n *\n * The vault owns the ENS subdomain node (registered in the factory via\n * `ensRegistrar.register(subdomain, vault)`). Only the vault can write text\n * records. We route writes through vault.executeBatch → L2Registry.setText,\n * which executes as the vault via delegatecall to the shared executor lib.\n */\n\nimport { encodeFunctionData } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport { namehash } from \"viem/ens\";\nimport { getPublicClient, getWalletClient, getAccount, waitForReceipt } from \"./client.js\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { SYNDICATE_FACTORY_ABI, L2_REGISTRY_ABI } from \"./abis.js\";\nimport { ENS, SHERWOOD } from \"./addresses.js\";\nimport * as vaultLib from \"./vault.js\";\n\n/**\n * Wait for a transaction to be mined before proceeding.\n */\nasync function waitForTx(hash: Hex): Promise<void> {\n await waitForReceipt(hash);\n}\n\nconst ENS_DOMAIN = \"sherwoodagent.eth\";\n\nfunction getFactoryAddress(): Address {\n return SHERWOOD().FACTORY;\n}\n\n// ── Syndicate Resolution (via factory) ──\n\nexport interface SyndicateResolution {\n id: bigint;\n vault: Address;\n creator: Address;\n subdomain: string;\n}\n\n/**\n * Resolve a syndicate subdomain to its on-chain data.\n * Uses factory.subdomainToSyndicate() → factory.syndicates().\n */\nexport async function resolveSyndicate(subdomain: string): Promise<SyndicateResolution> {\n const client = getPublicClient();\n const factory = getFactoryAddress();\n\n // Get syndicate ID from subdomain\n const syndicateId = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"subdomainToSyndicate\",\n args: [subdomain],\n })) as bigint;\n\n if (syndicateId === 0n) {\n throw new Error(`Syndicate \"${subdomain}\" not found`);\n }\n\n // Get full syndicate record\n const result = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicates\",\n args: [syndicateId],\n })) as [bigint, Address, Address, string, bigint, boolean, string];\n\n return {\n id: result[0],\n vault: result[1],\n creator: result[2],\n subdomain: result[6],\n };\n}\n\n/**\n * Reverse lookup: vault address → syndicate info.\n * Uses factory.vaultToSyndicate() → factory.syndicates().\n */\nexport async function resolveVaultSyndicate(\n vaultAddress: Address,\n): Promise<SyndicateResolution> {\n const client = getPublicClient();\n const factory = getFactoryAddress();\n\n const syndicateId = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"vaultToSyndicate\",\n args: [vaultAddress],\n })) as bigint;\n\n if (syndicateId === 0n) {\n throw new Error(`No syndicate found for vault ${vaultAddress}`);\n }\n\n const result = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicates\",\n args: [syndicateId],\n })) as [bigint, Address, Address, string, bigint, boolean, string];\n\n return {\n id: result[0],\n vault: result[1],\n creator: result[2],\n subdomain: result[6],\n };\n}\n\n// ── ENS Text Records (via L2Registry) ──\n\n/**\n * Compute the ENS node hash for a subdomain under sherwoodagent.eth.\n */\nfunction getSubdomainNode(subdomain: string): Hex {\n return namehash(`${subdomain}.${ENS_DOMAIN}`);\n}\n\n/**\n * Write a text record to the L2Registry via the vault's executeBatch.\n *\n * The vault owns the ENS node, so only the vault can call setText.\n * We route the call through vault.executeBatch (delegatecall → executor lib → L2Registry),\n * which means L2Registry sees msg.sender = vault address.\n *\n * Requires the caller to be a registered agent on the vault (creator is auto-registered).\n */\nexport async function setTextRecord(\n subdomain: string,\n key: string,\n value: string,\n vaultAddress: Address,\n): Promise<Hex> {\n const l2Registry = ENS().L2_REGISTRY;\n const node = getSubdomainNode(subdomain);\n\n vaultLib.setVaultAddress(vaultAddress);\n\n // Encode the L2Registry.setText call\n const setTextData = encodeFunctionData({\n abi: L2_REGISTRY_ABI,\n functionName: \"setText\",\n args: [node, key, value],\n });\n\n // Route through vault.executeBatch (owner only)\n return vaultLib.executeBatch(\n [{ target: l2Registry, data: setTextData, value: 0n }],\n );\n}\n\n/**\n * Read a text record from the L2Registry.\n * Used to look up xmtpGroupId when not cached locally.\n */\nexport async function getTextRecord(\n subdomain: string,\n key: string,\n): Promise<string> {\n const client = getPublicClient();\n const node = getSubdomainNode(subdomain);\n\n return client.readContract({\n address: ENS().L2_REGISTRY,\n abi: L2_REGISTRY_ABI,\n functionName: \"text\",\n args: [node, key],\n }) as Promise<string>;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getNetwork
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LVPBJ7MI.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/addresses.ts
|
|
6
6
|
var ZERO = "0x0000000000000000000000000000000000000000";
|
|
@@ -144,22 +144,25 @@ var ROBINHOOD_TESTNET_AERODROME = {
|
|
|
144
144
|
FACTORY: ZERO
|
|
145
145
|
};
|
|
146
146
|
var BASE_STRATEGY_TEMPLATES = {
|
|
147
|
-
MOONWELL_SUPPLY: "
|
|
147
|
+
MOONWELL_SUPPLY: "0x72216571Ac847b29E1a5e3378e6ebCca3C2882da",
|
|
148
148
|
AERODROME_LP: "0x1c61c740702690B86b874ab929A6F04A4Ec56C1c",
|
|
149
149
|
VENICE_INFERENCE: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C",
|
|
150
|
-
WSTETH_MOONWELL: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985"
|
|
150
|
+
WSTETH_MOONWELL: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
|
|
151
|
+
MAMO_YIELD: "0x5c98808Ce5e51767ba2d969F75312eEFF0b14a6A"
|
|
151
152
|
};
|
|
152
153
|
var BASE_SEPOLIA_STRATEGY_TEMPLATES = {
|
|
153
154
|
MOONWELL_SUPPLY: ZERO,
|
|
154
155
|
AERODROME_LP: ZERO,
|
|
155
156
|
VENICE_INFERENCE: ZERO,
|
|
156
|
-
WSTETH_MOONWELL: ZERO
|
|
157
|
+
WSTETH_MOONWELL: ZERO,
|
|
158
|
+
MAMO_YIELD: ZERO
|
|
157
159
|
};
|
|
158
160
|
var ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {
|
|
159
161
|
MOONWELL_SUPPLY: ZERO,
|
|
160
162
|
AERODROME_LP: ZERO,
|
|
161
163
|
VENICE_INFERENCE: ZERO,
|
|
162
|
-
WSTETH_MOONWELL: ZERO
|
|
164
|
+
WSTETH_MOONWELL: ZERO,
|
|
165
|
+
MAMO_YIELD: ZERO
|
|
163
166
|
};
|
|
164
167
|
var BASE_EAS = {
|
|
165
168
|
EAS: "0x4200000000000000000000000000000000000021",
|
|
@@ -339,6 +342,24 @@ var SYNDICATE_VAULT_ABI = [
|
|
|
339
342
|
],
|
|
340
343
|
outputs: []
|
|
341
344
|
},
|
|
345
|
+
// Governor-initiated batch execution (governor-only)
|
|
346
|
+
{
|
|
347
|
+
name: "executeGovernorBatch",
|
|
348
|
+
type: "function",
|
|
349
|
+
stateMutability: "nonpayable",
|
|
350
|
+
inputs: [
|
|
351
|
+
{
|
|
352
|
+
name: "calls",
|
|
353
|
+
type: "tuple[]",
|
|
354
|
+
components: [
|
|
355
|
+
{ name: "target", type: "address" },
|
|
356
|
+
{ name: "data", type: "bytes" },
|
|
357
|
+
{ name: "value", type: "uint256" }
|
|
358
|
+
]
|
|
359
|
+
}
|
|
360
|
+
],
|
|
361
|
+
outputs: []
|
|
362
|
+
},
|
|
342
363
|
// Agent management
|
|
343
364
|
{
|
|
344
365
|
name: "registerAgent",
|
|
@@ -474,6 +495,13 @@ var SYNDICATE_VAULT_ABI = [
|
|
|
474
495
|
inputs: [],
|
|
475
496
|
outputs: [{ name: "", type: "bool" }]
|
|
476
497
|
},
|
|
498
|
+
{
|
|
499
|
+
name: "paused",
|
|
500
|
+
type: "function",
|
|
501
|
+
stateMutability: "view",
|
|
502
|
+
inputs: [],
|
|
503
|
+
outputs: [{ name: "", type: "bool" }]
|
|
504
|
+
},
|
|
477
505
|
// ERC-4626 views for LP balance
|
|
478
506
|
{
|
|
479
507
|
name: "convertToAssets",
|
|
@@ -671,6 +699,17 @@ var ERC20_ABI = [
|
|
|
671
699
|
{ name: "amount", type: "uint256" }
|
|
672
700
|
],
|
|
673
701
|
outputs: [{ name: "", type: "bool" }]
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
name: "transferFrom",
|
|
705
|
+
type: "function",
|
|
706
|
+
stateMutability: "nonpayable",
|
|
707
|
+
inputs: [
|
|
708
|
+
{ name: "from", type: "address" },
|
|
709
|
+
{ name: "to", type: "address" },
|
|
710
|
+
{ name: "amount", type: "uint256" }
|
|
711
|
+
],
|
|
712
|
+
outputs: [{ name: "", type: "bool" }]
|
|
674
713
|
}
|
|
675
714
|
];
|
|
676
715
|
var SYNDICATE_FACTORY_ABI = [
|
|
@@ -1463,4 +1502,4 @@ export {
|
|
|
1463
1502
|
SYNDICATE_GOVERNOR_ABI,
|
|
1464
1503
|
BASE_STRATEGY_ABI
|
|
1465
1504
|
};
|
|
1466
|
-
//# sourceMappingURL=chunk-
|
|
1505
|
+
//# sourceMappingURL=chunk-JR5K5WVR.js.map
|