@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
package/dist/chunk-GWMTAW6A.js
DELETED
|
@@ -1,494 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getNetwork
|
|
3
|
-
} from "./chunk-2LRC7I33.js";
|
|
4
|
-
|
|
5
|
-
// src/lib/addresses.ts
|
|
6
|
-
var ZERO = "0x0000000000000000000000000000000000000000";
|
|
7
|
-
var ZERO_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
8
|
-
var BASE_TOKENS = {
|
|
9
|
-
USDC: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
10
|
-
WETH: "0x4200000000000000000000000000000000000006",
|
|
11
|
-
cbETH: "0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22",
|
|
12
|
-
wstETH: "0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452",
|
|
13
|
-
cbBTC: "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf",
|
|
14
|
-
DAI: "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb",
|
|
15
|
-
AERO: "0x940181a94A35A4569E4529A3CDfB74e38FD98631",
|
|
16
|
-
AAVE: "0x63706e401c06ac8513145b7687A14804d17f814b"
|
|
17
|
-
};
|
|
18
|
-
var BASE_MOONWELL = {
|
|
19
|
-
COMPTROLLER: "0xfBb21d0380beE3312B33c4353c8936a0F13EF26C",
|
|
20
|
-
mUSDC: "0xEdc817A28E8B93B03976FBd4a3dDBc9f7D176c22",
|
|
21
|
-
mWETH: "0x628ff693426583D9a7FB391E54366292F509D457",
|
|
22
|
-
mCbETH: "0x3bf93770f2d4a794c3d9EBEfBAeBAE2a8f09A5E5",
|
|
23
|
-
mWstETH: "0x627Fe393Bc6EdDA28e99AE648fD6fF362514304b",
|
|
24
|
-
mCbBTC: "0xF877ACaFA28c19b96727966690b2f44d35aD5976",
|
|
25
|
-
mDAI: "0x73b06D8d18De422E269645eaCe15400DE7462417",
|
|
26
|
-
mAERO: "0x73902f619CEB9B31FD8EFecf435CbDf89E369Ba6"
|
|
27
|
-
};
|
|
28
|
-
var BASE_UNISWAP = {
|
|
29
|
-
SWAP_ROUTER: "0x2626664c2603336E57B271c5C0b26F421741e481",
|
|
30
|
-
QUOTER_V2: "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a",
|
|
31
|
-
// Redeployed adapter with the QuoterV2 struct-ABI fix. The prior
|
|
32
|
-
// 0x679400a781A66d801C20DfD9E0020704e21e9d54 calls QuoterV1's
|
|
33
|
-
// positional signature against the deployed QuoterV2, which reverts
|
|
34
|
-
// on every quote — strategies built against it execute-fail with
|
|
35
|
-
// QuoteUnavailable. New clones (post this CLI version) point at the
|
|
36
|
-
// fixed adapter; pre-existing clones (e.g. the broken proposals
|
|
37
|
-
// 4 / 5 on the original Base test vault) stay bound to the old one
|
|
38
|
-
// via their stored InitParams and remain unrecoverable — cancel
|
|
39
|
-
// those and re-propose.
|
|
40
|
-
SWAP_ADAPTER: "0x2e8aB422Db9127F1a70d8C38A15903f22B51DA97"
|
|
41
|
-
};
|
|
42
|
-
var BASE_INFRA = {
|
|
43
|
-
MULTICALL3: "0xcA11bde05977b3631167028862bE2a173976CA11"
|
|
44
|
-
};
|
|
45
|
-
var BASE_SEPOLIA_TOKENS = {
|
|
46
|
-
USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
47
|
-
// Circle test USDC
|
|
48
|
-
WETH: "0x4200000000000000000000000000000000000006",
|
|
49
|
-
// Canonical bridged WETH
|
|
50
|
-
cbETH: ZERO,
|
|
51
|
-
wstETH: ZERO,
|
|
52
|
-
cbBTC: ZERO,
|
|
53
|
-
DAI: ZERO,
|
|
54
|
-
AERO: ZERO,
|
|
55
|
-
AAVE: ZERO
|
|
56
|
-
};
|
|
57
|
-
var BASE_SEPOLIA_MOONWELL = {
|
|
58
|
-
COMPTROLLER: ZERO,
|
|
59
|
-
mUSDC: ZERO,
|
|
60
|
-
mWETH: ZERO,
|
|
61
|
-
mCbETH: ZERO,
|
|
62
|
-
mWstETH: ZERO,
|
|
63
|
-
mCbBTC: ZERO,
|
|
64
|
-
mDAI: ZERO,
|
|
65
|
-
mAERO: ZERO
|
|
66
|
-
};
|
|
67
|
-
var BASE_SEPOLIA_UNISWAP = {
|
|
68
|
-
SWAP_ROUTER: "0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4",
|
|
69
|
-
// Uniswap V3 SwapRouter02
|
|
70
|
-
QUOTER_V2: "0xC5290058841028F1614F3A6F0F5816cAd0df5E27",
|
|
71
|
-
// Uniswap V3 QuoterV2
|
|
72
|
-
SWAP_ADAPTER: ZERO
|
|
73
|
-
};
|
|
74
|
-
var BASE_SEPOLIA_INFRA = {
|
|
75
|
-
MULTICALL3: "0xcA11bde05977b3631167028862bE2a173976CA11"
|
|
76
|
-
// Deterministic, same everywhere
|
|
77
|
-
};
|
|
78
|
-
var ROBINHOOD_TESTNET_TOKENS = {
|
|
79
|
-
USDC: ZERO,
|
|
80
|
-
WETH: "0x7943e237c7F95DA44E0301572D358911207852Fa",
|
|
81
|
-
cbETH: ZERO,
|
|
82
|
-
wstETH: ZERO,
|
|
83
|
-
cbBTC: ZERO,
|
|
84
|
-
DAI: ZERO,
|
|
85
|
-
AERO: ZERO,
|
|
86
|
-
AAVE: ZERO,
|
|
87
|
-
TSLA: "0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E",
|
|
88
|
-
AMZN: "0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02",
|
|
89
|
-
PLTR: "0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0",
|
|
90
|
-
NFLX: "0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93",
|
|
91
|
-
AMD: "0x71178BAc73cBeb415514eB542a8995b82669778d"
|
|
92
|
-
};
|
|
93
|
-
var ROBINHOOD_TESTNET_MOONWELL = {
|
|
94
|
-
COMPTROLLER: ZERO,
|
|
95
|
-
mUSDC: ZERO,
|
|
96
|
-
mWETH: ZERO,
|
|
97
|
-
mCbETH: ZERO,
|
|
98
|
-
mWstETH: ZERO,
|
|
99
|
-
mCbBTC: ZERO,
|
|
100
|
-
mDAI: ZERO,
|
|
101
|
-
mAERO: ZERO
|
|
102
|
-
};
|
|
103
|
-
var ROBINHOOD_TESTNET_UNISWAP = {
|
|
104
|
-
SWAP_ROUTER: ZERO,
|
|
105
|
-
QUOTER_V2: ZERO,
|
|
106
|
-
SWAP_ADAPTER: ZERO
|
|
107
|
-
};
|
|
108
|
-
var BASE_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
|
|
109
|
-
var BASE_SEPOLIA_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
|
|
110
|
-
var ROBINHOOD_TESTNET_SYNTHRA = {
|
|
111
|
-
ROUTER: "0x3Ce954107b1A675826B33bF23060Dd655e3758fE",
|
|
112
|
-
QUOTER: "0x231606c321A99DE81e28fE48B07a93F1ba49e713",
|
|
113
|
-
FACTORY: "0x911b4000D3422F482F4062a913885f7b035382Df"
|
|
114
|
-
};
|
|
115
|
-
var BASE_CHAINLINK = {
|
|
116
|
-
VERIFIER_PROXY: "0xDE1A28D87Afd0f546505B28AB50410A5c3a7387a",
|
|
117
|
-
// WSTETH/ETH AggregatorV3 feed on Base (heartbeat 24h, 18 decimals).
|
|
118
|
-
// Used by WstETHMoonwellStrategy._positionValue for live NAV.
|
|
119
|
-
WSTETH_ETH_FEED: "0x43a5C292A453A3bF3606fa856197f09D7B74251a"
|
|
120
|
-
};
|
|
121
|
-
var BASE_SEPOLIA_CHAINLINK = { VERIFIER_PROXY: ZERO, WSTETH_ETH_FEED: ZERO };
|
|
122
|
-
var ROBINHOOD_TESTNET_CHAINLINK = {
|
|
123
|
-
VERIFIER_PROXY: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64",
|
|
124
|
-
WSTETH_ETH_FEED: ZERO
|
|
125
|
-
};
|
|
126
|
-
var ROBINHOOD_TESTNET_INFRA = {
|
|
127
|
-
MULTICALL3: "0xcA11bde05977b3631167028862bE2a173976CA11"
|
|
128
|
-
// Deterministic, same everywhere
|
|
129
|
-
};
|
|
130
|
-
var HYPEREVM_TOKENS = {
|
|
131
|
-
USDC: "0xb88339CB7199b77E23DB6E890353E22632Ba630f",
|
|
132
|
-
WETH: ZERO,
|
|
133
|
-
cbETH: ZERO,
|
|
134
|
-
wstETH: ZERO,
|
|
135
|
-
cbBTC: ZERO,
|
|
136
|
-
DAI: ZERO,
|
|
137
|
-
AERO: ZERO,
|
|
138
|
-
AAVE: ZERO
|
|
139
|
-
};
|
|
140
|
-
var HYPEREVM_TESTNET_TOKENS = {
|
|
141
|
-
USDC: ZERO,
|
|
142
|
-
WETH: ZERO,
|
|
143
|
-
cbETH: ZERO,
|
|
144
|
-
wstETH: ZERO,
|
|
145
|
-
cbBTC: ZERO,
|
|
146
|
-
DAI: ZERO,
|
|
147
|
-
AERO: ZERO,
|
|
148
|
-
AAVE: ZERO
|
|
149
|
-
};
|
|
150
|
-
var HYPEREVM_MOONWELL = {
|
|
151
|
-
COMPTROLLER: ZERO,
|
|
152
|
-
mUSDC: ZERO,
|
|
153
|
-
mWETH: ZERO,
|
|
154
|
-
mCbETH: ZERO,
|
|
155
|
-
mWstETH: ZERO,
|
|
156
|
-
mCbBTC: ZERO,
|
|
157
|
-
mDAI: ZERO,
|
|
158
|
-
mAERO: ZERO
|
|
159
|
-
};
|
|
160
|
-
var HYPEREVM_UNISWAP = { SWAP_ROUTER: ZERO, QUOTER_V2: ZERO, SWAP_ADAPTER: ZERO };
|
|
161
|
-
var HYPEREVM_INFRA = {
|
|
162
|
-
MULTICALL3: "0xcA11bde05977b3631167028862bE2a173976CA11"
|
|
163
|
-
};
|
|
164
|
-
var BASE_ENS = {
|
|
165
|
-
L2_REGISTRAR: "0x866996c808E6244216a3d0df15464FCF5d495394",
|
|
166
|
-
L2_REGISTRY: "0x7a019ce699e27b0ad1e5b51344a58116b9f3b9b1"
|
|
167
|
-
};
|
|
168
|
-
var BASE_SEPOLIA_ENS = {
|
|
169
|
-
L2_REGISTRAR: "0x1fCbe9dFC25e3fa3F7C55b26c7992684A4758b47",
|
|
170
|
-
L2_REGISTRY: "0x06eb7b85b59bc3e50fe4837be776cdd26de602cf"
|
|
171
|
-
};
|
|
172
|
-
var ROBINHOOD_TESTNET_ENS = {
|
|
173
|
-
L2_REGISTRAR: ZERO,
|
|
174
|
-
L2_REGISTRY: ZERO
|
|
175
|
-
};
|
|
176
|
-
var HYPEREVM_ENS = { L2_REGISTRAR: ZERO, L2_REGISTRY: ZERO };
|
|
177
|
-
var BASE_AGENT_REGISTRY = {
|
|
178
|
-
IDENTITY_REGISTRY: "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
|
|
179
|
-
REPUTATION_REGISTRY: "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63"
|
|
180
|
-
};
|
|
181
|
-
var BASE_SEPOLIA_AGENT_REGISTRY = {
|
|
182
|
-
IDENTITY_REGISTRY: "0x8004A818BFB912233c491871b3d84c89A494BD9e",
|
|
183
|
-
REPUTATION_REGISTRY: "0x8004B663056A597Dffe9eCcC1965A193B7388713"
|
|
184
|
-
};
|
|
185
|
-
var ROBINHOOD_TESTNET_AGENT_REGISTRY = {
|
|
186
|
-
IDENTITY_REGISTRY: ZERO,
|
|
187
|
-
REPUTATION_REGISTRY: ZERO
|
|
188
|
-
};
|
|
189
|
-
var HYPEREVM_AGENT_REGISTRY = { IDENTITY_REGISTRY: ZERO, REPUTATION_REGISTRY: ZERO };
|
|
190
|
-
var BASE_SHERWOOD = {
|
|
191
|
-
FACTORY: "0xAC74EC56858d7F1f7618c8e77F65Fc26aDf33c82",
|
|
192
|
-
GOVERNOR: "0x9Fd3c87B34F254e3c5652A0394B9780c2F05d367",
|
|
193
|
-
GUARDIAN_REGISTRY: "0x49E4163b5e4b23F8f3d469Cf6fa197FB6b06A26E",
|
|
194
|
-
WOOD_TOKEN: ZERO,
|
|
195
|
-
// Merkl mainnet distributor — Angle Labs:
|
|
196
|
-
// https://docs.merkl.xyz/merkl-for-providers/merkl-technical-documentation/addresses
|
|
197
|
-
MERKL_DISTRIBUTOR: "0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae"
|
|
198
|
-
};
|
|
199
|
-
var BASE_SEPOLIA_SHERWOOD = {
|
|
200
|
-
FACTORY: "0x121AaC2B96Ec365e457fcCc1C2ED5a6142064069",
|
|
201
|
-
GOVERNOR: "0xE5ecf2B06E3f3e298B632C0cf6575f9d9422F55E",
|
|
202
|
-
GUARDIAN_REGISTRY: ZERO,
|
|
203
|
-
WOOD_TOKEN: ZERO,
|
|
204
|
-
MERKL_DISTRIBUTOR: ZERO
|
|
205
|
-
};
|
|
206
|
-
var ROBINHOOD_TESTNET_SHERWOOD = {
|
|
207
|
-
FACTORY: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
|
|
208
|
-
GOVERNOR: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C",
|
|
209
|
-
GUARDIAN_REGISTRY: ZERO,
|
|
210
|
-
WOOD_TOKEN: ZERO,
|
|
211
|
-
MERKL_DISTRIBUTOR: ZERO
|
|
212
|
-
};
|
|
213
|
-
var HYPEREVM_SHERWOOD = {
|
|
214
|
-
FACTORY: "0xd05Ae0E8bcf13075C29817c805d6Cc14F214393a",
|
|
215
|
-
GOVERNOR: "0x67AD3D5F3d127Ef923Fd6f67b178633c408D3fd3",
|
|
216
|
-
GUARDIAN_REGISTRY: "0x8b5710EB4e2fA639F364Dcc3F3B30c8f12F460b9",
|
|
217
|
-
WOOD_TOKEN: ZERO,
|
|
218
|
-
MERKL_DISTRIBUTOR: ZERO
|
|
219
|
-
};
|
|
220
|
-
var BASE_VENICE = {
|
|
221
|
-
VVV: "0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf",
|
|
222
|
-
STAKING: "0x321b7ff75154472b18edb199033ff4d116f340ff",
|
|
223
|
-
// also the sVVV ERC-20
|
|
224
|
-
DIEM: "0xF4d97F2da56e8c3098f3a8D538DB630A2606a024"
|
|
225
|
-
};
|
|
226
|
-
var BASE_SEPOLIA_VENICE = {
|
|
227
|
-
VVV: ZERO,
|
|
228
|
-
STAKING: ZERO,
|
|
229
|
-
DIEM: ZERO
|
|
230
|
-
};
|
|
231
|
-
var ROBINHOOD_TESTNET_VENICE = {
|
|
232
|
-
VVV: ZERO,
|
|
233
|
-
STAKING: ZERO,
|
|
234
|
-
DIEM: ZERO
|
|
235
|
-
};
|
|
236
|
-
var HYPEREVM_VENICE = { VVV: ZERO, STAKING: ZERO, DIEM: ZERO };
|
|
237
|
-
var BASE_AERODROME = {
|
|
238
|
-
ROUTER: "0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43",
|
|
239
|
-
FACTORY: "0x420DD381b31aEf6683db6B902084cB0FFECe40Da"
|
|
240
|
-
};
|
|
241
|
-
var BASE_SEPOLIA_AERODROME = {
|
|
242
|
-
ROUTER: ZERO,
|
|
243
|
-
FACTORY: ZERO
|
|
244
|
-
};
|
|
245
|
-
var ROBINHOOD_TESTNET_AERODROME = {
|
|
246
|
-
ROUTER: ZERO,
|
|
247
|
-
FACTORY: ZERO
|
|
248
|
-
};
|
|
249
|
-
var HYPEREVM_AERODROME = { ROUTER: ZERO, FACTORY: ZERO };
|
|
250
|
-
var BASE_STRATEGY_TEMPLATES = {
|
|
251
|
-
MOONWELL_SUPPLY: "0xb9Cd6d6720fc224508A07f0e43254A3cD65770E0",
|
|
252
|
-
AERODROME_LP: "0x6fba9a6D3F40AA1848Ad196564B27a430D29FdB0",
|
|
253
|
-
VENICE_INFERENCE: "0x0dDFf301F8AeB9B95627277f70bb6824CEFf5dF3",
|
|
254
|
-
WSTETH_MOONWELL: "0x23d145Bd100599C7418164FEae235bcE391Ae032",
|
|
255
|
-
MAMO_YIELD: "0x73b9cdC8cAf8853AfE299E144A40e3D51E399463",
|
|
256
|
-
HYPERLIQUID_PERP: ZERO,
|
|
257
|
-
HYPERLIQUID_GRID: ZERO,
|
|
258
|
-
PORTFOLIO: "0x42069e51c415f4BF4442D80F1532Bd38140Bd135"
|
|
259
|
-
};
|
|
260
|
-
var BASE_SEPOLIA_STRATEGY_TEMPLATES = {
|
|
261
|
-
MOONWELL_SUPPLY: "0xf67107afd786b6CB8829e55634b1686B8Bb7937a",
|
|
262
|
-
AERODROME_LP: "0xDf45018C64f5d6fd254B5d5437e96A27D5F01D09",
|
|
263
|
-
VENICE_INFERENCE: "0xB3E20A505D6e086eaEE02a58C264D41cb746E76E",
|
|
264
|
-
WSTETH_MOONWELL: "0x8F75B609519cEC5a9B9DF3cb74BcF095be5Ee2fD",
|
|
265
|
-
MAMO_YIELD: "0x49ea76685D79ff41bF7F60e22d9D367d0981bD58",
|
|
266
|
-
HYPERLIQUID_PERP: ZERO,
|
|
267
|
-
HYPERLIQUID_GRID: ZERO,
|
|
268
|
-
PORTFOLIO: ZERO
|
|
269
|
-
};
|
|
270
|
-
var ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {
|
|
271
|
-
MOONWELL_SUPPLY: ZERO,
|
|
272
|
-
AERODROME_LP: ZERO,
|
|
273
|
-
VENICE_INFERENCE: ZERO,
|
|
274
|
-
WSTETH_MOONWELL: ZERO,
|
|
275
|
-
MAMO_YIELD: ZERO,
|
|
276
|
-
HYPERLIQUID_PERP: ZERO,
|
|
277
|
-
HYPERLIQUID_GRID: ZERO,
|
|
278
|
-
PORTFOLIO: "0xAe981882923E0C76A7F10E7cAa3782023c0abd9B"
|
|
279
|
-
};
|
|
280
|
-
var HYPEREVM_STRATEGY_TEMPLATES = {
|
|
281
|
-
MOONWELL_SUPPLY: ZERO,
|
|
282
|
-
AERODROME_LP: ZERO,
|
|
283
|
-
VENICE_INFERENCE: ZERO,
|
|
284
|
-
WSTETH_MOONWELL: ZERO,
|
|
285
|
-
MAMO_YIELD: ZERO,
|
|
286
|
-
HYPERLIQUID_PERP: "0x7Cc36bcc6a1f0F2607BacC8692fe2aD52eB14fd7",
|
|
287
|
-
HYPERLIQUID_GRID: "0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab",
|
|
288
|
-
PORTFOLIO: ZERO
|
|
289
|
-
};
|
|
290
|
-
var BASE_EAS = {
|
|
291
|
-
EAS: "0x4200000000000000000000000000000000000021",
|
|
292
|
-
SCHEMA_REGISTRY: "0x4200000000000000000000000000000000000020"
|
|
293
|
-
};
|
|
294
|
-
var BASE_SEPOLIA_EAS = {
|
|
295
|
-
EAS: "0x4200000000000000000000000000000000000021",
|
|
296
|
-
SCHEMA_REGISTRY: "0x4200000000000000000000000000000000000020"
|
|
297
|
-
};
|
|
298
|
-
var ROBINHOOD_TESTNET_EAS = {
|
|
299
|
-
EAS: ZERO,
|
|
300
|
-
SCHEMA_REGISTRY: ZERO
|
|
301
|
-
};
|
|
302
|
-
var HYPEREVM_EAS = { EAS: ZERO, SCHEMA_REGISTRY: ZERO };
|
|
303
|
-
var BASE_EAS_SCHEMAS = {
|
|
304
|
-
SYNDICATE_JOIN_REQUEST: "0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef",
|
|
305
|
-
AGENT_APPROVED: "0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607",
|
|
306
|
-
X402_RESEARCH: "0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708",
|
|
307
|
-
VENICE_PROVISION: "0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1",
|
|
308
|
-
VENICE_INFERENCE: "0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14",
|
|
309
|
-
TRADE_EXECUTED: "0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6"
|
|
310
|
-
};
|
|
311
|
-
var BASE_SEPOLIA_EAS_SCHEMAS = {
|
|
312
|
-
SYNDICATE_JOIN_REQUEST: "0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef",
|
|
313
|
-
AGENT_APPROVED: "0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607",
|
|
314
|
-
X402_RESEARCH: "0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708",
|
|
315
|
-
VENICE_PROVISION: "0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1",
|
|
316
|
-
VENICE_INFERENCE: "0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14",
|
|
317
|
-
TRADE_EXECUTED: "0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6"
|
|
318
|
-
};
|
|
319
|
-
var ROBINHOOD_TESTNET_EAS_SCHEMAS = {
|
|
320
|
-
SYNDICATE_JOIN_REQUEST: ZERO_BYTES32,
|
|
321
|
-
AGENT_APPROVED: ZERO_BYTES32,
|
|
322
|
-
X402_RESEARCH: ZERO_BYTES32,
|
|
323
|
-
VENICE_PROVISION: ZERO_BYTES32,
|
|
324
|
-
VENICE_INFERENCE: ZERO_BYTES32,
|
|
325
|
-
TRADE_EXECUTED: ZERO_BYTES32
|
|
326
|
-
};
|
|
327
|
-
var HYPEREVM_EAS_SCHEMAS = {
|
|
328
|
-
SYNDICATE_JOIN_REQUEST: ZERO_BYTES32,
|
|
329
|
-
AGENT_APPROVED: ZERO_BYTES32,
|
|
330
|
-
X402_RESEARCH: ZERO_BYTES32,
|
|
331
|
-
VENICE_PROVISION: ZERO_BYTES32,
|
|
332
|
-
VENICE_INFERENCE: ZERO_BYTES32,
|
|
333
|
-
TRADE_EXECUTED: ZERO_BYTES32
|
|
334
|
-
};
|
|
335
|
-
var TOKEN_REGISTRY = {
|
|
336
|
-
base: BASE_TOKENS,
|
|
337
|
-
"base-sepolia": BASE_SEPOLIA_TOKENS,
|
|
338
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_TOKENS,
|
|
339
|
-
hyperevm: HYPEREVM_TOKENS,
|
|
340
|
-
"hyperevm-testnet": HYPEREVM_TESTNET_TOKENS
|
|
341
|
-
};
|
|
342
|
-
var MOONWELL_REGISTRY = {
|
|
343
|
-
base: BASE_MOONWELL,
|
|
344
|
-
"base-sepolia": BASE_SEPOLIA_MOONWELL,
|
|
345
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_MOONWELL,
|
|
346
|
-
hyperevm: HYPEREVM_MOONWELL,
|
|
347
|
-
"hyperevm-testnet": HYPEREVM_MOONWELL
|
|
348
|
-
};
|
|
349
|
-
var UNISWAP_REGISTRY = {
|
|
350
|
-
base: BASE_UNISWAP,
|
|
351
|
-
"base-sepolia": BASE_SEPOLIA_UNISWAP,
|
|
352
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_UNISWAP,
|
|
353
|
-
hyperevm: HYPEREVM_UNISWAP,
|
|
354
|
-
"hyperevm-testnet": HYPEREVM_UNISWAP
|
|
355
|
-
};
|
|
356
|
-
var INFRA_REGISTRY = {
|
|
357
|
-
base: BASE_INFRA,
|
|
358
|
-
"base-sepolia": BASE_SEPOLIA_INFRA,
|
|
359
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_INFRA,
|
|
360
|
-
hyperevm: HYPEREVM_INFRA,
|
|
361
|
-
"hyperevm-testnet": HYPEREVM_INFRA
|
|
362
|
-
};
|
|
363
|
-
var ENS_REGISTRY = {
|
|
364
|
-
base: BASE_ENS,
|
|
365
|
-
"base-sepolia": BASE_SEPOLIA_ENS,
|
|
366
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_ENS,
|
|
367
|
-
hyperevm: HYPEREVM_ENS,
|
|
368
|
-
"hyperevm-testnet": HYPEREVM_ENS
|
|
369
|
-
};
|
|
370
|
-
var AGENT_REGISTRY_MAP = {
|
|
371
|
-
base: BASE_AGENT_REGISTRY,
|
|
372
|
-
"base-sepolia": BASE_SEPOLIA_AGENT_REGISTRY,
|
|
373
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_AGENT_REGISTRY,
|
|
374
|
-
hyperevm: HYPEREVM_AGENT_REGISTRY,
|
|
375
|
-
"hyperevm-testnet": HYPEREVM_AGENT_REGISTRY
|
|
376
|
-
};
|
|
377
|
-
var SHERWOOD_REGISTRY = {
|
|
378
|
-
base: BASE_SHERWOOD,
|
|
379
|
-
"base-sepolia": BASE_SEPOLIA_SHERWOOD,
|
|
380
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_SHERWOOD,
|
|
381
|
-
hyperevm: HYPEREVM_SHERWOOD,
|
|
382
|
-
"hyperevm-testnet": HYPEREVM_SHERWOOD
|
|
383
|
-
};
|
|
384
|
-
var VENICE_REGISTRY = {
|
|
385
|
-
base: BASE_VENICE,
|
|
386
|
-
"base-sepolia": BASE_SEPOLIA_VENICE,
|
|
387
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_VENICE,
|
|
388
|
-
hyperevm: HYPEREVM_VENICE,
|
|
389
|
-
"hyperevm-testnet": HYPEREVM_VENICE
|
|
390
|
-
};
|
|
391
|
-
var AERODROME_REGISTRY = {
|
|
392
|
-
base: BASE_AERODROME,
|
|
393
|
-
"base-sepolia": BASE_SEPOLIA_AERODROME,
|
|
394
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_AERODROME,
|
|
395
|
-
hyperevm: HYPEREVM_AERODROME,
|
|
396
|
-
"hyperevm-testnet": HYPEREVM_AERODROME
|
|
397
|
-
};
|
|
398
|
-
var STRATEGY_TEMPLATE_REGISTRY = {
|
|
399
|
-
base: BASE_STRATEGY_TEMPLATES,
|
|
400
|
-
"base-sepolia": BASE_SEPOLIA_STRATEGY_TEMPLATES,
|
|
401
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES,
|
|
402
|
-
hyperevm: HYPEREVM_STRATEGY_TEMPLATES,
|
|
403
|
-
"hyperevm-testnet": HYPEREVM_STRATEGY_TEMPLATES
|
|
404
|
-
};
|
|
405
|
-
var HYPEREVM_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
|
|
406
|
-
var HYPEREVM_CHAINLINK = { VERIFIER_PROXY: ZERO, WSTETH_ETH_FEED: ZERO };
|
|
407
|
-
var SYNTHRA_REGISTRY = {
|
|
408
|
-
base: BASE_SYNTHRA,
|
|
409
|
-
"base-sepolia": BASE_SEPOLIA_SYNTHRA,
|
|
410
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_SYNTHRA,
|
|
411
|
-
hyperevm: HYPEREVM_SYNTHRA,
|
|
412
|
-
"hyperevm-testnet": HYPEREVM_SYNTHRA
|
|
413
|
-
};
|
|
414
|
-
var CHAINLINK_REGISTRY = {
|
|
415
|
-
base: BASE_CHAINLINK,
|
|
416
|
-
"base-sepolia": BASE_SEPOLIA_CHAINLINK,
|
|
417
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_CHAINLINK,
|
|
418
|
-
hyperevm: HYPEREVM_CHAINLINK,
|
|
419
|
-
"hyperevm-testnet": HYPEREVM_CHAINLINK
|
|
420
|
-
};
|
|
421
|
-
var EAS_CONTRACT_REGISTRY = {
|
|
422
|
-
base: BASE_EAS,
|
|
423
|
-
"base-sepolia": BASE_SEPOLIA_EAS,
|
|
424
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_EAS,
|
|
425
|
-
hyperevm: HYPEREVM_EAS,
|
|
426
|
-
"hyperevm-testnet": HYPEREVM_EAS
|
|
427
|
-
};
|
|
428
|
-
var EAS_SCHEMA_REGISTRY = {
|
|
429
|
-
base: BASE_EAS_SCHEMAS,
|
|
430
|
-
"base-sepolia": BASE_SEPOLIA_EAS_SCHEMAS,
|
|
431
|
-
"robinhood-testnet": ROBINHOOD_TESTNET_EAS_SCHEMAS,
|
|
432
|
-
hyperevm: HYPEREVM_EAS_SCHEMAS,
|
|
433
|
-
"hyperevm-testnet": HYPEREVM_EAS_SCHEMAS
|
|
434
|
-
};
|
|
435
|
-
function TOKENS() {
|
|
436
|
-
return TOKEN_REGISTRY[getNetwork()];
|
|
437
|
-
}
|
|
438
|
-
function MOONWELL() {
|
|
439
|
-
return MOONWELL_REGISTRY[getNetwork()];
|
|
440
|
-
}
|
|
441
|
-
function UNISWAP() {
|
|
442
|
-
return UNISWAP_REGISTRY[getNetwork()];
|
|
443
|
-
}
|
|
444
|
-
function INFRA() {
|
|
445
|
-
return INFRA_REGISTRY[getNetwork()];
|
|
446
|
-
}
|
|
447
|
-
function ENS() {
|
|
448
|
-
return ENS_REGISTRY[getNetwork()];
|
|
449
|
-
}
|
|
450
|
-
function AGENT_REGISTRY() {
|
|
451
|
-
return AGENT_REGISTRY_MAP[getNetwork()];
|
|
452
|
-
}
|
|
453
|
-
function VENICE() {
|
|
454
|
-
return VENICE_REGISTRY[getNetwork()];
|
|
455
|
-
}
|
|
456
|
-
function SHERWOOD() {
|
|
457
|
-
return SHERWOOD_REGISTRY[getNetwork()];
|
|
458
|
-
}
|
|
459
|
-
function AERODROME() {
|
|
460
|
-
return AERODROME_REGISTRY[getNetwork()];
|
|
461
|
-
}
|
|
462
|
-
function STRATEGY_TEMPLATES() {
|
|
463
|
-
return STRATEGY_TEMPLATE_REGISTRY[getNetwork()];
|
|
464
|
-
}
|
|
465
|
-
function EAS_CONTRACTS() {
|
|
466
|
-
return EAS_CONTRACT_REGISTRY[getNetwork()];
|
|
467
|
-
}
|
|
468
|
-
function EAS_SCHEMAS() {
|
|
469
|
-
return EAS_SCHEMA_REGISTRY[getNetwork()];
|
|
470
|
-
}
|
|
471
|
-
function SYNTHRA() {
|
|
472
|
-
return SYNTHRA_REGISTRY[getNetwork()];
|
|
473
|
-
}
|
|
474
|
-
function CHAINLINK() {
|
|
475
|
-
return CHAINLINK_REGISTRY[getNetwork()];
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
export {
|
|
479
|
-
TOKENS,
|
|
480
|
-
MOONWELL,
|
|
481
|
-
UNISWAP,
|
|
482
|
-
INFRA,
|
|
483
|
-
ENS,
|
|
484
|
-
AGENT_REGISTRY,
|
|
485
|
-
VENICE,
|
|
486
|
-
SHERWOOD,
|
|
487
|
-
AERODROME,
|
|
488
|
-
STRATEGY_TEMPLATES,
|
|
489
|
-
EAS_CONTRACTS,
|
|
490
|
-
EAS_SCHEMAS,
|
|
491
|
-
SYNTHRA,
|
|
492
|
-
CHAINLINK
|
|
493
|
-
};
|
|
494
|
-
//# sourceMappingURL=chunk-GWMTAW6A.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/addresses.ts"],"sourcesContent":["/**\n * Contract addresses by network.\n *\n * All exports are functions — they resolve at call time based on the\n * current network set via setNetwork(). This ensures --chain works\n * even when modules are imported before the flag is parsed.\n *\n * Zero addresses = protocol not deployed on that chain. Strategies that\n * need them will fail at execution time with a clear allowlist error.\n */\n\nimport type { Address } from \"viem\";\nimport { type Network, getNetwork } from \"./network.js\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\nconst ZERO_BYTES32 =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as `0x${string}`;\n\n// ── Base Mainnet ──\n\nconst BASE_TOKENS = {\n USDC: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" as Address,\n WETH: \"0x4200000000000000000000000000000000000006\" as Address,\n cbETH: \"0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22\" as Address,\n wstETH: \"0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452\" as Address,\n cbBTC: \"0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf\" as Address,\n DAI: \"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb\" as Address,\n AERO: \"0x940181a94A35A4569E4529A3CDfB74e38FD98631\" as Address,\n AAVE: \"0x63706e401c06ac8513145b7687A14804d17f814b\" as Address,\n} as const;\n\nconst BASE_MOONWELL = {\n COMPTROLLER: \"0xfBb21d0380beE3312B33c4353c8936a0F13EF26C\" as Address,\n mUSDC: \"0xEdc817A28E8B93B03976FBd4a3dDBc9f7D176c22\" as Address,\n mWETH: \"0x628ff693426583D9a7FB391E54366292F509D457\" as Address,\n mCbETH: \"0x3bf93770f2d4a794c3d9EBEfBAeBAE2a8f09A5E5\" as Address,\n mWstETH: \"0x627Fe393Bc6EdDA28e99AE648fD6fF362514304b\" as Address,\n mCbBTC: \"0xF877ACaFA28c19b96727966690b2f44d35aD5976\" as Address,\n mDAI: \"0x73b06D8d18De422E269645eaCe15400DE7462417\" as Address,\n mAERO: \"0x73902f619CEB9B31FD8EFecf435CbDf89E369Ba6\" as Address,\n} as const;\n\nconst BASE_UNISWAP = {\n SWAP_ROUTER: \"0x2626664c2603336E57B271c5C0b26F421741e481\" as Address,\n QUOTER_V2: \"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a\" as Address,\n // Redeployed adapter with the QuoterV2 struct-ABI fix. The prior\n // 0x679400a781A66d801C20DfD9E0020704e21e9d54 calls QuoterV1's\n // positional signature against the deployed QuoterV2, which reverts\n // on every quote — strategies built against it execute-fail with\n // QuoteUnavailable. New clones (post this CLI version) point at the\n // fixed adapter; pre-existing clones (e.g. the broken proposals\n // 4 / 5 on the original Base test vault) stay bound to the old one\n // via their stored InitParams and remain unrecoverable — cancel\n // those and re-propose.\n SWAP_ADAPTER: \"0x2e8aB422Db9127F1a70d8C38A15903f22B51DA97\" as Address,\n} as const;\n\nconst BASE_INFRA = {\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as Address,\n} as const;\n\n// ── Base Sepolia ──\n\nconst BASE_SEPOLIA_TOKENS = {\n USDC: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\" as Address, // Circle test USDC\n WETH: \"0x4200000000000000000000000000000000000006\" as Address, // Canonical bridged WETH\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n AAVE: ZERO,\n} as const;\n\nconst BASE_SEPOLIA_MOONWELL = {\n COMPTROLLER: ZERO,\n mUSDC: ZERO,\n mWETH: ZERO,\n mCbETH: ZERO,\n mWstETH: ZERO,\n mCbBTC: ZERO,\n mDAI: ZERO,\n mAERO: ZERO,\n} as const;\n\nconst BASE_SEPOLIA_UNISWAP = {\n SWAP_ROUTER: \"0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4\" as Address, // Uniswap V3 SwapRouter02\n QUOTER_V2: \"0xC5290058841028F1614F3A6F0F5816cAd0df5E27\" as Address, // Uniswap V3 QuoterV2\n SWAP_ADAPTER: ZERO as Address,\n} as const;\n\nconst BASE_SEPOLIA_INFRA = {\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as Address, // Deterministic, same everywhere\n} as const;\n\n// ── Robinhood L2 Testnet (Arbitrum Orbit, chain 46630) ──\n// Synthra DEX for swaps. Stock tokens available.\n\nconst ROBINHOOD_TESTNET_TOKENS = {\n USDC: ZERO,\n WETH: \"0x7943e237c7F95DA44E0301572D358911207852Fa\" as Address,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n AAVE: ZERO,\n TSLA: \"0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E\" as Address,\n AMZN: \"0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02\" as Address,\n PLTR: \"0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0\" as Address,\n NFLX: \"0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93\" as Address,\n AMD: \"0x71178BAc73cBeb415514eB542a8995b82669778d\" as Address,\n} as const;\n\nconst ROBINHOOD_TESTNET_MOONWELL = {\n COMPTROLLER: ZERO,\n mUSDC: ZERO,\n mWETH: ZERO,\n mCbETH: ZERO,\n mWstETH: ZERO,\n mCbBTC: ZERO,\n mDAI: ZERO,\n mAERO: ZERO,\n} as const;\n\nconst ROBINHOOD_TESTNET_UNISWAP = {\n SWAP_ROUTER: ZERO,\n QUOTER_V2: ZERO,\n SWAP_ADAPTER: ZERO as Address,\n} as const;\n\n// ── Synthra DEX (Robinhood L2 — Uniswap V3-compatible concentrated liquidity) ──\n\nconst BASE_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO } as const;\nconst BASE_SEPOLIA_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO } as const;\nconst ROBINHOOD_TESTNET_SYNTHRA = {\n ROUTER: \"0x3Ce954107b1A675826B33bF23060Dd655e3758fE\" as Address,\n QUOTER: \"0x231606c321A99DE81e28fE48B07a93F1ba49e713\" as Address,\n FACTORY: \"0x911b4000D3422F482F4062a913885f7b035382Df\" as Address,\n} as const;\n\n// ── Chainlink (Data Streams verifier proxy + AggregatorV3 feeds) ──\n\nconst BASE_CHAINLINK = {\n VERIFIER_PROXY: \"0xDE1A28D87Afd0f546505B28AB50410A5c3a7387a\" as Address,\n // WSTETH/ETH AggregatorV3 feed on Base (heartbeat 24h, 18 decimals).\n // Used by WstETHMoonwellStrategy._positionValue for live NAV.\n WSTETH_ETH_FEED: \"0x43a5C292A453A3bF3606fa856197f09D7B74251a\" as Address,\n} as const;\nconst BASE_SEPOLIA_CHAINLINK = { VERIFIER_PROXY: ZERO, WSTETH_ETH_FEED: ZERO } as const;\nconst ROBINHOOD_TESTNET_CHAINLINK = {\n VERIFIER_PROXY: \"0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64\" as Address,\n WSTETH_ETH_FEED: ZERO,\n} as const;\n\nconst ROBINHOOD_TESTNET_INFRA = {\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as Address, // Deterministic, same everywhere\n} as const;\n\n// ── HyperEVM (chain 999) ──\n// No Moonwell, no Uniswap, no Venice, no ENS/Durin, no ERC-8004, no EAS.\n// USDC: native USDC on HyperEVM.\n\nconst HYPEREVM_TOKENS = {\n USDC: \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\" as Address,\n WETH: ZERO,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n AAVE: ZERO,\n} as const;\n\nconst HYPEREVM_TESTNET_TOKENS = {\n USDC: ZERO,\n WETH: ZERO,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n AAVE: ZERO,\n} as const;\n\nconst HYPEREVM_MOONWELL = {\n COMPTROLLER: ZERO, mUSDC: ZERO, mWETH: ZERO, mCbETH: ZERO,\n mWstETH: ZERO, mCbBTC: ZERO, mDAI: ZERO, mAERO: ZERO,\n} as const;\n\nconst HYPEREVM_UNISWAP = { SWAP_ROUTER: ZERO, QUOTER_V2: ZERO, SWAP_ADAPTER: ZERO as Address } as const;\n\nconst HYPEREVM_INFRA = {\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as Address,\n} as const;\n\n// ── ENS / Durin ──\n\nconst BASE_ENS = {\n L2_REGISTRAR: \"0x866996c808E6244216a3d0df15464FCF5d495394\" as Address,\n L2_REGISTRY: \"0x7a019ce699e27b0ad1e5b51344a58116b9f3b9b1\" as Address,\n} as const;\n\nconst BASE_SEPOLIA_ENS = {\n L2_REGISTRAR: \"0x1fCbe9dFC25e3fa3F7C55b26c7992684A4758b47\" as Address,\n L2_REGISTRY: \"0x06eb7b85b59bc3e50fe4837be776cdd26de602cf\" as Address,\n} as const;\n\nconst ROBINHOOD_TESTNET_ENS = {\n L2_REGISTRAR: ZERO,\n L2_REGISTRY: ZERO,\n} as const;\n\nconst HYPEREVM_ENS = { L2_REGISTRAR: ZERO, L2_REGISTRY: ZERO } as const;\n\n// ── ERC-8004 Agent Identity ──\n\nconst BASE_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\" as Address,\n REPUTATION_REGISTRY:\n \"0x8004BAa17C55a88189AE136b182e5fdA19dE9b63\" as Address,\n} as const;\n\nconst BASE_SEPOLIA_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: \"0x8004A818BFB912233c491871b3d84c89A494BD9e\" as Address,\n REPUTATION_REGISTRY:\n \"0x8004B663056A597Dffe9eCcC1965A193B7388713\" as Address,\n} as const;\n\nconst ROBINHOOD_TESTNET_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: ZERO,\n REPUTATION_REGISTRY: ZERO,\n} as const;\n\nconst HYPEREVM_AGENT_REGISTRY = { IDENTITY_REGISTRY: ZERO, REPUTATION_REGISTRY: ZERO } as const;\n\n// ── Sherwood Protocol (our deployed contracts) ──\n\n// V1.5: per-network Sherwood entries now include GUARDIAN_REGISTRY + WOOD_TOKEN +\n// MERKL_DISTRIBUTOR. ZERO == not-yet-deployed on that network.\n// V1.5 Base redeploy: fresh factory/governor/registry/vault-impl/executor.\n// Old proxies (factory 0x4a76…6C29, governor 0x2F7C…186a, vault impl\n// 0x2523…cFE, executor 0x4DB1…664a) remain on-chain for historical /\n// settle-out access until ops decommission them.\nconst BASE_SHERWOOD = {\n FACTORY: \"0xAC74EC56858d7F1f7618c8e77F65Fc26aDf33c82\" as Address,\n GOVERNOR: \"0x9Fd3c87B34F254e3c5652A0394B9780c2F05d367\" as Address,\n GUARDIAN_REGISTRY: \"0x49E4163b5e4b23F8f3d469Cf6fa197FB6b06A26E\" as Address,\n WOOD_TOKEN: ZERO,\n // Merkl mainnet distributor — Angle Labs:\n // https://docs.merkl.xyz/merkl-for-providers/merkl-technical-documentation/addresses\n MERKL_DISTRIBUTOR: \"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae\" as Address,\n} as const;\n\nconst BASE_SEPOLIA_SHERWOOD = {\n FACTORY: \"0x121AaC2B96Ec365e457fcCc1C2ED5a6142064069\" as Address,\n GOVERNOR: \"0xE5ecf2B06E3f3e298B632C0cf6575f9d9422F55E\" as Address,\n GUARDIAN_REGISTRY: ZERO,\n WOOD_TOKEN: ZERO,\n MERKL_DISTRIBUTOR: ZERO,\n} as const;\n\nconst ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985\" as Address,\n GOVERNOR: \"0xd882056ba6b0aEd8908c541884B327121E2f2C9C\" as Address,\n GUARDIAN_REGISTRY: ZERO,\n WOOD_TOKEN: ZERO,\n MERKL_DISTRIBUTOR: ZERO,\n} as const;\n\n// V1.5 beta redeploy on HyperEVM (PR #282 / chore/redeploy-beta-v1.5):\n// CREATE3 salts bumped .2/.1 → .3/.2 to deploy fresh V1.5 contracts at\n// new addresses. Old proxies (factory 0x7e7F…48d3, governor 0x915F…7C21,\n// vault impl 0xB454…ECba, registry 0x121A…4069) remain on-chain for\n// historical access until ops decommission them.\nconst HYPEREVM_SHERWOOD = {\n FACTORY: \"0xd05Ae0E8bcf13075C29817c805d6Cc14F214393a\" as Address,\n GOVERNOR: \"0x67AD3D5F3d127Ef923Fd6f67b178633c408D3fd3\" as Address,\n GUARDIAN_REGISTRY: \"0x8b5710EB4e2fA639F364Dcc3F3B30c8f12F460b9\" as Address,\n WOOD_TOKEN: ZERO,\n MERKL_DISTRIBUTOR: ZERO,\n} as const;\n\n// ── Venice (VVV governance + sVVV staking + DIEM compute) ──\n\nconst BASE_VENICE = {\n VVV: \"0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf\" as Address,\n STAKING: \"0x321b7ff75154472b18edb199033ff4d116f340ff\" as Address, // also the sVVV ERC-20\n DIEM: \"0xF4d97F2da56e8c3098f3a8D538DB630A2606a024\" as Address,\n} as const;\n\nconst BASE_SEPOLIA_VENICE = {\n VVV: ZERO,\n STAKING: ZERO,\n DIEM: ZERO,\n} as const;\n\nconst ROBINHOOD_TESTNET_VENICE = {\n VVV: ZERO,\n STAKING: ZERO,\n DIEM: ZERO,\n} as const;\n\nconst HYPEREVM_VENICE = { VVV: ZERO, STAKING: ZERO, DIEM: ZERO } as const;\n\n// ── Aerodrome (Base ve(3,3) DEX) ──\n\nconst BASE_AERODROME = {\n ROUTER: \"0xcF77a3Ba9A5CA399B7c97c74d54e5b1Beb874E43\" as Address,\n FACTORY: \"0x420DD381b31aEf6683db6B902084cB0FFECe40Da\" as Address,\n} as const;\n\nconst BASE_SEPOLIA_AERODROME = {\n ROUTER: ZERO,\n FACTORY: ZERO,\n} as const;\n\nconst ROBINHOOD_TESTNET_AERODROME = {\n ROUTER: ZERO,\n FACTORY: ZERO,\n} as const;\n\nconst HYPEREVM_AERODROME = { ROUTER: ZERO, FACTORY: ZERO } as const;\n\n// ── Strategy Templates (ERC-1167 clonable singletons) ──\n// Populated after running script/DeployTemplates.s.sol\n\n// V1.5 Base redeploy: the new factory at 0xAC74…3c82 only accepts strategies\n// V1.5 templates implement IStrategy.onLiveDeposit + _positionValue. These\n// addresses replace the V1 templates that were dropped during the V1.5\n// redeploy because they were tied to the old factory.\n//\n// Old V1 addresses (kept on-chain for in-flight settle-out only):\n// MOONWELL_SUPPLY 0x649f8d24096a5eb17b8C73ee5113825AcA259F00\n// AERODROME_LP 0x6ccdD48C6A83cCdD6712DEB02E85FbEA8CF426CE\n// VENICE_INFERENCE 0x49BFDae8353ba15954924274573D427211CCe41b\n// WSTETH_MOONWELL 0xA31851Ab35F9992b0411749ec02Df053e904D1e6\n// MAMO_YIELD 0x9ca8A9B75a46261F107B610b634ecE69D7E6DF42\n// PORTFOLIO 0x7865eEA4063c22d0F55FdD412D345495c7b73f64\nconst BASE_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: \"0xb9Cd6d6720fc224508A07f0e43254A3cD65770E0\" as Address,\n AERODROME_LP: \"0x6fba9a6D3F40AA1848Ad196564B27a430D29FdB0\" as Address,\n VENICE_INFERENCE: \"0x0dDFf301F8AeB9B95627277f70bb6824CEFf5dF3\" as Address,\n WSTETH_MOONWELL: \"0x23d145Bd100599C7418164FEae235bcE391Ae032\" as Address,\n MAMO_YIELD: \"0x73b9cdC8cAf8853AfE299E144A40e3D51E399463\" as Address,\n HYPERLIQUID_PERP: ZERO as Address,\n HYPERLIQUID_GRID: ZERO as Address,\n PORTFOLIO: \"0x42069e51c415f4BF4442D80F1532Bd38140Bd135\" as Address,\n} as const;\n\nconst BASE_SEPOLIA_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: \"0xf67107afd786b6CB8829e55634b1686B8Bb7937a\" as Address,\n AERODROME_LP: \"0xDf45018C64f5d6fd254B5d5437e96A27D5F01D09\" as Address,\n VENICE_INFERENCE: \"0xB3E20A505D6e086eaEE02a58C264D41cb746E76E\" as Address,\n WSTETH_MOONWELL: \"0x8F75B609519cEC5a9B9DF3cb74BcF095be5Ee2fD\" as Address,\n MAMO_YIELD: \"0x49ea76685D79ff41bF7F60e22d9D367d0981bD58\" as Address,\n HYPERLIQUID_PERP: ZERO as Address,\n HYPERLIQUID_GRID: ZERO as Address,\n PORTFOLIO: ZERO as Address,\n} as const;\n\nconst ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: ZERO as Address,\n AERODROME_LP: ZERO as Address,\n VENICE_INFERENCE: ZERO as Address,\n WSTETH_MOONWELL: ZERO as Address,\n MAMO_YIELD: ZERO as Address,\n HYPERLIQUID_PERP: ZERO as Address,\n HYPERLIQUID_GRID: ZERO as Address,\n PORTFOLIO: \"0xAe981882923E0C76A7F10E7cAa3782023c0abd9B\" as Address,\n} as const;\n\nconst HYPEREVM_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: ZERO as Address,\n AERODROME_LP: ZERO as Address,\n VENICE_INFERENCE: ZERO as Address,\n WSTETH_MOONWELL: ZERO as Address,\n MAMO_YIELD: ZERO as Address,\n HYPERLIQUID_PERP: \"0x7Cc36bcc6a1f0F2607BacC8692fe2aD52eB14fd7\" as Address,\n HYPERLIQUID_GRID: \"0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab\" as Address,\n PORTFOLIO: ZERO as Address,\n} as const;\n\n// ── EAS (Ethereum Attestation Service) — Base predeploys ──\n\nconst BASE_EAS = {\n EAS: \"0x4200000000000000000000000000000000000021\" as Address,\n SCHEMA_REGISTRY: \"0x4200000000000000000000000000000000000020\" as Address,\n} as const;\n\nconst BASE_SEPOLIA_EAS = {\n EAS: \"0x4200000000000000000000000000000000000021\" as Address,\n SCHEMA_REGISTRY: \"0x4200000000000000000000000000000000000020\" as Address,\n} as const;\n\nconst ROBINHOOD_TESTNET_EAS = {\n EAS: ZERO,\n SCHEMA_REGISTRY: ZERO,\n} as const;\n\nconst HYPEREVM_EAS = { EAS: ZERO, SCHEMA_REGISTRY: ZERO } as const;\n\n// ── EAS Schema UIDs (populated after running scripts/register-eas-schemas.ts) ──\n\nconst BASE_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST:\n \"0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef\" as `0x${string}`,\n AGENT_APPROVED:\n \"0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607\" as `0x${string}`,\n X402_RESEARCH:\n \"0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708\" as `0x${string}`,\n VENICE_PROVISION:\n \"0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1\" as `0x${string}`,\n VENICE_INFERENCE:\n \"0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14\" as `0x${string}`,\n TRADE_EXECUTED:\n \"0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6\" as `0x${string}`,\n} as const;\n\nconst BASE_SEPOLIA_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST:\n \"0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef\" as `0x${string}`,\n AGENT_APPROVED:\n \"0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607\" as `0x${string}`,\n X402_RESEARCH:\n \"0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708\" as `0x${string}`,\n VENICE_PROVISION:\n \"0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1\" as `0x${string}`,\n VENICE_INFERENCE:\n \"0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14\" as `0x${string}`,\n TRADE_EXECUTED:\n \"0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6\" as `0x${string}`,\n} as const;\n\nconst ROBINHOOD_TESTNET_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST: ZERO_BYTES32,\n AGENT_APPROVED: ZERO_BYTES32,\n X402_RESEARCH: ZERO_BYTES32,\n VENICE_PROVISION: ZERO_BYTES32,\n VENICE_INFERENCE: ZERO_BYTES32,\n TRADE_EXECUTED: ZERO_BYTES32,\n} as const;\n\nconst HYPEREVM_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST: ZERO_BYTES32, AGENT_APPROVED: ZERO_BYTES32,\n X402_RESEARCH: ZERO_BYTES32, VENICE_PROVISION: ZERO_BYTES32,\n VENICE_INFERENCE: ZERO_BYTES32, TRADE_EXECUTED: ZERO_BYTES32,\n} as const;\n\n// ── Registries (map-based lookup) ──\n\nconst TOKEN_REGISTRY: Record<Network, typeof BASE_TOKENS> = {\n base: BASE_TOKENS,\n \"base-sepolia\": BASE_SEPOLIA_TOKENS,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_TOKENS,\n hyperevm: HYPEREVM_TOKENS,\n \"hyperevm-testnet\": HYPEREVM_TESTNET_TOKENS,\n};\n\nconst MOONWELL_REGISTRY: Record<Network, typeof BASE_MOONWELL> = {\n base: BASE_MOONWELL,\n \"base-sepolia\": BASE_SEPOLIA_MOONWELL,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_MOONWELL,\n hyperevm: HYPEREVM_MOONWELL,\n \"hyperevm-testnet\": HYPEREVM_MOONWELL,\n};\n\nconst UNISWAP_REGISTRY: Record<Network, typeof BASE_UNISWAP> = {\n base: BASE_UNISWAP,\n \"base-sepolia\": BASE_SEPOLIA_UNISWAP,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_UNISWAP,\n hyperevm: HYPEREVM_UNISWAP,\n \"hyperevm-testnet\": HYPEREVM_UNISWAP,\n};\n\nconst INFRA_REGISTRY: Record<Network, typeof BASE_INFRA> = {\n base: BASE_INFRA,\n \"base-sepolia\": BASE_SEPOLIA_INFRA,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_INFRA,\n hyperevm: HYPEREVM_INFRA,\n \"hyperevm-testnet\": HYPEREVM_INFRA,\n};\n\nconst ENS_REGISTRY: Record<Network, typeof BASE_ENS> = {\n base: BASE_ENS,\n \"base-sepolia\": BASE_SEPOLIA_ENS,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_ENS,\n hyperevm: HYPEREVM_ENS,\n \"hyperevm-testnet\": HYPEREVM_ENS,\n};\n\nconst AGENT_REGISTRY_MAP: Record<Network, typeof BASE_AGENT_REGISTRY> = {\n base: BASE_AGENT_REGISTRY,\n \"base-sepolia\": BASE_SEPOLIA_AGENT_REGISTRY,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AGENT_REGISTRY,\n hyperevm: HYPEREVM_AGENT_REGISTRY,\n \"hyperevm-testnet\": HYPEREVM_AGENT_REGISTRY,\n};\n\nconst SHERWOOD_REGISTRY: Record<Network, typeof BASE_SHERWOOD> = {\n base: BASE_SHERWOOD,\n \"base-sepolia\": BASE_SEPOLIA_SHERWOOD,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SHERWOOD,\n hyperevm: HYPEREVM_SHERWOOD,\n \"hyperevm-testnet\": HYPEREVM_SHERWOOD,\n};\n\nconst VENICE_REGISTRY: Record<Network, typeof BASE_VENICE> = {\n base: BASE_VENICE,\n \"base-sepolia\": BASE_SEPOLIA_VENICE,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_VENICE,\n hyperevm: HYPEREVM_VENICE,\n \"hyperevm-testnet\": HYPEREVM_VENICE,\n};\n\nconst AERODROME_REGISTRY: Record<Network, typeof BASE_AERODROME> = {\n base: BASE_AERODROME,\n \"base-sepolia\": BASE_SEPOLIA_AERODROME,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AERODROME,\n hyperevm: HYPEREVM_AERODROME,\n \"hyperevm-testnet\": HYPEREVM_AERODROME,\n};\n\nconst STRATEGY_TEMPLATE_REGISTRY: Record<Network, typeof BASE_STRATEGY_TEMPLATES> = {\n base: BASE_STRATEGY_TEMPLATES,\n \"base-sepolia\": BASE_SEPOLIA_STRATEGY_TEMPLATES,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES,\n hyperevm: HYPEREVM_STRATEGY_TEMPLATES,\n \"hyperevm-testnet\": HYPEREVM_STRATEGY_TEMPLATES,\n};\n\nconst HYPEREVM_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO } as const;\nconst HYPEREVM_CHAINLINK = { VERIFIER_PROXY: ZERO, WSTETH_ETH_FEED: ZERO } as const;\n\nconst SYNTHRA_REGISTRY: Record<Network, typeof BASE_SYNTHRA> = {\n base: BASE_SYNTHRA,\n \"base-sepolia\": BASE_SEPOLIA_SYNTHRA,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SYNTHRA,\n hyperevm: HYPEREVM_SYNTHRA,\n \"hyperevm-testnet\": HYPEREVM_SYNTHRA,\n};\n\nconst CHAINLINK_REGISTRY: Record<Network, typeof BASE_CHAINLINK> = {\n base: BASE_CHAINLINK,\n \"base-sepolia\": BASE_SEPOLIA_CHAINLINK,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_CHAINLINK,\n hyperevm: HYPEREVM_CHAINLINK,\n \"hyperevm-testnet\": HYPEREVM_CHAINLINK,\n};\n\nconst EAS_CONTRACT_REGISTRY: Record<Network, typeof BASE_EAS> = {\n base: BASE_EAS,\n \"base-sepolia\": BASE_SEPOLIA_EAS,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_EAS,\n hyperevm: HYPEREVM_EAS,\n \"hyperevm-testnet\": HYPEREVM_EAS,\n};\n\nconst EAS_SCHEMA_REGISTRY: Record<Network, typeof BASE_EAS_SCHEMAS> = {\n base: BASE_EAS_SCHEMAS,\n \"base-sepolia\": BASE_SEPOLIA_EAS_SCHEMAS,\n \"robinhood-testnet\": ROBINHOOD_TESTNET_EAS_SCHEMAS,\n hyperevm: HYPEREVM_EAS_SCHEMAS,\n \"hyperevm-testnet\": HYPEREVM_EAS_SCHEMAS,\n};\n\n// ── Exports (functions, resolved at call time) ──\n\nexport function TOKENS() {\n return TOKEN_REGISTRY[getNetwork()];\n}\n\nexport function MOONWELL() {\n return MOONWELL_REGISTRY[getNetwork()];\n}\n\nexport function UNISWAP() {\n return UNISWAP_REGISTRY[getNetwork()];\n}\n\nexport function INFRA() {\n return INFRA_REGISTRY[getNetwork()];\n}\n\nexport function ENS() {\n return ENS_REGISTRY[getNetwork()];\n}\n\nexport function AGENT_REGISTRY() {\n return AGENT_REGISTRY_MAP[getNetwork()];\n}\n\nexport function VENICE() {\n return VENICE_REGISTRY[getNetwork()];\n}\n\nexport function SHERWOOD() {\n return SHERWOOD_REGISTRY[getNetwork()];\n}\n\nexport function AERODROME() {\n return AERODROME_REGISTRY[getNetwork()];\n}\n\nexport function STRATEGY_TEMPLATES() {\n return STRATEGY_TEMPLATE_REGISTRY[getNetwork()];\n}\n\nexport function EAS_CONTRACTS() {\n return EAS_CONTRACT_REGISTRY[getNetwork()];\n}\n\nexport function EAS_SCHEMAS() {\n return EAS_SCHEMA_REGISTRY[getNetwork()];\n}\n\nexport function SYNTHRA() {\n return SYNTHRA_REGISTRY[getNetwork()];\n}\n\nexport function CHAINLINK() {\n return CHAINLINK_REGISTRY[getNetwork()];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/factory.ts"],"sourcesContent":["/**\n * SyndicateFactory contract wrapper.\n *\n * Creates new syndicate vaults via the factory. Each syndicate = one vault proxy\n * with shared executor lib and vault implementation.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { parseUnits, formatUnits, decodeEventLog } from \"viem\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt } from \"./client.js\";\nimport { SYNDICATE_FACTORY_ABI } from \"./abis.js\";\nimport { TOKENS, SHERWOOD } from \"./addresses.js\";\n\nexport interface SyndicateInfo {\n id: bigint;\n vault: Address;\n creator: Address;\n metadataURI: string;\n createdAt: bigint;\n active: boolean;\n subdomain: string;\n}\n\nexport interface CreateSyndicateParams {\n creatorAgentId: bigint;\n metadataURI: string;\n asset: Address;\n name: string;\n symbol: string;\n openDeposits: boolean;\n subdomain: string;\n}\n\nfunction getFactoryAddress(): Address {\n return SHERWOOD().FACTORY;\n}\n\nexport interface CreateSyndicateResult {\n hash: Hex;\n syndicateId: bigint;\n vault: Address;\n}\n\n/**\n * Create a new syndicate via the factory.\n * Deploys a UUPS vault proxy, initializes it, and registers in the factory.\n * Waits for receipt and extracts vault address from SyndicateCreated event.\n */\nexport async function createSyndicate(params: CreateSyndicateParams): Promise<CreateSyndicateResult> {\n const client = getPublicClient();\n\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"createSyndicate\",\n args: [\n params.creatorAgentId,\n {\n metadataURI: params.metadataURI,\n asset: params.asset,\n name: params.name,\n symbol: params.symbol,\n openDeposits: params.openDeposits,\n subdomain: params.subdomain,\n },\n ],\n });\n\n // Wait for receipt and extract vault from SyndicateCreated event\n const receipt = await waitForReceipt(hash);\n\n // Parse SyndicateCreated event from receipt logs\n for (const log of receipt.logs) {\n try {\n const event = decodeEventLog({\n abi: SYNDICATE_FACTORY_ABI,\n data: log.data,\n topics: log.topics,\n });\n if (event.eventName === \"SyndicateCreated\") {\n const args = event.args as { id: bigint; vault: Address; creator: Address };\n return {\n hash,\n syndicateId: args.id,\n vault: args.vault,\n };\n }\n } catch {\n // Not our event, skip\n }\n }\n\n // Fallback: read from factory state (may lag on RPC replicas)\n const count = await getSyndicateCount();\n const info = await getSyndicate(count);\n\n return {\n hash,\n syndicateId: count,\n vault: info.vault,\n };\n}\n\n/**\n * Check if a subdomain is already registered. Returns the syndicate ID if found, null otherwise.\n */\nexport async function subdomainExists(subdomain: string): Promise<bigint | null> {\n const client = getPublicClient();\n const id = (await client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"subdomainToSyndicate\",\n args: [subdomain],\n })) as bigint;\n\n return id > 0n ? id : null;\n}\n\n/**\n * Get syndicate info by ID.\n */\nexport async function getSyndicate(id: bigint): Promise<SyndicateInfo> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicates\",\n args: [id],\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 metadataURI: result[3],\n createdAt: result[4],\n active: result[5],\n subdomain: result[6],\n };\n}\n\n/**\n * Get the total number of syndicates created.\n */\nexport async function getSyndicateCount(): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicateCount\",\n }) as Promise<bigint>;\n}\n\n/**\n * Get all active syndicates from the factory.\n */\nexport async function getActiveSyndicates(): Promise<SyndicateInfo[]> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"getAllActiveSyndicates\",\n })) as readonly {\n id: bigint;\n vault: Address;\n creator: Address;\n metadataURI: string;\n createdAt: bigint;\n active: boolean;\n subdomain: string;\n }[];\n\n return result.map((s) => ({\n id: s.id,\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt,\n active: s.active,\n subdomain: s.subdomain,\n }));\n}\n\n/**\n * Update syndicate metadata (creator only).\n */\nexport async function updateMetadata(syndicateId: bigint, metadataURI: string): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"updateMetadata\",\n args: [syndicateId, metadataURI],\n });\n await waitForReceipt(hash);\n return hash;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
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/**\n * Read the vault owner (OwnableUpgradeable).\n */\nexport async function getVaultOwner(vault?: Address): Promise<Address> {\n const client = getPublicClient();\n return client.readContract({\n address: vault ?? getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"owner\",\n }) as Promise<Address>;\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// ── Redeem ──\n\n/**\n * Pre-flight check for redeem. Validates that the caller has enough shares\n * and that the vault allows redemption right now.\n */\nexport async function preflightRedeem(shares: bigint): Promise<void> {\n const client = getPublicClient();\n const vaultAddress = getVaultAddress();\n const account = getAccount();\n\n if (shares === 0n) {\n throw new Error(\"No shares to redeem.\");\n }\n\n // 1. Check share balance\n const balance = (await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n })) as bigint;\n\n if (balance < shares) {\n throw new Error(\n `Insufficient shares. Have ${balance.toString()}, need ${shares.toString()}.`,\n );\n }\n\n // 2. 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 — redemptions are temporarily disabled.\");\n }\n\n // 3. Check redemptions not locked (active proposal blocks redemptions)\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 \"Redemptions are locked while a strategy is executing. Wait for the proposal to be settled.\",\n );\n }\n\n // 4. 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.`,\n );\n }\n}\n\n/**\n * Redeem shares for the underlying asset (standard ERC-4626 redeem).\n * Returns the tx hash and the assets received.\n */\nexport async function redeem(\n shares: bigint,\n receiver?: Address,\n): Promise<{ hash: Hex; assetsOut: bigint }> {\n const client = getPublicClient();\n const vaultAddress = getVaultAddress();\n const account = getAccount();\n const to = receiver ?? account.address;\n\n // Preview so we can report assets received\n const assetsOut = (await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"previewRedeem\",\n args: [shares],\n })) as bigint;\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"redeem\",\n args: [shares, to, account.address],\n });\n await waitForReceipt(hash);\n return { hash, assetsOut };\n}\n\n/**\n * Read the current share balance for an address (defaults to the caller).\n */\nexport async function getShareBalance(address?: Address): Promise<bigint> {\n const client = getPublicClient();\n const owner = address ?? getAccount().address;\n return client.readContract({\n address: getVaultAddress(),\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"balanceOf\",\n args: [owner],\n }) as Promise<bigint>;\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 {\n getChain,\n getNetwork,\n withNetwork,\n VALID_NETWORKS,\n CHAIN_REGISTRY,\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// ── 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 * Probe every supported chain for a subdomain registration. Skips testnets\n * unless `ENABLE_TESTNET=true` (so we never surface \"found on testnet\" hints\n * to a user who can't act on them). Returns every hit — most queries find\n * zero or one, but post-CREATE3 the same subdomain may exist on multiple\n * chains and the caller needs to disambiguate. RPC errors on individual\n * chains are swallowed so a flaky chain doesn't fail the whole search.\n */\nexport async function searchSyndicateAcrossChains(\n subdomain: string,\n): Promise<{ network: Network; result: SyndicateResolution }[]> {\n const includeTestnets = process.env.ENABLE_TESTNET === \"true\";\n const candidates = VALID_NETWORKS.filter(\n (n) => includeTestnets || !CHAIN_REGISTRY[n].isTestnet,\n );\n\n const hits: { network: Network; result: SyndicateResolution }[] = [];\n for (const net of candidates) {\n try {\n const result = await withNetwork(net, () => resolveSyndicate(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 → 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":[]}
|