@sherwoodagent/cli 0.65.2 → 0.72.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/{abis-4HWN2E3H.js → abis-KP7M4IPM.js} +4 -2
- package/dist/addresses-HJDYFLWZ.js +45 -0
- package/dist/{agent-AETROOEW.js → agent-6OJKQVEG.js} +10 -10
- package/dist/{agent-AETROOEW.js.map → agent-6OJKQVEG.js.map} +1 -1
- package/dist/{chat-JSSTSE4K.js → chat-2DKD3QPA.js} +37 -36
- package/dist/chat-2DKD3QPA.js.map +1 -0
- package/dist/{chunk-O4G3SBCI.js → chunk-3YUMQGJD.js} +109 -129
- package/dist/chunk-3YUMQGJD.js.map +1 -0
- package/dist/{chunk-W2ZUPR3W.js → chunk-5DWB5Y7G.js} +9 -9
- package/dist/chunk-5DWB5Y7G.js.map +1 -0
- package/dist/{chunk-IL43IMOC.js → chunk-6SRIVGAV.js} +23 -18
- package/dist/chunk-6SRIVGAV.js.map +1 -0
- package/dist/{chunk-UCQEEF3Z.js → chunk-ASF2WTSW.js} +6 -6
- package/dist/chunk-ASF2WTSW.js.map +1 -0
- package/dist/{chunk-YZHZSBES.js → chunk-BQMOE4FJ.js} +144 -37
- package/dist/chunk-BQMOE4FJ.js.map +1 -0
- package/dist/{chunk-2W4KGGPU.js → chunk-GSC7PVEO.js} +27 -27
- package/dist/chunk-GSC7PVEO.js.map +1 -0
- package/dist/chunk-GT3KCKF6.js +124 -0
- package/dist/chunk-GT3KCKF6.js.map +1 -0
- package/dist/{chunk-RO26TXXE.js → chunk-ITZT5HD4.js} +2 -2
- package/dist/{chunk-UBAX22KA.js → chunk-OZLX666C.js} +4 -4
- package/dist/chunk-OZLX666C.js.map +1 -0
- package/dist/{chunk-A6TOJEUD.js → chunk-PDUGL4EY.js} +106 -128
- package/dist/chunk-PDUGL4EY.js.map +1 -0
- package/dist/chunk-RNASYOQT.js +111 -0
- package/dist/chunk-RNASYOQT.js.map +1 -0
- package/dist/{chunk-VYF2TXPX.js → chunk-SVSJNZ5D.js} +6 -6
- package/dist/{chunk-YJSCIQUZ.js → chunk-UC5RMCB3.js} +6 -6
- package/dist/chunk-UC5RMCB3.js.map +1 -0
- package/dist/chunk-YLYANZMC.js +308 -0
- package/dist/chunk-YLYANZMC.js.map +1 -0
- package/dist/{chunk-RHRLYVKM.js → chunk-ZYXFKVYF.js} +25 -12
- package/dist/chunk-ZYXFKVYF.js.map +1 -0
- package/dist/{client-KBBFAMEI.js → client-K4JCNPVV.js} +4 -4
- package/dist/{config-REASKDIK.js → config-FAQO37S7.js} +10 -10
- package/dist/{cron-EOULYO3R.js → cron-QMLRWDJG.js} +19 -17
- package/dist/cron-QMLRWDJG.js.map +1 -0
- package/dist/{eas-K4ZBACYN.js → eas-ZXGUNYC5.js} +7 -7
- package/dist/{governor-2CDSMSG7.js → governor-CV5PITE3.js} +13 -13
- package/dist/index.js +1964 -1219
- package/dist/index.js.map +1 -1
- package/dist/{ipfs-FAYWUCS2.js → ipfs-VGWTUORE.js} +2 -2
- package/dist/{network-3ZU7UBDU.js → network-DHWEYXP2.js} +7 -7
- package/dist/{price-LCTECRQP.js → price-GOX6P4NT.js} +6 -6
- package/dist/{research-FUQOQWKK.js → research-6D7NNJX4.js} +22 -22
- package/dist/research-6D7NNJX4.js.map +1 -0
- package/dist/research-EFNVHU7G.js +14 -0
- package/dist/{session-FJB2RV2X.js → session-LDLW66K3.js} +28 -28
- package/dist/session-LDLW66K3.js.map +1 -0
- package/dist/{session-XAW5UIXP.js → session-XBQY7SBJ.js} +2 -2
- package/dist/{trade-U7H5IFH6.js → trade-7NNZXP5B.js} +34 -34
- package/dist/trade-7NNZXP5B.js.map +1 -0
- package/dist/vault-SIL4QL5U.js +54 -0
- package/dist/vault-SIL4QL5U.js.map +1 -0
- package/dist/{xmtp-6NJ4PW6L.js → xmtp-QNOVDLXX.js} +13 -12
- package/dist/xmtp-QNOVDLXX.js.map +1 -0
- package/package.json +4 -3
- package/dist/addresses-J2LMGUCT.js +0 -35
- package/dist/chat-JSSTSE4K.js.map +0 -1
- package/dist/chunk-2LRC7I33.js +0 -186
- package/dist/chunk-2LRC7I33.js.map +0 -1
- package/dist/chunk-2W4KGGPU.js.map +0 -1
- package/dist/chunk-A6TOJEUD.js.map +0 -1
- package/dist/chunk-GWMTAW6A.js +0 -494
- package/dist/chunk-GWMTAW6A.js.map +0 -1
- package/dist/chunk-IL43IMOC.js.map +0 -1
- package/dist/chunk-O4G3SBCI.js.map +0 -1
- package/dist/chunk-RHRLYVKM.js.map +0 -1
- package/dist/chunk-UBAX22KA.js.map +0 -1
- package/dist/chunk-UCQEEF3Z.js.map +0 -1
- package/dist/chunk-W2ZUPR3W.js.map +0 -1
- package/dist/chunk-YJSCIQUZ.js.map +0 -1
- package/dist/chunk-YZHZSBES.js.map +0 -1
- package/dist/cron-EOULYO3R.js.map +0 -1
- package/dist/research-FUQOQWKK.js.map +0 -1
- package/dist/research-XEXTHDT3.js +0 -14
- package/dist/session-FJB2RV2X.js.map +0 -1
- package/dist/trade-U7H5IFH6.js.map +0 -1
- package/dist/xmtp-6NJ4PW6L.js.map +0 -1
- /package/dist/{abis-4HWN2E3H.js.map → abis-KP7M4IPM.js.map} +0 -0
- /package/dist/{addresses-J2LMGUCT.js.map → addresses-HJDYFLWZ.js.map} +0 -0
- /package/dist/{chunk-RO26TXXE.js.map → chunk-ITZT5HD4.js.map} +0 -0
- /package/dist/{chunk-VYF2TXPX.js.map → chunk-SVSJNZ5D.js.map} +0 -0
- /package/dist/{client-KBBFAMEI.js.map → client-K4JCNPVV.js.map} +0 -0
- /package/dist/{config-REASKDIK.js.map → config-FAQO37S7.js.map} +0 -0
- /package/dist/{eas-K4ZBACYN.js.map → eas-ZXGUNYC5.js.map} +0 -0
- /package/dist/{governor-2CDSMSG7.js.map → governor-CV5PITE3.js.map} +0 -0
- /package/dist/{ipfs-FAYWUCS2.js.map → ipfs-VGWTUORE.js.map} +0 -0
- /package/dist/{network-3ZU7UBDU.js.map → network-DHWEYXP2.js.map} +0 -0
- /package/dist/{price-LCTECRQP.js.map → price-GOX6P4NT.js.map} +0 -0
- /package/dist/{research-XEXTHDT3.js.map → research-EFNVHU7G.js.map} +0 -0
- /package/dist/{session-XAW5UIXP.js.map → session-XBQY7SBJ.js.map} +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {
|
|
2
|
+
executeBatch,
|
|
3
|
+
setVaultAddress
|
|
4
|
+
} from "./chunk-3YUMQGJD.js";
|
|
5
|
+
import {
|
|
6
|
+
ENS,
|
|
7
|
+
SHERWOOD
|
|
8
|
+
} from "./chunk-YLYANZMC.js";
|
|
9
|
+
import {
|
|
10
|
+
getPublicClient
|
|
11
|
+
} from "./chunk-UC5RMCB3.js";
|
|
12
|
+
import {
|
|
13
|
+
VALID_NETWORKS,
|
|
14
|
+
withNetwork
|
|
15
|
+
} from "./chunk-RNASYOQT.js";
|
|
16
|
+
import {
|
|
17
|
+
L2_REGISTRY_ABI,
|
|
18
|
+
SYNDICATE_FACTORY_ABI
|
|
19
|
+
} from "./chunk-BQMOE4FJ.js";
|
|
20
|
+
|
|
21
|
+
// src/lib/ens.ts
|
|
22
|
+
import { encodeFunctionData } from "viem";
|
|
23
|
+
import { namehash } from "viem/ens";
|
|
24
|
+
var ENS_DOMAIN = "sherwoodagent.eth";
|
|
25
|
+
function getFactoryAddress() {
|
|
26
|
+
return SHERWOOD().FACTORY;
|
|
27
|
+
}
|
|
28
|
+
async function resolveFund(subdomain) {
|
|
29
|
+
const client = getPublicClient();
|
|
30
|
+
const factory = getFactoryAddress();
|
|
31
|
+
const fundId = await client.readContract({
|
|
32
|
+
address: factory,
|
|
33
|
+
abi: SYNDICATE_FACTORY_ABI,
|
|
34
|
+
functionName: "subdomainToSyndicate",
|
|
35
|
+
args: [subdomain]
|
|
36
|
+
});
|
|
37
|
+
if (fundId === 0n) {
|
|
38
|
+
throw new Error(`Fund "${subdomain}" not found`);
|
|
39
|
+
}
|
|
40
|
+
const result = await client.readContract({
|
|
41
|
+
address: factory,
|
|
42
|
+
abi: SYNDICATE_FACTORY_ABI,
|
|
43
|
+
functionName: "syndicates",
|
|
44
|
+
args: [fundId]
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
id: result[0],
|
|
48
|
+
vault: result[1],
|
|
49
|
+
creator: result[2],
|
|
50
|
+
subdomain: result[6]
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function searchFundAcrossChains(subdomain) {
|
|
54
|
+
const candidates = VALID_NETWORKS;
|
|
55
|
+
const hits = [];
|
|
56
|
+
for (const net of candidates) {
|
|
57
|
+
try {
|
|
58
|
+
const result = await withNetwork(net, () => resolveFund(subdomain));
|
|
59
|
+
hits.push({ network: net, result });
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return hits;
|
|
64
|
+
}
|
|
65
|
+
async function resolveVaultFund(vaultAddress) {
|
|
66
|
+
const client = getPublicClient();
|
|
67
|
+
const factory = getFactoryAddress();
|
|
68
|
+
const fundId = await client.readContract({
|
|
69
|
+
address: factory,
|
|
70
|
+
abi: SYNDICATE_FACTORY_ABI,
|
|
71
|
+
functionName: "vaultToSyndicate",
|
|
72
|
+
args: [vaultAddress]
|
|
73
|
+
});
|
|
74
|
+
if (fundId === 0n) {
|
|
75
|
+
throw new Error(`No fund found for vault ${vaultAddress}`);
|
|
76
|
+
}
|
|
77
|
+
const result = await client.readContract({
|
|
78
|
+
address: factory,
|
|
79
|
+
abi: SYNDICATE_FACTORY_ABI,
|
|
80
|
+
functionName: "syndicates",
|
|
81
|
+
args: [fundId]
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
id: result[0],
|
|
85
|
+
vault: result[1],
|
|
86
|
+
creator: result[2],
|
|
87
|
+
subdomain: result[6]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function getSubdomainNode(subdomain) {
|
|
91
|
+
return namehash(`${subdomain}.${ENS_DOMAIN}`);
|
|
92
|
+
}
|
|
93
|
+
async function setTextRecord(subdomain, key, value, vaultAddress) {
|
|
94
|
+
const l2Registry = ENS().L2_REGISTRY;
|
|
95
|
+
const node = getSubdomainNode(subdomain);
|
|
96
|
+
setVaultAddress(vaultAddress);
|
|
97
|
+
const setTextData = encodeFunctionData({
|
|
98
|
+
abi: L2_REGISTRY_ABI,
|
|
99
|
+
functionName: "setText",
|
|
100
|
+
args: [node, key, value]
|
|
101
|
+
});
|
|
102
|
+
return executeBatch(
|
|
103
|
+
[{ target: l2Registry, data: setTextData, value: 0n }]
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
async function getTextRecord(subdomain, key) {
|
|
107
|
+
const client = getPublicClient();
|
|
108
|
+
const node = getSubdomainNode(subdomain);
|
|
109
|
+
return client.readContract({
|
|
110
|
+
address: ENS().L2_REGISTRY,
|
|
111
|
+
abi: L2_REGISTRY_ABI,
|
|
112
|
+
functionName: "text",
|
|
113
|
+
args: [node, key]
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export {
|
|
118
|
+
resolveFund,
|
|
119
|
+
searchFundAcrossChains,
|
|
120
|
+
resolveVaultFund,
|
|
121
|
+
setTextRecord,
|
|
122
|
+
getTextRecord
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=chunk-GT3KCKF6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/ens.ts"],"sourcesContent":["/**\n * ENS resolution + text records via Durin L2Registry on Base.\n *\n * Two responsibilities:\n * 1. Resolve fund subdomain → on-chain fund 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 {\n getChain,\n getNetwork,\n withNetwork,\n VALID_NETWORKS,\n type Network,\n} 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// ── Fund Resolution (via factory) ──\n\nexport interface FundResolution {\n id: bigint;\n vault: Address;\n creator: Address;\n subdomain: string;\n}\n\n/**\n * Resolve a fund subdomain to its on-chain data.\n * Uses factory.subdomainToSyndicate() → factory.syndicates().\n */\nexport async function resolveFund(subdomain: string): Promise<FundResolution> {\n const client = getPublicClient();\n const factory = getFactoryAddress();\n\n // Get fund ID from subdomain\n const fundId = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"subdomainToSyndicate\",\n args: [subdomain],\n })) as bigint;\n\n if (fundId === 0n) {\n throw new Error(`Fund \"${subdomain}\" not found`);\n }\n\n // Get full fund record\n const result = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicates\",\n args: [fundId],\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 * Probe every supported chain for a subdomain registration. Returns every hit —\n * most queries find zero or one, but post-CREATE3 the same subdomain may exist\n * on multiple chains and the caller needs to disambiguate. RPC errors on\n * individual chains are swallowed so a flaky chain doesn't fail the whole\n * search. The current deployment target is a single (ungated) chain, so this\n * iterates VALID_NETWORKS directly.\n */\nexport async function searchFundAcrossChains(\n subdomain: string,\n): Promise<{ network: Network; result: FundResolution }[]> {\n const candidates = VALID_NETWORKS;\n\n const hits: { network: Network; result: FundResolution }[] = [];\n for (const net of candidates) {\n try {\n const result = await withNetwork(net, () => resolveFund(subdomain));\n hits.push({ network: net, result });\n } catch {\n // Not registered on this chain, or RPC failed — keep searching.\n }\n }\n return hits;\n}\n\n/**\n * Reverse lookup: vault address → fund info.\n * Uses factory.vaultToSyndicate() → factory.syndicates().\n */\nexport async function resolveVaultFund(\n vaultAddress: Address,\n): Promise<FundResolution> {\n const client = getPublicClient();\n const factory = getFactoryAddress();\n\n const fundId = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"vaultToSyndicate\",\n args: [vaultAddress],\n })) as bigint;\n\n if (fundId === 0n) {\n throw new Error(`No fund 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: [fundId],\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":";;;;;;;;;;;;;;;;;;;;;AAaA,SAAS,0BAA0B;AAEnC,SAAS,gBAAgB;AAoBzB,IAAM,aAAa;AAEnB,SAAS,oBAA6B;AACpC,SAAO,SAAS,EAAE;AACpB;AAeA,eAAsB,YAAY,WAA4C;AAC5E,QAAM,SAAS,gBAAgB;AAC/B,QAAM,UAAU,kBAAkB;AAGlC,QAAM,SAAU,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,SAAS;AAAA,EAClB,CAAC;AAED,MAAI,WAAW,IAAI;AACjB,UAAM,IAAI,MAAM,SAAS,SAAS,aAAa;AAAA,EACjD;AAGA,QAAM,SAAU,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACL,IAAI,OAAO,CAAC;AAAA,IACZ,OAAO,OAAO,CAAC;AAAA,IACf,SAAS,OAAO,CAAC;AAAA,IACjB,WAAW,OAAO,CAAC;AAAA,EACrB;AACF;AAUA,eAAsB,uBACpB,WACyD;AACzD,QAAM,aAAa;AAEnB,QAAM,OAAuD,CAAC;AAC9D,aAAW,OAAO,YAAY;AAC5B,QAAI;AACF,YAAM,SAAS,MAAM,YAAY,KAAK,MAAM,YAAY,SAAS,CAAC;AAClE,WAAK,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;AAAA,IACpC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAsB,iBACpB,cACyB;AACzB,QAAM,SAAS,gBAAgB;AAC/B,QAAM,UAAU,kBAAkB;AAElC,QAAM,SAAU,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,YAAY;AAAA,EACrB,CAAC;AAED,MAAI,WAAW,IAAI;AACjB,UAAM,IAAI,MAAM,2BAA2B,YAAY,EAAE;AAAA,EAC3D;AAEA,QAAM,SAAU,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACL,IAAI,OAAO,CAAC;AAAA,IACZ,OAAO,OAAO,CAAC;AAAA,IACf,SAAS,OAAO,CAAC;AAAA,IACjB,WAAW,OAAO,CAAC;AAAA,EACrB;AACF;AAOA,SAAS,iBAAiB,WAAwB;AAChD,SAAO,SAAS,GAAG,SAAS,IAAI,UAAU,EAAE;AAC9C;AAWA,eAAsB,cACpB,WACA,KACA,OACA,cACc;AACd,QAAM,aAAa,IAAI,EAAE;AACzB,QAAM,OAAO,iBAAiB,SAAS;AAEvC,EAAS,gBAAgB,YAAY;AAGrC,QAAM,cAAc,mBAAmB;AAAA,IACrC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM,KAAK,KAAK;AAAA,EACzB,CAAC;AAGD,SAAgB;AAAA,IACd,CAAC,EAAE,QAAQ,YAAY,MAAM,aAAa,OAAO,GAAG,CAAC;AAAA,EACvD;AACF;AAMA,eAAsB,cACpB,WACA,KACiB;AACjB,QAAM,SAAS,gBAAgB;AAC/B,QAAM,OAAO,iBAAiB,SAAS;AAEvC,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS,IAAI,EAAE;AAAA,IACf,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM,GAAG;AAAA,EAClB,CAAC;AACH;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getAccount
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UC5RMCB3.js";
|
|
4
4
|
|
|
5
5
|
// src/providers/research/messari.ts
|
|
6
6
|
import { base, baseSepolia } from "viem/chains";
|
|
@@ -635,4 +635,4 @@ export {
|
|
|
635
635
|
NansenProvider,
|
|
636
636
|
getResearchProvider
|
|
637
637
|
};
|
|
638
|
-
//# sourceMappingURL=chunk-
|
|
638
|
+
//# sourceMappingURL=chunk-ITZT5HD4.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getAccount
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UC5RMCB3.js";
|
|
4
4
|
import {
|
|
5
5
|
getVeniceApiKey,
|
|
6
6
|
setVeniceApiKey
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-GSC7PVEO.js";
|
|
8
8
|
|
|
9
9
|
// src/lib/venice.ts
|
|
10
10
|
import chalk from "chalk";
|
|
@@ -71,7 +71,7 @@ async function provisionApiKey() {
|
|
|
71
71
|
signature,
|
|
72
72
|
token,
|
|
73
73
|
apiKeyType: "INFERENCE",
|
|
74
|
-
description: "Sherwood
|
|
74
|
+
description: "Sherwood fund agent"
|
|
75
75
|
})
|
|
76
76
|
});
|
|
77
77
|
if (!keyRes.ok) {
|
|
@@ -186,4 +186,4 @@ export {
|
|
|
186
186
|
chatCompletion,
|
|
187
187
|
listModels
|
|
188
188
|
};
|
|
189
|
-
//# sourceMappingURL=chunk-
|
|
189
|
+
//# sourceMappingURL=chunk-OZLX666C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/venice.ts"],"sourcesContent":["/**\n * Venice AI API integration — web3 key generation, validation, and inference.\n *\n * Key provisioning flow:\n * 1. GET /api_keys/generate_web3_key → validation token\n * 2. Sign token with agent wallet (EIP-191)\n * 3. POST /api_keys/generate_web3_key → API key\n *\n * Inference:\n * POST /chat/completions with Bearer auth → chat completion response\n *\n * The API key is stored in ~/.sherwood/config.json.\n * Venice requires the signing wallet to hold staked VVV (sVVV).\n */\n\nimport chalk from \"chalk\";\nimport { getAccount } from \"./client.js\";\nimport { setVeniceApiKey, getVeniceApiKey } from \"./config.js\";\n\nconst VENICE_API_BASE = \"https://api.venice.ai/api/v1\";\n\n// ── Retry policy for chatCompletion ──\n\nconst RETRY_MAX_ATTEMPTS = 3;\nconst RETRY_BASE_DELAYS_MS = [1000, 2000, 4000]; // 1s, 2s, 4s\nconst RETRY_JITTER_PCT = 0.2; // ±20%\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\n/**\n * Transient HTTP error raised by `chatCompletion` before retry logic kicks in.\n * Carries the response status so `shouldRetry` can inspect it.\n */\nclass VeniceHttpError extends Error {\n readonly status: number;\n readonly body: string;\n constructor(status: number, body: string) {\n super(`Venice inference failed: ${status} ${body}`);\n this.name = \"VeniceHttpError\";\n this.status = status;\n this.body = body;\n }\n}\n\n/**\n * Decide whether a failed `chatCompletion` HTTP attempt is worth retrying.\n * Retries: 429, 5xx, and network-class errors (fetch TypeError / ECONNRESET).\n * Never retries: AbortError (user/timeout), 4xx client errors, parse errors.\n */\nfunction shouldRetry(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n // User/caller abort or outer timeout — never retry\n if (err.name === \"AbortError\") return false;\n if (err instanceof VeniceHttpError) {\n return RETRYABLE_STATUS.has(err.status);\n }\n // Network-class: Node's fetch surfaces these as TypeError with a cause,\n // or occasionally the cause Error carries codes like ECONNRESET/ETIMEDOUT.\n if (err instanceof TypeError) return true;\n const cause = (err as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const code = (cause as { code?: unknown }).code;\n if (typeof code === \"string\" &&\n [\"ECONNRESET\", \"ECONNREFUSED\", \"ETIMEDOUT\", \"EAI_AGAIN\", \"ENOTFOUND\", \"EPIPE\", \"UND_ERR_SOCKET\"].includes(code)) {\n return true;\n }\n }\n return false;\n}\n\nfunction jitter(delayMs: number): number {\n const spread = delayMs * RETRY_JITTER_PCT;\n return Math.max(0, Math.round(delayMs + (Math.random() * 2 - 1) * spread));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Provision a Venice API key via web3 wallet signature.\n * The wallet must hold sVVV for this to succeed.\n */\nexport async function provisionApiKey(): Promise<string> {\n const account = getAccount();\n\n // 1. Get validation token (unauthenticated per Venice swagger spec)\n const tokenRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n signal: AbortSignal.timeout(15_000),\n });\n if (!tokenRes.ok) {\n throw new Error(`Failed to get validation token: ${tokenRes.status} ${tokenRes.statusText}`);\n }\n const tokenData = await tokenRes.json();\n const token = tokenData?.data?.token;\n if (!token) {\n throw new Error(\"Venice API returned no validation token\");\n }\n\n // 2. Sign token with wallet (EIP-191)\n const signature = await account.signMessage({ message: token });\n\n // 3. Generate API key\n const keyRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal: AbortSignal.timeout(15_000),\n body: JSON.stringify({\n address: account.address,\n signature,\n token,\n apiKeyType: \"INFERENCE\",\n description: \"Sherwood fund agent\",\n }),\n });\n\n if (!keyRes.ok) {\n const body = await keyRes.text();\n throw new Error(`Failed to generate API key: ${keyRes.status} ${body}`);\n }\n\n const keyData = await keyRes.json();\n const apiKey = keyData?.data?.apiKey;\n if (!apiKey) {\n throw new Error(\"Venice API returned no API key\");\n }\n\n // Store in config\n setVeniceApiKey(apiKey);\n\n return apiKey;\n}\n\n/**\n * Check if the stored Venice API key is still valid.\n */\nexport async function checkApiKeyValid(): Promise<boolean> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) return false;\n\n try {\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n// ── Inference ──\n\nexport interface ChatCompletionMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatCompletionOptions {\n model: string;\n messages: ChatCompletionMessage[];\n temperature?: number;\n maxTokens?: number;\n enableWebSearch?: boolean;\n disableThinking?: boolean;\n}\n\nexport interface ChatCompletionResult {\n content: string;\n model: string;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Call Venice chat completions API for private inference.\n * Requires a provisioned API key (run `sherwood venice provision` first).\n */\nexport async function chatCompletion(opts: ChatCompletionOptions): Promise<ChatCompletionResult> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const body: Record<string, unknown> = {\n model: opts.model,\n messages: opts.messages,\n };\n if (opts.temperature !== undefined) body.temperature = opts.temperature;\n if (opts.maxTokens !== undefined) body.max_tokens = opts.maxTokens;\n\n const veniceParams: Record<string, unknown> = {};\n if (opts.enableWebSearch) veniceParams.enable_web_search = \"on\";\n if (opts.disableThinking) veniceParams.disable_thinking = true;\n if (Object.keys(veniceParams).length > 0) body.venice_parameters = veniceParams;\n\n // Retry loop: exponential backoff with jitter on 429/5xx and network errors.\n // Caller-provided timeouts (e.g. Promise.race in the judge) still win — if\n // the outer timeout fires before retries exhaust, the promise rejects normally.\n let lastErr: unknown;\n let res: Response | undefined;\n for (let attempt = 1; attempt <= RETRY_MAX_ATTEMPTS; attempt++) {\n try {\n res = await fetch(`${VENICE_API_BASE}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n signal: AbortSignal.timeout(120_000), // inference can be slow\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const errBody = await res.text();\n throw new VeniceHttpError(res.status, errBody);\n }\n lastErr = undefined;\n break; // success\n } catch (err) {\n lastErr = err;\n if (attempt >= RETRY_MAX_ATTEMPTS || !shouldRetry(err)) {\n throw err;\n }\n const baseDelay = RETRY_BASE_DELAYS_MS[attempt - 1] ?? RETRY_BASE_DELAYS_MS[RETRY_BASE_DELAYS_MS.length - 1];\n const delayMs = jitter(baseDelay);\n const reason = err instanceof VeniceHttpError ? `HTTP ${err.status}` : (err as Error).message || \"network\";\n console.error(chalk.dim(` [venice] retry ${attempt}/${RETRY_MAX_ATTEMPTS} after ${delayMs}ms — ${reason}`));\n await sleep(delayMs);\n }\n }\n\n if (!res || lastErr) {\n // Defensive — the loop either breaks on success or throws on final failure.\n throw lastErr ?? new Error(\"Venice inference failed: no response\");\n }\n\n const data = await res.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Venice returned no choices\");\n }\n\n return {\n content: choice.message?.content ?? \"\",\n model: data.model ?? opts.model,\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n}\n\n/**\n * List available Venice models.\n * Requires a provisioned API key.\n */\nexport async function listModels(): Promise<string[]> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Failed to list Venice models: ${res.status} ${res.statusText}`);\n }\n\n const data = await res.json();\n return (data.data ?? []).map((m: { id: string }) => m.id);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SHERWOOD
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YLYANZMC.js";
|
|
4
4
|
import {
|
|
5
5
|
getAccount,
|
|
6
6
|
getPublicClient,
|
|
7
7
|
waitForReceipt,
|
|
8
8
|
writeContractWithRetry
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-UC5RMCB3.js";
|
|
10
10
|
import {
|
|
11
11
|
getChain
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-RNASYOQT.js";
|
|
13
13
|
import {
|
|
14
|
+
PROTOCOL_CONFIG_ABI,
|
|
15
|
+
SYNDICATE_FACTORY_ABI,
|
|
14
16
|
SYNDICATE_GOVERNOR_ABI
|
|
15
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-BQMOE4FJ.js";
|
|
16
18
|
|
|
17
19
|
// src/lib/governor.ts
|
|
18
20
|
import { parseEventLogs } from "viem";
|
|
@@ -61,125 +63,143 @@ function parseDuration(input) {
|
|
|
61
63
|
throw new Error(`Unknown duration unit: ${match[2]}`);
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
var governorCache = /* @__PURE__ */ new Map();
|
|
67
|
+
async function getGovernorOf(vault) {
|
|
68
|
+
const key = `${getChain().id}:${vault.toLowerCase()}`;
|
|
69
|
+
const cached = governorCache.get(key);
|
|
70
|
+
if (cached) return cached;
|
|
71
|
+
const client = getPublicClient();
|
|
72
|
+
const governor = await client.readContract({
|
|
73
|
+
address: SHERWOOD().FACTORY,
|
|
74
|
+
abi: SYNDICATE_FACTORY_ABI,
|
|
75
|
+
functionName: "governorOf",
|
|
76
|
+
args: [vault]
|
|
77
|
+
});
|
|
78
|
+
if (governor === "0x0000000000000000000000000000000000000000") {
|
|
79
|
+
throw new Error(`No governor registered for vault ${vault} \u2014 is it a factory-created vault?`);
|
|
80
|
+
}
|
|
81
|
+
governorCache.set(key, governor);
|
|
82
|
+
return governor;
|
|
83
|
+
}
|
|
84
|
+
var protocolConfigCache = /* @__PURE__ */ new Map();
|
|
85
|
+
async function getProtocolConfigAddress() {
|
|
86
|
+
const chainId = getChain().id;
|
|
87
|
+
const cached = protocolConfigCache.get(chainId);
|
|
88
|
+
if (cached) return cached;
|
|
89
|
+
const client = getPublicClient();
|
|
90
|
+
const config = await client.readContract({
|
|
91
|
+
address: SHERWOOD().FACTORY,
|
|
92
|
+
abi: SYNDICATE_FACTORY_ABI,
|
|
93
|
+
functionName: "protocolConfig"
|
|
94
|
+
});
|
|
95
|
+
protocolConfigCache.set(chainId, config);
|
|
96
|
+
return config;
|
|
66
97
|
}
|
|
67
|
-
async function getGovernorParams() {
|
|
98
|
+
async function getGovernorParams(vault) {
|
|
68
99
|
const client = getPublicClient();
|
|
69
100
|
const result = await client.readContract({
|
|
70
|
-
address:
|
|
101
|
+
address: await getGovernorOf(vault),
|
|
71
102
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
72
103
|
functionName: "getGovernorParams"
|
|
73
104
|
});
|
|
74
105
|
return result;
|
|
75
106
|
}
|
|
76
|
-
async function getProposal(id) {
|
|
107
|
+
async function getProposal(vault, id) {
|
|
77
108
|
const client = getPublicClient();
|
|
78
109
|
const result = await client.readContract({
|
|
79
|
-
address:
|
|
110
|
+
address: await getGovernorOf(vault),
|
|
80
111
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
81
112
|
functionName: "getProposal",
|
|
82
113
|
args: [id]
|
|
83
114
|
});
|
|
84
115
|
return result;
|
|
85
116
|
}
|
|
86
|
-
async function getProposalState(id) {
|
|
117
|
+
async function getProposalState(vault, id) {
|
|
87
118
|
const client = getPublicClient();
|
|
88
119
|
return client.readContract({
|
|
89
|
-
address:
|
|
120
|
+
address: await getGovernorOf(vault),
|
|
90
121
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
91
122
|
functionName: "getProposalState",
|
|
92
123
|
args: [id]
|
|
93
124
|
});
|
|
94
125
|
}
|
|
95
|
-
async function proposalCount() {
|
|
126
|
+
async function proposalCount(vault) {
|
|
96
127
|
const client = getPublicClient();
|
|
97
128
|
return client.readContract({
|
|
98
|
-
address:
|
|
129
|
+
address: await getGovernorOf(vault),
|
|
99
130
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
100
131
|
functionName: "proposalCount"
|
|
101
132
|
});
|
|
102
133
|
}
|
|
103
|
-
async function getVoteWeight(proposalId, voter) {
|
|
134
|
+
async function getVoteWeight(vault, proposalId, voter) {
|
|
104
135
|
const client = getPublicClient();
|
|
105
136
|
return client.readContract({
|
|
106
|
-
address:
|
|
137
|
+
address: await getGovernorOf(vault),
|
|
107
138
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
108
139
|
functionName: "getVoteWeight",
|
|
109
140
|
args: [proposalId, voter]
|
|
110
141
|
});
|
|
111
142
|
}
|
|
112
|
-
async function hasVoted(proposalId, voter) {
|
|
143
|
+
async function hasVoted(vault, proposalId, voter) {
|
|
113
144
|
const client = getPublicClient();
|
|
114
145
|
return client.readContract({
|
|
115
|
-
address:
|
|
146
|
+
address: await getGovernorOf(vault),
|
|
116
147
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
117
148
|
functionName: "hasVoted",
|
|
118
149
|
args: [proposalId, voter]
|
|
119
150
|
});
|
|
120
151
|
}
|
|
121
|
-
async function getExecuteCalls(proposalId) {
|
|
152
|
+
async function getExecuteCalls(vault, proposalId) {
|
|
122
153
|
const client = getPublicClient();
|
|
123
154
|
const result = await client.readContract({
|
|
124
|
-
address:
|
|
155
|
+
address: await getGovernorOf(vault),
|
|
125
156
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
126
157
|
functionName: "getExecuteCalls",
|
|
127
158
|
args: [proposalId]
|
|
128
159
|
});
|
|
129
160
|
return result.map((c) => ({ target: c.target, data: c.data, value: c.value }));
|
|
130
161
|
}
|
|
131
|
-
async function getSettlementCalls(proposalId) {
|
|
162
|
+
async function getSettlementCalls(vault, proposalId) {
|
|
132
163
|
const client = getPublicClient();
|
|
133
164
|
const result = await client.readContract({
|
|
134
|
-
address:
|
|
165
|
+
address: await getGovernorOf(vault),
|
|
135
166
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
136
167
|
functionName: "getSettlementCalls",
|
|
137
168
|
args: [proposalId]
|
|
138
169
|
});
|
|
139
170
|
return result.map((c) => ({ target: c.target, data: c.data, value: c.value }));
|
|
140
171
|
}
|
|
141
|
-
async function getRegisteredVaults() {
|
|
142
|
-
const client = getPublicClient();
|
|
143
|
-
return client.readContract({
|
|
144
|
-
address: getGovernorAddress(),
|
|
145
|
-
abi: SYNDICATE_GOVERNOR_ABI,
|
|
146
|
-
functionName: "getRegisteredVaults"
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
172
|
async function getActiveProposal(vault) {
|
|
150
173
|
const client = getPublicClient();
|
|
151
174
|
return client.readContract({
|
|
152
|
-
address:
|
|
175
|
+
address: await getGovernorOf(vault),
|
|
153
176
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
154
|
-
functionName: "getActiveProposal"
|
|
155
|
-
args: [vault]
|
|
177
|
+
functionName: "getActiveProposal"
|
|
156
178
|
});
|
|
157
179
|
}
|
|
158
180
|
async function getCooldownEnd(vault) {
|
|
159
181
|
const client = getPublicClient();
|
|
160
182
|
return client.readContract({
|
|
161
|
-
address:
|
|
183
|
+
address: await getGovernorOf(vault),
|
|
162
184
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
163
|
-
functionName: "getCooldownEnd"
|
|
164
|
-
args: [vault]
|
|
185
|
+
functionName: "getCooldownEnd"
|
|
165
186
|
});
|
|
166
187
|
}
|
|
167
|
-
async function
|
|
188
|
+
async function openProposalCount(vault) {
|
|
168
189
|
const client = getPublicClient();
|
|
169
190
|
return client.readContract({
|
|
170
|
-
address:
|
|
191
|
+
address: await getGovernorOf(vault),
|
|
171
192
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
172
|
-
functionName: "
|
|
173
|
-
args: [proposalId]
|
|
193
|
+
functionName: "openProposalCount"
|
|
174
194
|
});
|
|
175
195
|
}
|
|
176
|
-
async function
|
|
196
|
+
async function getCapitalSnapshot(vault, proposalId) {
|
|
177
197
|
const client = getPublicClient();
|
|
178
198
|
return client.readContract({
|
|
179
|
-
address:
|
|
199
|
+
address: await getGovernorOf(vault),
|
|
180
200
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
181
|
-
functionName: "
|
|
182
|
-
args: [
|
|
201
|
+
functionName: "getCapitalSnapshot",
|
|
202
|
+
args: [proposalId]
|
|
183
203
|
});
|
|
184
204
|
}
|
|
185
205
|
function parseProposalIdFromLogs(logs) {
|
|
@@ -194,31 +214,31 @@ function parseProposalIdFromLogs(logs) {
|
|
|
194
214
|
return void 0;
|
|
195
215
|
}
|
|
196
216
|
}
|
|
197
|
-
async function propose(vault, strategy, metadataURI,
|
|
217
|
+
async function propose(vault, strategy, metadataURI, strategyDuration, executeCalls, settlementCalls, coProposers = []) {
|
|
198
218
|
const hash = await writeContractWithRetry({
|
|
199
219
|
account: getAccount(),
|
|
200
220
|
chain: getChain(),
|
|
201
|
-
address:
|
|
221
|
+
address: await getGovernorOf(vault),
|
|
202
222
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
203
223
|
functionName: "propose",
|
|
204
|
-
args: [vault, strategy, metadataURI,
|
|
224
|
+
args: [vault, strategy, metadataURI, strategyDuration, executeCalls, settlementCalls, coProposers]
|
|
205
225
|
});
|
|
206
226
|
const receipt = await waitForReceipt(hash);
|
|
207
227
|
let proposalId = parseProposalIdFromLogs(receipt.logs);
|
|
208
228
|
if (proposalId === void 0) {
|
|
209
229
|
try {
|
|
210
|
-
proposalId = await proposalCount();
|
|
230
|
+
proposalId = await proposalCount(vault);
|
|
211
231
|
} catch {
|
|
212
232
|
proposalId = 0n;
|
|
213
233
|
}
|
|
214
234
|
}
|
|
215
235
|
return { hash: receipt.transactionHash, proposalId };
|
|
216
236
|
}
|
|
217
|
-
async function vote(proposalId, support) {
|
|
237
|
+
async function vote(vault, proposalId, support) {
|
|
218
238
|
const hash = await writeContractWithRetry({
|
|
219
239
|
account: getAccount(),
|
|
220
240
|
chain: getChain(),
|
|
221
|
-
address:
|
|
241
|
+
address: await getGovernorOf(vault),
|
|
222
242
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
223
243
|
functionName: "vote",
|
|
224
244
|
args: [proposalId, support]
|
|
@@ -226,11 +246,11 @@ async function vote(proposalId, support) {
|
|
|
226
246
|
const receipt = await waitForReceipt(hash);
|
|
227
247
|
return receipt.transactionHash;
|
|
228
248
|
}
|
|
229
|
-
async function executeProposal(proposalId) {
|
|
249
|
+
async function executeProposal(vault, proposalId) {
|
|
230
250
|
const hash = await writeContractWithRetry({
|
|
231
251
|
account: getAccount(),
|
|
232
252
|
chain: getChain(),
|
|
233
|
-
address:
|
|
253
|
+
address: await getGovernorOf(vault),
|
|
234
254
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
235
255
|
functionName: "executeProposal",
|
|
236
256
|
args: [proposalId]
|
|
@@ -247,11 +267,11 @@ function detectStrategyAdapter(calls) {
|
|
|
247
267
|
}
|
|
248
268
|
return null;
|
|
249
269
|
}
|
|
250
|
-
async function settleProposal(proposalId) {
|
|
270
|
+
async function settleProposal(vault, proposalId) {
|
|
251
271
|
const hash = await writeContractWithRetry({
|
|
252
272
|
account: getAccount(),
|
|
253
273
|
chain: getChain(),
|
|
254
|
-
address:
|
|
274
|
+
address: await getGovernorOf(vault),
|
|
255
275
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
256
276
|
functionName: "settleProposal",
|
|
257
277
|
args: [proposalId]
|
|
@@ -259,23 +279,23 @@ async function settleProposal(proposalId) {
|
|
|
259
279
|
const receipt = await waitForReceipt(hash);
|
|
260
280
|
return receipt.transactionHash;
|
|
261
281
|
}
|
|
262
|
-
async function emergencySettle(proposalId, calls) {
|
|
282
|
+
async function emergencySettle(vault, proposalId, calls) {
|
|
263
283
|
const hash = await writeContractWithRetry({
|
|
264
284
|
account: getAccount(),
|
|
265
285
|
chain: getChain(),
|
|
266
|
-
address:
|
|
286
|
+
address: await getGovernorOf(vault),
|
|
267
287
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
268
|
-
functionName: "
|
|
288
|
+
functionName: "emergencySettleWithCalls",
|
|
269
289
|
args: [proposalId, calls]
|
|
270
290
|
});
|
|
271
291
|
const receipt = await waitForReceipt(hash);
|
|
272
292
|
return receipt.transactionHash;
|
|
273
293
|
}
|
|
274
|
-
async function cancelProposal(proposalId) {
|
|
294
|
+
async function cancelProposal(vault, proposalId) {
|
|
275
295
|
const hash = await writeContractWithRetry({
|
|
276
296
|
account: getAccount(),
|
|
277
297
|
chain: getChain(),
|
|
278
|
-
address:
|
|
298
|
+
address: await getGovernorOf(vault),
|
|
279
299
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
280
300
|
functionName: "cancelProposal",
|
|
281
301
|
args: [proposalId]
|
|
@@ -283,11 +303,11 @@ async function cancelProposal(proposalId) {
|
|
|
283
303
|
const receipt = await waitForReceipt(hash);
|
|
284
304
|
return receipt.transactionHash;
|
|
285
305
|
}
|
|
286
|
-
async function emergencyCancel(proposalId) {
|
|
306
|
+
async function emergencyCancel(vault, proposalId) {
|
|
287
307
|
const hash = await writeContractWithRetry({
|
|
288
308
|
account: getAccount(),
|
|
289
309
|
chain: getChain(),
|
|
290
|
-
address:
|
|
310
|
+
address: await getGovernorOf(vault),
|
|
291
311
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
292
312
|
functionName: "emergencyCancel",
|
|
293
313
|
args: [proposalId]
|
|
@@ -295,83 +315,41 @@ async function emergencyCancel(proposalId) {
|
|
|
295
315
|
const receipt = await waitForReceipt(hash);
|
|
296
316
|
return receipt.transactionHash;
|
|
297
317
|
}
|
|
298
|
-
async function
|
|
318
|
+
async function setGovernorParam(vault, functionName, value) {
|
|
299
319
|
const hash = await writeContractWithRetry({
|
|
300
320
|
account: getAccount(),
|
|
301
321
|
chain: getChain(),
|
|
302
|
-
address:
|
|
322
|
+
address: await getGovernorOf(vault),
|
|
303
323
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
304
|
-
functionName
|
|
305
|
-
args: [
|
|
324
|
+
functionName,
|
|
325
|
+
args: [value]
|
|
306
326
|
});
|
|
307
327
|
const receipt = await waitForReceipt(hash);
|
|
308
328
|
return receipt.transactionHash;
|
|
309
329
|
}
|
|
310
|
-
async function
|
|
311
|
-
|
|
312
|
-
account: getAccount(),
|
|
313
|
-
chain: getChain(),
|
|
314
|
-
address: getGovernorAddress(),
|
|
315
|
-
abi: SYNDICATE_GOVERNOR_ABI,
|
|
316
|
-
functionName: "setExecutionWindow",
|
|
317
|
-
args: [seconds]
|
|
318
|
-
});
|
|
319
|
-
const receipt = await waitForReceipt(hash);
|
|
320
|
-
return receipt.transactionHash;
|
|
330
|
+
async function setVotingPeriod(vault, seconds) {
|
|
331
|
+
return setGovernorParam(vault, "setVotingPeriod", seconds);
|
|
321
332
|
}
|
|
322
|
-
async function
|
|
323
|
-
|
|
324
|
-
account: getAccount(),
|
|
325
|
-
chain: getChain(),
|
|
326
|
-
address: getGovernorAddress(),
|
|
327
|
-
abi: SYNDICATE_GOVERNOR_ABI,
|
|
328
|
-
functionName: "setVetoThresholdBps",
|
|
329
|
-
args: [bps]
|
|
330
|
-
});
|
|
331
|
-
const receipt = await waitForReceipt(hash);
|
|
332
|
-
return receipt.transactionHash;
|
|
333
|
+
async function setExecutionWindow(vault, seconds) {
|
|
334
|
+
return setGovernorParam(vault, "setExecutionWindow", seconds);
|
|
333
335
|
}
|
|
334
|
-
async function
|
|
335
|
-
|
|
336
|
-
account: getAccount(),
|
|
337
|
-
chain: getChain(),
|
|
338
|
-
address: getGovernorAddress(),
|
|
339
|
-
abi: SYNDICATE_GOVERNOR_ABI,
|
|
340
|
-
functionName: "setMaxPerformanceFeeBps",
|
|
341
|
-
args: [bps]
|
|
342
|
-
});
|
|
343
|
-
const receipt = await waitForReceipt(hash);
|
|
344
|
-
return receipt.transactionHash;
|
|
336
|
+
async function setVetoThresholdBps(vault, bps) {
|
|
337
|
+
return setGovernorParam(vault, "setVetoThresholdBps", bps);
|
|
345
338
|
}
|
|
346
|
-
async function
|
|
347
|
-
|
|
348
|
-
account: getAccount(),
|
|
349
|
-
chain: getChain(),
|
|
350
|
-
address: getGovernorAddress(),
|
|
351
|
-
abi: SYNDICATE_GOVERNOR_ABI,
|
|
352
|
-
functionName: "setMaxStrategyDuration",
|
|
353
|
-
args: [seconds]
|
|
354
|
-
});
|
|
355
|
-
const receipt = await waitForReceipt(hash);
|
|
356
|
-
return receipt.transactionHash;
|
|
339
|
+
async function setMaxPerformanceFeeBps(vault, bps) {
|
|
340
|
+
return setGovernorParam(vault, "setMaxPerformanceFeeBps", bps);
|
|
357
341
|
}
|
|
358
|
-
async function
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
abi: SYNDICATE_GOVERNOR_ABI,
|
|
364
|
-
functionName: "setCooldownPeriod",
|
|
365
|
-
args: [seconds]
|
|
366
|
-
});
|
|
367
|
-
const receipt = await waitForReceipt(hash);
|
|
368
|
-
return receipt.transactionHash;
|
|
342
|
+
async function setMaxStrategyDuration(vault, seconds) {
|
|
343
|
+
return setGovernorParam(vault, "setMaxStrategyDuration", seconds);
|
|
344
|
+
}
|
|
345
|
+
async function setCooldownPeriod(vault, seconds) {
|
|
346
|
+
return setGovernorParam(vault, "setCooldownPeriod", seconds);
|
|
369
347
|
}
|
|
370
|
-
async function vetoProposal(proposalId) {
|
|
348
|
+
async function vetoProposal(vault, proposalId) {
|
|
371
349
|
const hash = await writeContractWithRetry({
|
|
372
350
|
account: getAccount(),
|
|
373
351
|
chain: getChain(),
|
|
374
|
-
address:
|
|
352
|
+
address: await getGovernorOf(vault),
|
|
375
353
|
abi: SYNDICATE_GOVERNOR_ABI,
|
|
376
354
|
functionName: "vetoProposal",
|
|
377
355
|
args: [proposalId]
|
|
@@ -383,8 +361,8 @@ async function setProtocolFeeBps(bps) {
|
|
|
383
361
|
const hash = await writeContractWithRetry({
|
|
384
362
|
account: getAccount(),
|
|
385
363
|
chain: getChain(),
|
|
386
|
-
address:
|
|
387
|
-
abi:
|
|
364
|
+
address: await getProtocolConfigAddress(),
|
|
365
|
+
abi: PROTOCOL_CONFIG_ABI,
|
|
388
366
|
functionName: "setProtocolFeeBps",
|
|
389
367
|
args: [bps]
|
|
390
368
|
});
|
|
@@ -397,7 +375,8 @@ export {
|
|
|
397
375
|
PROPOSAL_STATE,
|
|
398
376
|
VOTE_TYPE,
|
|
399
377
|
parseDuration,
|
|
400
|
-
|
|
378
|
+
getGovernorOf,
|
|
379
|
+
getProtocolConfigAddress,
|
|
401
380
|
getGovernorParams,
|
|
402
381
|
getProposal,
|
|
403
382
|
getProposalState,
|
|
@@ -406,11 +385,10 @@ export {
|
|
|
406
385
|
hasVoted,
|
|
407
386
|
getExecuteCalls,
|
|
408
387
|
getSettlementCalls,
|
|
409
|
-
getRegisteredVaults,
|
|
410
388
|
getActiveProposal,
|
|
411
389
|
getCooldownEnd,
|
|
390
|
+
openProposalCount,
|
|
412
391
|
getCapitalSnapshot,
|
|
413
|
-
isRegisteredVault,
|
|
414
392
|
parseProposalIdFromLogs,
|
|
415
393
|
propose,
|
|
416
394
|
vote,
|
|
@@ -429,4 +407,4 @@ export {
|
|
|
429
407
|
vetoProposal,
|
|
430
408
|
setProtocolFeeBps
|
|
431
409
|
};
|
|
432
|
-
//# sourceMappingURL=chunk-
|
|
410
|
+
//# sourceMappingURL=chunk-PDUGL4EY.js.map
|