@sherwoodagent/cli 0.83.1 → 0.84.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 (69) hide show
  1. package/dist/{abis-ZQ6I3S6L.js → abis-WVW2EBI3.js} +2 -2
  2. package/dist/{addresses-MS6BB7AB.js → addresses-LFYVOPOH.js} +3 -3
  3. package/dist/{agent-C5XZSK7Z.js → agent-TBLC3WNJ.js} +7 -7
  4. package/dist/{chat-FGTYCJ4B.js → chat-UZ3BBEXV.js} +8 -8
  5. package/dist/{chunk-G34TNE53.js → chunk-45FELUWY.js} +2 -2
  6. package/dist/{chunk-4WAEM2TC.js → chunk-56YYNNNQ.js} +5 -5
  7. package/dist/{chunk-AJ46XIGY.js → chunk-6DRNSZ2Z.js} +41 -5
  8. package/dist/chunk-6DRNSZ2Z.js.map +1 -0
  9. package/dist/{chunk-4GO7I33U.js → chunk-BOC7VB5B.js} +36 -5
  10. package/dist/chunk-BOC7VB5B.js.map +1 -0
  11. package/dist/{chunk-I7TMY7AS.js → chunk-DNRIKCJ5.js} +85 -31
  12. package/dist/chunk-DNRIKCJ5.js.map +1 -0
  13. package/dist/{chunk-XSP64L7L.js → chunk-F3MDCUGO.js} +4 -368
  14. package/dist/chunk-F3MDCUGO.js.map +1 -0
  15. package/dist/{chunk-NKRMMFQG.js → chunk-JUVXLTL2.js} +56 -5
  16. package/dist/chunk-JUVXLTL2.js.map +1 -0
  17. package/dist/{chunk-CCNOXDZ7.js → chunk-KVB5P2OE.js} +2 -2
  18. package/dist/{chunk-MBWFTXF5.js → chunk-MQ55QOGD.js} +5 -5
  19. package/dist/{chunk-M34JVPJO.js → chunk-NCFN66ZH.js} +39 -6
  20. package/dist/chunk-NCFN66ZH.js.map +1 -0
  21. package/dist/{chunk-ZW2VKCFZ.js → chunk-PVTZMRC6.js} +34 -2
  22. package/dist/chunk-PVTZMRC6.js.map +1 -0
  23. package/dist/{chunk-AQPTBVEA.js → chunk-QRMZRAMG.js} +2 -2
  24. package/dist/{chunk-AOL2DJTK.js → chunk-SNR5R5TO.js} +6 -6
  25. package/dist/{client-OPZ2ORWW.js → client-3SE632Q2.js} +3 -3
  26. package/dist/{eas-32PEJETG.js → eas-QPKX6A5A.js} +12 -6
  27. package/dist/{governor-GSCXEZWI.js → governor-7QKGNHMR.js} +12 -6
  28. package/dist/index.js +1053 -269
  29. package/dist/index.js.map +1 -1
  30. package/dist/{network-HCFCNZUI.js → network-FEHRFDPJ.js} +6 -2
  31. package/dist/{price-OUL7WIXQ.js → price-SVF25X4O.js} +6 -6
  32. package/dist/{providers-4HQHB7V5.js → providers-BMOHHVUN.js} +4 -4
  33. package/dist/{research-2RWAMWWH.js → research-YSNJ5HTM.js} +15 -12
  34. package/dist/research-YSNJ5HTM.js.map +1 -0
  35. package/dist/{session-SIOJZO6P.js → session-RMAIFRS6.js} +44 -13
  36. package/dist/session-RMAIFRS6.js.map +1 -0
  37. package/dist/{trade-ZEIY3MCL.js → trade-YPLTIS56.js} +21 -21
  38. package/dist/trade-YPLTIS56.js.map +1 -0
  39. package/dist/{vault-VDADZFSV.js → vault-UCFFOOTS.js} +8 -8
  40. package/dist/{xmtp-2U7CSBXM.js → xmtp-S7IGTIMZ.js} +6 -6
  41. package/package.json +2 -2
  42. package/dist/chunk-4GO7I33U.js.map +0 -1
  43. package/dist/chunk-AJ46XIGY.js.map +0 -1
  44. package/dist/chunk-I7TMY7AS.js.map +0 -1
  45. package/dist/chunk-M34JVPJO.js.map +0 -1
  46. package/dist/chunk-NKRMMFQG.js.map +0 -1
  47. package/dist/chunk-XSP64L7L.js.map +0 -1
  48. package/dist/chunk-ZW2VKCFZ.js.map +0 -1
  49. package/dist/research-2RWAMWWH.js.map +0 -1
  50. package/dist/session-SIOJZO6P.js.map +0 -1
  51. package/dist/trade-ZEIY3MCL.js.map +0 -1
  52. /package/dist/{abis-ZQ6I3S6L.js.map → abis-WVW2EBI3.js.map} +0 -0
  53. /package/dist/{addresses-MS6BB7AB.js.map → addresses-LFYVOPOH.js.map} +0 -0
  54. /package/dist/{agent-C5XZSK7Z.js.map → agent-TBLC3WNJ.js.map} +0 -0
  55. /package/dist/{chat-FGTYCJ4B.js.map → chat-UZ3BBEXV.js.map} +0 -0
  56. /package/dist/{chunk-G34TNE53.js.map → chunk-45FELUWY.js.map} +0 -0
  57. /package/dist/{chunk-4WAEM2TC.js.map → chunk-56YYNNNQ.js.map} +0 -0
  58. /package/dist/{chunk-CCNOXDZ7.js.map → chunk-KVB5P2OE.js.map} +0 -0
  59. /package/dist/{chunk-MBWFTXF5.js.map → chunk-MQ55QOGD.js.map} +0 -0
  60. /package/dist/{chunk-AQPTBVEA.js.map → chunk-QRMZRAMG.js.map} +0 -0
  61. /package/dist/{chunk-AOL2DJTK.js.map → chunk-SNR5R5TO.js.map} +0 -0
  62. /package/dist/{client-OPZ2ORWW.js.map → client-3SE632Q2.js.map} +0 -0
  63. /package/dist/{eas-32PEJETG.js.map → eas-QPKX6A5A.js.map} +0 -0
  64. /package/dist/{governor-GSCXEZWI.js.map → governor-7QKGNHMR.js.map} +0 -0
  65. /package/dist/{network-HCFCNZUI.js.map → network-FEHRFDPJ.js.map} +0 -0
  66. /package/dist/{price-OUL7WIXQ.js.map → price-SVF25X4O.js.map} +0 -0
  67. /package/dist/{providers-4HQHB7V5.js.map → providers-BMOHHVUN.js.map} +0 -0
  68. /package/dist/{vault-VDADZFSV.js.map → vault-UCFFOOTS.js.map} +0 -0
  69. /package/dist/{xmtp-2U7CSBXM.js.map → xmtp-S7IGTIMZ.js.map} +0 -0
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  SHERWOOD
3
- } from "./chunk-I7TMY7AS.js";
3
+ } from "./chunk-DNRIKCJ5.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-AQPTBVEA.js";
9
+ } from "./chunk-QRMZRAMG.js";
10
10
  import {
11
11
  getChain
12
- } from "./chunk-ZW2VKCFZ.js";
12
+ } from "./chunk-PVTZMRC6.js";
13
13
  import {
14
14
  PROTOCOL_CONFIG_ABI,
15
15
  SYNDICATE_FACTORY_ABI,
16
16
  SYNDICATE_GOVERNOR_ABI
17
- } from "./chunk-XSP64L7L.js";
17
+ } from "./chunk-F3MDCUGO.js";
18
18
 
19
19
  // src/lib/governor.ts
20
20
  import { parseEventLogs } from "viem";
@@ -65,6 +65,34 @@ function classifyReview(args) {
65
65
  if (!pastWindow || resolved) return "none";
66
66
  return opened ? "resolvable" : "cold-start";
67
67
  }
68
+ function classifyReviewOpen(args) {
69
+ const { opened, resolved, voteEnd, reviewEnd, now } = args;
70
+ const registered = voteEnd > 0n && reviewEnd > voteEnd;
71
+ const inWindow = now >= voteEnd && now < reviewEnd;
72
+ if (!registered || !inWindow || opened || resolved) return "none";
73
+ return "openable";
74
+ }
75
+ async function scanReviewCandidates(ids, load) {
76
+ const failures = [];
77
+ const settled = await Promise.all(
78
+ ids.map(async (id) => {
79
+ try {
80
+ return { ok: true, value: await load(id) };
81
+ } catch (error) {
82
+ failures.push({ id, error });
83
+ return { ok: false };
84
+ }
85
+ })
86
+ );
87
+ const candidates = [];
88
+ for (const s of settled) if (s.ok) candidates.push(s.value);
89
+ return { candidates, failures };
90
+ }
91
+ function assertReceiptSuccess(receipt) {
92
+ if (receipt.status !== "success") {
93
+ throw new Error(`transaction mined but reverted on-chain (status=${receipt.status})`);
94
+ }
95
+ }
68
96
  function parseDuration(input) {
69
97
  const match = input.match(/^(\d+)(d|h|m|s)?$/);
70
98
  if (!match) throw new Error(`Invalid duration: ${input}`);
@@ -417,6 +445,9 @@ export {
417
445
  VOTE_TYPE,
418
446
  evaluateExecuteGate,
419
447
  classifyReview,
448
+ classifyReviewOpen,
449
+ scanReviewCandidates,
450
+ assertReceiptSuccess,
420
451
  parseDuration,
421
452
  getGovernorOf,
422
453
  getProtocolConfigAddress,
@@ -450,4 +481,4 @@ export {
450
481
  vetoProposal,
451
482
  setProtocolFeeBps
452
483
  };
453
- //# sourceMappingURL=chunk-4GO7I33U.js.map
484
+ //# sourceMappingURL=chunk-BOC7VB5B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/governor.ts","../src/lib/generated/proposal-state.ts"],"sourcesContent":["/**\n * Governor contract wrapper — reads/writes to SyndicateGovernor.\n *\n * Per-vault governor design: the factory deploys ONE governor per vault\n * (BeaconProxy). Every helper takes the vault address and resolves its\n * governor via `factory.governorOf(vault)` (memoized per chain+vault —\n * the binding is set once at createSyndicate and never changes).\n *\n * Protocol-wide fee parameters (protocol/guardian fee bps + recipients)\n * live on the separate ProtocolConfig contract, resolved via\n * `factory.protocolConfig()`.\n */\n\nimport type { Address, Hex, Log } from \"viem\";\nimport { parseEventLogs } from \"viem\";\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt } from \"./client.js\";\nimport { getChain } from \"./network.js\";\nimport { SHERWOOD } from \"./addresses.js\";\nimport { SYNDICATE_GOVERNOR_ABI, SYNDICATE_FACTORY_ABI, PROTOCOL_CONFIG_ABI } from \"./abis.js\";\nimport { PROPOSAL_STATE, PROPOSAL_STATES } from \"./generated/proposal-state.js\";\n\n// ── Types ──\n\nexport interface GovernorParams {\n votingPeriod: bigint;\n executionWindow: bigint;\n vetoThresholdBps: bigint;\n maxPerformanceFeeBps: bigint;\n cooldownPeriod: bigint;\n collaborationWindow: bigint;\n maxCoProposers: bigint;\n minStrategyDuration: bigint;\n maxStrategyDuration: bigint;\n}\n\nexport interface StrategyProposal {\n id: bigint;\n proposer: Address;\n vault: Address;\n /** Strategy contract address whose `positionValue()` the vault polls\n * for live NAV. Set at propose time, immutable thereafter. address(0)\n * for queue-only proposals (no live NAV). */\n strategy: Address;\n metadataURI: string;\n /** Agent fee (bps) snapshotted from the vault's `agentFeeBps` at propose. */\n performanceFeeBps: bigint;\n strategyDuration: bigint;\n votesFor: bigint;\n votesAgainst: bigint;\n votesAbstain: bigint;\n snapshotTimestamp: bigint;\n voteEnd: bigint;\n reviewEnd: bigint;\n executeBy: bigint;\n executedAt: bigint;\n state: number;\n vetoThresholdBps: bigint;\n /** Fee-recipient snapshot taken from ProtocolConfig at propose time.\n *\n * THE FLAT `snapshot*FeeBps` SCALARS AND `selfManagesFees` ARE GONE: the\n * splits became structs (`snapshotMgmtSplit`/`snapshotPerfSplit` below) and\n * self-managed fees were removed outright. Every field below is positional\n * in the on-chain tuple — omitting or reordering one corrupts the decode of\n * everything after it. */\n snapshotProtocolFeeRecipient: Address;\n snapshotGuardiansFeeRecipient: Address;\n /** Risk envelope declared at propose: the net-outflow ceiling the execute\n * batch is metered against. */\n maxCapital: bigint;\n /** Declared drawdown bound, bps of `effectiveMaxCapital`. */\n maxDrawdownBps: number;\n /** Tier the envelope resolved to; drives how much coverage is required. */\n envelopeTier: number;\n requiredCoverage: bigint;\n /** WOOD bond pulled from the proposer at propose, held by the escrow. */\n proposerBondWood: bigint;\n proposerBondEscrow: Address;\n /** Management-fee split snapshotted from ProtocolConfig at propose. */\n snapshotMgmtSplit: { agentBps: number; protocolBps: number; guardianBps: number };\n /** Performance-fee split snapshotted from ProtocolConfig at propose. */\n snapshotPerfSplit: { agentBps: number; protocolBps: number; guardianBps: number; ownerBps: number };\n /** The ledger the bond's reclaim gates read — bound alongside the escrow so\n * re-pointing either slot later cannot strand the bond. */\n proposerBondLedger: Address;\n /** `maxCapital` after any scaling applied at execute. */\n effectiveMaxCapital: bigint;\n}\n\nexport interface CoProposer {\n agent: Address;\n splitBps: bigint;\n}\n\nexport interface BatchCall {\n target: Address;\n data: Hex;\n value: bigint;\n}\n\n// ProposalState ordering is code-generated from the Solidity enum\n// (contracts/src/interfaces/ISyndicateGovernor.sol) — `npm run codegen`.\n// History: PR #229 inserted GuardianReview at index 2 and this hand-kept\n// mirror drifted for ~2 months, mislabeling Approved (3) as Rejected and\n// making `proposal execute` reject valid approved proposals. The generated\n// module (checked by codegen-drift.test.ts + CI) makes that impossible.\nexport { PROPOSAL_STATE, PROPOSAL_STATES };\n\nexport const VOTE_TYPE = {\n For: 0,\n Against: 1,\n Abstain: 2,\n} as const;\n\n// ── Client-side action gates (mirror SyndicateGovernor) ──\n//\n// The governor's mutating entrypoints resolve state INLINE and can act on a\n// state the read-only `getProposalState` view is still reporting as\n// GuardianReview. The client gates below reproduce that divergence so the CLI\n// stops refusing txs the contract would accept (issue #452).\n\n/** Result of the `proposal execute` client gate. */\nexport type ExecuteGate =\n | { kind: \"send\" } // state == Approved — straightforward execute.\n | { kind: \"send-self-resolve\" } // GuardianReview, window elapsed, still within\n // the execution window — executeProposal\n // self-resolves the (cold-start) review inline.\n | { kind: \"refuse-review-open\" } // GuardianReview, review window still open — the\n // tx WOULD revert (ProposalNotApproved).\n | { kind: \"refuse-expired\" } // GuardianReview past executeBy — the inline\n // self-resolve maps to Expired, tx WOULD revert.\n | { kind: \"refuse-state\" }; // any other non-executable state.\n\n/**\n * Decide whether `executeProposal(id)` should be broadcast.\n *\n * Mirrors `SyndicateGovernor.executeProposal` (contracts/src/SyndicateGovernor.sol:342)\n * vs. the `getProposalState` view:\n * - The view (`_resolveStateView` @824 / `_resolveAfterVote` @865) keeps\n * reporting `GuardianReview` once the review window elapses but the registry\n * has not cached a resolution — a zero-guardian / never-opened cold-start\n * review NEVER auto-opens, so the view is stuck there indefinitely.\n * - `executeProposal` runs the MUTATING `_resolveState` (@789) which, when the\n * window elapsed (`now > reviewEnd`), calls `registry.resolveReview` inline\n * (cold-start ⇒ blocked=false) and maps to Approved when `now <= executeBy`\n * (else Expired) — then executes in the same tx.\n * Invariant `voteEnd < reviewEnd < executeBy` (@528-530) holds for any past-vote\n * proposal, so `reviewEnd`/`executeBy` are always populated in the GuardianReview\n * branch.\n *\n * `now` MUST be chain time (latest block timestamp), not wall-clock — on a\n * time-warped vnet the two diverge and the contract compares against chain time.\n */\nexport function evaluateExecuteGate(args: {\n state: number;\n reviewEnd: bigint;\n executeBy: bigint;\n now: bigint;\n}): ExecuteGate {\n const { state, reviewEnd, executeBy, now } = args;\n if (state === PROPOSAL_STATE.Approved) return { kind: \"send\" };\n if (state === PROPOSAL_STATE.GuardianReview) {\n if (now <= reviewEnd) return { kind: \"refuse-review-open\" };\n if (now > executeBy) return { kind: \"refuse-expired\" };\n return { kind: \"send-self-resolve\" };\n }\n return { kind: \"refuse-state\" };\n}\n\n/**\n * Classification for the `resolve-reviews` keeper.\n * - `resolvable`: an OPENED, unresolved review past its window — needs a real\n * `resolveReview` tx (computes block quorum, may slash approvers).\n * - `cold-start`: an UNOPENED, unresolved review past its window — the\n * zero-guardian case. `resolveReview` would only mark it resolved/not-blocked\n * (GuardianRegistry.resolveReview @639-643), which `executeProposal`\n * already does inline, so the keeper should report it (pointing at\n * `proposal execute`) rather than spend a redundant tx.\n * - `none`: not past window yet, or already resolved.\n */\nexport type ReviewResolveClass = \"resolvable\" | \"cold-start\" | \"none\";\n\nexport function classifyReview(args: {\n opened: boolean;\n resolved: boolean;\n reviewEnd: bigint;\n now: bigint;\n}): ReviewResolveClass {\n const { opened, resolved, reviewEnd, now } = args;\n const pastWindow = reviewEnd > 0n && now >= reviewEnd;\n if (!pastWindow || resolved) return \"none\";\n return opened ? \"resolvable\" : \"cold-start\";\n}\n\n/**\n * Classification for the `open-reviews` keeper (SHE-162), the other leg of\n * `classifyReview`: `GuardianRegistry.openReview(governor, proposalId)` is\n * permissionless, and an unopened review clears by default (`outcomeOf`:\n * `if (!r.opened) return ReviewOutcome.Cleared;`) — nobody opening it means\n * proposals execute unreviewed.\n * - `openable`: a registered, unopened, unresolved review inside the open\n * window `[voteEnd, reviewEnd)` — needs an `openReview` keeper tx.\n * - `none`: never registered (collapsed window, `reviewEnd <= voteEnd`),\n * already opened or resolved, or outside the window. Past `reviewEnd`\n * opening is pointless — that is `classifyReview`'s territory.\n */\nexport type ReviewOpenClass = \"openable\" | \"none\";\n\nexport function classifyReviewOpen(args: {\n opened: boolean;\n resolved: boolean;\n voteEnd: bigint;\n reviewEnd: bigint;\n now: bigint;\n}): ReviewOpenClass {\n const { opened, resolved, voteEnd, reviewEnd, now } = args;\n // Collapsed window ⇒ the review was never registered with the registry;\n // openReview would revert ReviewNotOpen (r.voteEnd == 0).\n const registered = voteEnd > 0n && reviewEnd > voteEnd;\n // Contract gate is `now >= voteEnd` (inclusive); past reviewEnd the open\n // is moot — the review resolves/clears without it.\n const inWindow = now >= voteEnd && now < reviewEnd;\n if (!registered || !inWindow || opened || resolved) return \"none\";\n return \"openable\";\n}\n\n/**\n * Per-proposal scan step shared by the `open-reviews` / `resolve-reviews`\n * keepers. Runs `load` for every id concurrently; an id whose load throws is\n * RECORDED in `failures` (id + error), never silently swallowed — a systemic\n * failure (e.g. an ABI mismatch, the SHE-88/SHE-49 class) must surface as\n * \"N of M failed to load\", not as a clean \"nothing to do\". The loadable ids\n * are still returned so the keeper can process every candidate it CAN see.\n */\nexport interface ReviewScanFailure {\n id: bigint;\n error: unknown;\n}\n\nexport async function scanReviewCandidates<T>(\n ids: readonly bigint[],\n load: (id: bigint) => Promise<T>,\n): Promise<{ candidates: T[]; failures: ReviewScanFailure[] }> {\n const failures: ReviewScanFailure[] = [];\n const settled = await Promise.all(\n ids.map(async (id): Promise<{ ok: true; value: T } | { ok: false }> => {\n try {\n return { ok: true, value: await load(id) };\n } catch (error) {\n failures.push({ id, error });\n return { ok: false };\n }\n }),\n );\n const candidates: T[] = [];\n for (const s of settled) if (s.ok) candidates.push(s.value);\n return { candidates, failures };\n}\n\n/**\n * A mined-but-REVERTED tx still yields a receipt — `waitForReceipt` resolves\n * with `status: \"reverted\"` and does not throw. A keeper counting that as a\n * success would report \"opened/resolved\" for a tx that changed nothing. Call\n * this on every keeper receipt: it throws (like a send failure) unless the\n * tx actually succeeded, so the caller's catch path drives the exit code.\n */\nexport function assertReceiptSuccess(receipt: { status: string }): void {\n if (receipt.status !== \"success\") {\n throw new Error(`transaction mined but reverted on-chain (status=${receipt.status})`);\n }\n}\n\n// ── Duration parser ──\n\nexport function parseDuration(input: string): bigint {\n const match = input.match(/^(\\d+)(d|h|m|s)?$/);\n if (!match) throw new Error(`Invalid duration: ${input}`);\n const value = BigInt(match[1]);\n switch (match[2]) {\n case \"d\":\n return value * 86400n;\n case \"h\":\n return value * 3600n;\n case \"m\":\n return value * 60n;\n case \"s\":\n case undefined:\n return value;\n default:\n throw new Error(`Unknown duration unit: ${match[2]}`);\n }\n}\n\n// ── Address helpers ──\n\n// governorOf(vault) is set once at createSyndicate and never rebinds, so\n// it is safe to memoize per chain+vault for the lifetime of the process.\nconst governorCache = new Map<string, Address>();\n\n/** Resolve the per-vault governor via `factory.governorOf(vault)`. */\nexport async function getGovernorOf(vault: Address): Promise<Address> {\n const key = `${getChain().id}:${vault.toLowerCase()}`;\n const cached = governorCache.get(key);\n if (cached) return cached;\n\n const client = getPublicClient();\n const governor = await client.readContract({\n address: SHERWOOD().FACTORY,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"governorOf\",\n args: [vault],\n }) as Address;\n\n if (governor === \"0x0000000000000000000000000000000000000000\") {\n throw new Error(`No governor registered for vault ${vault} — is it a factory-created vault?`);\n }\n\n governorCache.set(key, governor);\n return governor;\n}\n\n// ProtocolConfig is a protocol-wide singleton behind the factory — same\n// set-once semantics as governorOf, memoized per chain.\nconst protocolConfigCache = new Map<number, Address>();\n\n/** Resolve the ProtocolConfig address via `factory.protocolConfig()`. */\nexport async function getProtocolConfigAddress(): Promise<Address> {\n const chainId = getChain().id;\n const cached = protocolConfigCache.get(chainId);\n if (cached) return cached;\n\n const client = getPublicClient();\n const config = await client.readContract({\n address: SHERWOOD().FACTORY,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"protocolConfig\",\n }) as Address;\n\n protocolConfigCache.set(chainId, config);\n return config;\n}\n\n// ── Read helpers ──\n\nexport async function getGovernorParams(vault: Address): Promise<GovernorParams> {\n const client = getPublicClient();\n const result = await client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getGovernorParams\",\n }) as {\n votingPeriod: bigint;\n executionWindow: bigint;\n vetoThresholdBps: bigint;\n maxPerformanceFeeBps: bigint;\n cooldownPeriod: bigint;\n collaborationWindow: bigint;\n maxCoProposers: bigint;\n minStrategyDuration: bigint;\n maxStrategyDuration: bigint;\n };\n return result;\n}\n\nexport async function getProposal(vault: Address, id: bigint): Promise<StrategyProposal> {\n const client = getPublicClient();\n const result = await client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getProposal\",\n args: [id],\n }) as StrategyProposal;\n return result;\n}\n\nexport async function getProposalState(vault: Address, id: bigint): Promise<number> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getProposalState\",\n args: [id],\n }) as Promise<number>;\n}\n\nexport async function proposalCount(vault: Address): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"proposalCount\",\n }) as Promise<bigint>;\n}\n\nexport async function getVoteWeight(vault: Address, proposalId: bigint, voter: Address): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getVoteWeight\",\n args: [proposalId, voter],\n }) as Promise<bigint>;\n}\n\nexport async function hasVoted(vault: Address, proposalId: bigint, voter: Address): Promise<boolean> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"hasVoted\",\n args: [proposalId, voter],\n }) as Promise<boolean>;\n}\n\n// `getProposalCalls` (concat of execute + settle) was dropped in V1.5\n// to reclaim governor bytecode under EIP-170. Use `getExecuteCalls`\n// + `getSettlementCalls` instead — same data, no on-chain copy loop.\n\nexport async function getExecuteCalls(vault: Address, proposalId: bigint): Promise<BatchCall[]> {\n const client = getPublicClient();\n const result = await client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getExecuteCalls\",\n args: [proposalId],\n }) as { target: Address; data: Hex; value: bigint }[];\n return result.map((c) => ({ target: c.target, data: c.data, value: c.value }));\n}\n\nexport async function getSettlementCalls(vault: Address, proposalId: bigint): Promise<BatchCall[]> {\n const client = getPublicClient();\n const result = await client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getSettlementCalls\",\n args: [proposalId],\n }) as { target: Address; data: Hex; value: bigint }[];\n return result.map((c) => ({ target: c.target, data: c.data, value: c.value }));\n}\n\n// Per-vault governor: `getRegisteredVaults` / `isRegisteredVault` were\n// removed on-chain — a governor serves exactly one vault (`governor.vault()`).\n// Enumerate vaults via the factory (`getAllActiveSyndicates`) instead.\n\nexport async function getActiveProposal(vault: Address): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getActiveProposal\",\n }) as Promise<bigint>;\n}\n\nexport async function getCooldownEnd(vault: Address): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getCooldownEnd\",\n }) as Promise<bigint>;\n}\n\nexport async function openProposalCount(vault: Address): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"openProposalCount\",\n }) as Promise<bigint>;\n}\n\nexport async function getCapitalSnapshot(vault: Address, proposalId: bigint): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"getCapitalSnapshot\",\n args: [proposalId],\n }) as Promise<bigint>;\n}\n\n/**\n * Extract proposalId from ProposalCreated event logs.\n * Returns undefined if the event is not found or parsing fails.\n */\nexport function parseProposalIdFromLogs(logs: Log[]): bigint | undefined {\n try {\n const parsed = parseEventLogs({\n abi: SYNDICATE_GOVERNOR_ABI,\n logs,\n eventName: \"ProposalCreated\",\n });\n return parsed[0]?.args.proposalId;\n } catch {\n return undefined;\n }\n}\n\n// ── Write helpers ──\n\n/**\n * The risk envelope a proposal commits to.\n *\n * `maxCapital` is in ASSET UNITS (the vault's own asset, at its decimals), not\n * a share. `maxDrawdownBps` is the declared loss allowance in basis points,\n * 0..10_000, and is what the settle-price guard sizes its tolerance from — so\n * it is a real declaration to voters and guardians, not a formality.\n */\nexport interface RiskEnvelope {\n maxCapital: bigint;\n maxDrawdownBps: number;\n}\n\n/**\n * @param executeCallCaps one entry per execute call, in ASSET UNITS: the\n * maximum GROSS OUTFLOW of the vault asset measured around that call. A call\n * that moves nothing out (an `approve`, or a settlement that only returns\n * assets) takes 0. Summed per batch and required to be <= `maxCapital`;\n * the execute and settlement batches are bounded independently because they\n * run in separate transactions.\n */\nexport async function propose(\n vault: Address,\n strategy: Address,\n metadataURI: string,\n strategyDuration: bigint,\n envelope: RiskEnvelope,\n executeCalls: BatchCall[],\n executeCallCaps: bigint[],\n settlementCalls: BatchCall[],\n settlementCallCaps: bigint[],\n coProposers: CoProposer[] = [],\n): Promise<{ hash: Hex; proposalId: bigint }> {\n // Fail here rather than as an on-chain `CallCapsLengthMismatch` — the\n // governor's revert names the mismatch but not which batch, and a caller that\n // built the arrays in different places will not know.\n if (executeCallCaps.length !== executeCalls.length) {\n throw new Error(\n `executeCallCaps has ${executeCallCaps.length} entries for ${executeCalls.length} execute calls — every call must declare exactly one cap`,\n );\n }\n if (settlementCallCaps.length !== settlementCalls.length) {\n throw new Error(\n `settlementCallCaps has ${settlementCallCaps.length} entries for ${settlementCalls.length} settlement calls — every call must declare exactly one cap`,\n );\n }\n\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"propose\",\n args: [\n vault,\n strategy,\n metadataURI,\n strategyDuration,\n { maxCapital: envelope.maxCapital, maxDrawdownBps: envelope.maxDrawdownBps },\n executeCalls,\n executeCallCaps,\n settlementCalls,\n settlementCallCaps,\n coProposers,\n ],\n });\n\n const receipt = await waitForReceipt(hash);\n\n // Parse proposalId from the ProposalCreated event in the receipt logs.\n // Falls back to proposalCount() if event parsing fails.\n let proposalId = parseProposalIdFromLogs(receipt.logs);\n if (proposalId === undefined) {\n try {\n proposalId = await proposalCount(vault);\n } catch {\n proposalId = 0n;\n }\n }\n\n return { hash: receipt.transactionHash, proposalId };\n}\n\nexport async function vote(vault: Address, proposalId: bigint, support: number): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"vote\",\n args: [proposalId, support],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\nexport async function executeProposal(vault: Address, proposalId: bigint): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"executeProposal\",\n args: [proposalId],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\n/**\n * Walk a proposal's executeCalls and pick the strategy clone — the\n * target of the call whose selector matches `BaseStrategy.execute()`\n * (0x61461954). This is the canonical entry point that every Sherwood\n * strategy template inherits from BaseStrategy, so it's a reliable\n * marker even across template families (Moonwell / Aerodrome /\n * Hyperliquid / Mamo / Venice / Portfolio).\n *\n * Returns null when no execute() call is present (e.g. proposals that\n * only do approves and direct ERC-20 transfers without a strategy).\n */\nexport function detectStrategyAdapter(\n calls: { target: Address; data: Hex; value: bigint }[],\n): Address | null {\n const STRATEGY_EXECUTE_SELECTOR = \"0x61461954\";\n for (const call of calls) {\n if (call.data.slice(0, 10).toLowerCase() === STRATEGY_EXECUTE_SELECTOR) {\n return call.target;\n }\n }\n return null;\n}\n\nexport async function settleProposal(vault: Address, proposalId: bigint): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"settleProposal\",\n args: [proposalId],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\nexport async function emergencySettle(vault: Address, proposalId: bigint, calls: BatchCall[]): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"emergencySettleWithCalls\",\n args: [proposalId, calls],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\nexport async function cancelProposal(vault: Address, proposalId: bigint): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"cancelProposal\",\n args: [proposalId],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\nexport async function emergencyCancel(vault: Address, proposalId: bigint): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"emergencyCancel\",\n args: [proposalId],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\n// ── Parameter setters ──\n//\n// Per-vault governor: governance parameters are per-vault now, set by the\n// VAULT OWNER on that vault's governor. Setters revert with\n// `ParamsFrozenDuringProposal` while any proposal is open on the vault.\n\ntype GovernorParamSetter =\n | \"setVotingPeriod\"\n | \"setExecutionWindow\"\n | \"setVetoThresholdBps\"\n | \"setMaxPerformanceFeeBps\"\n | \"setMaxStrategyDuration\"\n | \"setCooldownPeriod\";\n\nasync function setGovernorParam(\n vault: Address,\n functionName: GovernorParamSetter,\n value: bigint,\n): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName,\n args: [value],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\nexport async function setVotingPeriod(vault: Address, seconds: bigint): Promise<Hex> {\n return setGovernorParam(vault, \"setVotingPeriod\", seconds);\n}\n\nexport async function setExecutionWindow(vault: Address, seconds: bigint): Promise<Hex> {\n return setGovernorParam(vault, \"setExecutionWindow\", seconds);\n}\n\nexport async function setVetoThresholdBps(vault: Address, bps: bigint): Promise<Hex> {\n return setGovernorParam(vault, \"setVetoThresholdBps\", bps);\n}\n\nexport async function setMaxPerformanceFeeBps(vault: Address, bps: bigint): Promise<Hex> {\n return setGovernorParam(vault, \"setMaxPerformanceFeeBps\", bps);\n}\n\nexport async function setMaxStrategyDuration(vault: Address, seconds: bigint): Promise<Hex> {\n return setGovernorParam(vault, \"setMaxStrategyDuration\", seconds);\n}\n\nexport async function setCooldownPeriod(vault: Address, seconds: bigint): Promise<Hex> {\n return setGovernorParam(vault, \"setCooldownPeriod\", seconds);\n}\n\nexport async function vetoProposal(vault: Address, proposalId: bigint): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getGovernorOf(vault),\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"vetoProposal\",\n args: [proposalId],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n\n// ── ProtocolConfig fee setters (protocol-owner only) ──\n//\n// Fee parameters moved off the governor onto the protocol-wide\n// ProtocolConfig contract (resolved via `factory.protocolConfig()`).\n\nexport async function setProtocolFeeBps(bps: bigint): Promise<Hex> {\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: await getProtocolConfigAddress(),\n abi: PROTOCOL_CONFIG_ABI,\n functionName: \"setProtocolFeeBps\",\n args: [bps],\n });\n const receipt = await waitForReceipt(hash);\n return receipt.transactionHash;\n}\n","/**\n * AUTO-GENERATED by cli/scripts/codegen-contracts.ts — do not edit.\n * Regenerate: npm run codegen (in cli/)\n *\n * Source of truth: sherwood-protocol src/interfaces/ISyndicateGovernor.sol (enum ProposalState)\n */\n\n/** On-chain `ProposalState` member names, index === Solidity enum value. */\nexport const PROPOSAL_STATES = [\n \"Draft\",\n \"Pending\",\n \"GuardianReview\",\n \"Approved\",\n \"Rejected\",\n \"Expired\",\n \"Executed\",\n \"Settled\",\n \"Cancelled\",\n] as const;\n\nexport type ProposalStateName = (typeof PROPOSAL_STATES)[number];\n\n/** Name → Solidity enum value. */\nexport const PROPOSAL_STATE = {\n Draft: 0,\n Pending: 1,\n GuardianReview: 2,\n Approved: 3,\n Rejected: 4,\n Expired: 5,\n Executed: 6,\n Settled: 7,\n Cancelled: 8,\n} as const;\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getNetwork
3
- } from "./chunk-ZW2VKCFZ.js";
3
+ } from "./chunk-PVTZMRC6.js";
4
4
 
5
5
  // src/lib/addresses.ts
6
6
  import { isAddress } from "viem";
@@ -71,7 +71,6 @@ function overridesFor(registry) {
71
71
 
72
72
  // src/lib/addresses.ts
73
73
  var ZERO = "0x0000000000000000000000000000000000000000";
74
- var ZERO_BYTES32 = "0x0000000000000000000000000000000000000000000000000000000000000000";
75
74
  var ROBINHOOD_TESTNET_TOKENS = {
76
75
  USDC: ZERO,
77
76
  // USDG (Robinhood-chain stablecoin, 6-dec). Zero on testnet (Synthra WETH-quoted);
@@ -165,7 +164,20 @@ var ROBINHOOD_TESTNET_SHERWOOD = {
165
164
  STAKED_WOOD: "0x21A69A6c9814c0d339C57fDdafed3B283702a739",
166
165
  WOOD_TOKEN: "0xCCb4fB59cf40de1E23083037ee81Da1DD747D8d7",
167
166
  STRATEGY_FACTORY: "0xb683Bb8EEcBc2419BC3801df6FeA88f96657e670",
168
- MERKL_DISTRIBUTOR: ZERO
167
+ MERKL_DISTRIBUTOR: ZERO,
168
+ // Guardian-era contracts from contracts/chains/46630.json (SHE-93).
169
+ VAULT_IMPL: "0xC57e12d6e2d8Ed49316F0b69c51893CcA44151F7",
170
+ BATCH_EXECUTOR_LIB: "0xF3b8db5aa41c7Ce92478A0Fa9C55a6460533eb86",
171
+ GOVERNOR_BEACON: "0x3D46Ec018cd5893b685b4dfdc3921A4Eb64E11d1",
172
+ PROTOCOL_CONFIG: "0xC104Eb6a522d6718cA28F344B2373B29d57FF2E0",
173
+ PRICE_ROUTER: "0xDd302ffcfA08071780eC1A2f12BccFB9ba6b6731",
174
+ TIER_REGISTRY: "0x99b8068Dc0F6093466964D581f72d947e3e380DB",
175
+ CALL_SANDBOX_IMPL: "0xf09f6AF7DeBB964eD731376C9Af389F2Ce3d872A",
176
+ // Not in chains/46630.json (econ-security stack not deployed there yet).
177
+ EXPOSURE_LEDGER: ZERO,
178
+ PROPOSER_BOND_ESCROW: ZERO,
179
+ CHALLENGE_GAME: ZERO,
180
+ TOKEN_COURT: ZERO
169
181
  };
170
182
  var ROBINHOOD_TESTNET_VENICE = {
171
183
  VVV: ZERO,
@@ -187,18 +199,21 @@ var ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {
187
199
  // V2 redeploy PORTFOLIO_TEMPLATE (chain 46630).
188
200
  PORTFOLIO: "0x67420Cc504d70a42Adfd8867d878afe0978C7d10"
189
201
  };
190
- var ROBINHOOD_TESTNET_EAS = {
191
- EAS: ZERO,
192
- SCHEMA_REGISTRY: ZERO
202
+ var ROBINHOOD_MAINNET_EAS = {
203
+ EAS: "0x7d70441Bb10AcE5d9771dc0b6205D89ddf63205B",
204
+ SCHEMA_REGISTRY: "0xdd7521Ba10773e556Defa6D6c133cB2F663b5c26"
193
205
  };
194
- var ROBINHOOD_TESTNET_EAS_SCHEMAS = {
195
- SYNDICATE_JOIN_REQUEST: ZERO_BYTES32,
196
- AGENT_APPROVED: ZERO_BYTES32,
197
- X402_RESEARCH: ZERO_BYTES32,
198
- VENICE_PROVISION: ZERO_BYTES32,
199
- VENICE_INFERENCE: ZERO_BYTES32,
200
- TRADE_EXECUTED: ZERO_BYTES32
206
+ var SHERWOOD_EAS_SCHEMAS = {
207
+ SYNDICATE_JOIN_REQUEST: "0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef",
208
+ AGENT_APPROVED: "0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607",
209
+ X402_RESEARCH: "0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708",
210
+ VENICE_PROVISION: "0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1",
211
+ VENICE_INFERENCE: "0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14",
212
+ TRADE_EXECUTED: "0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6"
201
213
  };
214
+ function noneOf(shape) {
215
+ return Object.fromEntries(Object.keys(shape).map((k) => [k, ZERO]));
216
+ }
202
217
  var ROBINHOOD_FORK_TOKENS = {
203
218
  USDC: ZERO,
204
219
  USDG: "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
@@ -232,7 +247,20 @@ var ROBINHOOD_FORK_SHERWOOD = {
232
247
  STAKED_WOOD: "0xD3037D28693cc7BB3DbF1E17B6e01C4ce628f6DF",
233
248
  WOOD_TOKEN: "0xF8BC08092C06dB6148114DCf82AF881F1085f92b",
234
249
  STRATEGY_FACTORY: "0xb3C009aECAeDd5ccC62Ec12eDAAA55F19C4A1eFb",
235
- MERKL_DISTRIBUTOR: ZERO
250
+ MERKL_DISTRIBUTOR: ZERO,
251
+ // Guardian-era contracts from sherwood-protocol/chains/9994663.json (SHE-93).
252
+ VAULT_IMPL: "0x9BF51da59B13746e6cCeb1b35c398EDA9776a4Dc",
253
+ BATCH_EXECUTOR_LIB: "0xdBdBce2af4222Abe0cCDAc05f84364a50577B5a2",
254
+ GOVERNOR_BEACON: "0x2e8aB422Db9127F1a70d8C38A15903f22B51DA97",
255
+ PROTOCOL_CONFIG: "0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab",
256
+ // Not in chains/9994663.json (no PriceRouter / CallSandbox on the fork).
257
+ PRICE_ROUTER: ZERO,
258
+ TIER_REGISTRY: "0x42B089B816F994d792481fAa308199E9CF63be9f",
259
+ CALL_SANDBOX_IMPL: ZERO,
260
+ EXPOSURE_LEDGER: "0x223e2Fd41aD6487333146fc3998d000E74CB1549",
261
+ PROPOSER_BOND_ESCROW: "0xef2D6994faCad11e6CfAF3DaBf7b0B2091009B05",
262
+ CHALLENGE_GAME: "0x202c1F133006D6706e872433CCAfD729c7A8AE56",
263
+ TOKEN_COURT: "0x5DC603881f5d77f41bbd4202F1d518263Dfd497f"
236
264
  };
237
265
  var ROBINHOOD_FORK_STRATEGY_TEMPLATES = {
238
266
  MOONWELL_SUPPLY: ZERO,
@@ -246,60 +274,86 @@ var ROBINHOOD_FORK_STRATEGY_TEMPLATES = {
246
274
  };
247
275
  var TOKEN_REGISTRY = {
248
276
  "robinhood-testnet": ROBINHOOD_TESTNET_TOKENS,
249
- "robinhood-fork": ROBINHOOD_FORK_TOKENS
277
+ "robinhood-fork": ROBINHOOD_FORK_TOKENS,
278
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_TOKENS)
279
+ // coordination chain — no Sherwood contracts
250
280
  };
251
281
  var MOONWELL_REGISTRY = {
252
282
  "robinhood-testnet": ROBINHOOD_TESTNET_MOONWELL,
253
- "robinhood-fork": ROBINHOOD_TESTNET_MOONWELL
283
+ "robinhood-fork": ROBINHOOD_TESTNET_MOONWELL,
284
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_MOONWELL)
285
+ // coordination chain — no Sherwood contracts
254
286
  };
255
287
  var UNISWAP_REGISTRY = {
256
288
  "robinhood-testnet": ROBINHOOD_TESTNET_UNISWAP,
257
- "robinhood-fork": ROBINHOOD_FORK_UNISWAP
289
+ "robinhood-fork": ROBINHOOD_FORK_UNISWAP,
290
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_UNISWAP)
291
+ // coordination chain — no Sherwood contracts
258
292
  };
259
293
  var INFRA_REGISTRY = {
260
294
  "robinhood-testnet": ROBINHOOD_TESTNET_INFRA,
261
- "robinhood-fork": ROBINHOOD_TESTNET_INFRA
295
+ "robinhood-fork": ROBINHOOD_TESTNET_INFRA,
296
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_INFRA)
297
+ // coordination chain — no Sherwood contracts
262
298
  };
263
299
  var ENS_REGISTRY = {
264
300
  "robinhood-testnet": ROBINHOOD_TESTNET_ENS,
265
- "robinhood-fork": ROBINHOOD_TESTNET_ENS
301
+ "robinhood-fork": ROBINHOOD_TESTNET_ENS,
302
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_ENS)
303
+ // coordination chain — no Sherwood contracts
266
304
  };
267
305
  var AGENT_REGISTRY_MAP = {
268
306
  "robinhood-testnet": ROBINHOOD_TESTNET_AGENT_REGISTRY,
269
- "robinhood-fork": ROBINHOOD_TESTNET_AGENT_REGISTRY
307
+ "robinhood-fork": ROBINHOOD_TESTNET_AGENT_REGISTRY,
308
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_AGENT_REGISTRY)
309
+ // coordination chain — no Sherwood contracts
270
310
  };
271
311
  var SHERWOOD_REGISTRY = {
272
312
  "robinhood-testnet": ROBINHOOD_TESTNET_SHERWOOD,
273
- "robinhood-fork": ROBINHOOD_FORK_SHERWOOD
313
+ "robinhood-fork": ROBINHOOD_FORK_SHERWOOD,
314
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_SHERWOOD)
315
+ // coordination chain — no Sherwood contracts
274
316
  };
275
317
  var VENICE_REGISTRY = {
276
318
  "robinhood-testnet": ROBINHOOD_TESTNET_VENICE,
277
- "robinhood-fork": ROBINHOOD_TESTNET_VENICE
319
+ "robinhood-fork": ROBINHOOD_TESTNET_VENICE,
320
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_VENICE)
321
+ // coordination chain — no Sherwood contracts
278
322
  };
279
323
  var AERODROME_REGISTRY = {
280
324
  "robinhood-testnet": ROBINHOOD_TESTNET_AERODROME,
281
- "robinhood-fork": ROBINHOOD_TESTNET_AERODROME
325
+ "robinhood-fork": ROBINHOOD_TESTNET_AERODROME,
326
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_AERODROME)
327
+ // coordination chain — no Sherwood contracts
282
328
  };
283
329
  var STRATEGY_TEMPLATE_REGISTRY = {
284
330
  "robinhood-testnet": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES,
285
- "robinhood-fork": ROBINHOOD_FORK_STRATEGY_TEMPLATES
331
+ "robinhood-fork": ROBINHOOD_FORK_STRATEGY_TEMPLATES,
332
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_STRATEGY_TEMPLATES)
333
+ // coordination chain — no Sherwood contracts
286
334
  };
287
335
  var SYNTHRA_REGISTRY = {
288
336
  "robinhood-testnet": ROBINHOOD_TESTNET_SYNTHRA,
289
- "robinhood-fork": ROBINHOOD_TESTNET_SYNTHRA
337
+ "robinhood-fork": ROBINHOOD_TESTNET_SYNTHRA,
290
338
  // unused on the fork (Uniswap, not Synthra)
339
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_SYNTHRA)
340
+ // coordination chain — no Sherwood contracts
291
341
  };
292
342
  var CHAINLINK_REGISTRY = {
293
343
  "robinhood-testnet": ROBINHOOD_TESTNET_CHAINLINK,
294
- "robinhood-fork": ROBINHOOD_FORK_CHAINLINK
344
+ "robinhood-fork": ROBINHOOD_FORK_CHAINLINK,
345
+ "robinhood-mainnet": noneOf(ROBINHOOD_TESTNET_CHAINLINK)
346
+ // coordination chain — no Sherwood contracts
295
347
  };
296
348
  var EAS_CONTRACT_REGISTRY = {
297
- "robinhood-testnet": ROBINHOOD_TESTNET_EAS,
298
- "robinhood-fork": ROBINHOOD_TESTNET_EAS
349
+ "robinhood-testnet": ROBINHOOD_MAINNET_EAS,
350
+ "robinhood-fork": ROBINHOOD_MAINNET_EAS,
351
+ "robinhood-mainnet": ROBINHOOD_MAINNET_EAS
299
352
  };
300
353
  var EAS_SCHEMA_REGISTRY = {
301
- "robinhood-testnet": ROBINHOOD_TESTNET_EAS_SCHEMAS,
302
- "robinhood-fork": ROBINHOOD_TESTNET_EAS_SCHEMAS
354
+ "robinhood-testnet": SHERWOOD_EAS_SCHEMAS,
355
+ "robinhood-fork": SHERWOOD_EAS_SCHEMAS,
356
+ "robinhood-mainnet": SHERWOOD_EAS_SCHEMAS
303
357
  };
304
358
  function TOKENS() {
305
359
  return TOKEN_REGISTRY[getNetwork()];
@@ -368,4 +422,4 @@ export {
368
422
  SYNTHRA,
369
423
  CHAINLINK
370
424
  };
371
- //# sourceMappingURL=chunk-I7TMY7AS.js.map
425
+ //# sourceMappingURL=chunk-DNRIKCJ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/addresses.ts","../src/lib/address-overrides.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 * Current deployment target: Robinhood L2 testnet (chain 46630) only. Other\n * chains may be added back later; when they are, their address blocks + registry\n * entries re-enter here alongside the robinhood-testnet ones.\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, Hex } from \"viem\";\nimport { isAddress } from \"viem\";\nimport { type Network, getNetwork } from \"./network.js\";\nimport { overridesFor } from \"./address-overrides.js\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\nconst ZERO_BYTES32 =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as `0x${string}`;\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 // USDG (Robinhood-chain stablecoin, 6-dec). Zero on testnet (Synthra WETH-quoted);\n // real on the mainnet fork. Keyed so `--asset USDG` resolves + decimals=6.\n USDG: ZERO,\n // WETH resolves to Synthra's WETH9 (SYNTHRA_WETH): ALL stock DEX liquidity is\n // denominated in it (e.g. the TSLA fee-3000 pool holds ~37.8 WETH here vs\n // ~0.0003 in the canonical WETH pool). It is WETH9-style (payable deposit()),\n // so --use-eth wrapping works against it. Canonical WETH kept as WETH_CANONICAL\n // so the reference isn't lost.\n WETH: \"0x33e4191705c386532ba27cBF171Db86919200B94\" as Address,\n WETH_CANONICAL: \"0x7943e237c7F95DA44E0301572D358911207852Fa\" as Address,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: 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\n// Synthra is Uniswap-V3-compatible; the deployed UniswapSwapAdapter is backed by\n// Synthra's router + a QuoterV2 shim (SYNTHRA_QUOTER_V2_SHIM). SWAP_ROUTER /\n// QUOTER_V2 mirror the Synthra addresses so a direct v3 quote path also resolves.\nconst ROBINHOOD_TESTNET_UNISWAP = {\n SWAP_ROUTER: \"0x3Ce954107b1A675826B33bF23060Dd655e3758fE\" as Address,\n QUOTER_V2: \"0xb3C009aECAeDd5ccC62Ec12eDAAA55F19C4A1eFb\" as Address,\n SWAP_ADAPTER: \"0x4fc3492117cC3bbcE0b210D22a8DC244f9d86490\" as Address,\n} as const;\n\n// ── Synthra DEX (Robinhood L2 — Uniswap V3-compatible concentrated liquidity) ──\n\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 ROBINHOOD_TESTNET_CHAINLINK = {\n VERIFIER_PROXY: \"0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64\" as Address,\n WSTETH_ETH_FEED: ZERO,\n} as const;\n\n// ── Robinhood portfolio-basket route + feed metadata ──\n//\n// Data-driven replacement for the hand-drifting \"known stock\" Set that used to\n// live in strategy-template.ts. Every entry is a VERIFIED-liquidity default\n// swap route for a basket token. Absence from this map means \"no verified\n// default route\" — the CLI fails fast and demands an explicit --swap-routes\n// rather than falling through to a v3 auto-detect that would be dead.\n//\n// `kind: \"v4-native\"` = a Uniswap v4 mode-3 multi-hop USDG → native ETH → stock,\n// consumed by portfolio-template.ts as\n// v4PathExtraData([{currency: ETH, ...native}, {currency: <token>, ...stock}]).\nexport interface RobinhoodStockRoute {\n kind: \"v4-native\";\n nativeFee: number;\n nativeTickSpacing: number;\n stockFee: number;\n stockTickSpacing: number;\n}\n\n// No verified default stock swap routes on the Robinhood testnet — the machinery\n// is retained (see robinhoodEquityMaxAge / portfolio-template.ts) but the map is\n// empty, so every basket token falls to the existing fail-fast route error until\n// a verified route is added.\n// LOCKSTEP: the app's quote-probe geometry (app/src/lib/price-quote.ts\n// V4_DIRECT_TIERS + via-native path) must stay consistent with any route added\n// here, or the dashboard displays a tier the strategy won't execute.\nexport const ROBINHOOD_STOCK_ROUTES: Record<string, RobinhoodStockRoute> = {};\n\n// Chainlink push-feed classification. Every `*_USD_FEED` is an EQUITY feed\n// (needs the extended 96h max-price-age over holiday weekends) EXCEPT these —\n// crypto/FX/stable feeds keep the contract default (26h). Encoded here (not an\n// inline list in the command) so route/feed metadata lives in one registry.\n//\n// WETH is listed alongside ETH because feed auto-resolve normalizes WETH →\n// ETH_USD_FEED (there is no WETH_USD_FEED — the two share the 24h crypto feed).\n// The classification helper below MUST agree with that normalization for every\n// symbol the feed-resolution path accepts, or a WETH allocation packs the 96h\n// equity max-age onto a 24h crypto feed and accepts ~4-day-stale ETH prices.\nexport const ROBINHOOD_NON_EQUITY_FEEDS = new Set([\"ETH\", \"WETH\", \"BTC\", \"LINK\", \"USDG\", \"USDC\"]);\n\n/** True if `symbol`'s Robinhood push feed is a tokenized-equity feed. */\nexport function isRobinhoodEquityFeed(symbol: string): boolean {\n return !ROBINHOOD_NON_EQUITY_FEEDS.has(symbol.toUpperCase());\n}\n\n/**\n * Reverse-lookup a token address against a `TOKENS()` registry to recover its\n * symbol (case-insensitive). Returns undefined for the zero address or an\n * address that isn't registered. Used so a raw-address token spec can still be\n * classified as an equity feed (→ 96h max-price-age) the same way a symbol spec\n * is — otherwise a stock token passed by address silently falls back to the\n * contract's 26h default and trips `StalePrice` over long weekends.\n */\nexport function symbolForTokenAddress(\n address: string,\n tokens: Record<string, Address>,\n): string | undefined {\n if (!address || address.toLowerCase() === ZERO.toLowerCase()) return undefined;\n const want = address.toLowerCase();\n for (const [symbol, addr] of Object.entries(tokens)) {\n if (addr && addr !== ZERO && addr.toLowerCase() === want) return symbol;\n }\n return undefined;\n}\n\n/**\n * Resolve the equity max-price-age (seconds) for a Robinhood push-feed token\n * spec, which may be a SYMBOL or a raw 0x address. Returns the 96h equity\n * default for equity feeds, 0 (contract default) for crypto/stable feeds, and\n * `{ maxPriceAge: 0, unknownAddress: true }` when a raw address isn't in the\n * registry (caller should warn — we can't classify what we can't identify).\n *\n * `equityMaxAgeSeconds` is injected (from the portfolio builder's\n * EQUITY_MAX_PRICE_AGE_SECONDS) to avoid a cross-module import cycle.\n */\nexport function robinhoodEquityMaxAge(\n tokenSpec: string,\n tokens: Record<string, Address>,\n equityMaxAgeSeconds: number,\n): { maxPriceAge: number; unknownAddress: boolean } {\n let symbol: string | undefined;\n if (isAddress(tokenSpec)) {\n symbol = symbolForTokenAddress(tokenSpec, tokens);\n if (!symbol) return { maxPriceAge: 0, unknownAddress: true };\n } else {\n symbol = tokenSpec;\n }\n return {\n maxPriceAge: isRobinhoodEquityFeed(symbol) ? equityMaxAgeSeconds : 0,\n unknownAddress: false,\n };\n}\n\nconst ROBINHOOD_TESTNET_INFRA = {\n MULTICALL3: \"0xcA11bde05977b3631167028862bE2a173976CA11\" as Address, // Deterministic, same everywhere\n} as const;\n\n// ── ENS / Durin ──\n\nconst ROBINHOOD_TESTNET_ENS = {\n L2_REGISTRAR: ZERO,\n L2_REGISTRY: ZERO,\n} as const;\n\n// ── ERC-8004 Agent Identity ──\n\nconst ROBINHOOD_TESTNET_AGENT_REGISTRY = {\n IDENTITY_REGISTRY: ZERO,\n REPUTATION_REGISTRY: ZERO,\n} as const;\n\n// ── Sherwood Protocol (our deployed contracts) ──\n//\n// V2 redeploy (chain 46630): fresh factory/governor/vault-impl/executor plus a\n// full guardian layer (registry + sWOOD + WOOD fixture token) and the V2\n// live-NAV surface (PriceRouter, UniswapSwapAdapter via the Synthra QuoterV2\n// shim, Portfolio template, StrategyFactory). WOOD_TOKEN here is a testnet\n// fixture, not the mainnet OFT.\n//\n// GOVERNOR is the deploy-time bootstrap governor. Governors are per-vault since\n// PR #421 — resolve one at runtime via `factory.governorOf(vault)`\n// (lib/governor.ts `getGovernorOf`), never from this table.\n// Key parity with the SDK book (sdk/src/addresses.ts SherwoodDeployment) is\n// pinned by lib/address-parity.test.ts — add new keys to BOTH books.\nconst ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0xa91AA45AFF32f52b6357044B02a16EBA775feC0b\" as Address,\n GOVERNOR: ZERO, // zeroed since the post-#421 redeploy — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0xA400eFcfFc820C6f812203C58ee00423AeCC0903\" as Address,\n STAKED_WOOD: \"0x21A69A6c9814c0d339C57fDdafed3B283702a739\" as Address,\n WOOD_TOKEN: \"0xCCb4fB59cf40de1E23083037ee81Da1DD747D8d7\" as Address,\n STRATEGY_FACTORY: \"0xb683Bb8EEcBc2419BC3801df6FeA88f96657e670\" as Address,\n MERKL_DISTRIBUTOR: ZERO,\n // Guardian-era contracts from contracts/chains/46630.json (SHE-93).\n VAULT_IMPL: \"0xC57e12d6e2d8Ed49316F0b69c51893CcA44151F7\" as Address,\n BATCH_EXECUTOR_LIB: \"0xF3b8db5aa41c7Ce92478A0Fa9C55a6460533eb86\" as Address,\n GOVERNOR_BEACON: \"0x3D46Ec018cd5893b685b4dfdc3921A4Eb64E11d1\" as Address,\n PROTOCOL_CONFIG: \"0xC104Eb6a522d6718cA28F344B2373B29d57FF2E0\" as Address,\n PRICE_ROUTER: \"0xDd302ffcfA08071780eC1A2f12BccFB9ba6b6731\" as Address,\n TIER_REGISTRY: \"0x99b8068Dc0F6093466964D581f72d947e3e380DB\" as Address,\n CALL_SANDBOX_IMPL: \"0xf09f6AF7DeBB964eD731376C9Af389F2Ce3d872A\" as Address,\n // Not in chains/46630.json (econ-security stack not deployed there yet).\n EXPOSURE_LEDGER: ZERO,\n PROPOSER_BOND_ESCROW: ZERO,\n CHALLENGE_GAME: ZERO,\n TOKEN_COURT: ZERO,\n} as const;\n\n// ── Venice (VVV governance + sVVV staking + DIEM compute) ──\n\nconst ROBINHOOD_TESTNET_VENICE = {\n VVV: ZERO,\n STAKING: ZERO,\n DIEM: ZERO,\n} as const;\n\n// ── Aerodrome (Base ve(3,3) DEX) ──\n\nconst ROBINHOOD_TESTNET_AERODROME = {\n ROUTER: ZERO,\n FACTORY: ZERO,\n} as const;\n\n// ── Strategy Templates (ERC-1167 clonable singletons) ──\n// Populated after running script/DeployTemplates.s.sol\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 // V2 redeploy PORTFOLIO_TEMPLATE (chain 46630).\n PORTFOLIO: \"0x67420Cc504d70a42Adfd8867d878afe0978C7d10\" as Address,\n} as const;\n\n// ── EAS (Ethereum Attestation Service) ──\n\nconst ROBINHOOD_TESTNET_EAS = {\n EAS: ZERO,\n SCHEMA_REGISTRY: ZERO,\n} as const;\n\n// EAS on Robinhood Chain mainnet (4663). Deployed by Sherwood — EAS is not a\n// predeploy on an Arbitrum Orbit chain. sherwoodagent/sherwood-protocol#278.\nconst ROBINHOOD_MAINNET_EAS = {\n EAS: \"0x7d70441Bb10AcE5d9771dc0b6205D89ddf63205B\" as Address,\n SCHEMA_REGISTRY: \"0xdd7521Ba10773e556Defa6D6c133cB2F663b5c26\" as Address,\n} as const;\n\n/**\n * Schema UIDs are chain-INDEPENDENT: uid = keccak256(schema, resolver,\n * revocable) carries no chainId. With resolver = address(0) these are the same\n * UIDs already registered on Base, and re-registering the same definitions on\n * any chain reproduces them. Verified against Base's live SchemaRegistry.\n */\nconst SHERWOOD_EAS_SCHEMAS = {\n SYNDICATE_JOIN_REQUEST: \"0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef\" as Hex,\n AGENT_APPROVED: \"0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607\" as Hex,\n X402_RESEARCH: \"0x86c67f0a59acb3093ecbeb6c4d1d4352e4a48143672e92ef9dd2fdfc8a9ca708\" as Hex,\n VENICE_PROVISION: \"0x76d4d6baa72307826cd2fd4ce069bb42ee54cdda6ed6ab208c8d233c893fb7f1\" as Hex,\n VENICE_INFERENCE: \"0xf9b4e530f3016c19439b67372a1c213c9339857627fb817032614b97433a2a14\" as Hex,\n TRADE_EXECUTED: \"0x06bb488363a468f7f857ddc8cfffe918d048b8746a0d59eca9cd7f58dbdb4af6\" as Hex,\n} as const;\n\n/**\n * Every non-EAS address book, for the coordination chain. Sherwood core is not\n * deployed on 4663, so these are all zero BY CONSTRUCTION rather than by\n * omission — mapping them to the testnet book would silently hand out 46630\n * addresses during the brief `withNetwork` window an EAS write opens.\n */\nfunction noneOf<T extends Record<string, unknown>>(shape: T): T {\n return Object.fromEntries(Object.keys(shape).map((k) => [k, ZERO])) as T;\n}\n\n// ── EAS Schema UIDs (populated after running scripts/register-eas-schemas.ts) ──\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\n// ── Robinhood Chain mainnet fork (Tenderly vnet, chain 9994663) ──\n//\n// Fork of Robinhood *mainnet*: USDG stablecoin (6-dec), official Uniswap v3+v4,\n// Chainlink PUSH feeds. VERIFIER_PROXY = 0 makes PortfolioStrategy run in\n// push-feed mode (feedIds are AggregatorV3 proxy addresses). Core addresses\n// come from sherwood-protocol/chains/9994663.json (fresh deploy). USDG is passed\n// as a raw --asset address (not a token-shape key); stock baskets use raw token\n// addresses + explicit --feed-ids/--swap-routes until the symbol registry lands.\n\nconst ROBINHOOD_FORK_TOKENS: typeof ROBINHOOD_TESTNET_TOKENS = {\n USDC: ZERO,\n USDG: \"0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168\" as Address,\n WETH: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\" as Address,\n WETH_CANONICAL: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\" as Address,\n cbETH: ZERO,\n wstETH: ZERO,\n cbBTC: ZERO,\n DAI: ZERO,\n AERO: ZERO,\n TSLA: \"0x322F0929c4625eD5bAd873c95208D54E1c003b2d\" as Address,\n AMZN: \"0x12f190a9F9d7D37a250758b26824B97CE941bF54\" as Address,\n PLTR: ZERO,\n NFLX: ZERO,\n AMD: \"0x86923f96303D656E4aa86D9d42D1e57ad2023fdC\" as Address,\n};\n\nconst ROBINHOOD_FORK_UNISWAP: typeof ROBINHOOD_TESTNET_UNISWAP = {\n SWAP_ROUTER: \"0xcaf681a66d020601342297493863e78c959e5cb2\" as Address,\n QUOTER_V2: \"0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7\" as Address,\n SWAP_ADAPTER: \"0xdBf12248c68d1FCb6083f431A1d6ab6d0ef84E49\" as Address,\n};\n\n// VERIFIER_PROXY = 0 ⇒ PortfolioStrategy push-feed mode (Robinhood-mainnet-style).\nconst ROBINHOOD_FORK_CHAINLINK: typeof ROBINHOOD_TESTNET_CHAINLINK = {\n VERIFIER_PROXY: ZERO,\n WSTETH_ETH_FEED: ZERO,\n};\n\nconst ROBINHOOD_FORK_SHERWOOD: typeof ROBINHOOD_TESTNET_SHERWOOD = {\n FACTORY: \"0x02bc9B9C1A4322D5A5df86DadA0a2a02e45108B9\" as Address,\n GOVERNOR: ZERO, // per-vault — always factory.governorOf(vault)\n GUARDIAN_REGISTRY: \"0xdfEe38C4D7595c9c04AdBcaFE01E4Fd6FD6117f4\" as Address,\n STAKED_WOOD: \"0xD3037D28693cc7BB3DbF1E17B6e01C4ce628f6DF\" as Address,\n WOOD_TOKEN: \"0xF8BC08092C06dB6148114DCf82AF881F1085f92b\" as Address,\n STRATEGY_FACTORY: \"0xb3C009aECAeDd5ccC62Ec12eDAAA55F19C4A1eFb\" as Address,\n MERKL_DISTRIBUTOR: ZERO,\n // Guardian-era contracts from sherwood-protocol/chains/9994663.json (SHE-93).\n VAULT_IMPL: \"0x9BF51da59B13746e6cCeb1b35c398EDA9776a4Dc\" as Address,\n BATCH_EXECUTOR_LIB: \"0xdBdBce2af4222Abe0cCDAc05f84364a50577B5a2\" as Address,\n GOVERNOR_BEACON: \"0x2e8aB422Db9127F1a70d8C38A15903f22B51DA97\" as Address,\n PROTOCOL_CONFIG: \"0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab\" as Address,\n // Not in chains/9994663.json (no PriceRouter / CallSandbox on the fork).\n PRICE_ROUTER: ZERO,\n TIER_REGISTRY: \"0x42B089B816F994d792481fAa308199E9CF63be9f\" as Address,\n CALL_SANDBOX_IMPL: ZERO,\n EXPOSURE_LEDGER: \"0x223e2Fd41aD6487333146fc3998d000E74CB1549\" as Address,\n PROPOSER_BOND_ESCROW: \"0xef2D6994faCad11e6CfAF3DaBf7b0B2091009B05\" as Address,\n CHALLENGE_GAME: \"0x202c1F133006D6706e872433CCAfD729c7A8AE56\" as Address,\n TOKEN_COURT: \"0x5DC603881f5d77f41bbd4202F1d518263Dfd497f\" as Address,\n};\n\nconst ROBINHOOD_FORK_STRATEGY_TEMPLATES: typeof ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {\n MOONWELL_SUPPLY: ZERO,\n AERODROME_LP: ZERO,\n VENICE_INFERENCE: ZERO,\n WSTETH_MOONWELL: ZERO,\n MAMO_YIELD: ZERO,\n HYPERLIQUID_PERP: ZERO,\n HYPERLIQUID_GRID: ZERO,\n PORTFOLIO: \"0x0e768a93B814282776022c3EBfc4e3f22Fa1605E\" as Address,\n};\n\n// ── Registries (map-based lookup) ──\n\nconst TOKEN_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_TOKENS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_TOKENS,\n \"robinhood-fork\": ROBINHOOD_FORK_TOKENS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_TOKENS), // coordination chain — no Sherwood contracts\n};\n\nconst MOONWELL_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_MOONWELL> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_MOONWELL,\n \"robinhood-fork\": ROBINHOOD_TESTNET_MOONWELL,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_MOONWELL), // coordination chain — no Sherwood contracts\n};\n\nconst UNISWAP_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_UNISWAP> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_UNISWAP,\n \"robinhood-fork\": ROBINHOOD_FORK_UNISWAP,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_UNISWAP), // coordination chain — no Sherwood contracts\n};\n\nconst INFRA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_INFRA> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_INFRA,\n \"robinhood-fork\": ROBINHOOD_TESTNET_INFRA,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_INFRA), // coordination chain — no Sherwood contracts\n};\n\nconst ENS_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_ENS> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_ENS,\n \"robinhood-fork\": ROBINHOOD_TESTNET_ENS,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_ENS), // coordination chain — no Sherwood contracts\n};\n\nconst AGENT_REGISTRY_MAP: Record<Network, typeof ROBINHOOD_TESTNET_AGENT_REGISTRY> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AGENT_REGISTRY,\n \"robinhood-fork\": ROBINHOOD_TESTNET_AGENT_REGISTRY,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_AGENT_REGISTRY), // coordination chain — no Sherwood contracts\n};\n\nconst SHERWOOD_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_SHERWOOD> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SHERWOOD,\n \"robinhood-fork\": ROBINHOOD_FORK_SHERWOOD,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_SHERWOOD), // coordination chain — no Sherwood contracts\n};\n\nconst VENICE_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_VENICE> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_VENICE,\n \"robinhood-fork\": ROBINHOOD_TESTNET_VENICE,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_VENICE), // coordination chain — no Sherwood contracts\n};\n\nconst AERODROME_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_AERODROME> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_AERODROME,\n \"robinhood-fork\": ROBINHOOD_TESTNET_AERODROME,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_AERODROME), // coordination chain — no Sherwood contracts\n};\n\nconst STRATEGY_TEMPLATE_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_STRATEGY_TEMPLATES> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES,\n \"robinhood-fork\": ROBINHOOD_FORK_STRATEGY_TEMPLATES,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_STRATEGY_TEMPLATES), // coordination chain — no Sherwood contracts\n};\n\nconst SYNTHRA_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_SYNTHRA> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_SYNTHRA,\n \"robinhood-fork\": ROBINHOOD_TESTNET_SYNTHRA, // unused on the fork (Uniswap, not Synthra)\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_SYNTHRA), // coordination chain — no Sherwood contracts\n};\n\nconst CHAINLINK_REGISTRY: Record<Network, typeof ROBINHOOD_TESTNET_CHAINLINK> = {\n \"robinhood-testnet\": ROBINHOOD_TESTNET_CHAINLINK,\n \"robinhood-fork\": ROBINHOOD_FORK_CHAINLINK,\n \"robinhood-mainnet\": noneOf(ROBINHOOD_TESTNET_CHAINLINK), // coordination chain — no Sherwood contracts\n};\n\n// Attestations live on chain 4663 no matter which chain the fund is on,\n// so every network resolves to the same book (spec §5.1).\nconst EAS_CONTRACT_REGISTRY: Record<Network, typeof ROBINHOOD_MAINNET_EAS> = {\n \"robinhood-testnet\": ROBINHOOD_MAINNET_EAS,\n \"robinhood-fork\": ROBINHOOD_MAINNET_EAS,\n \"robinhood-mainnet\": ROBINHOOD_MAINNET_EAS,\n};\n\n// Attestations live on chain 4663 no matter which chain the fund is on,\n// so every network resolves to the same book (spec §5.1).\nconst EAS_SCHEMA_REGISTRY: Record<Network, typeof SHERWOOD_EAS_SCHEMAS> = {\n \"robinhood-testnet\": SHERWOOD_EAS_SCHEMAS,\n \"robinhood-fork\": SHERWOOD_EAS_SCHEMAS,\n \"robinhood-mainnet\": SHERWOOD_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()], ...overridesFor(\"UNISWAP\") };\n}\n\nexport function INFRA() {\n return INFRA_REGISTRY[getNetwork()];\n}\n\nexport function ENS() {\n return { ...ENS_REGISTRY[getNetwork()], ...overridesFor(\"ENS\") };\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()], ...overridesFor(\"SHERWOOD\") };\n}\n\nexport function AERODROME() {\n return AERODROME_REGISTRY[getNetwork()];\n}\n\nexport function STRATEGY_TEMPLATES() {\n return {\n ...STRATEGY_TEMPLATE_REGISTRY[getNetwork()],\n ...overridesFor(\"STRATEGY_TEMPLATES\"),\n };\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","/**\n * SIM_ADDRESSES_FILE override layer (spec G1).\n *\n * Points the CLI at a vnet deployment: a chains/{chainId}.json-shaped file\n * (CAPS_SNAKE_CASE keys, written by contracts deploy scripts) is mapped onto\n * the CLI's per-registry key names and merged over the base network registry\n * at call time. Only 0x-string values are considered. Fail-closed: a set-but-\n * unreadable file throws rather than silently using mainnet addresses.\n */\nimport { readFileSync } from \"node:fs\";\nimport type { Address } from \"viem\";\n\ntype RegistryName = \"SHERWOOD\" | \"STRATEGY_TEMPLATES\" | \"ENS\" | \"UNISWAP\";\n\n// chains-json key → CLI registry key, grouped by target registry.\n// Extend when deploy scripts gain keys the CLI reads (Task 1 Step 2).\n//\n// STRATEGY_TEMPLATES note (Task 1 Step 2 finding): the deploy scripts\n// (DeployTemplates.s.sol / DeployStrategyFactory.s.sol) write chains.json\n// keys with a `_TEMPLATE` suffix (e.g. `MOONWELL_SUPPLY_TEMPLATE`), but the\n// CLI-side STRATEGY_TEMPLATES() registry (cli/src/lib/addresses.ts\n// `BASE_STRATEGY_TEMPLATES`) and its consumers (e.g.\n// cli/src/commands/strategy-template.ts `addressKey: \"MOONWELL_SUPPLY\"`) key\n// off the UNSUFFIXED name. The map below strips the suffix so overrides\n// actually reach the keys the CLI reads.\nconst CHAINS_TO_CLI: Record<RegistryName, Record<string, string>> = {\n SHERWOOD: {\n SYNDICATE_FACTORY: \"FACTORY\",\n SYNDICATE_GOVERNOR: \"GOVERNOR\",\n GUARDIAN_REGISTRY: \"GUARDIAN_REGISTRY\",\n STAKED_WOOD: \"STAKED_WOOD\",\n WOOD: \"WOOD_TOKEN\",\n WOOD_TOKEN: \"WOOD_TOKEN\",\n STRATEGY_FACTORY: \"STRATEGY_FACTORY\",\n },\n STRATEGY_TEMPLATES: {\n MOONWELL_SUPPLY_TEMPLATE: \"MOONWELL_SUPPLY\",\n AERODROME_LP_TEMPLATE: \"AERODROME_LP\",\n VENICE_INFERENCE_TEMPLATE: \"VENICE_INFERENCE\",\n WSTETH_MOONWELL_TEMPLATE: \"WSTETH_MOONWELL\",\n MAMO_YIELD_TEMPLATE: \"MAMO_YIELD\",\n PORTFOLIO_TEMPLATE: \"PORTFOLIO\",\n HYPERLIQUID_PERP_TEMPLATE: \"HYPERLIQUID_PERP\",\n HYPERLIQUID_GRID_TEMPLATE: \"HYPERLIQUID_GRID\",\n },\n ENS: {\n L2_REGISTRAR: \"L2_REGISTRAR\",\n L2_REGISTRY: \"L2_REGISTRY\",\n },\n UNISWAP: {\n UNISWAP_SWAP_ADAPTER: \"SWAP_ADAPTER\",\n },\n};\n\nlet cached: Record<string, Address> | null | undefined;\n\nfunction loadFile(): Record<string, Address> | null {\n if (cached !== undefined) return cached;\n const file = process.env.SIM_ADDRESSES_FILE;\n if (!file) {\n cached = null;\n return cached;\n }\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(readFileSync(file, \"utf8\")) as Record<string, unknown>;\n } catch (err) {\n throw new Error(\n `SIM_ADDRESSES_FILE is set (${file}) but unreadable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n const out: Record<string, Address> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v === \"string\" && v.startsWith(\"0x\")) out[k] = v as Address;\n }\n cached = out;\n return cached;\n}\n\n/** Mapped overrides for one CLI registry; {} when SIM_ADDRESSES_FILE unset. */\nexport function overridesFor(registry: RegistryName): Record<string, Address> {\n const file = loadFile();\n if (!file) return {};\n const map = CHAINS_TO_CLI[registry];\n const out: Record<string, Address> = {};\n for (const [chainsKey, cliKey] of Object.entries(map)) {\n if (file[chainsKey]) out[cliKey] = file[chainsKey];\n }\n return out;\n}\n\nexport function __resetOverridesCacheForTests(): void {\n cached = undefined;\n}\n"],"mappings":";;;;;AAgBA,SAAS,iBAAiB;;;ACP1B,SAAS,oBAAoB;AAgB7B,IAAM,gBAA8D;AAAA,EAClE,UAAU;AAAA,IACR,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,kBAAkB;AAAA,EACpB;AAAA,EACA,oBAAoB;AAAA,IAClB,0BAA0B;AAAA,IAC1B,uBAAuB;AAAA,IACvB,2BAA2B;AAAA,IAC3B,0BAA0B;AAAA,IAC1B,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,EAC7B;AAAA,EACA,KAAK;AAAA,IACH,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,sBAAsB;AAAA,EACxB;AACF;AAEA,IAAI;AAEJ,SAAS,WAA2C;AAClD,MAAI,WAAW,OAAW,QAAO;AACjC,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,CAAC,MAAM;AACT,aAAS;AACT,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA,EAC7C,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,8BAA8B,IAAI,qBAAqB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACzG;AAAA,EACF;AACA,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,QAAI,OAAO,MAAM,YAAY,EAAE,WAAW,IAAI,EAAG,KAAI,CAAC,IAAI;AAAA,EAC5D;AACA,WAAS;AACT,SAAO;AACT;AAGO,SAAS,aAAa,UAAiD;AAC5E,QAAM,OAAO,SAAS;AACtB,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,MAAM,cAAc,QAAQ;AAClC,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,GAAG,GAAG;AACrD,QAAI,KAAK,SAAS,EAAG,KAAI,MAAM,IAAI,KAAK,SAAS;AAAA,EACnD;AACA,SAAO;AACT;;;ADrEA,IAAM,OAAgB;AAOtB,IAAM,2BAA2B;AAAA,EAC/B,MAAM;AAAA;AAAA;AAAA,EAGN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AACP;AAEA,IAAM,6BAA6B;AAAA,EACjC,aAAa;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACT;AAKA,IAAM,4BAA4B;AAAA,EAChC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAChB;AAIA,IAAM,4BAA4B;AAAA,EAChC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAIA,IAAM,8BAA8B;AAAA,EAClC,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AA4BO,IAAM,yBAA8D,CAAC;AAYrE,IAAM,6BAA6B,oBAAI,IAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAGzF,SAAS,sBAAsB,QAAyB;AAC7D,SAAO,CAAC,2BAA2B,IAAI,OAAO,YAAY,CAAC;AAC7D;AAUO,SAAS,sBACd,SACA,QACoB;AACpB,MAAI,CAAC,WAAW,QAAQ,YAAY,MAAM,KAAK,YAAY,EAAG,QAAO;AACrE,QAAM,OAAO,QAAQ,YAAY;AACjC,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AACnD,QAAI,QAAQ,SAAS,QAAQ,KAAK,YAAY,MAAM,KAAM,QAAO;AAAA,EACnE;AACA,SAAO;AACT;AAYO,SAAS,sBACd,WACA,QACA,qBACkD;AAClD,MAAI;AACJ,MAAI,UAAU,SAAS,GAAG;AACxB,aAAS,sBAAsB,WAAW,MAAM;AAChD,QAAI,CAAC,OAAQ,QAAO,EAAE,aAAa,GAAG,gBAAgB,KAAK;AAAA,EAC7D,OAAO;AACL,aAAS;AAAA,EACX;AACA,SAAO;AAAA,IACL,aAAa,sBAAsB,MAAM,IAAI,sBAAsB;AAAA,IACnE,gBAAgB;AAAA,EAClB;AACF;AAEA,IAAM,0BAA0B;AAAA,EAC9B,YAAY;AAAA;AACd;AAIA,IAAM,wBAAwB;AAAA,EAC5B,cAAc;AAAA,EACd,aAAa;AACf;AAIA,IAAM,mCAAmC;AAAA,EACvC,mBAAmB;AAAA,EACnB,qBAAqB;AACvB;AAeA,IAAM,6BAA6B;AAAA,EACjC,SAAS;AAAA,EACT,UAAU;AAAA;AAAA,EACV,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,mBAAmB;AAAA;AAAA,EAEnB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA;AAAA,EAEnB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,aAAa;AACf;AAIA,IAAM,2BAA2B;AAAA,EAC/B,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AACR;AAIA,IAAM,8BAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,SAAS;AACX;AAKA,IAAM,uCAAuC;AAAA,EAC3C,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,kBAAkB;AAAA;AAAA,EAElB,WAAW;AACb;AAWA,IAAM,wBAAwB;AAAA,EAC5B,KAAK;AAAA,EACL,iBAAiB;AACnB;AAQA,IAAM,uBAAuB;AAAA,EAC3B,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,gBAAgB;AAClB;AAQA,SAAS,OAA0C,OAAa;AAC9D,SAAO,OAAO,YAAY,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE;AAsBA,IAAM,wBAAyD;AAAA,EAC7D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AACP;AAEA,IAAM,yBAA2D;AAAA,EAC/D,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAChB;AAGA,IAAM,2BAA+D;AAAA,EACnE,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAEA,IAAM,0BAA6D;AAAA,EACjE,SAAS;AAAA,EACT,UAAU;AAAA;AAAA,EACV,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,mBAAmB;AAAA;AAAA,EAEnB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA;AAAA,EAEjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,aAAa;AACf;AAEA,IAAM,oCAAiF;AAAA,EACrF,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,WAAW;AACb;AAIA,IAAM,iBAAmE;AAAA,EACvE,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,wBAAwB;AAAA;AACtD;AAEA,IAAM,oBAAwE;AAAA,EAC5E,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,0BAA0B;AAAA;AACxD;AAEA,IAAM,mBAAsE;AAAA,EAC1E,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,yBAAyB;AAAA;AACvD;AAEA,IAAM,iBAAkE;AAAA,EACtE,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,uBAAuB;AAAA;AACrD;AAEA,IAAM,eAA8D;AAAA,EAClE,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,qBAAqB;AAAA;AACnD;AAEA,IAAM,qBAA+E;AAAA,EACnF,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,gCAAgC;AAAA;AAC9D;AAEA,IAAM,oBAAwE;AAAA,EAC5E,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,0BAA0B;AAAA;AACxD;AAEA,IAAM,kBAAoE;AAAA,EACxE,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,wBAAwB;AAAA;AACtD;AAEA,IAAM,qBAA0E;AAAA,EAC9E,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,2BAA2B;AAAA;AACzD;AAEA,IAAM,6BAA2F;AAAA,EAC/F,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,oCAAoC;AAAA;AAClE;AAEA,IAAM,mBAAsE;AAAA,EAC1E,qBAAqB;AAAA,EACrB,kBAAkB;AAAA;AAAA,EAClB,qBAAqB,OAAO,yBAAyB;AAAA;AACvD;AAEA,IAAM,qBAA0E;AAAA,EAC9E,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB,OAAO,2BAA2B;AAAA;AACzD;AAIA,IAAM,wBAAuE;AAAA,EAC3E,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB;AACvB;AAIA,IAAM,sBAAoE;AAAA,EACxE,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,qBAAqB;AACvB;AAIO,SAAS,SAAS;AACvB,SAAO,eAAe,WAAW,CAAC;AACpC;AAEO,SAAS,WAAW;AACzB,SAAO,kBAAkB,WAAW,CAAC;AACvC;AAEO,SAAS,UAAU;AACxB,SAAO,EAAE,GAAG,iBAAiB,WAAW,CAAC,GAAG,GAAG,aAAa,SAAS,EAAE;AACzE;AAEO,SAAS,QAAQ;AACtB,SAAO,eAAe,WAAW,CAAC;AACpC;AAEO,SAAS,MAAM;AACpB,SAAO,EAAE,GAAG,aAAa,WAAW,CAAC,GAAG,GAAG,aAAa,KAAK,EAAE;AACjE;AAEO,SAAS,iBAAiB;AAC/B,SAAO,mBAAmB,WAAW,CAAC;AACxC;AAEO,SAAS,SAAS;AACvB,SAAO,gBAAgB,WAAW,CAAC;AACrC;AAEO,SAAS,WAAW;AACzB,SAAO,EAAE,GAAG,kBAAkB,WAAW,CAAC,GAAG,GAAG,aAAa,UAAU,EAAE;AAC3E;AAEO,SAAS,YAAY;AAC1B,SAAO,mBAAmB,WAAW,CAAC;AACxC;AAEO,SAAS,qBAAqB;AACnC,SAAO;AAAA,IACL,GAAG,2BAA2B,WAAW,CAAC;AAAA,IAC1C,GAAG,aAAa,oBAAoB;AAAA,EACtC;AACF;AAEO,SAAS,gBAAgB;AAC9B,SAAO,sBAAsB,WAAW,CAAC;AAC3C;AAEO,SAAS,cAAc;AAC5B,SAAO,oBAAoB,WAAW,CAAC;AACzC;AAEO,SAAS,UAAU;AACxB,SAAO,iBAAiB,WAAW,CAAC;AACtC;AAEO,SAAS,YAAY;AAC1B,SAAO,mBAAmB,WAAW,CAAC;AACxC;","names":[]}