@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.
Files changed (93) hide show
  1. package/dist/{abis-4HWN2E3H.js → abis-KP7M4IPM.js} +4 -2
  2. package/dist/addresses-HJDYFLWZ.js +45 -0
  3. package/dist/{agent-AETROOEW.js → agent-6OJKQVEG.js} +10 -10
  4. package/dist/{agent-AETROOEW.js.map → agent-6OJKQVEG.js.map} +1 -1
  5. package/dist/{chat-JSSTSE4K.js → chat-2DKD3QPA.js} +37 -36
  6. package/dist/chat-2DKD3QPA.js.map +1 -0
  7. package/dist/{chunk-O4G3SBCI.js → chunk-3YUMQGJD.js} +109 -129
  8. package/dist/chunk-3YUMQGJD.js.map +1 -0
  9. package/dist/{chunk-W2ZUPR3W.js → chunk-5DWB5Y7G.js} +9 -9
  10. package/dist/chunk-5DWB5Y7G.js.map +1 -0
  11. package/dist/{chunk-IL43IMOC.js → chunk-6SRIVGAV.js} +23 -18
  12. package/dist/chunk-6SRIVGAV.js.map +1 -0
  13. package/dist/{chunk-UCQEEF3Z.js → chunk-ASF2WTSW.js} +6 -6
  14. package/dist/chunk-ASF2WTSW.js.map +1 -0
  15. package/dist/{chunk-YZHZSBES.js → chunk-BQMOE4FJ.js} +144 -37
  16. package/dist/chunk-BQMOE4FJ.js.map +1 -0
  17. package/dist/{chunk-2W4KGGPU.js → chunk-GSC7PVEO.js} +27 -27
  18. package/dist/chunk-GSC7PVEO.js.map +1 -0
  19. package/dist/chunk-GT3KCKF6.js +124 -0
  20. package/dist/chunk-GT3KCKF6.js.map +1 -0
  21. package/dist/{chunk-RO26TXXE.js → chunk-ITZT5HD4.js} +2 -2
  22. package/dist/{chunk-UBAX22KA.js → chunk-OZLX666C.js} +4 -4
  23. package/dist/chunk-OZLX666C.js.map +1 -0
  24. package/dist/{chunk-A6TOJEUD.js → chunk-PDUGL4EY.js} +106 -128
  25. package/dist/chunk-PDUGL4EY.js.map +1 -0
  26. package/dist/chunk-RNASYOQT.js +111 -0
  27. package/dist/chunk-RNASYOQT.js.map +1 -0
  28. package/dist/{chunk-VYF2TXPX.js → chunk-SVSJNZ5D.js} +6 -6
  29. package/dist/{chunk-YJSCIQUZ.js → chunk-UC5RMCB3.js} +6 -6
  30. package/dist/chunk-UC5RMCB3.js.map +1 -0
  31. package/dist/chunk-YLYANZMC.js +308 -0
  32. package/dist/chunk-YLYANZMC.js.map +1 -0
  33. package/dist/{chunk-RHRLYVKM.js → chunk-ZYXFKVYF.js} +25 -12
  34. package/dist/chunk-ZYXFKVYF.js.map +1 -0
  35. package/dist/{client-KBBFAMEI.js → client-K4JCNPVV.js} +4 -4
  36. package/dist/{config-REASKDIK.js → config-FAQO37S7.js} +10 -10
  37. package/dist/{cron-EOULYO3R.js → cron-QMLRWDJG.js} +19 -17
  38. package/dist/cron-QMLRWDJG.js.map +1 -0
  39. package/dist/{eas-K4ZBACYN.js → eas-ZXGUNYC5.js} +7 -7
  40. package/dist/{governor-2CDSMSG7.js → governor-CV5PITE3.js} +13 -13
  41. package/dist/index.js +1964 -1219
  42. package/dist/index.js.map +1 -1
  43. package/dist/{ipfs-FAYWUCS2.js → ipfs-VGWTUORE.js} +2 -2
  44. package/dist/{network-3ZU7UBDU.js → network-DHWEYXP2.js} +7 -7
  45. package/dist/{price-LCTECRQP.js → price-GOX6P4NT.js} +6 -6
  46. package/dist/{research-FUQOQWKK.js → research-6D7NNJX4.js} +22 -22
  47. package/dist/research-6D7NNJX4.js.map +1 -0
  48. package/dist/research-EFNVHU7G.js +14 -0
  49. package/dist/{session-FJB2RV2X.js → session-LDLW66K3.js} +28 -28
  50. package/dist/session-LDLW66K3.js.map +1 -0
  51. package/dist/{session-XAW5UIXP.js → session-XBQY7SBJ.js} +2 -2
  52. package/dist/{trade-U7H5IFH6.js → trade-7NNZXP5B.js} +34 -34
  53. package/dist/trade-7NNZXP5B.js.map +1 -0
  54. package/dist/vault-SIL4QL5U.js +54 -0
  55. package/dist/vault-SIL4QL5U.js.map +1 -0
  56. package/dist/{xmtp-6NJ4PW6L.js → xmtp-QNOVDLXX.js} +13 -12
  57. package/dist/xmtp-QNOVDLXX.js.map +1 -0
  58. package/package.json +4 -3
  59. package/dist/addresses-J2LMGUCT.js +0 -35
  60. package/dist/chat-JSSTSE4K.js.map +0 -1
  61. package/dist/chunk-2LRC7I33.js +0 -186
  62. package/dist/chunk-2LRC7I33.js.map +0 -1
  63. package/dist/chunk-2W4KGGPU.js.map +0 -1
  64. package/dist/chunk-A6TOJEUD.js.map +0 -1
  65. package/dist/chunk-GWMTAW6A.js +0 -494
  66. package/dist/chunk-GWMTAW6A.js.map +0 -1
  67. package/dist/chunk-IL43IMOC.js.map +0 -1
  68. package/dist/chunk-O4G3SBCI.js.map +0 -1
  69. package/dist/chunk-RHRLYVKM.js.map +0 -1
  70. package/dist/chunk-UBAX22KA.js.map +0 -1
  71. package/dist/chunk-UCQEEF3Z.js.map +0 -1
  72. package/dist/chunk-W2ZUPR3W.js.map +0 -1
  73. package/dist/chunk-YJSCIQUZ.js.map +0 -1
  74. package/dist/chunk-YZHZSBES.js.map +0 -1
  75. package/dist/cron-EOULYO3R.js.map +0 -1
  76. package/dist/research-FUQOQWKK.js.map +0 -1
  77. package/dist/research-XEXTHDT3.js +0 -14
  78. package/dist/session-FJB2RV2X.js.map +0 -1
  79. package/dist/trade-U7H5IFH6.js.map +0 -1
  80. package/dist/xmtp-6NJ4PW6L.js.map +0 -1
  81. /package/dist/{abis-4HWN2E3H.js.map → abis-KP7M4IPM.js.map} +0 -0
  82. /package/dist/{addresses-J2LMGUCT.js.map → addresses-HJDYFLWZ.js.map} +0 -0
  83. /package/dist/{chunk-RO26TXXE.js.map → chunk-ITZT5HD4.js.map} +0 -0
  84. /package/dist/{chunk-VYF2TXPX.js.map → chunk-SVSJNZ5D.js.map} +0 -0
  85. /package/dist/{client-KBBFAMEI.js.map → client-K4JCNPVV.js.map} +0 -0
  86. /package/dist/{config-REASKDIK.js.map → config-FAQO37S7.js.map} +0 -0
  87. /package/dist/{eas-K4ZBACYN.js.map → eas-ZXGUNYC5.js.map} +0 -0
  88. /package/dist/{governor-2CDSMSG7.js.map → governor-CV5PITE3.js.map} +0 -0
  89. /package/dist/{ipfs-FAYWUCS2.js.map → ipfs-VGWTUORE.js.map} +0 -0
  90. /package/dist/{network-3ZU7UBDU.js.map → network-DHWEYXP2.js.map} +0 -0
  91. /package/dist/{price-LCTECRQP.js.map → price-GOX6P4NT.js.map} +0 -0
  92. /package/dist/{research-XEXTHDT3.js.map → research-EFNVHU7G.js.map} +0 -0
  93. /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-YJSCIQUZ.js";
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-RO26TXXE.js.map
638
+ //# sourceMappingURL=chunk-ITZT5HD4.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  getAccount
3
- } from "./chunk-YJSCIQUZ.js";
3
+ } from "./chunk-UC5RMCB3.js";
4
4
  import {
5
5
  getVeniceApiKey,
6
6
  setVeniceApiKey
7
- } from "./chunk-2W4KGGPU.js";
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 syndicate agent"
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-UBAX22KA.js.map
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-GWMTAW6A.js";
3
+ } from "./chunk-YLYANZMC.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-YJSCIQUZ.js";
9
+ } from "./chunk-UC5RMCB3.js";
10
10
  import {
11
11
  getChain
12
- } from "./chunk-2LRC7I33.js";
12
+ } from "./chunk-RNASYOQT.js";
13
13
  import {
14
+ PROTOCOL_CONFIG_ABI,
15
+ SYNDICATE_FACTORY_ABI,
14
16
  SYNDICATE_GOVERNOR_ABI
15
- } from "./chunk-YZHZSBES.js";
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
- function getGovernorAddress() {
65
- return SHERWOOD().GOVERNOR;
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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 getCapitalSnapshot(proposalId) {
188
+ async function openProposalCount(vault) {
168
189
  const client = getPublicClient();
169
190
  return client.readContract({
170
- address: getGovernorAddress(),
191
+ address: await getGovernorOf(vault),
171
192
  abi: SYNDICATE_GOVERNOR_ABI,
172
- functionName: "getCapitalSnapshot",
173
- args: [proposalId]
193
+ functionName: "openProposalCount"
174
194
  });
175
195
  }
176
- async function isRegisteredVault(vault) {
196
+ async function getCapitalSnapshot(vault, proposalId) {
177
197
  const client = getPublicClient();
178
198
  return client.readContract({
179
- address: getGovernorAddress(),
199
+ address: await getGovernorOf(vault),
180
200
  abi: SYNDICATE_GOVERNOR_ABI,
181
- functionName: "isRegisteredVault",
182
- args: [vault]
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, performanceFeeBps, strategyDuration, executeCalls, settlementCalls, coProposers = []) {
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: getGovernorAddress(),
221
+ address: await getGovernorOf(vault),
202
222
  abi: SYNDICATE_GOVERNOR_ABI,
203
223
  functionName: "propose",
204
- args: [vault, strategy, metadataURI, performanceFeeBps, strategyDuration, executeCalls, settlementCalls, coProposers]
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
286
+ address: await getGovernorOf(vault),
267
287
  abi: SYNDICATE_GOVERNOR_ABI,
268
- functionName: "emergencySettle",
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: getGovernorAddress(),
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: getGovernorAddress(),
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 setVotingPeriod(seconds) {
318
+ async function setGovernorParam(vault, functionName, value) {
299
319
  const hash = await writeContractWithRetry({
300
320
  account: getAccount(),
301
321
  chain: getChain(),
302
- address: getGovernorAddress(),
322
+ address: await getGovernorOf(vault),
303
323
  abi: SYNDICATE_GOVERNOR_ABI,
304
- functionName: "setVotingPeriod",
305
- args: [seconds]
324
+ functionName,
325
+ args: [value]
306
326
  });
307
327
  const receipt = await waitForReceipt(hash);
308
328
  return receipt.transactionHash;
309
329
  }
310
- async function setExecutionWindow(seconds) {
311
- const hash = await writeContractWithRetry({
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 setVetoThresholdBps(bps) {
323
- const hash = await writeContractWithRetry({
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 setMaxPerformanceFeeBps(bps) {
335
- const hash = await writeContractWithRetry({
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 setMaxStrategyDuration(seconds) {
347
- const hash = await writeContractWithRetry({
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 setCooldownPeriod(seconds) {
359
- const hash = await writeContractWithRetry({
360
- account: getAccount(),
361
- chain: getChain(),
362
- address: getGovernorAddress(),
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: getGovernorAddress(),
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: getGovernorAddress(),
387
- abi: SYNDICATE_GOVERNOR_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
- getGovernorAddress,
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-A6TOJEUD.js.map
410
+ //# sourceMappingURL=chunk-PDUGL4EY.js.map