@sherwoodagent/cli 0.89.3 → 0.90.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 (28) hide show
  1. package/dist/{chat-EVRY5BV3.js → chat-PFXIL6WT.js} +5 -5
  2. package/dist/{chunk-WAF3JU5J.js → chunk-J3JMMJLN.js} +2 -2
  3. package/dist/{chunk-NJNK6GTJ.js → chunk-KRASHQRB.js} +4 -4
  4. package/dist/{chunk-UCULHATO.js → chunk-XQHRKFFH.js} +48 -9
  5. package/dist/chunk-XQHRKFFH.js.map +1 -0
  6. package/dist/{chunk-6KXITNND.js → chunk-ZCRVHITI.js} +9 -9
  7. package/dist/{identity-462SMK5H.js → identity-M6UIVBNX.js} +4 -4
  8. package/dist/index.js +291 -197
  9. package/dist/index.js.map +1 -1
  10. package/dist/{lighter-preflight-TSLSSYWI.js → lighter-preflight-R7C6HY3M.js} +5 -5
  11. package/dist/{price-QKOARHS4.js → price-PBFF6NFU.js} +3 -3
  12. package/dist/{research-3L3BTHWY.js → research-ZH34O7YL.js} +1 -1
  13. package/dist/{session-27X337LQ.js → session-GSWEE4M3.js} +3 -3
  14. package/dist/{trade-6Q7VCDEA.js → trade-SHK7GKSI.js} +3 -3
  15. package/dist/{vault-TQWUWBSG.js → vault-3T6UHCPE.js} +4 -4
  16. package/package.json +1 -1
  17. package/dist/chunk-UCULHATO.js.map +0 -1
  18. /package/dist/{chat-EVRY5BV3.js.map → chat-PFXIL6WT.js.map} +0 -0
  19. /package/dist/{chunk-WAF3JU5J.js.map → chunk-J3JMMJLN.js.map} +0 -0
  20. /package/dist/{chunk-NJNK6GTJ.js.map → chunk-KRASHQRB.js.map} +0 -0
  21. /package/dist/{chunk-6KXITNND.js.map → chunk-ZCRVHITI.js.map} +0 -0
  22. /package/dist/{identity-462SMK5H.js.map → identity-M6UIVBNX.js.map} +0 -0
  23. /package/dist/{lighter-preflight-TSLSSYWI.js.map → lighter-preflight-R7C6HY3M.js.map} +0 -0
  24. /package/dist/{price-QKOARHS4.js.map → price-PBFF6NFU.js.map} +0 -0
  25. /package/dist/{research-3L3BTHWY.js.map → research-ZH34O7YL.js.map} +0 -0
  26. /package/dist/{session-27X337LQ.js.map → session-GSWEE4M3.js.map} +0 -0
  27. /package/dist/{trade-6Q7VCDEA.js.map → trade-SHK7GKSI.js.map} +0 -0
  28. /package/dist/{vault-TQWUWBSG.js.map → vault-3T6UHCPE.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/identity.ts","../src/lib/identity-mirror.ts","../src/lib/virtuals.ts","../../sdk/dist/generated/state-machines.js","../../sdk/dist/types.js","../../sdk/dist/errors.js","../../sdk/dist/abis.js","../../sdk/dist/protocol-selectors.js","../../sdk/dist/addresses.js","../../sdk/dist/encoders/vault.js","../../sdk/dist/encoders/governor.js","../../sdk/dist/encoders/factory.js","../../sdk/dist/encoders/strategy.js","../../sdk/dist/encoders/identity.js","../../sdk/dist/encoders/eas.js","../../sdk/dist/encoders/guardian.js","../../sdk/dist/reads/funds.js"],"sourcesContent":["/**\n * Identity commands — sherwood identity <subcommand>\n *\n * ERC-8004 agent identity lives on the COORDINATION chain (Robinhood mainnet,\n * 4663) whatever chain the fund itself runs on: the canonical IdentityRegistry\n * is deployed there and nowhere else in our lineup (the fork / testnet entries\n * are address(0) on purpose). Every subcommand therefore reads and writes it\n * with plain viem calls under `withNetwork(COORDINATION_NETWORK, …)`.\n *\n * The Agent0 SDK is only reachable from `link-virtuals` for the Base /\n * Base Sepolia issuing chains its hosted subgraphs actually index — nothing on\n * 4663 goes through it.\n *\n * Handles: mint (register), find, check status, load existing agent.\n * Required before creating or joining funds.\n */\n\nimport { Command } from \"commander\";\nimport { getAddress, isAddress, type Address } from \"viem\";\nimport { generatePrivateKey } from \"viem/accounts\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { SDK } from \"agent0-sdk\";\nimport { getPublicClient, getAccount, formatContractError, sendTxWithRetry, waitForReceipt } from \"../lib/client.js\";\nimport { withNetwork, getChain } from \"../lib/network.js\";\nimport { COORDINATION_NETWORK } from \"../lib/eas.js\";\nimport { AGENT_REGISTRY } from \"../lib/addresses.js\";\nimport { resolveMetadataSummary } from \"../lib/ipfs.js\";\nimport { publishIdentityLink } from \"../lib/identity-mirror.js\";\nimport {\n setAgentId,\n getAgentId,\n setVirtualsIdentity,\n getVirtualsIdentity,\n getIdentityProvider,\n getIdentityChainId,\n} from \"../lib/config.js\";\nimport {\n ISSUING_CHAINS,\n DEFAULT_ISSUING_CHAIN_ID,\n WALLET_ONLY_CHAIN_ID,\n buildBindingMessage,\n verifyBinding,\n ownerOfOnIssuingChain,\n detectAcp,\n acpWhoami,\n acpWalletAddress,\n acpSignMessage,\n} from \"../lib/virtuals.js\";\nimport { isCalldataOnly, emitCalldata } from \"../lib/calldata.js\";\nimport { encodeIdentityMint, type ChainId } from \"@sherwoodagent/sdk\";\n\n/** Robinhood mainnet — the coordination chain every identity op targets. */\nconst COORDINATION_CHAIN_ID = 4663;\n\n// ── ABI (minimal — identity reads are plain viem calls, no SDK) ──\n\nconst IDENTITY_REGISTRY_ABI = [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"ownerOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"tokenURI\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n] as const;\n\n/**\n * ERC-8004 token ids currently held by `wallet`. The canonical 4663 registry is\n * NOT ERC721Enumerable (no tokenOfOwnerByIndex — probed on-chain) and no\n * subgraph covers the chain, so this walks mint Transfer logs (from = 0x0,\n * to = wallet) and keeps the ids `ownerOf` still reports as the wallet's.\n * Identities received by transfer are invisible to it — there is no index.\n *\n * Assumes the coordination network is already active (caller wraps).\n */\nasync function ownedAgentIds(wallet: Address): Promise<bigint[]> {\n const client = getPublicClient();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const balance = (await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"balanceOf\",\n args: [wallet],\n })) as bigint;\n if (balance === 0n) return [];\n const logs = await client.getLogs({\n address: registry,\n event: {\n type: \"event\", name: \"Transfer\",\n inputs: [\n { indexed: true, name: \"from\", type: \"address\" },\n { indexed: true, name: \"to\", type: \"address\" },\n { indexed: true, name: \"tokenId\", type: \"uint256\" },\n ],\n },\n args: { from: \"0x0000000000000000000000000000000000000000\", to: wallet },\n fromBlock: 0n,\n });\n const minted = [...new Set(logs.map((l) => l.args?.tokenId).filter((id): id is bigint => id != null))];\n const owned: bigint[] = [];\n for (const id of minted) {\n try {\n const owner = (await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [id],\n })) as Address;\n if (owner.toLowerCase() === wallet.toLowerCase()) owned.push(id);\n } catch {\n // burned / non-existent — skip\n }\n }\n return owned;\n}\n\n/** `ownedAgentIds` on the coordination chain, whatever `--chain` is active. */\nexport async function lookupAgentIdsByWallet(wallet: Address): Promise<bigint[]> {\n return withNetwork(COORDINATION_NETWORK, () => ownedAgentIds(wallet));\n}\n\n/**\n * Resolve an agent's ERC-8004 tokenId from its wallet, on the coordination\n * chain — the most recent mint it still holds. Null when it holds none.\n */\nexport async function lookupAgentIdByWallet(wallet: Address): Promise<bigint | null> {\n const ids = await lookupAgentIdsByWallet(wallet);\n return ids[ids.length - 1] ?? null;\n}\n\n/**\n * name / description from a token's ERC-8004 registration URI (`tokenURI` — a\n * `data:application/json;base64,…` blob for CLI-minted agents, ipfs:// for\n * Agent0-minted ones). Null on any failure: metadata is decoration.\n *\n * Assumes the coordination network is already active (caller wraps).\n */\nasync function readIdentityMetadata(tokenId: bigint): Promise<{ name: string; description: string } | null> {\n try {\n const uri = (await getPublicClient().readContract({\n address: AGENT_REGISTRY().IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"tokenURI\",\n args: [tokenId],\n })) as string;\n return await resolveMetadataSummary(uri);\n } catch {\n return null;\n }\n}\n\n/**\n * Publish a freshly minted or loaded self-held identity to the metadata mirror\n * and say what happened.\n *\n * Never throws and never exits non-zero: the identity is already on chain by\n * this point, and the mirror discovers unpublished links on its own. A failure\n * here delays the agent's name appearing, it does not lose anything.\n */\nasync function announceIdentityToMirror(wallet: Address, tokenId: number): Promise<void> {\n const fundChainId = getChain().id;\n const result = await publishIdentityLink({\n wallet,\n tokenId,\n issuingChainId: COORDINATION_CHAIN_ID,\n fundChainId,\n });\n if (result.ok) {\n console.log(chalk.dim(` Published to the metadata mirror (chain ${fundChainId})`));\n return;\n }\n console.log(chalk.yellow(` Could not publish to the metadata mirror: ${result.reason}`));\n console.log(chalk.dim(\" Harmless — the mirror discovers unpublished identities on its own.\"));\n}\n\nexport function registerIdentityCommands(program: Command): void {\n const identity = program\n .command(\"identity\")\n .description(\"Manage ERC-8004 agent identity (on Robinhood mainnet, chain 4663)\");\n\n // ── identity mint ──\n\n identity\n .command(\"mint\")\n .description(\"Register a new ERC-8004 agent identity (required before creating/joining vaults)\")\n .requiredOption(\"--name <name>\", \"Agent name (e.g. 'Alpha Seeker Agent')\")\n .option(\"--description <desc>\", \"Agent description\", \"Sherwood vault agent\")\n .option(\"--image <uri>\", \"Agent image URI (IPFS recommended)\")\n .action(async (opts) => {\n // --calldata-only: emit the unsigned ERC-8004 register() calldata and\n // stop. No Agent0 SDK init, no IPFS, no private key.\n if (isCalldataOnly()) {\n // Identity mints on the coordination chain (4663) even under\n // --calldata-only; the emitted tx carries chainId 4663 for the signer.\n emitCalldata(\n encodeIdentityMint(\n {\n name: opts.name,\n description: opts.description,\n image: opts.image,\n },\n COORDINATION_CHAIN_ID as ChainId,\n ),\n );\n return;\n }\n\n const account = getAccount();\n\n // Check if wallet already has an identity\n const existingId = getAgentId();\n if (existingId) {\n console.log(chalk.yellow(`You already have an agent identity saved: #${existingId}`));\n console.log(chalk.dim(\" Minting a new one anyway. The old ID is not affected.\"));\n console.log();\n }\n\n // Identity lives on the COORDINATION chain (Robinhood mainnet, 4663),\n // not the active fund chain — same model as EAS attestations. Minting\n // goes through the SDK encoder (data-URI registration JSON, no IPFS)\n // rather than the Agent0 SDK: Agent0's hosted infrastructure does not\n // cover 4663 (agent0-sdk 1.7.1 ships subgraphs for 1/8453/11155111/\n // 84532/137 only), while a plain register() needs nothing but RPC.\n const spinner = ora(\"Minting ERC-8004 identity on Robinhood mainnet...\").start();\n try {\n const tokenId = await withNetwork(COORDINATION_NETWORK, async () => {\n const client = getPublicClient();\n const balance = await client.getBalance({ address: account.address });\n if (balance === 0n) {\n throw new Error(\n `No ETH on Robinhood mainnet (chain 4663) for ${account.address}. ` +\n `Identity is minted on the coordination chain regardless of your ` +\n `vault's chain; a mint costs well under 0.0001 ETH.`,\n );\n }\n const action = encodeIdentityMint(\n { name: opts.name, description: opts.description, image: opts.image },\n COORDINATION_CHAIN_ID as ChainId,\n );\n const tx = action.txs[0];\n const hash = await sendTxWithRetry({\n account,\n chain: getChain(),\n to: tx.to,\n data: tx.data,\n });\n spinner.text = \"Waiting for confirmation...\";\n const receipt = await waitForReceipt(hash as `0x${string}`);\n // ERC-721 Transfer(from=0, to=wallet, tokenId) — tokenId in topics[3]\n const TRANSFER = \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\n const mint = receipt.logs.find(\n (l) => l.address.toLowerCase() === tx.to.toLowerCase() && l.topics[0] === TRANSFER,\n );\n if (!mint?.topics[3]) throw new Error(\"no Transfer event in mint receipt\");\n return Number(BigInt(mint.topics[3]));\n });\n\n // Save to config\n setAgentId(tokenId);\n\n spinner.succeed(`Agent identity registered: #${tokenId}`);\n console.log(chalk.dim(` Chain: Robinhood mainnet (4663) — the coordination chain`));\n console.log(chalk.dim(` Name: ${opts.name}`));\n console.log(chalk.dim(` Owner: ${account.address}`));\n console.log(chalk.dim(` Saved to ~/.sherwood/config.json`));\n // The app reads identities from the mirror's wallet index, not the\n // registry, so a mint the mirror never hears about shows as an address.\n await announceIdentityToMirror(account.address, tokenId);\n console.log();\n console.log(chalk.green(\"You can now create vaults:\"));\n console.log(chalk.dim(` sherwood vault create --agent-id ${tokenId} --subdomain <name> --name <name>`));\n } catch (err) {\n spinner.fail(\"Failed to register identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity load ──\n\n identity\n .command(\"load\")\n .description(\"Load an existing ERC-8004 agent identity into your config\")\n .requiredOption(\"--id <tokenId>\", \"Agent token ID to load\")\n .action(async (opts) => {\n const account = getAccount();\n const tokenId = Number(opts.id);\n\n const spinner = ora(`Verifying ownership of agent #${tokenId}...`).start();\n try {\n // Identity lives on the coordination chain regardless of --chain.\n const owner = await withNetwork(COORDINATION_NETWORK, () =>\n getPublicClient().readContract({\n address: AGENT_REGISTRY().IDENTITY_REGISTRY,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(tokenId)],\n }),\n ) as Address;\n\n if (owner.toLowerCase() !== account.address.toLowerCase()) {\n spinner.fail(`Agent #${tokenId} is owned by ${owner}, not your wallet`);\n process.exit(1);\n }\n\n setAgentId(tokenId);\n spinner.succeed(`Agent #${tokenId} loaded and saved to config`);\n console.log(chalk.dim(` Owner: ${account.address}`));\n console.log(chalk.dim(` Saved to ~/.sherwood/config.json`));\n // Ownership was just proven above, so this is the same self-held link\n // a mint publishes — and `load` is the recovery path, where the mirror\n // is the most likely thing to be missing the row.\n await announceIdentityToMirror(account.address, tokenId);\n } catch (err) {\n spinner.fail(\"Failed to load identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity link-virtuals ──\n\n identity\n .command(\"link-virtuals\")\n .description(\"Link a Virtuals economyOS agent identity (ERC-8004 on Robinhood Chain or Base) to this Sherwood install\")\n .option(\"--wallet <address>\", \"economyOS agent wallet (default: auto-detect via `acp wallet address`)\")\n .option(\"--agent-id <tokenId>\", \"ERC-8004 token ID on the issuing chain (default: resolve from that chain's registry)\")\n .option(\"--chain-id <id>\", \"Issuing chain ID (4663 = Robinhood Chain, 8453 = Base, 84532 = Base Sepolia)\", String(DEFAULT_ISSUING_CHAIN_ID))\n .option(\"--binding-sig <hex>\", \"EIP-191 signature of the binding message by the economyOS wallet\")\n .option(\"--wallet-only\", \"Link without an ERC-8004 registration — the economyOS wallet + binding signature are the identity (agentId 0)\")\n .action(async (opts) => {\n const account = getAccount();\n const issuingChainId = opts.walletOnly ? WALLET_ONLY_CHAIN_ID : parseInt(opts.chainId, 10);\n if (!opts.walletOnly && !ISSUING_CHAINS[issuingChainId]) {\n console.error(chalk.red(`Unsupported issuing chain ${opts.chainId}. Supported: ${Object.keys(ISSUING_CHAINS).join(\", \")}`));\n process.exit(1);\n }\n\n const spinner = ora(\"Resolving economyOS agent...\").start();\n try {\n // 1. economyOS wallet — flag, or auto-detect via the user's acp CLI.\n let virtualsWallet = opts.wallet as Address | undefined;\n let virtualsAgentId: string | undefined;\n if (await detectAcp()) {\n const who = await acpWhoami();\n virtualsAgentId = who?.agentId;\n if (!virtualsWallet) {\n virtualsWallet = (await acpWalletAddress()) ?? undefined;\n }\n }\n if (!virtualsWallet) {\n spinner.fail(\"Could not resolve the economyOS agent wallet\");\n console.error(chalk.dim(\" Install + authenticate the acp CLI (npm i -g @virtuals-protocol/acp-cli; acp configure)\"));\n console.error(chalk.dim(\" or pass --wallet <address> explicitly.\"));\n process.exit(1);\n }\n\n // 2. ERC-8004 token — flag, or resolve by wallet against the issuing\n // chain. On the coordination chain (4663) that is our own mint-log\n // walk: Agent0's hosted subgraphs cover 1/8453/11155111/84532/137\n // only, so the SDK would answer \"not found\" for every 4663 agent.\n // On Base / Base Sepolia the SDK search still applies — read-only,\n // so hand it an EPHEMERAL key, never the operational one (review\n // M3: no supply-chain exposure for a read).\n // --wallet-only skips the token entirely (sentinel 0).\n let tokenId: bigint;\n if (opts.walletOnly) {\n tokenId = 0n;\n } else if (opts.agentId) {\n tokenId = BigInt(opts.agentId);\n } else if (issuingChainId === COORDINATION_CHAIN_ID) {\n spinner.text = `Searching the ERC-8004 registry on Robinhood mainnet (${COORDINATION_CHAIN_ID}) for ${virtualsWallet}...`;\n const ids = await lookupAgentIdsByWallet(virtualsWallet);\n if (ids.length === 0) {\n spinner.fail(`No ERC-8004 registration found for ${virtualsWallet} on chain ${issuingChainId}`);\n console.error(chalk.dim(\" Register first via the Virtuals CLI:\"));\n console.error(chalk.dim(` acp agent register-erc8004 --agent-id ${virtualsAgentId ?? \"<id>\"} --chain-id ${issuingChainId}`));\n console.error(chalk.dim(\" Then re-run this command (or pass --agent-id <tokenId> directly).\"));\n console.error(chalk.dim(\" No registration possible yet? Link without one: --wallet-only\"));\n process.exit(1);\n }\n if (ids.length > 1) {\n spinner.fail(`Wallet ${virtualsWallet} has ${ids.length} ERC-8004 registrations on chain ${issuingChainId} — pick one explicitly`);\n for (const id of ids) console.error(chalk.dim(` #${id}`));\n console.error(chalk.green(\" Re-run with: sherwood identity link-virtuals --agent-id <tokenId>\"));\n process.exit(1);\n }\n tokenId = ids[0];\n } else {\n spinner.text = `Searching ERC-8004 registry on chain ${issuingChainId} for ${virtualsWallet}...`;\n const sdk = new SDK({\n chainId: issuingChainId,\n rpcUrl: ISSUING_CHAINS[issuingChainId].chain.rpcUrls.default.http[0],\n privateKey: generatePrivateKey(),\n });\n const results = await sdk.searchAgents({\n walletAddress: virtualsWallet,\n chains: [issuingChainId],\n });\n if (results.length === 0) {\n spinner.fail(`No ERC-8004 registration found for ${virtualsWallet} on chain ${issuingChainId}`);\n console.error(chalk.dim(\" Register first via the Virtuals CLI:\"));\n console.error(chalk.dim(` acp agent register-erc8004 --agent-id ${virtualsAgentId ?? \"<id>\"} --chain-id ${issuingChainId}`));\n console.error(chalk.dim(\" Then re-run this command (or pass --agent-id <tokenId> directly).\"));\n console.error(chalk.dim(\" No registration possible yet? Link without one: --wallet-only\"));\n process.exit(1);\n }\n if (results.length > 1) {\n spinner.fail(`Wallet ${virtualsWallet} has ${results.length} ERC-8004 registrations on chain ${issuingChainId} — pick one explicitly`);\n for (const a of results) {\n const idStr = String(a.agentId);\n const tid = idStr.includes(\":\") ? idStr.split(\":\")[1] : idStr;\n console.error(chalk.dim(` #${tid} ${a.name || \"(no name)\"}`));\n }\n console.error(chalk.green(\" Re-run with: sherwood identity link-virtuals --agent-id <tokenId>\"));\n process.exit(1);\n }\n const idStr = String(results[0].agentId);\n tokenId = BigInt(idStr.includes(\":\") ? idStr.split(\":\")[1] : idStr);\n }\n // config.agentId is a JS number (legacy schema): refuse anything that\n // would silently truncate — the binding message signs the exact bigint.\n if (tokenId > BigInt(Number.MAX_SAFE_INTEGER)) {\n spinner.fail(`Token ID ${tokenId} exceeds Number.MAX_SAFE_INTEGER — cannot be stored in config`);\n process.exit(1);\n }\n\n // 3. Ownership — the NFT must be held by the economyOS wallet.\n // Wallet-only links have no NFT; the binding is the identity.\n if (!opts.walletOnly) {\n spinner.text = `Verifying ownerOf(#${tokenId}) on chain ${issuingChainId}...`;\n const owner = await ownerOfOnIssuingChain(issuingChainId, tokenId);\n if (owner.toLowerCase() !== virtualsWallet.toLowerCase()) {\n spinner.fail(`Agent #${tokenId} on chain ${issuingChainId} is owned by ${owner}, not ${virtualsWallet}`);\n process.exit(1);\n }\n }\n\n // 4. Binding — prove the identity holder endorses this Sherwood EOA.\n // Skipped when the economyOS wallet IS the local signer.\n const self = virtualsWallet.toLowerCase() === account.address.toLowerCase();\n const bindingMessage = buildBindingMessage(account.address, issuingChainId, tokenId);\n let binding: { sig: string; message: string } | undefined;\n if (!self) {\n // Auto-sign via the user's acp CLI when no signature was passed —\n // the same authenticated install we already use for discovery.\n let bindingSig = opts.bindingSig as `0x${string}` | undefined;\n if (!bindingSig) {\n spinner.text = \"Requesting binding signature from the economyOS wallet (acp wallet sign-message)...\";\n bindingSig = (await acpSignMessage(bindingMessage)) ?? undefined;\n if (bindingSig) {\n console.log(chalk.dim(\" Binding signed automatically via acp.\"));\n }\n }\n if (!bindingSig) {\n spinner.fail(\"Binding signature required (economyOS wallet differs from your Sherwood wallet)\");\n console.error();\n console.error(chalk.bold(\" Sign this exact message with the economyOS agent wallet:\"));\n console.error(chalk.green(` ${bindingMessage}`));\n console.error();\n console.error(chalk.dim(` acp wallet sign-message --message \"${bindingMessage}\" --json`));\n console.error(chalk.dim(\" Then re-run with --binding-sig <signature>.\"));\n process.exit(1);\n }\n spinner.text = \"Verifying binding signature...\";\n const ok = await verifyBinding({\n sherwoodEoa: account.address,\n issuingChainId,\n tokenId,\n virtualsWallet,\n signature: bindingSig,\n });\n if (!ok) {\n spinner.fail(\"Binding signature does not recover to the economyOS wallet\");\n console.error(chalk.dim(` Expected signer: ${virtualsWallet}`));\n console.error(chalk.dim(` Signed message must be exactly: ${bindingMessage}`));\n process.exit(1);\n }\n binding = { sig: bindingSig, message: bindingMessage };\n }\n\n // 5. Persist.\n setVirtualsIdentity(Number(tokenId), issuingChainId, {\n agentId: virtualsAgentId,\n wallet: virtualsWallet,\n binding,\n });\n\n spinner.succeed(\n opts.walletOnly\n ? \"Virtuals identity linked: wallet-only (no ERC-8004 — upgrade later by re-linking after registration)\"\n : `Virtuals identity linked: agent #${tokenId} (chain ${issuingChainId})`,\n );\n console.log(chalk.dim(` economyOS wallet: ${virtualsWallet}`));\n if (virtualsAgentId) console.log(chalk.dim(` Virtuals agent: ${virtualsAgentId}`));\n console.log(chalk.dim(` Sherwood wallet: ${account.address}${self ? \" (same as economyOS wallet — no binding needed)\" : \" (bound via signature)\"}`));\n console.log(chalk.dim(` Saved to ~/.sherwood/config.json`));\n console.log();\n console.log(chalk.green(\"You can now create or join vaults with this identity:\"));\n console.log(chalk.dim(` sherwood vault create --agent-id ${tokenId} --subdomain <name> --name <name>`));\n } catch (err) {\n spinner.fail(\"Failed to link Virtuals identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity find ──\n\n identity\n .command(\"find\")\n .description(\"Find ERC-8004 agent identities held by a wallet (recover a lost agent ID)\")\n .option(\"--wallet <address>\", \"Owner / wallet address\")\n .option(\"--name <text>\", \"(unsupported — name search needs an indexer; see the error it prints)\")\n .action(async (opts) => {\n // Name search needs an index over the whole registry. Nothing indexes\n // chain 4663 — no subgraph, and the registry is not enumerable — so the\n // only honest answer is to say so rather than search a chain identity\n // does not live on.\n if (opts.name) {\n console.error(chalk.red(\"Name search is not available.\"));\n console.error(chalk.dim(\" Identity lives on Robinhood mainnet (4663) and no indexer covers that chain,\"));\n console.error(chalk.dim(\" so there is nothing to query by name. Search by owner instead:\"));\n console.error(chalk.dim(\" sherwood identity find --wallet <address>\"));\n process.exit(1);\n }\n if (!opts.wallet || !isAddress(opts.wallet)) {\n console.error(chalk.red(\"Pass --wallet <address> (a 0x-prefixed address).\"));\n process.exit(1);\n }\n const wallet = getAddress(opts.wallet);\n\n // Identity always resolves on the coordination chain, whatever --chain is.\n const spinner = ora(`Searching the ERC-8004 registry on Robinhood mainnet (${COORDINATION_CHAIN_ID})...`).start();\n try {\n const found = await withNetwork(COORDINATION_NETWORK, async () => {\n const ids = await ownedAgentIds(wallet);\n return Promise.all(ids.map(async (id) => ({ id, meta: await readIdentityMetadata(id) })));\n });\n spinner.stop();\n\n if (found.length === 0) {\n console.log(chalk.dim(`No identity minted to ${wallet} on Robinhood mainnet (${COORDINATION_CHAIN_ID}).`));\n console.log(chalk.dim(\" Mint one: sherwood identity mint --name <name>\"));\n console.log(chalk.dim(\" Already have one you received by transfer? Bind it directly:\"));\n console.log(chalk.dim(\" sherwood identity load --id <tokenId>\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Found ${found.length} agent${found.length === 1 ? \"\" : \"s\"}`));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (const { id, meta } of found) {\n console.log(` ${chalk.bold(`#${id}`)} ${meta?.name || chalk.dim(\"(no name)\")}`);\n console.log(chalk.dim(` Chain: Robinhood mainnet (${COORDINATION_CHAIN_ID})`));\n console.log(chalk.dim(` Owner: ${wallet}`));\n if (meta?.description) console.log(chalk.dim(` Desc: ${meta.description}`));\n }\n console.log();\n console.log(chalk.green(\"To bind one of these to this machine:\"));\n console.log(chalk.dim(` sherwood identity load --id <tokenId>`));\n } catch (err) {\n spinner.fail(\"Search failed\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n\n // ── identity status ──\n\n identity\n .command(\"status\")\n .description(\"Show your agent identity status\")\n .action(async () => {\n const account = getAccount();\n\n // Virtuals-linked identity: the NFT lives on the issuing chain (Base /\n // Base Sepolia), not the active chain — report against that instead of\n // the local registry (which is address(0) on Robinhood testnet).\n if (getIdentityProvider() === \"virtuals\") {\n const virtuals = getVirtualsIdentity();\n const savedId = getAgentId();\n const issuingChainId = getIdentityChainId();\n console.log();\n console.log(chalk.bold(\"Agent Identity (ERC-8004 via Virtuals economyOS)\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Sherwood wallet: ${account.address}`);\n console.log(` economyOS wallet: ${virtuals?.wallet ?? chalk.red(\"(missing)\")}`);\n if (virtuals?.agentId) console.log(` Virtuals agent: ${virtuals.agentId}`);\n const walletOnly = issuingChainId === WALLET_ONLY_CHAIN_ID;\n console.log(` Issuing chain: ${walletOnly ? chalk.yellow(\"wallet-only (no ERC-8004)\") : issuingChainId ?? chalk.red(\"(missing)\")}`);\n console.log(` Saved ID: ${savedId != null ? (walletOnly ? chalk.dim(\"0 (wallet-only)\") : `#${savedId}`) : chalk.red(\"(missing)\")}`);\n\n if (virtuals?.wallet && savedId != null && issuingChainId != null) {\n const spinner = ora(\"Re-verifying link...\").start();\n try {\n let ownerOk = true;\n let owner: Address | undefined;\n if (!walletOnly) {\n owner = await ownerOfOnIssuingChain(issuingChainId, BigInt(savedId));\n ownerOk = owner.toLowerCase() === virtuals.wallet.toLowerCase();\n }\n let bindingOk = virtuals.wallet.toLowerCase() === account.address.toLowerCase();\n if (!bindingOk && virtuals.binding?.sig) {\n bindingOk = await verifyBinding({\n sherwoodEoa: account.address,\n issuingChainId,\n tokenId: BigInt(savedId),\n virtualsWallet: virtuals.wallet as Address,\n signature: virtuals.binding.sig as `0x${string}`,\n });\n }\n spinner.stop();\n if (walletOnly) {\n console.log(` NFT ownership: ${chalk.dim(\"n/a (wallet-only link)\")}`);\n } else {\n console.log(` NFT ownership: ${ownerOk ? chalk.green(\"verified\") : chalk.red(`FAILED (owner is ${owner})`)}`);\n }\n console.log(` Binding: ${bindingOk ? chalk.green(\"verified\") : chalk.red(\"FAILED\")}`);\n if (!ownerOk) {\n console.log(chalk.yellow(\" The NFT moved since linking — re-run 'sherwood identity link-virtuals'.\"));\n }\n if (walletOnly) {\n console.log(chalk.dim(\" Upgrade to a registered link once ERC-8004 registration is available:\"));\n console.log(chalk.dim(\" acp agent register-erc8004 ... && sherwood identity link-virtuals\"));\n }\n } catch (err) {\n spinner.warn(\"Could not re-verify against the issuing chain\");\n console.log(chalk.dim(` ${(err as Error).message}`));\n }\n }\n console.log();\n return;\n }\n\n const savedId = getAgentId();\n // agentId 0 is the wallet-only sentinel, never a real token — same\n // truthiness gate the command has always used.\n const hasSavedId = savedId != null && savedId !== 0;\n\n // The registry only exists on the coordination chain — read it there, not\n // on whatever chain the fund happens to run on (fork/testnet are zero).\n const spinner = ora(`Checking identity on Robinhood mainnet (${COORDINATION_CHAIN_ID})...`).start();\n try {\n const state = await withNetwork(COORDINATION_NETWORK, async () => {\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const client = getPublicClient();\n const balance = (await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n })) as bigint;\n\n let owner: Address | null = null;\n let meta: { name: string; description: string } | null = null;\n if (hasSavedId) {\n try {\n owner = (await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(savedId)],\n })) as Address;\n } catch {\n owner = null; // token not minted / burned\n }\n if (owner?.toLowerCase() === account.address.toLowerCase()) {\n meta = await readIdentityMetadata(BigInt(savedId));\n }\n }\n\n // Nothing saved locally but the wallet holds NFTs: surface them so a\n // fresh install doesn't report \"none\" while identities sit on-chain.\n const owned = !hasSavedId && balance > 0n ? await ownedAgentIds(account.address) : [];\n return { registry, balance, owner, meta, owned };\n });\n\n spinner.stop();\n\n console.log();\n console.log(chalk.bold(\"Agent Identity (ERC-8004)\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Wallet: ${account.address}`);\n console.log(` Chain: Robinhood mainnet (${COORDINATION_CHAIN_ID}) — the coordination chain`);\n console.log(` Registry: ${state.registry}`);\n console.log(` NFTs owned: ${state.balance.toString()}`);\n\n if (hasSavedId) {\n if (state.owner == null) {\n console.log(` Saved ID: #${savedId} ${chalk.red(\"(token not found)\")}`);\n } else {\n const isOwner = state.owner.toLowerCase() === account.address.toLowerCase();\n console.log(` Saved ID: #${savedId} ${isOwner ? chalk.green(\"(verified)\") : chalk.red(\"(owned by \" + state.owner + \")\")}`);\n console.log(` Owner: ${state.owner}`);\n if (state.meta?.name) console.log(` Name: ${state.meta.name}`);\n if (state.meta?.description) console.log(` Desc: ${chalk.dim(state.meta.description)}`);\n }\n console.log();\n } else if (state.owned.length > 0) {\n console.log(` Saved ID: ${chalk.yellow(\"none (but this wallet owns identities — listing below)\")}`);\n console.log();\n console.log(chalk.bold(` Identities held by this wallet (${state.owned.length}):`));\n for (const id of state.owned) {\n console.log(` ${chalk.bold(`#${id}`)}`);\n }\n console.log();\n console.log(chalk.green(\" Bind one to this machine:\"));\n console.log(\n chalk.dim(\n state.owned.length === 1\n ? ` sherwood identity load --id ${state.owned[0]}`\n : \" sherwood identity load --id <tokenId>\",\n ),\n );\n console.log();\n } else if (state.balance > 0n) {\n // Balance without a discoverable mint log = received by transfer.\n console.log(` Saved ID: ${chalk.yellow(\"none\")}`);\n console.log(chalk.dim(\" This wallet holds identities that were not minted to it, and the\"));\n console.log(chalk.dim(\" registry is not enumerable — bind yours by id:\"));\n console.log(chalk.dim(\" sherwood identity load --id <tokenId>\"));\n console.log();\n } else {\n console.log(` Saved ID: ${chalk.dim(\"none — run 'sherwood identity mint --name <name>'\")}`);\n console.log();\n }\n } catch (err) {\n spinner.fail(\"Failed to check identity\");\n console.error(chalk.red(formatContractError(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Publish an identity link to the metadata mirror.\n *\n * Minting registers the identity on the coordination chain, but that is not\n * where anything reads it from. The registry has no reverse lookup — nothing\n * maps a wallet back to its token — so the app resolves an agent through the\n * mirror's wallet→token index instead. An identity that was minted but never\n * published there renders as a bare address on every surface.\n *\n * Only self-held links go through here: the minting wallet owns its own token,\n * so the server proves the binding with `ownerOf` on the issuing chain and no\n * signature is involved. Cross-wallet links (economyOS) carry a binding\n * signature and are submitted by `identity link-virtuals`.\n *\n * Best-effort on purpose. A mint that settled on chain must never be reported\n * as failed because an HTTP call did not land, and the mirror discovers\n * unpublished identities on its own within its discovery interval. The caller\n * gets the outcome so it can say which of the two happened.\n */\n\nimport type { Address } from \"viem\";\n\n/** Same default the dapp ships with; override for a local mirror. */\nexport const METADATA_API_URL =\n process.env.SHERWOOD_METADATA_API_URL ??\n \"https://sherwood-metadata-api-production.up.railway.app\";\n\nconst PUBLISH_TIMEOUT_MS = 8_000;\n\nexport type PublishResult = { ok: true } | { ok: false; reason: string };\n\nexport async function publishIdentityLink(params: {\n /** The agent's operational wallet, which also holds the token. */\n wallet: Address;\n tokenId: number | bigint;\n /** Where the identity NFT lives (the coordination chain). */\n issuingChainId: number;\n /** The fund chain the agent operates on — how the mirror keys the row. */\n fundChainId: number;\n baseUrl?: string;\n fetchImpl?: typeof fetch;\n}): Promise<PublishResult> {\n const base = (params.baseUrl ?? METADATA_API_URL).replace(/\\/+$/, \"\");\n const doFetch = params.fetchImpl ?? fetch;\n try {\n const res = await doFetch(`${base}/v1/identities?chain=${params.fundChainId}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n sherwoodWallet: params.wallet,\n identityWallet: params.wallet,\n erc8004ChainId: params.issuingChainId,\n erc8004TokenId: params.tokenId.toString(),\n bindingSig: null,\n }),\n signal: AbortSignal.timeout(PUBLISH_TIMEOUT_MS),\n });\n if (res.ok) return { ok: true };\n // The body carries the server's own reason on a 422, which is worth\n // showing: it names exactly which check failed.\n const detail = await res.text().catch(() => \"\");\n return { ok: false, reason: `${res.status}${detail ? ` ${detail.slice(0, 200)}` : \"\"}` };\n } catch (err) {\n return { ok: false, reason: err instanceof Error ? err.message : String(err) };\n }\n}\n","/**\n * Virtuals economyOS identity integration.\n *\n * economyOS (os.virtuals.io) provisions agents with a non-custodial wallet and\n * a one-command ERC-8004 registration (`acp agent register-erc8004`) on Base /\n * Base Sepolia. Sherwood consumes that identity cross-chain: the economyOS\n * wallet is the identity holder, the local Sherwood EOA stays the operational\n * signer, and an EIP-191 \"binding message\" signed by the economyOS wallet\n * links the two. See docs/superpowers/specs/2026-07-21-virtuals-economyos-identity-design.md.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { Address, Hex, Chain } from \"viem\";\nimport { createPublicClient, http, recoverMessageAddress, isAddress } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\n\nconst execFileAsync = promisify(execFile);\n\n// ── Binding message ──\n\nexport const BINDING_VERSION = \"v1\";\n\n/**\n * The message the economyOS wallet signs to bind a Sherwood operational EOA.\n * Commits to the EOA, the issuing chain, and the token ID so a signature\n * cannot be replayed for a different agent, chain, or identity.\n */\nexport function buildBindingMessage(\n sherwoodEoa: Address,\n issuingChainId: number,\n tokenId: bigint,\n): string {\n return `sherwood-identity-link:${BINDING_VERSION}:${sherwoodEoa.toLowerCase()}:${issuingChainId}:${tokenId}`;\n}\n\n/**\n * Verify a binding signature recovers to the expected economyOS wallet.\n * Pure EIP-191 recovery — no network calls.\n */\nexport async function verifyBinding(params: {\n sherwoodEoa: Address;\n issuingChainId: number;\n tokenId: bigint;\n virtualsWallet: Address;\n signature: Hex;\n}): Promise<boolean> {\n try {\n const recovered = await recoverMessageAddress({\n message: buildBindingMessage(params.sherwoodEoa, params.issuingChainId, params.tokenId),\n signature: params.signature,\n });\n return recovered.toLowerCase() === params.virtualsWallet.toLowerCase();\n } catch {\n return false;\n }\n}\n\n// ── Issuing chains (where economyOS registers ERC-8004) ──\n\n/**\n * Robinhood Chain mainnet. Virtuals deployed economyOS here (their docs still\n * say Base-only — verified on-chain instead: the canonical ERC-8004\n * IdentityRegistry + ReputationRegistry live at the same 0x8004… addresses as\n * Base mainnet). Not in viem/chains yet, so defined inline.\n */\nexport const robinhoodChain: Chain = {\n id: 4663,\n name: \"Robinhood Chain\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: { default: { http: [\"https://rpc.mainnet.chain.robinhood.com\"] } },\n blockExplorers: {\n default: {\n name: \"Robinhood Chain Explorer\",\n url: \"https://explorer.mainnet.chain.robinhood.com\",\n },\n },\n};\n\n/** Default issuing chain for `identity link-virtuals` — Robinhood Chain,\n * matching Sherwood's home ecosystem. Base / Base Sepolia stay supported. */\nexport const DEFAULT_ISSUING_CHAIN_ID = robinhoodChain.id;\n\n/** Canonical ERC-8004 IdentityRegistry deployments (standard, not ours). */\nexport interface IssuingChain {\n chain: Chain;\n identityRegistry: Address;\n}\n\nexport const ISSUING_CHAINS: Record<number, IssuingChain> = {\n [robinhoodChain.id]: {\n chain: robinhoodChain,\n identityRegistry: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n },\n [base.id]: {\n chain: base,\n identityRegistry: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n },\n [baseSepolia.id]: {\n chain: baseSepolia,\n identityRegistry: \"0x8004A818BFB912233c491871b3d84c89A494BD9e\",\n },\n};\n\nconst OWNER_OF_ABI = [\n {\n name: \"ownerOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n] as const;\n\n/** Env-var RPC overrides for the issuing chains (default: viem public RPC).\n * Lets operators avoid public-RPC rate limits at the verification path. */\nconst ISSUING_RPC_ENV: Record<number, string> = {\n [robinhoodChain.id]: \"ROBINHOOD_RPC_URL\",\n [base.id]: \"BASE_RPC_URL\",\n [baseSepolia.id]: \"BASE_SEPOLIA_RPC_URL\",\n};\n\n/**\n * Read the ERC-8004 NFT owner on the issuing chain (Base / Base Sepolia),\n * independent of the CLI's active network. Throws on unsupported chain or\n * nonexistent token.\n */\nexport async function ownerOfOnIssuingChain(\n issuingChainId: number,\n tokenId: bigint,\n): Promise<Address> {\n const issuing = ISSUING_CHAINS[issuingChainId];\n if (!issuing) {\n throw new Error(\n `Unsupported issuing chain ${issuingChainId}. Supported: ${Object.keys(ISSUING_CHAINS).join(\", \")}`,\n );\n }\n const rpcOverride = process.env[ISSUING_RPC_ENV[issuingChainId]];\n const client = createPublicClient({ chain: issuing.chain, transport: http(rpcOverride) });\n return client.readContract({\n address: issuing.identityRegistry,\n abi: OWNER_OF_ABI,\n functionName: \"ownerOf\",\n args: [tokenId],\n });\n}\n\n/**\n * Wallet-only sentinel: issuingChainId 0 + tokenId 0 means the link carries\n * NO ERC-8004 registration — the economyOS wallet + binding signature are the\n * whole identity (matches the pre-existing `agentId=0` convention on chains\n * without a registry). Ownership verification is skipped; the binding\n * signature remains mandatory unless attester == wallet. Introduced because\n * Virtuals' register-erc8004 backend can lag chain launches — agents onboard\n * immediately and upgrade to a registered link later.\n */\nexport const WALLET_ONLY_CHAIN_ID = 0;\n\n// ── [vid:...] message tag ──\n//\n// Join-request messages already carry bracketed CLI metadata ([chain:...]\n// [ref:...] prefixes — see eas.ts). The Virtuals binding travels the same\n// way, as a trailing tag so the existing prefix regexes are untouched:\n// [vid:v1:<issuingChainId>:<tokenId>:<virtualsWallet>:<sig|self>]\n// `self` means the attester IS the economyOS wallet (no binding signature\n// needed — the verifier checks ownerOf against the attester directly).\n// chainId 0 + tokenId 0 = wallet-only (no ERC-8004; binding is the identity).\n\nexport interface VidTag {\n version: string;\n issuingChainId: number;\n tokenId: bigint;\n wallet: Address;\n /** 65-byte EIP-191 signature, or \"self\" when attester == wallet. */\n signature: Hex | \"self\";\n}\n\n// Signature leg is exactly a 65-byte EIP-191 signature (130 hex chars) or\n// the literal \"self\" — any-length hex would let junk ride the tag.\nconst VID_TAG_RE = /\\s*\\[vid:(v\\d+):(\\d+):(\\d+):(0x[0-9a-fA-F]{40}):(self|0x[0-9a-fA-F]{130})\\]\\s*$/;\n\nexport function formatVidTag(tag: Omit<VidTag, \"version\">): string {\n return `[vid:${BINDING_VERSION}:${tag.issuingChainId}:${tag.tokenId}:${tag.wallet.toLowerCase()}:${tag.signature}]`;\n}\n\nexport function appendVidTag(message: string, tag: Omit<VidTag, \"version\">): string {\n return `${message} ${formatVidTag(tag)}`;\n}\n\nexport function parseVidTag(message: string): VidTag | null {\n // Exactly one tag: a second \"[vid:\" is either an injection attempt or a\n // malformed message — refuse to pick one.\n if (message.indexOf(\"[vid:\") !== message.lastIndexOf(\"[vid:\")) return null;\n const match = message.match(VID_TAG_RE);\n if (!match) return null;\n if (!isAddress(match[4])) return null;\n return {\n version: match[1],\n issuingChainId: parseInt(match[2], 10),\n tokenId: BigInt(match[3]),\n wallet: match[4] as Address,\n signature: match[5] === \"self\" ? \"self\" : (match[5] as Hex),\n };\n}\n\nexport function stripVidTag(message: string): string {\n return message.replace(VID_TAG_RE, \"\");\n}\n\n/**\n * Full verification of a join-request vid tag:\n * 1. binding — \"self\" requires attester == wallet; otherwise the signature\n * over buildBindingMessage(attester, chainId, tokenId) must recover wallet.\n * 2. ownership — ownerOf(tokenId) on the issuing chain must equal wallet.\n * The binding leg is checked first and OFFLINE; a failed binding short-circuits\n * so forged tags never cost an RPC call (griefing resistance at the sole\n * enforcement point). `ownerOf` is injectable so batch callers can dedupe\n * lookups per (chainId, tokenId).\n * Returns granular results so callers can display which leg failed.\n */\nexport async function verifyVidTag(\n tag: VidTag,\n attester: Address,\n ownerOf: (chainId: number, tokenId: bigint) => Promise<Address> = ownerOfOnIssuingChain,\n): Promise<{ bindingOk: boolean; ownerOk: boolean; owner?: Address; error?: string; walletOnly?: boolean }> {\n let bindingOk: boolean;\n if (tag.signature === \"self\") {\n bindingOk = attester.toLowerCase() === tag.wallet.toLowerCase();\n } else {\n bindingOk = await verifyBinding({\n sherwoodEoa: attester,\n issuingChainId: tag.issuingChainId,\n tokenId: tag.tokenId,\n virtualsWallet: tag.wallet,\n signature: tag.signature,\n });\n }\n if (!bindingOk) {\n return { bindingOk: false, ownerOk: false, error: \"binding failed — ownership check skipped\" };\n }\n\n // Wallet-only link: the binding IS the identity — no NFT to check.\n if (tag.issuingChainId === WALLET_ONLY_CHAIN_ID) {\n return { bindingOk, ownerOk: true, walletOnly: true };\n }\n\n try {\n const owner = await ownerOf(tag.issuingChainId, tag.tokenId);\n return {\n bindingOk,\n ownerOk: owner.toLowerCase() === tag.wallet.toLowerCase(),\n owner,\n };\n } catch (err) {\n return { bindingOk, ownerOk: false, error: (err as Error).message };\n }\n}\n\n/**\n * Memoized ownerOf for batch verification (e.g. `fund requests` looping over\n * many join requests): one RPC per distinct (chainId, tokenId) regardless of\n * how many requests reference it. Errors are cached too — a failing token\n * shouldn't be retried N times within one batch.\n */\nexport function makeOwnerOfCache(): (chainId: number, tokenId: bigint) => Promise<Address> {\n const cache = new Map<string, Promise<Address>>();\n return (chainId, tokenId) => {\n const key = `${chainId}:${tokenId}`;\n let p = cache.get(key);\n if (!p) {\n p = ownerOfOnIssuingChain(chainId, tokenId);\n // Swallow here so an uncaught cached rejection can't crash the process;\n // consumers still see the rejection when they await.\n p.catch(() => {});\n cache.set(key, p);\n }\n return p;\n };\n}\n\n// ── acp CLI discovery (best-effort, never required) ──\n//\n// The CLI shells out to the user's own authenticated `acp` install and only\n// consumes stdout JSON — it never touches Virtuals OAuth tokens or keychain\n// entries. All acp JSON shapes are parsed defensively: field names are not a\n// stable contract, so every accessor tolerates absence.\n\nasync function acpJson(args: string[]): Promise<Record<string, unknown> | null> {\n try {\n const { stdout } = await execFileAsync(\"acp\", [...args, \"--json\"], {\n timeout: 15_000,\n });\n // Some CLIs prepend log lines before the JSON payload — find the first\n // brace and parse from there.\n const start = stdout.indexOf(\"{\");\n if (start < 0) return null;\n return JSON.parse(stdout.slice(start)) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport async function detectAcp(): Promise<boolean> {\n try {\n await execFileAsync(\"acp\", [\"--version\"], { timeout: 10_000 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Sign an EIP-191 message with the economyOS wallet via the user's acp CLI\n * (`acp wallet sign-message`). Longer timeout: Privy signing round-trips\n * Virtuals' API and can require a policy check. Returns null on any failure —\n * callers fall back to printing manual signing instructions.\n */\nexport async function acpSignMessage(message: string): Promise<Hex | null> {\n try {\n const { stdout } = await execFileAsync(\n \"acp\",\n [\"wallet\", \"sign-message\", \"--message\", message, \"--json\"],\n { timeout: 60_000 },\n );\n const start = stdout.indexOf(\"{\");\n if (start < 0) return null;\n const json = JSON.parse(stdout.slice(start)) as Record<string, unknown>;\n const sig = json.signature;\n return typeof sig === \"string\" && /^0x[0-9a-fA-F]{130}$/.test(sig) ? (sig as Hex) : null;\n } catch {\n return null;\n }\n}\n\n/** Active economyOS agent, if an authenticated `acp` CLI is installed. */\nexport async function acpWhoami(): Promise<{ agentId?: string; name?: string } | null> {\n const json = await acpJson([\"agent\", \"whoami\"]);\n if (!json) return null;\n const agentId = json.agentId ?? json.id ?? (json.agent as Record<string, unknown> | undefined)?.id;\n const name = json.name ?? (json.agent as Record<string, unknown> | undefined)?.name;\n return {\n agentId: agentId != null ? String(agentId) : undefined,\n name: name != null ? String(name) : undefined,\n };\n}\n\n/** The active economyOS agent's EVM wallet address, if resolvable via acp. */\nexport async function acpWalletAddress(): Promise<Address | null> {\n const json = await acpJson([\"wallet\", \"address\"]);\n if (!json) return null;\n for (const key of [\"address\", \"evmAddress\", \"evm\", \"wallet\"]) {\n const value = json[key];\n if (typeof value === \"string\" && isAddress(value)) return value as Address;\n }\n return null;\n}\n","/**\n * AUTO-GENERATED by cli/scripts/codegen-contracts.ts -- do not edit.\n * Source of truth:\n * sherwood-protocol src/interfaces/IGuardianRegistry.sol (GuardianVoteType, ReviewOutcome)\n * sherwood-protocol src/interfaces/IChallengeGame.sol (Status as ChallengeStatus, Verdict, PoolOutcome, Predicate)\n * sherwood-protocol src/interfaces/ITokenCourt.sol (Phase as CourtPhase, Ruling)\n *\n * ITokenCourt.Ruling is inverted relative to IChallengeGame.Verdict, so a\n * numeric cast between them is NEVER valid:\n *\n * Ruling { None = 0, Guilty = 1, NotGuilty = 2 }\n * Verdict { Inconclusive = 0, NotGuilty = 1, Guilty = 2 }\n *\n * `Ruling.Guilty.value` is 1, which is `Verdict.NotGuilty.value` — a cast\n * that looks right silently inverts guilt. Each enum is a nominally distinct\n * branded object so assignment and `as` between them is a type error.\n * TokenCourt translates arm by arm; never `Verdict(uint8(ruling))`.\n */\n/** On-chain `IGuardianRegistry.GuardianVoteType` member names, index === Solidity enum value. */\nexport const GUARDIAN_VOTE_TYPES = [\n \"None\",\n \"Approve\",\n \"Block\",\n];\nexport const GuardianVoteType = {\n None: { name: \"None\", value: 0 },\n Approve: { name: \"Approve\", value: 1 },\n Block: { name: \"Block\", value: 2 },\n};\n/** On-chain `IGuardianRegistry.ReviewOutcome` member names, index === Solidity enum value. */\nexport const REVIEW_OUTCOMES = [\n \"Unresolved\",\n \"Cleared\",\n \"Blocked\",\n];\nexport const ReviewOutcome = {\n Unresolved: { name: \"Unresolved\", value: 0 },\n Cleared: { name: \"Cleared\", value: 1 },\n Blocked: { name: \"Blocked\", value: 2 },\n};\n/** On-chain `IChallengeGame.Status` member names, index === Solidity enum value. TypeScript name is `ChallengeStatus` (Solidity `Status`). */\nexport const CHALLENGE_STATUSES = [\n \"None\",\n \"Filed\",\n \"Disputed\",\n \"Failed\",\n \"Settled\",\n \"Inconclusive\",\n];\nexport const ChallengeStatus = {\n None: { name: \"None\", value: 0 },\n Filed: { name: \"Filed\", value: 1 },\n Disputed: { name: \"Disputed\", value: 2 },\n Failed: { name: \"Failed\", value: 3 },\n Settled: { name: \"Settled\", value: 4 },\n Inconclusive: { name: \"Inconclusive\", value: 5 },\n};\n/** On-chain `IChallengeGame.Verdict` member names, index === Solidity enum value. */\nexport const VERDICTS = [\n \"Inconclusive\",\n \"NotGuilty\",\n \"Guilty\",\n];\nexport const Verdict = {\n Inconclusive: { name: \"Inconclusive\", value: 0 },\n NotGuilty: { name: \"NotGuilty\", value: 1 },\n Guilty: { name: \"Guilty\", value: 2 },\n};\n/** On-chain `IChallengeGame.PoolOutcome` member names, index === Solidity enum value. */\nexport const POOL_OUTCOMES = [\n \"Open\",\n \"Burned\",\n \"Released\",\n];\nexport const PoolOutcome = {\n Open: { name: \"Open\", value: 0 },\n Burned: { name: \"Burned\", value: 1 },\n Released: { name: \"Released\", value: 2 },\n};\n/** On-chain `IChallengeGame.Predicate` member names, index === Solidity enum value. */\nexport const PREDICATES = [\n \"OutOfAdapterOutflow\",\n \"OraclePriceDeviation\",\n \"ProposerLinkedOutflow\",\n \"RogueAllowance\",\n \"DrawdownBreach\",\n];\nexport const Predicate = {\n OutOfAdapterOutflow: { name: \"OutOfAdapterOutflow\", value: 0 },\n OraclePriceDeviation: { name: \"OraclePriceDeviation\", value: 1 },\n ProposerLinkedOutflow: { name: \"ProposerLinkedOutflow\", value: 2 },\n RogueAllowance: { name: \"RogueAllowance\", value: 3 },\n DrawdownBreach: { name: \"DrawdownBreach\", value: 4 },\n};\n/** On-chain `ITokenCourt.Phase` member names, index === Solidity enum value. TypeScript name is `CourtPhase` (Solidity `Phase`). */\nexport const COURT_PHASES = [\n \"None\",\n \"Voting\",\n \"Resolved\",\n];\nexport const CourtPhase = {\n None: { name: \"None\", value: 0 },\n Voting: { name: \"Voting\", value: 1 },\n Resolved: { name: \"Resolved\", value: 2 },\n};\n/** On-chain `ITokenCourt.Ruling` member names, index === Solidity enum value. */\nexport const RULINGS = [\n \"None\",\n \"Guilty\",\n \"NotGuilty\",\n];\nexport const Ruling = {\n None: { name: \"None\", value: 0 },\n Guilty: { name: \"Guilty\", value: 1 },\n NotGuilty: { name: \"NotGuilty\", value: 2 },\n};\n","export const CHAIN_IDS = {\n BASE: 8453,\n HYPEREVM: 999,\n ROBINHOOD: 4663,\n ROBINHOOD_L2: 46630,\n // Tenderly fork of Robinhood mainnet (USDG + Uniswap v3+v4) — mainnet-faithful\n // e2e + guardian-sim environment. Ephemeral vnet; addresses in addresses.ts.\n ROBINHOOD_FORK: 9994663,\n};\nexport const SUPPORTED_CHAIN_IDS = [\n CHAIN_IDS.BASE,\n CHAIN_IDS.HYPEREVM,\n CHAIN_IDS.ROBINHOOD,\n CHAIN_IDS.ROBINHOOD_L2,\n CHAIN_IDS.ROBINHOOD_FORK,\n];\nexport function isSupportedChainId(value) {\n return SUPPORTED_CHAIN_IDS.includes(value);\n}\n// ProposalState mirrors the on-chain enum and is code-generated from the\n// Solidity source (cli/scripts/codegen-contracts.ts → npm run codegen in\n// cli/). Do not hand-maintain the list here — reads/governor.ts indexes it\n// with the raw on-chain state number, so ordering must match the contract.\nexport { PROPOSAL_STATES } from \"./generated/proposal-state.js\";\n// StrategyProposal is code-generated from ISyndicateGovernor.sol + IProtocolConfig.sol\n// (cli/scripts/codegen-contracts.ts). Do not hand-maintain the member list.\nexport { STRATEGY_PROPOSAL_MEMBERS } from \"./generated/strategy-proposal.js\";\n// Guardian / challenge / court enums are code-generated from the Solidity\n// interfaces. Do not hand-maintain the lists — index === on-chain discriminant.\nexport { GUARDIAN_VOTE_TYPES, GuardianVoteType, REVIEW_OUTCOMES, ReviewOutcome, CHALLENGE_STATUSES, ChallengeStatus, VERDICTS, Verdict, } from \"./generated/state-machines.js\";\nexport { POOL_OUTCOMES, PoolOutcome, PREDICATES, Predicate, COURT_PHASES, CourtPhase, RULINGS, Ruling, } from \"./generated/state-machines.js\";\n","export class SdkError extends Error {\n code;\n cause;\n constructor(code, message, cause) {\n super(message);\n this.code = code;\n this.cause = cause;\n this.name = \"SdkError\";\n }\n}\nexport const usage = (message) => new SdkError(\"USAGE\", message);\nexport const unsupported = (message) => new SdkError(\"UNSUPPORTED\", message);\nexport const unavailable = (message, cause) => new SdkError(\"UNAVAILABLE\", message, cause);\nexport const internal = (message, cause) => new SdkError(\"INTERNAL\", message, cause);\nexport const notFound = (message) => new SdkError(\"NOT_FOUND\", message);\n","// Minimal ABI fragments for the v1 SDK encoders + reads.\n// Source of truth: cli/src/lib/abis.ts. Keep in lockstep.\nexport const SYNDICATE_VAULT_ABI = [\n // ERC-4626\n {\n name: \"deposit\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"assets\", type: \"uint256\" },\n { name: \"receiver\", type: \"address\" },\n ],\n outputs: [{ name: \"shares\", type: \"uint256\" }],\n },\n {\n name: \"redeem\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"shares\", type: \"uint256\" },\n { name: \"receiver\", type: \"address\" },\n { name: \"owner\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"requestRedeem\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"shares\", type: \"uint256\" },\n { name: \"owner\", type: \"address\" },\n ],\n outputs: [{ name: \"requestId\", type: \"uint256\" }],\n },\n // Lane B deposit escrow. Assets are held OFF-vault by the queue so they\n // neither inflate totalAssets nor get swept into the strategy.\n {\n name: \"requestDeposit\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"assets\", type: \"uint256\" },\n { name: \"receiver\", type: \"address\" },\n ],\n outputs: [{ name: \"requestId\", type: \"uint256\" }],\n },\n {\n name: \"withdrawalQueue\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n // Reads\n {\n name: \"asset\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"totalAssets\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"totalSupply\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"owner\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"governor\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"redemptionsLocked\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"paused\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"openDeposits\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"agentFeeBps\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"setAgentFeeBps\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"bps\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"AgentFeeUpdated\",\n type: \"event\",\n inputs: [{ name: \"bps\", type: \"uint256\", indexed: false }],\n },\n {\n name: \"getAgentCount\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"isApprovedDepositor\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"depositor\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n // Owner-side write surface\n {\n name: \"approveDepositor\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"depositor\", type: \"address\" }],\n outputs: [],\n },\n {\n name: \"removeDepositor\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"depositor\", type: \"address\" }],\n outputs: [],\n },\n {\n // ARGUMENT ORDER IS (agentId, agentAddress), NOT the reverse. The flipped\n // tuple is a DIFFERENT function (0x3543ad58) that no deployed vault has —\n // it reverts with empty returndata, giving the caller no signal (SHE-185).\n name: \"registerAgent\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentId\", type: \"uint256\" },\n { name: \"agentAddress\", type: \"address\" },\n ],\n outputs: [],\n },\n];\nexport const SYNDICATE_GOVERNOR_ABI = [\n // Propose (multi-arg). Order MUST match contract: vault, strategy,\n // metadataURI, strategyDuration, executeCalls, settlementCalls, coProposers.\n // Agent fee is no longer a propose() arg — it's the vault's `agentFeeBps`\n // (owner-set), snapshotted onto the proposal at propose time and clamped to\n // maxPerformanceFeeBps at settlement.\n {\n name: \"propose\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"vault\", type: \"address\" },\n { name: \"strategy\", type: \"address\" },\n { name: \"metadataURI\", type: \"string\" },\n { name: \"strategyDuration\", type: \"uint256\" },\n // The RISK ENVELOPE the proposal commits to: the ceiling the execute\n // batch is metered against, and the declared loss allowance the\n // settle-price guard sizes its tolerance from.\n {\n name: \"envelope\",\n type: \"tuple\",\n components: [\n { name: \"maxCapital\", type: \"uint256\" },\n { name: \"maxDrawdownBps\", type: \"uint16\" },\n ],\n },\n {\n name: \"executeCalls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"value\", type: \"uint256\" },\n ],\n },\n // One cap per call, in ASSET UNITS — the maximum gross outflow measured\n // around that call. Summed per batch, required <= maxCapital.\n { name: \"executeCallCaps\", type: \"uint256[]\" },\n {\n name: \"settlementCalls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"value\", type: \"uint256\" },\n ],\n },\n { name: \"settlementCallCaps\", type: \"uint256[]\" },\n {\n name: \"coProposers\",\n type: \"tuple[]\",\n components: [\n { name: \"agent\", type: \"address\" },\n { name: \"splitBps\", type: \"uint256\" },\n ],\n },\n ],\n outputs: [{ name: \"proposalId\", type: \"uint256\" }],\n },\n // Lifecycle writes\n {\n name: \"vote\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"proposalId\", type: \"uint256\" },\n { name: \"support\", type: \"uint8\" },\n ],\n outputs: [],\n },\n {\n name: \"executeProposal\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"settleProposal\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"cancelProposal\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"vetoProposal\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [],\n },\n // Emergency settlement (GovernorEmergency, V1.5). `unstick` is the\n // owner-instant pre-committed-calls path; `emergencySettleWithCalls` commits\n // a new calldata hash and opens a guardian-reviewed window. The removed\n // `emergencySettle` is intentionally absent — it is not on the deployed impl.\n {\n name: \"unstick\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [],\n },\n {\n name: \"emergencySettleWithCalls\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"proposalId\", type: \"uint256\" },\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"value\", type: \"uint256\" },\n ],\n },\n ],\n outputs: [],\n },\n // Parameter setters (GovernorParameters, V1.5 — owner-instant, no timelock).\n { name: \"setVotingPeriod\", type: \"function\", stateMutability: \"nonpayable\", inputs: [{ name: \"newValue\", type: \"uint256\" }], outputs: [] },\n { name: \"setExecutionWindow\", type: \"function\", stateMutability: \"nonpayable\", inputs: [{ name: \"newValue\", type: \"uint256\" }], outputs: [] },\n { name: \"setVetoThresholdBps\", type: \"function\", stateMutability: \"nonpayable\", inputs: [{ name: \"newValue\", type: \"uint256\" }], outputs: [] },\n { name: \"setMaxPerformanceFeeBps\", type: \"function\", stateMutability: \"nonpayable\", inputs: [{ name: \"newValue\", type: \"uint256\" }], outputs: [] },\n { name: \"setMaxStrategyDuration\", type: \"function\", stateMutability: \"nonpayable\", inputs: [{ name: \"newValue\", type: \"uint256\" }], outputs: [] },\n { name: \"setCooldownPeriod\", type: \"function\", stateMutability: \"nonpayable\", inputs: [{ name: \"newValue\", type: \"uint256\" }], outputs: [] },\n // Reads\n {\n name: \"getProposal\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"id\", type: \"uint256\" },\n { name: \"proposer\", type: \"address\" },\n { name: \"vault\", type: \"address\" },\n { name: \"strategy\", type: \"address\" },\n { name: \"metadataURI\", type: \"string\" },\n { name: \"performanceFeeBps\", type: \"uint256\" },\n { name: \"strategyDuration\", type: \"uint256\" },\n // Optimistic governance tallies only AGAINST weight; the For /\n // Abstain counters were dropped at v1 and `votableSupply` (the\n // veto denominator) is appended at the tail instead.\n { name: \"votesAgainst\", type: \"uint256\" },\n { name: \"snapshotTimestamp\", type: \"uint256\" },\n { name: \"voteEnd\", type: \"uint256\" },\n { name: \"reviewEnd\", type: \"uint256\" },\n { name: \"executeBy\", type: \"uint256\" },\n { name: \"executedAt\", type: \"uint256\" },\n { name: \"state\", type: \"uint8\" },\n { name: \"vetoThresholdBps\", type: \"uint256\" },\n // This tail was doubly stale: it omitted the fee-recipient snapshot\n // entirely AND still carried `selfManagesFees`, which was removed.\n // Every field is positional, so the first divergence corrupts the\n // decode of everything after it.\n { name: \"snapshotProtocolFeeRecipient\", type: \"address\" },\n { name: \"snapshotGuardiansFeeRecipient\", type: \"address\" },\n { name: \"maxCapital\", type: \"uint256\" },\n { name: \"maxDrawdownBps\", type: \"uint16\" },\n { name: \"envelopeTier\", type: \"uint8\" },\n { name: \"requiredCoverage\", type: \"uint256\" },\n { name: \"proposerBondWood\", type: \"uint256\" },\n { name: \"proposerBondEscrow\", type: \"address\" },\n {\n name: \"snapshotMgmtSplit\",\n type: \"tuple\",\n components: [\n { name: \"agentBps\", type: \"uint16\" },\n { name: \"protocolBps\", type: \"uint16\" },\n { name: \"guardianBps\", type: \"uint16\" },\n ],\n },\n {\n name: \"snapshotPerfSplit\",\n type: \"tuple\",\n components: [\n { name: \"agentBps\", type: \"uint16\" },\n { name: \"protocolBps\", type: \"uint16\" },\n { name: \"guardianBps\", type: \"uint16\" },\n { name: \"ownerBps\", type: \"uint16\" },\n ],\n },\n { name: \"proposerBondLedger\", type: \"address\" },\n { name: \"effectiveMaxCapital\", type: \"uint256\" },\n { name: \"votableSupply\", type: \"uint256\" },\n ],\n },\n ],\n },\n {\n name: \"getProposalState\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"getActiveProposal\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"proposalCount\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"getGovernorParams\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"votingPeriod\", type: \"uint256\" },\n { name: \"executionWindow\", type: \"uint256\" },\n { name: \"vetoThresholdBps\", type: \"uint256\" },\n { name: \"maxPerformanceFeeBps\", type: \"uint256\" },\n { name: \"cooldownPeriod\", type: \"uint256\" },\n { name: \"collaborationWindow\", type: \"uint256\" },\n { name: \"maxCoProposers\", type: \"uint256\" },\n { name: \"minStrategyDuration\", type: \"uint256\" },\n { name: \"maxStrategyDuration\", type: \"uint256\" },\n ],\n },\n ],\n },\n // protocolFeeRecipient() is NOT on the governor — fees moved to\n // ProtocolConfig (#421). Read it off PROTOCOL_CONFIG_ABI instead (SHE-185).\n {\n name: \"FeeClamped\",\n type: \"event\",\n inputs: [\n { name: \"proposalId\", type: \"uint256\", indexed: true },\n { name: \"snapshotted\", type: \"uint256\", indexed: true },\n { name: \"clamped\", type: \"uint256\", indexed: true },\n ],\n },\n];\nexport const SYNDICATE_FACTORY_ABI = [\n {\n name: \"createSyndicate\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"creatorAgentId\", type: \"uint256\" },\n {\n name: \"config\",\n type: \"tuple\",\n components: [\n { name: \"metadataURI\", type: \"string\" },\n { name: \"asset\", type: \"address\" },\n { name: \"name\", type: \"string\" },\n { name: \"symbol\", type: \"string\" },\n { name: \"openDeposits\", type: \"bool\" },\n { name: \"subdomain\", type: \"string\" },\n ],\n },\n ],\n outputs: [\n { name: \"syndicateId\", type: \"uint256\" },\n { name: \"vault\", type: \"address\" },\n ],\n },\n {\n name: \"syndicateCount\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"governorOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"vault\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"protocolConfig\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n {\n name: \"subdomainToSyndicate\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"subdomain\", type: \"string\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"vaultToSyndicate\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"vault\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"syndicates\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"id\", type: \"uint256\" }],\n outputs: [\n { name: \"id\", type: \"uint256\" },\n { name: \"vault\", type: \"address\" },\n { name: \"creator\", type: \"address\" },\n { name: \"metadataURI\", type: \"string\" },\n { name: \"createdAt\", type: \"uint256\" },\n { name: \"active\", type: \"bool\" },\n { name: \"subdomain\", type: \"string\" },\n ],\n },\n {\n name: \"getAllActiveSyndicates\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"tuple[]\",\n components: [\n { name: \"id\", type: \"uint256\" },\n { name: \"vault\", type: \"address\" },\n { name: \"creator\", type: \"address\" },\n { name: \"metadataURI\", type: \"string\" },\n { name: \"createdAt\", type: \"uint256\" },\n { name: \"active\", type: \"bool\" },\n { name: \"subdomain\", type: \"string\" },\n ],\n },\n ],\n },\n];\nexport const PROTOCOL_CONFIG_ABI = [\n // The two-number fee model exposes the SPLITS, not flat rates. The\n // `protocolFeeBps` / `guardianFeeBps` scalars this ABI used to declare are\n // on no deployed ProtocolConfig — every read through them reverted.\n {\n name: \"mgmtSplit\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"agentBps\", type: \"uint16\" },\n { name: \"protocolBps\", type: \"uint16\" },\n { name: \"guardianBps\", type: \"uint16\" },\n ],\n },\n ],\n },\n {\n name: \"perfSplit\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"agentBps\", type: \"uint16\" },\n { name: \"protocolBps\", type: \"uint16\" },\n { name: \"guardianBps\", type: \"uint16\" },\n { name: \"ownerBps\", type: \"uint16\" },\n ],\n },\n ],\n },\n {\n name: \"protocolFeeRecipient\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n // Protocol-owner setters.\n {\n name: \"setMgmtSplit\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n {\n name: \"s\",\n type: \"tuple\",\n components: [\n { name: \"agentBps\", type: \"uint16\" },\n { name: \"protocolBps\", type: \"uint16\" },\n { name: \"guardianBps\", type: \"uint16\" },\n ],\n },\n ],\n outputs: [],\n },\n {\n name: \"setPerfSplit\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n {\n name: \"s\",\n type: \"tuple\",\n components: [\n { name: \"agentBps\", type: \"uint16\" },\n { name: \"protocolBps\", type: \"uint16\" },\n { name: \"guardianBps\", type: \"uint16\" },\n { name: \"ownerBps\", type: \"uint16\" },\n ],\n },\n ],\n outputs: [],\n },\n];\nexport const GUARDIAN_REGISTRY_ABI = [\n // Guardian staking, unstaking and stake reads are NOT on this contract —\n // the sWOOD split moved them to StakedWood, which is the sole WOOD\n // custodian. They lived here until SHE-185; sending stakeAsGuardian /\n // requestUnstakeGuardian / cancelUnstakeGuardian / claimUnstakeGuardian /\n // guardianStake / isActiveGuardian to the registry reverts with empty\n // returndata. Use STAKED_WOOD_ABI against `sherwood.stakedWood`.\n // Guardian review vote — 4 args. Selector 0x4915ace5. The 3-arg form\n // (0x3ad95b6d) is on no deployed registry.\n // GuardianVoteType: None=0, Approve=1, Block=2 (uint8). `lockWood` is the\n // approver's declared WOOD lock, clamped to its free budget by the\n // ExposureLedger and ignored on a Block vote.\n {\n name: \"voteOnProposal\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"governor\", type: \"address\" },\n { name: \"proposalId\", type: \"uint256\" },\n { name: \"support\", type: \"uint8\" },\n { name: \"lockWood\", type: \"uint256\" },\n ],\n outputs: [],\n },\n // Cached review flags. Returns THREE bools (opened, resolved, blocked).\n // A fourth output is the SHE-88 arity break: viem refuses the 96-byte returndata.\n {\n name: \"getReviewState\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"governor\", type: \"address\" },\n { name: \"proposalId\", type: \"uint256\" },\n ],\n outputs: [\n { name: \"opened\", type: \"bool\" },\n { name: \"resolved\", type: \"bool\" },\n { name: \"blocked\", type: \"bool\" },\n ],\n },\n];\n// StakedWood (sWOOD) — sole WOOD custodian. Guardian staking lives here\n// (`stakeAsGuardian` at StakedWood.sol:594); GuardianRegistry holds zero assets.\nexport const STAKED_WOOD_ABI = [\n {\n name: \"stakeAsGuardian\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"amount\", type: \"uint256\" },\n { name: \"agentId\", type: \"uint256\" },\n ],\n outputs: [],\n },\n // Vault-creator bond. `createSyndicate` reverts PreparedStakeNotFound\n // until the creator has called this (min = minOwnerStake).\n {\n name: \"prepareOwnerStake\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"amount\", type: \"uint256\" }],\n outputs: [],\n },\n // Self-stake unstake flow. Moved off GUARDIAN_REGISTRY_ABI in SHE-185 —\n // the registry holds zero WOOD and implements none of these.\n {\n name: \"requestUnstakeGuardian\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\n {\n name: \"cancelUnstakeGuardian\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\n {\n name: \"claimUnstakeGuardian\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\n // Reads\n {\n name: \"guardianStake\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"guardian\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"isActiveGuardian\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"guardian\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n];\n// VaultWithdrawalQueue — the per-vault Lane B escrow. Deployed by the factory\n// at createSyndicate; resolve its address with `vault.withdrawalQueue()`.\nexport const VAULT_WITHDRAWAL_QUEUE_ABI = [\n // PERMISSIONLESS: anyone may settle someone else's request once its\n // proposal price is stamped. The proceeds go to the request's owner, not\n // the caller (VaultWithdrawalQueue.sol `claim`).\n {\n name: \"claim\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"requestId\", type: \"uint256\" }],\n outputs: [{ name: \"outAmount\", type: \"uint256\" }],\n },\n // OWNER-ONLY (`msg.sender != r.owner` reverts NotQueueOwner).\n {\n name: \"cancel\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"requestId\", type: \"uint256\" }],\n outputs: [],\n },\n // getRequest is deliberately NOT declared here: the on-chain Request struct\n // carries eight fields (owner, amount, pid, kind, claimed, cancelled,\n // queuedAt, closedAt) and a short tuple would fail to decode the returndata\n // — the SHE-88 arity break. The API's queue routes are calldata-only.\n];\nexport const ERC20_ABI = [\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"symbol\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n];\n// ── ERC-8004 Identity Registry (Agent0) ──\n//\n// Only the `register(string agentURI, MetadataEntry[] metadata)` overload — the\n// one Agent0's `registerOnChain()` actually calls for on-chain data-URI mints.\n// agentURI is a base64 `data:application/json` URI; metadata is `[]` for a basic\n// agent. Selector 0x8ea42286.\nexport const IDENTITY_REGISTRY_ABI = [\n {\n name: \"register\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"agentURI\", type: \"string\" },\n {\n name: \"metadata\",\n type: \"tuple[]\",\n components: [\n { name: \"metadataKey\", type: \"string\" },\n { name: \"metadataValue\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [{ name: \"agentId\", type: \"uint256\" }],\n },\n];\n// ── EAS (Ethereum Attestation Service) — `attest` only ──\n//\n// Used for SYNDICATE_JOIN_REQUEST and AGENT_APPROVED coordination attestations,\n// which always live on Base. Selector 0xf17325e7.\nexport const EAS_ABI = [\n {\n name: \"attest\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [\n {\n name: \"request\",\n type: \"tuple\",\n components: [\n { name: \"schema\", type: \"bytes32\" },\n {\n name: \"data\",\n type: \"tuple\",\n components: [\n { name: \"recipient\", type: \"address\" },\n { name: \"expirationTime\", type: \"uint64\" },\n { name: \"revocable\", type: \"bool\" },\n { name: \"refUID\", type: \"bytes32\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"value\", type: \"uint256\" },\n ],\n },\n ],\n },\n ],\n outputs: [{ name: \"\", type: \"bytes32\" }],\n },\n];\n// StrategyFactory — atomic clone+initialize wrapper for strategy templates.\n// `cloneAndInitDeterministic` deploys the ERC-1167 clone via CREATE2, so the\n// clone address is predictable BEFORE the tx is mined (see\n// `predictStrategyCloneAddress` in encoders/strategy.ts). This is what unblocks\n// keyless / external-signer strategy proposals (issue #387): the proposal's\n// executeCalls + the `strategy` arg can be built against the predicted address\n// up front, so deploy + propose can both be emitted as unsigned calldata.\nexport const STRATEGY_FACTORY_ABI = [\n {\n name: \"cloneAndInit\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"template\", type: \"address\" },\n { name: \"vault\", type: \"address\" },\n { name: \"proposer\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n outputs: [{ name: \"clone\", type: \"address\" }],\n },\n {\n name: \"cloneAndInitDeterministic\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"template\", type: \"address\" },\n { name: \"vault\", type: \"address\" },\n { name: \"proposer\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n { name: \"salt\", type: \"bytes32\" },\n ],\n outputs: [{ name: \"clone\", type: \"address\" }],\n },\n {\n name: \"syndicateFactory\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n];\n","/**\n * Checked-in 4-byte selector table for SHE-109.\n *\n * Derived with `cast sig \"<canonical signature>\"` from sherwood-protocol\n * interfaces at pin `c9e3d8c6a8f0ee6c67b2c542d1b31e4664834309`\n * (origin/v1-deploy). Do not invent these;\n * recompute with `cast sig` if an interface argument list changes.\n *\n * ISyndicateGovernor.propose 10 args\n * IGuardianRegistry.voteOnProposal (address,uint256,uint8,uint256) — Approve=1, Block=2, plus the approver's declared WOOD lock\n * IGuardianRegistry.getReviewState (address,uint256) → (bool,bool,bool)\n *\n * The three sandbox rows (proposeWithSandbox, runSandbox, ICallSandbox.sweep)\n * went with the contract: CallSandbox does not exist at v1.\n */\nexport const PROTOCOL_PIN = \"c9e3d8c6a8f0ee6c67b2c542d1b31e4664834309\";\nexport const PROTOCOL_SELECTORS = {\n propose: {\n iface: \"ISyndicateGovernor\",\n signature: \"propose(address,address,string,uint256,(uint256,uint16),(address,bytes,uint256)[],uint256[],(address,bytes,uint256)[],uint256[],(address,uint256)[])\",\n selector: \"0x784ea274\",\n },\n voteOnProposal: {\n iface: \"IGuardianRegistry\",\n signature: \"voteOnProposal(address,uint256,uint8,uint256)\",\n selector: \"0x4915ace5\",\n },\n getReviewState: {\n iface: \"IGuardianRegistry\",\n signature: \"getReviewState(address,uint256)\",\n selector: \"0x043bd8b9\",\n },\n};\n/**\n * Selectors of the historical ABI mistakes this gate exists to catch.\n * Each is the `cast sig` of a signature the protocol does NOT have.\n */\nexport const KNOWN_BREAKAGE_SELECTORS = {\n /** 7-arg propose — no RiskEnvelope, no per-call caps (SHE-89). */\n propose7Arg: \"0x1bb08ebe\",\n /** voteOnProposal(uint256,uint8,uint256) — slashBps still in the sig (SHE-92). */\n voteOnProposalWithSlashBps: \"0x4fbfccdb\",\n /** voteOnProposal(address,uint256,uint8) — no lockWood, so an approver\n * underwrote nothing. Live until v1; the registry has only the 4-arg form. */\n voteOnProposalNoLock: \"0x3ad95b6d\",\n /** getReviewState(uint256) — missing the per-vault governor (input-arity). */\n getReviewStateUnary: \"0xee89569a\",\n /** registerAgent(address,uint256) — the arguments flipped (SHE-185). */\n registerAgentFlipped: \"0x3543ad58\",\n};\n/**\n * SHE-185: what every calldata-emitting API route is allowed to emit.\n *\n * The table above pins the six selectors the protocol/SDK/CLI/app ABIs must\n * agree on. This one pins the ROUTES: for each\n * `app/src/app/api/v1/prepare/*`, the ordered list of transactions its\n * encoder produces, each as (which contract it targets, which selector).\n *\n * `target` is the contract KIND, not an address — the address book resolves\n * it per chain. It is pinned because two of this ticket's three live bugs\n * were right-selector/wrong-contract: the guardian unstake calls carried\n * valid StakedWood selectors to the GuardianRegistry, which implements none\n * of them, so they reverted with empty returndata and the caller got no\n * signal at all. A selector-only gate would have passed them.\n *\n * `external` marks a target outside sherwood-protocol (EAS, the ERC-8004\n * IdentityRegistry, plain ERC-20): still pinned, but verified against those\n * deployments rather than the protocol build.\n */\nexport const API_CALLDATA_SELECTORS = {\n deposit: [\n { target: \"erc20\", selector: \"0x095ea7b3\", signature: \"approve(address,uint256)\", external: true },\n { target: \"vault\", selector: \"0x6e553f65\", signature: \"deposit(uint256,address)\" },\n ],\n redeem: [\n { target: \"vault\", selector: \"0xba087652\", signature: \"redeem(uint256,address,address)\" },\n ],\n \"request-redeem\": [\n { target: \"vault\", selector: \"0x107703ab\", signature: \"requestRedeem(uint256,address)\" },\n ],\n \"request-deposit\": [\n { target: \"erc20\", selector: \"0x095ea7b3\", signature: \"approve(address,uint256)\", external: true },\n { target: \"vault\", selector: \"0x29344f08\", signature: \"requestDeposit(uint256,address)\" },\n ],\n \"queue-claim\": [\n { target: \"queue\", selector: \"0x379607f5\", signature: \"claim(uint256)\" },\n ],\n \"queue-cancel\": [\n { target: \"queue\", selector: \"0x40e58ee5\", signature: \"cancel(uint256)\" },\n ],\n \"strategy-deploy\": [\n { target: \"strategyFactory\", selector: \"0x26ab0cd4\", signature: \"cloneAndInitDeterministic(address,address,address,bytes,bytes32)\" },\n ],\n propose: [\n { target: \"governor\", selector: \"0x784ea274\", signature: PROTOCOL_SELECTORS.propose.signature },\n ],\n vote: [\n { target: \"governor\", selector: \"0x943e8216\", signature: \"vote(uint256,uint8)\" },\n ],\n \"vote-on-proposal\": [\n { target: \"guardianRegistry\", selector: \"0x4915ace5\", signature: PROTOCOL_SELECTORS.voteOnProposal.signature },\n ],\n execute: [\n { target: \"governor\", selector: \"0x0d61b519\", signature: \"executeProposal(uint256)\" },\n ],\n settle: [\n { target: \"governor\", selector: \"0x2473ad34\", signature: \"settleProposal(uint256)\" },\n ],\n cancel: [\n { target: \"governor\", selector: \"0xe0a8f6f5\", signature: \"cancelProposal(uint256)\" },\n ],\n veto: [\n { target: \"governor\", selector: \"0x6f65108c\", signature: \"vetoProposal(uint256)\" },\n ],\n unstick: [\n { target: \"governor\", selector: \"0x83170f05\", signature: \"unstick(uint256)\" },\n ],\n \"emergency-settle\": [\n { target: \"governor\", selector: \"0xf1f21adc\", signature: \"emergencySettleWithCalls(uint256,(address,bytes,uint256)[])\" },\n ],\n \"governor-set\": [\n { target: \"governor\", selector: \"0xea0217cf\", signature: \"setVotingPeriod(uint256)\" },\n ],\n \"create-fund\": [\n { target: \"factory\", selector: \"0xd902f450\", signature: \"createSyndicate(uint256,(string,address,string,string,bool,string))\" },\n ],\n \"approve-depositor\": [\n { target: \"vault\", selector: \"0x8e6a1bb3\", signature: \"approveDepositor(address)\" },\n ],\n // (agentId, agentAddress). The flipped tuple is\n // KNOWN_BREAKAGE_SELECTORS.registerAgentFlipped and exists on no deployed vault.\n \"register-agent\": [\n { target: \"vault\", selector: \"0x047d4c27\", signature: \"registerAgent(uint256,address)\" },\n ],\n \"approve-agent\": [\n { target: \"vault\", selector: \"0x047d4c27\", signature: \"registerAgent(uint256,address)\" },\n { target: \"eas\", selector: \"0xf17325e7\", signature: \"attest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)))\", external: true },\n ],\n join: [\n { target: \"eas\", selector: \"0xf17325e7\", signature: \"attest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)))\", external: true },\n ],\n \"identity-mint\": [\n { target: \"identityRegistry\", selector: \"0x8ea42286\", signature: \"register(string,(string,bytes)[])\", external: true },\n ],\n // sWOOD, not the registry — see the note above.\n \"guardian-stake\": [\n { target: \"stakedWood\", selector: \"0xfc1d6c63\", signature: \"stakeAsGuardian(uint256,uint256)\" },\n ],\n \"guardian-unstake\": [\n { target: \"stakedWood\", selector: \"0xf4714817\", signature: \"requestUnstakeGuardian()\" },\n ],\n};\n","import { CHAIN_IDS } from \"./types.js\";\nimport { unsupported } from \"./errors.js\";\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n/** Guardian-era fields not yet deployed on a chain — all ZERO. */\nconst NO_GUARDIAN_ERA = {\n governorBeacon: ZERO_ADDRESS,\n protocolConfig: ZERO_ADDRESS,\n priceRouter: ZERO_ADDRESS,\n tierRegistry: ZERO_ADDRESS,\n exposureLedger: ZERO_ADDRESS,\n proposerBondEscrow: ZERO_ADDRESS,\n challengeGame: ZERO_ADDRESS,\n tokenCourt: ZERO_ADDRESS,\n};\nconst NO_STRATEGY_TEMPLATES = {\n PORTFOLIO: ZERO_ADDRESS,\n MORPHO_SUPPLY: ZERO_ADDRESS,\n CONCENTRATED_LIQUIDITY: ZERO_ADDRESS,\n LAUNCHPAD: ZERO_ADDRESS,\n LIGHTER_PERP: ZERO_ADDRESS,\n};\nconst NO_LAUNCH_ADAPTERS = {\n SUSHI: ZERO_ADDRESS,\n STONK: ZERO_ADDRESS,\n};\n// Base EAS predeploy + registered Sherwood coordination schema UIDs. Shared\n// across any chain whose attestations are pinned to Base.\nconst BASE_EAS = {\n chainId: CHAIN_IDS.BASE,\n address: \"0x4200000000000000000000000000000000000021\",\n schemas: {\n joinRequest: \"0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef\",\n agentApproved: \"0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607\",\n },\n};\nconst NO_EAS = {\n chainId: CHAIN_IDS.BASE,\n address: ZERO_ADDRESS,\n schemas: { joinRequest: ZERO_BYTES32, agentApproved: ZERO_BYTES32 },\n};\n/**\n * Sherwood's EAS deployment on Robinhood Chain mainnet (4663).\n *\n * EAS is not a predeploy here — Robinhood Chain is Arbitrum Orbit, so there are\n * no OP-Stack predeploys at all — and Sherwood deployed it\n * (sherwoodagent/sherwood-protocol#278).\n *\n * This is the attestation COORDINATION chain: join/approve attestations for a\n * fund on any chain are recorded here, so every Robinhood deployment below\n * points at it rather than carrying its own.\n *\n * Schema UIDs are chain-independent — uid = keccak256(schema, resolver,\n * revocable) carries no chainId — so these match Base's.\n */\nconst ROBINHOOD_EAS = {\n chainId: CHAIN_IDS.ROBINHOOD,\n address: \"0x7d70441Bb10AcE5d9771dc0b6205D89ddf63205B\",\n schemas: {\n joinRequest: \"0x1e7ce17b16233977ba913b156033e98f52029f4bee273a4abefe6c15ce11d5ef\",\n agentApproved: \"0x1013f7b38f433b2a93fc5ac162482813081c64edd67cea9b5a90698531ddb607\",\n },\n};\n// Source of truth for each chain: contracts/chains/{chainId}.json.\n// Mirror manually until cli/contracts/sdk all share a generated table.\nconst BASE = {\n chainId: CHAIN_IDS.BASE,\n name: \"Base\",\n slug: \"base\",\n sherwood: {\n factory: \"0xAC74EC56858d7F1f7618c8e77F65Fc26aDf33c82\",\n guardianRegistry: \"0x49E4163b5e4b23F8f3d469Cf6fa197FB6b06A26E\",\n stakedWood: ZERO_ADDRESS, // not in chains/8453.json\n vaultImpl: \"0xfce4bcE08E9C047E4736f75C2B8557e2754Ce36A\",\n batchExecutorLib: \"0xbC79FbD5036C1Cc4A9d10BDf8628BF09a558496E\",\n // Not yet deployed on Base — fill in `STRATEGY_FACTORY` from\n // contracts/chains/8453.json when it lands (issue #387).\n strategyFactory: ZERO_ADDRESS,\n // None of the guardian-era contracts are in chains/8453.json yet.\n ...NO_GUARDIAN_ERA,\n },\n strategyTemplates: NO_STRATEGY_TEMPLATES,\n launchAdapters: NO_LAUNCH_ADAPTERS,\n identityRegistry: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n eas: BASE_EAS,\n tokens: {\n usdc: {\n address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n symbol: \"USDC\",\n decimals: 6,\n },\n weth: {\n address: \"0x4200000000000000000000000000000000000006\",\n symbol: \"WETH\",\n decimals: 18,\n },\n },\n explorer: \"https://basescan.org\",\n rpcs: [\"https://mainnet.base.org\"],\n};\nconst HYPEREVM = {\n chainId: CHAIN_IDS.HYPEREVM,\n name: \"HyperEVM\",\n slug: \"hyperevm\",\n sherwood: {\n factory: \"0xd05Ae0E8bcf13075C29817c805d6Cc14F214393a\",\n guardianRegistry: \"0x8b5710EB4e2fA639F364Dcc3F3B30c8f12F460b9\",\n stakedWood: ZERO_ADDRESS, // no known sWOOD deployment\n vaultImpl: \"0x2cbBe36Cf907A2BB410bacB0e4Fd632C7b012846\",\n batchExecutorLib: \"0x2c454bEF1b09c8a306a7058b8B510bF0DfF7179D\",\n strategyFactory: ZERO_ADDRESS,\n // No canonical chain book for HyperEVM — guardian-era contracts unknown.\n ...NO_GUARDIAN_ERA,\n },\n // ERC-8004 identity is minted on Base; HyperEVM funds reference the\n // Base-minted token id. Coordination attestations are pinned to Base EAS.\n strategyTemplates: NO_STRATEGY_TEMPLATES,\n launchAdapters: NO_LAUNCH_ADAPTERS,\n identityRegistry: ZERO_ADDRESS,\n eas: BASE_EAS,\n tokens: {\n usdc: {\n address: \"0xb88339CB7199b77E23DB6E890353E22632Ba630f\",\n symbol: \"USDC\",\n decimals: 6,\n },\n },\n explorer: \"https://hyperliquid.cloud.blockscout.com\",\n rpcs: [\"https://rpc.hyperliquid.xyz/evm\"],\n};\n// Robinhood Chain mainnet (chain 4663). Sherwood protocol is NOT yet deployed\n// here — all sherwood addresses stay ZERO (callers get a clear UNSUPPORTED).\n// USDG is the canonical stable (6 decimals); there is NO USDC on this chain.\nconst ROBINHOOD = {\n chainId: CHAIN_IDS.ROBINHOOD,\n name: \"Robinhood Chain\",\n slug: \"robinhood\",\n sherwood: {\n factory: ZERO_ADDRESS,\n guardianRegistry: ZERO_ADDRESS,\n stakedWood: ZERO_ADDRESS, // 4663.json has WOOD, no STAKED_WOOD\n vaultImpl: ZERO_ADDRESS,\n batchExecutorLib: ZERO_ADDRESS,\n strategyFactory: ZERO_ADDRESS,\n // Sherwood not deployed on Robinhood mainnet — no guardian-era contracts.\n ...NO_GUARDIAN_ERA,\n },\n // Coordination-only (decided): ZERO even where a template is deployed here.\n strategyTemplates: NO_STRATEGY_TEMPLATES,\n launchAdapters: NO_LAUNCH_ADAPTERS,\n // Canonical ERC-8004 IdentityRegistry (verified on-chain — ERC-1967 proxy,\n // name() = \"AgentIdentity\"). 4663 is the identity COORDINATION chain the\n // same way it is the EAS one: agents mint here regardless of fund chain.\n identityRegistry: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n eas: ROBINHOOD_EAS,\n tokens: {\n weth: {\n address: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\",\n symbol: \"WETH\",\n decimals: 18,\n },\n },\n explorer: \"https://robinhoodchain.blockscout.com\",\n rpcs: [\"https://rpc.mainnet.chain.robinhood.com\"],\n};\nconst ROBINHOOD_L2 = {\n chainId: CHAIN_IDS.ROBINHOOD_L2,\n name: \"Robinhood L2 Testnet\",\n slug: \"robinhood-l2\",\n // V2 redeploy (chain 46630): fresh core contracts + a full guardian layer\n // (registry + sWOOD) and a deployed StrategyFactory for the keyless\n // clone+init path (#387). Post-#421 per-vault-governor redeploy — kept in\n // sync with the canonical source of truth contracts/chains/46630.json (and\n // the app's app/src/lib/contracts.ts ROBINHOOD_TESTNET_ADDRESSES). A stale\n // factory here made /api/v1/funds?chain=46630 read the old deployment and\n // return {count: 0} while the UI listed funds (issue #459).\n sherwood: {\n factory: \"0xa91AA45AFF32f52b6357044B02a16EBA775feC0b\",\n guardianRegistry: \"0xA400eFcfFc820C6f812203C58ee00423AeCC0903\",\n stakedWood: \"0x21A69A6c9814c0d339C57fDdafed3B283702a739\",\n vaultImpl: \"0xC57e12d6e2d8Ed49316F0b69c51893CcA44151F7\",\n batchExecutorLib: \"0xF3b8db5aa41c7Ce92478A0Fa9C55a6460533eb86\",\n strategyFactory: \"0xb683Bb8EEcBc2419BC3801df6FeA88f96657e670\",\n // Guardian-era contracts from contracts/chains/46630.json (SHE-93).\n governorBeacon: \"0x3D46Ec018cd5893b685b4dfdc3921A4Eb64E11d1\",\n protocolConfig: \"0xC104Eb6a522d6718cA28F344B2373B29d57FF2E0\",\n priceRouter: \"0xDd302ffcfA08071780eC1A2f12BccFB9ba6b6731\",\n tierRegistry: \"0x99b8068Dc0F6093466964D581f72d947e3e380DB\",\n // Not in chains/46630.json (econ-security stack not deployed there yet).\n exposureLedger: ZERO_ADDRESS,\n proposerBondEscrow: ZERO_ADDRESS,\n challengeGame: ZERO_ADDRESS,\n tokenCourt: ZERO_ADDRESS,\n },\n // V2 redeploy PORTFOLIO_TEMPLATE; no other template or adapter on 46630.\n strategyTemplates: {\n ...NO_STRATEGY_TEMPLATES,\n PORTFOLIO: \"0x67420Cc504d70a42Adfd8867d878afe0978C7d10\",\n },\n launchAdapters: NO_LAUNCH_ADAPTERS,\n // No ERC-8004 registry on 46630. Attestations for funds here are recorded on\n // the 4663 coordination chain, so this points at the SAME deployment — note\n // eas.chainId is 4663, not this chain's id. That is deliberate.\n identityRegistry: ZERO_ADDRESS,\n eas: ROBINHOOD_EAS,\n tokens: {\n wood: {\n address: \"0xCCb4fB59cf40de1E23083037ee81Da1DD747D8d7\",\n symbol: \"WOOD\",\n decimals: 18,\n },\n },\n explorer: \"https://explorer.testnet.chain.robinhood.com\",\n rpcs: [\"https://rpc.testnet.chain.robinhood.com\"],\n};\n// Robinhood mainnet fork (Tenderly vnet, chain 9994663). Fresh Sherwood deploy\n// against a fork of Robinhood *mainnet* — USDG asset, official Uniswap v3+v4.\n// Source of truth: sherwood-protocol/chains/9994663.json. Ephemeral vnet: the\n// RPC changes when a new fork is minted (consumers should override via env).\nconst ROBINHOOD_FORK = {\n chainId: CHAIN_IDS.ROBINHOOD_FORK,\n name: \"Robinhood Chain (fork)\",\n slug: \"robinhood-fork\",\n sherwood: {\n factory: \"0x619af1488F32B4797f6faDa3C3a8De72a5B693E0\",\n guardianRegistry: \"0xD8F9E7446E6d6c02198AAaF674A0C5e3d5D1BF72\",\n stakedWood: \"0xdDf2B4C52B9575e0e6D03a3A57D75D06a4a9e203\",\n vaultImpl: \"0xdaB4707c9997a84e931FE98F4688adaFc70b6B95\",\n batchExecutorLib: \"0x899FC2Cac572F64A233344115b488E71E0044f34\",\n strategyFactory: \"0xb06788F027268a9A06c3AD41a88559530D2E54b1\",\n // Guardian-era contracts from sherwood-protocol/chains/9994663.json (SHE-93).\n governorBeacon: \"0x3CF45eFE9fBDdd6cB749384Bf5c1bA5Ec96af05d\",\n protocolConfig: \"0x8aDb5810B5bF8B9149BE3Ca45Cb441818a9679bB\",\n // Not in chains/9994663.json (no PriceRouter on the fork).\n priceRouter: ZERO_ADDRESS,\n tierRegistry: \"0x4614f058920941A0a9a852e62485fbDE692D75E1\",\n exposureLedger: \"0x99D789E7C8E65dB5597dCa692F082B47BE30AB33\",\n proposerBondEscrow: \"0x7d25058c891d3AC5C8bc8Da6aA937DFeE648B5cF\",\n challengeGame: \"0x7046FececcA6c0f5E66Cc998099593ae71A1bbee\",\n tokenCourt: \"0xC30bA62727be65fd867385Ce27Ff7C78bd66A897\",\n },\n strategyTemplates: {\n // sherwood-protocol chains/9994663.json\n PORTFOLIO: \"0xAA5872009c527cCb80343E41C52840CEdb095eb0\",\n MORPHO_SUPPLY: \"0x5B55E1Da361573CB0788e750038567D2569BE41d\",\n CONCENTRATED_LIQUIDITY: \"0xcba9C84F2d382729D1519c5F7f4a9AAaC075f8B5\",\n // sherwood-strategies deployments/9994663.json\n LAUNCHPAD: \"0x4435Aae199907f60588902Bcd7c4363a13Bb2951\",\n // Lighter deploys on Robinhood mainnet only (no sequencer on the fork).\n LIGHTER_PERP: ZERO_ADDRESS,\n },\n // sherwood-strategies deployments/9994663.json\n launchAdapters: {\n SUSHI: \"0x20348e428050031647d671F0e24752C01D4b7379\",\n STONK: \"0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab\",\n },\n // The fork is ephemeral, so attestation WRITES are disabled there (CLI\n // enforces it). Reads still resolve against the 4663 coordination chain, so\n // a fork session can display real attestations.\n identityRegistry: ZERO_ADDRESS,\n eas: ROBINHOOD_EAS,\n tokens: {\n weth: {\n address: \"0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73\",\n symbol: \"WETH\",\n decimals: 18,\n },\n wood: {\n address: \"0xF8BC08092C06dB6148114DCf82AF881F1085f92b\",\n symbol: \"WOOD\",\n decimals: 18,\n },\n },\n // A Tenderly vnet scopes its blocks under /explorer/vnet/<id> — the bare\n // dashboard host resolves to the caller's own dashboard, not this fork.\n explorer: \"https://dashboard.tenderly.co/explorer/vnet/6ad5961e-fbca-452f-939f-ca9a8c020933\",\n // PUBLIC endpoint of the vnet carrying the v1 redeploy: reads + tx\n // broadcast, no state-cheat surface. Admin/cheat RPCs stay private\n // (Tenderly dashboard). Retired vnets answer `not_found` rather than a\n // transport error, so the address book is the tell for which one is live.\n rpcs: [\n \"https://virtual.robinhood-chain.eu.rpc.tenderly.co/moonwell/wormhole-bridge/f509bc-4fdefe\",\n ],\n};\nconst REGISTRY = {\n [CHAIN_IDS.BASE]: BASE,\n [CHAIN_IDS.HYPEREVM]: HYPEREVM,\n [CHAIN_IDS.ROBINHOOD]: ROBINHOOD,\n [CHAIN_IDS.ROBINHOOD_L2]: ROBINHOOD_L2,\n [CHAIN_IDS.ROBINHOOD_FORK]: ROBINHOOD_FORK,\n};\nexport function getDeployment(chainId) {\n const entry = REGISTRY[chainId];\n if (!entry)\n throw unsupported(`No Sherwood deployment for chain ${chainId}`);\n return entry;\n}\nexport function listDeployments() {\n return Object.values(REGISTRY);\n}\n/** Network slug for join-request message prefixes (e.g. 8453 → \"base\"). */\nexport function chainSlug(chainId) {\n return getDeployment(chainId).slug;\n}\n","import { encodeFunctionData, getAddress, maxUint256 } from \"viem\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI, VAULT_WITHDRAWAL_QUEUE_ABI, } from \"../abis.js\";\nimport { getDeployment } from \"../addresses.js\";\nimport { usage } from \"../errors.js\";\n/**\n * Vault `agentFeeBps` bounds in basis points, mirroring sherwood-protocol\n * `src/FeeConstants.sol`: `MAX_AGENT_FEE_BPS` is the vault's hard cap\n * (`MAX_PERFORMANCE_FEE_BPS`, 25%) and `DEFAULT_AGENT_FEE_BPS` is the getter's\n * unset fallback (20% — the headline rate). Exported so consumers and the\n * encode-time guard share one searchable source rather than a bare literal\n * (PR #384 review pass 3).\n *\n * The SDK has no generated constants module, so these are hand-maintained\n * against that file; `cli/src/lib/generated/contract-constants.ts` is the\n * code-generated mirror of the same literal and must agree.\n */\nexport const MAX_AGENT_FEE_BPS = 2500n;\nexport const DEFAULT_AGENT_FEE_BPS = 2000n;\n/** Minimal WETH9 `deposit()` (payable) fragment — for the ETH→WETH wrap leg. */\nconst WETH_ABI = [\n {\n name: \"deposit\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [],\n outputs: [],\n },\n];\nconst ZERO_VALUE = \"0x0\";\nfunction toHexValue(value) {\n return `0x${value.toString(16)}`;\n}\nfunction encodeApproveTx(token, spender, amount, chainId) {\n return {\n to: token,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [spender, amount],\n }),\n value: ZERO_VALUE,\n chainId,\n };\n}\nfunction encodeDepositTx(vault, assets, receiver, chainId) {\n return {\n to: vault,\n data: encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"deposit\",\n args: [assets, receiver],\n }),\n value: ZERO_VALUE,\n chainId,\n };\n}\n/**\n * Encode the calldata for an ERC-4626 vault deposit.\n *\n * Returns 1–2 transactions:\n * - If `currentAllowance` is provided and >= `assets`, only the `deposit` tx.\n * - Otherwise, an `approve(spender=vault, amount=assets)` tx followed by the\n * `deposit` tx. Agents that already have an unlimited allowance can drop\n * the first tx after checking the `allowance` precondition.\n *\n * The SDK never reads chain state — pass `currentAllowance` if you want a\n * precise plan; otherwise expect the conservative two-tx default.\n */\nexport function encodeDeposit(args, chainId) {\n if (args.assets <= 0n) {\n throw usage(\"`assets` must be > 0\");\n }\n const vault = getAddress(args.vault);\n const receiver = getAddress(args.receiver);\n const asset = getAddress(args.asset);\n const txs = [];\n // Optional ETH→WETH wrap leg (WETH vaults only). Prepended so the wrap lands\n // before the approve/deposit. Wraps only the shortfall when a balance is given.\n let wrapped = false;\n if (args.wrapEth) {\n const weth = getDeployment(chainId).tokens.weth;\n if (!weth || getAddress(weth.address) !== asset) {\n throw usage(\"`wrapEth` is only valid for WETH vaults — the vault asset must be the chain's WETH.\");\n }\n const held = args.currentWethBalance ?? 0n;\n const shortfall = held >= args.assets ? 0n : args.assets - held;\n if (shortfall > 0n) {\n txs.push({\n to: asset,\n data: encodeFunctionData({ abi: WETH_ABI, functionName: \"deposit\", args: [] }),\n value: toHexValue(shortfall),\n chainId,\n });\n wrapped = true;\n }\n }\n const needsApprove = args.currentAllowance === undefined || args.currentAllowance < args.assets;\n if (needsApprove) {\n txs.push(encodeApproveTx(asset, vault, maxUint256, chainId));\n }\n txs.push(encodeDepositTx(vault, args.assets, receiver, chainId));\n const minDecimal = formatUnits(args.assets, args.assetDecimals);\n let description;\n if (wrapped) {\n description = needsApprove\n ? `Wrap ETH→WETH, approve ${args.assetSymbol} for ${vault}, then deposit ${minDecimal} ${args.assetSymbol}.`\n : `Wrap ETH→WETH, then deposit ${minDecimal} ${args.assetSymbol}.`;\n }\n else {\n description = needsApprove\n ? `Approve ${args.assetSymbol} for ${vault}, then deposit ${minDecimal} ${args.assetSymbol}.`\n : `Deposit ${minDecimal} ${args.assetSymbol} into ${vault}.`;\n }\n return {\n txs,\n preconditions: [\n {\n type: \"balance\",\n asset,\n assetSymbol: args.assetSymbol,\n min: args.assets.toString(),\n minDecimal,\n },\n {\n type: \"allowance\",\n token: asset,\n spender: vault,\n min: args.assets.toString(),\n minDecimal,\n },\n { type: \"vault-not-locked\", vault },\n { type: \"depositor-approved\", vault, depositor: receiver },\n ],\n description,\n note: \"Both txs are gated by vault state. If `redemptionsLocked()` is true the deposit reverts unless live NAV is available; check the vault read endpoint before broadcasting.\",\n };\n}\n/** Internal: decimal-string formatter so we don't pull in a heavy dep. */\nfunction formatUnits(value, decimals) {\n if (decimals === 0)\n return value.toString();\n const negative = value < 0n;\n const abs = negative ? -value : value;\n const str = abs.toString().padStart(decimals + 1, \"0\");\n const head = str.slice(0, str.length - decimals);\n const tail = str.slice(str.length - decimals).replace(/0+$/, \"\");\n const out = tail.length > 0 ? `${head}.${tail}` : head;\n return negative ? `-${out}` : out;\n}\n// Re-export for tests / callers that want to pre-format previews.\nexport { formatUnits };\n// Tiny helpers exported for the API layer to convert plan-level UnsignedTx\n// into the on-the-wire JSON shape with a hex `value`. Kept here so encoders\n// own their wire representation end to end.\nexport { toHexValue };\nexport function encodeRedeem(args, chainId) {\n if (args.shares <= 0n)\n throw usage(\"`shares` must be > 0\");\n const vault = getAddress(args.vault);\n const receiver = getAddress(args.receiver);\n const owner = getAddress(args.owner);\n return {\n txs: [\n {\n to: vault,\n data: encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"redeem\",\n args: [args.shares, receiver, owner],\n }),\n value: ZERO_VALUE,\n chainId,\n },\n ],\n preconditions: [\n { type: \"vault-not-locked\", vault },\n ],\n description: `Redeem ${args.shares.toString()} shares of ${vault} → ${receiver}.`,\n note: \"Synchronous path. Reverts if the vault has an active proposal AND live NAV is unavailable; in that case use /prepare/request-redeem (queue path) instead.\",\n };\n}\nexport function encodeRequestRedeem(args, chainId) {\n if (args.shares <= 0n)\n throw usage(\"`shares` must be > 0\");\n const vault = getAddress(args.vault);\n const owner = getAddress(args.owner);\n return {\n txs: [\n {\n to: vault,\n data: encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"requestRedeem\",\n args: [args.shares, owner],\n }),\n value: ZERO_VALUE,\n chainId,\n },\n ],\n preconditions: [],\n description: `Queue a redeem request for ${args.shares.toString()} shares of ${vault}.`,\n note: \"Only callable while `redemptionsLocked() == true`. Shares are escrowed in the per-vault queue; claim with the queue's `claim(requestId)` once the proposal settles.\",\n };\n}\n/**\n * Encode a Lane B deposit request. Mirrors `encodeRequestRedeem`, but the\n * asset moves, so an ERC-20 approve leg is emitted the same way\n * `encodeDeposit` does — the spender is the VAULT (it pulls, then forwards to\n * the queue), not the queue.\n */\nexport function encodeRequestDeposit(args, chainId) {\n if (args.assets <= 0n)\n throw usage(\"`assets` must be > 0\");\n const vault = getAddress(args.vault);\n const receiver = getAddress(args.receiver);\n const asset = getAddress(args.asset);\n const txs = [];\n const needsApproval = args.currentAllowance === undefined || args.currentAllowance < args.assets;\n if (needsApproval) {\n txs.push(encodeApproveTx(asset, vault, args.assets, chainId));\n }\n txs.push({\n to: vault,\n data: encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"requestDeposit\",\n args: [args.assets, receiver],\n }),\n value: ZERO_VALUE,\n chainId,\n });\n return {\n txs,\n preconditions: needsApproval\n ? [\n {\n type: \"allowance\",\n token: asset,\n spender: vault,\n min: args.assets.toString(),\n minDecimal: args.assets.toString(),\n },\n ]\n : [],\n description: `Queue a deposit of ${args.assets.toString()} asset units into ${vault} for ${receiver}.`,\n note: \"Only callable while a proposal is open. Assets are escrowed OFF-vault in the per-vault queue (they neither inflate totalAssets nor get swept into the strategy); shares mint on `claim(requestId)` after the proposal settles.\",\n };\n}\n/**\n * Encode `claim(requestId)` or `cancel(requestId)` on a vault's Lane B queue.\n *\n * The queue address is not derivable off-chain — read it from\n * `vault.withdrawalQueue()` and pass it in (the encoders never do RPC).\n */\nexport function encodeQueueAction(args, chainId) {\n if (args.action !== \"claim\" && args.action !== \"cancel\") {\n throw usage(\"`action` must be one of: claim, cancel\");\n }\n const queue = getAddress(args.queue);\n const id = typeof args.requestId === \"bigint\" ? args.requestId : BigInt(args.requestId);\n if (id < 0n)\n throw usage(\"`requestId` must be a non-negative integer\");\n return {\n txs: [\n {\n to: queue,\n data: encodeFunctionData({\n abi: VAULT_WITHDRAWAL_QUEUE_ABI,\n functionName: args.action,\n args: [id],\n }),\n value: ZERO_VALUE,\n chainId,\n },\n ],\n preconditions: [],\n description: args.action === \"claim\"\n ? `Claim Lane B request ${id.toString()} at its frozen settle price.`\n : `Cancel Lane B request ${id.toString()}.`,\n // WHO MAY CALL differs between the two, and the difference is not\n // guessable from the shared shape — claim has no sender check at all.\n note: args.action === \"claim\"\n ? \"PERMISSIONLESS — anyone may claim any request once its price is stamped; proceeds always go to the request's owner, never the caller. Reverts while the vault is still locked, or if the request is already claimed or cancelled.\"\n : \"OWNER-ONLY — reverts NotQueueOwner unless the caller is the request's owner. A redeem may only be cancelled before its proposal price is stamped (G7: a post-settle cancel would be a free look-back option); a deposit cancel stays open unconditionally because deposits price live at claim time.\",\n };\n}\n// ── Owner-side admin encoders ─────────────────────────────\nexport function encodeApproveDepositor(args, chainId) {\n const vault = getAddress(args.vault);\n const depositor = getAddress(args.depositor);\n return {\n txs: [\n {\n to: vault,\n data: encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"approveDepositor\",\n args: [depositor],\n }),\n value: ZERO_VALUE,\n chainId,\n },\n ],\n preconditions: [],\n description: `Approve depositor ${depositor} on vault ${vault}.`,\n note: \"Vault owner only.\",\n };\n}\nexport function encodeSetAgentFeeBps(args, chainId) {\n const vault = getAddress(args.vault);\n const bps = typeof args.bps === \"bigint\" ? args.bps : BigInt(args.bps);\n // Client-side fail-fast against the same ceiling the vault enforces.\n if (bps < 0n || bps > MAX_AGENT_FEE_BPS) {\n throw usage(`\\`bps\\` must be an integer in [0, ${MAX_AGENT_FEE_BPS}] (max ${Number(MAX_AGENT_FEE_BPS) / 100}%)`);\n }\n return {\n txs: [\n {\n to: vault,\n data: encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"setAgentFeeBps\",\n args: [bps],\n }),\n value: ZERO_VALUE,\n chainId,\n },\n ],\n preconditions: [],\n description: `Set agent performance fee to ${bps.toString()} bps on vault ${vault}.`,\n note: `Vault owner only. Capped at ${MAX_AGENT_FEE_BPS} bps (${Number(MAX_AGENT_FEE_BPS) / 100}%, the vault's MAX_AGENT_FEE_BPS); the governor further clamps the realized fee to its configured maxPerformanceFeeBps at settlement, which may be lower.`,\n };\n}\nexport function encodeRegisterAgent(args, chainId) {\n const vault = getAddress(args.vault);\n const agentAddress = getAddress(args.agentAddress);\n const id = typeof args.agentId === \"bigint\" ? args.agentId : BigInt(args.agentId);\n if (id < 0n)\n throw usage(\"`agentId` must be a non-negative integer\");\n return {\n txs: [\n {\n to: vault,\n data: encodeFunctionData({\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"registerAgent\",\n // (agentId, agentAddress) — the protocol's order. See abis.ts.\n args: [id, agentAddress],\n }),\n value: ZERO_VALUE,\n chainId,\n },\n ],\n preconditions: [],\n description: `Register agent ${agentAddress} (id ${id.toString()}) on vault ${vault}.`,\n note: \"Vault owner only. The ERC-8004 NFT must be owned by `agentAddress` or by the vault owner at registration time.\",\n };\n}\n","import { encodeFunctionData, getAddress, isAddress } from \"viem\";\nimport { PROTOCOL_CONFIG_ABI, SYNDICATE_GOVERNOR_ABI } from \"../abis.js\";\nimport { usage } from \"../errors.js\";\nconst ZERO_VALUE = \"0x0\";\nexport const VOTE_TYPES = {\n For: 0,\n Against: 1,\n Abstain: 2,\n};\n/**\n * Per-vault governor (PR #421): there is no global governor singleton any\n * more — every write targets the vault's own governor. Callers resolve it\n * with `resolveGovernor(client, chainId, vault)` (factory.governorOf) and\n * pass it in each encoder's `governor` arg. Encoders stay pure (no RPC).\n */\nfunction governorTx(governor, chainId, data) {\n return {\n to: governor,\n data,\n value: ZERO_VALUE,\n chainId,\n };\n}\nfunction parseGovernor(value) {\n if (typeof value !== \"string\" || !isAddress(value)) {\n throw usage(\"`governor` must be the vault's governor address — resolve it with `resolveGovernor(client, chainId, vault)` (factory.governorOf)\");\n }\n return getAddress(value);\n}\nfunction parseProposalId(value) {\n if (typeof value === \"bigint\") {\n if (value < 0n)\n throw usage(\"`proposalId` must be a non-negative integer\");\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isInteger(value) || value < 0) {\n throw usage(\"`proposalId` must be a non-negative integer\");\n }\n return BigInt(value);\n }\n if (!/^\\d+$/.test(value)) {\n throw usage(`\\`proposalId\\` must be a non-negative integer string, got \"${value}\"`);\n }\n return BigInt(value);\n}\nexport function encodeVote(args, chainId) {\n const governor = parseGovernor(args.governor);\n const support = VOTE_TYPES[args.vote];\n if (support === undefined) {\n throw usage(`Unsupported vote \"${args.vote}\" — must be one of: ${Object.keys(VOTE_TYPES).join(\", \")}`);\n }\n const proposalId = parseProposalId(args.proposalId);\n const data = encodeFunctionData({\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"vote\",\n args: [proposalId, support],\n });\n return {\n txs: [governorTx(governor, chainId, data)],\n preconditions: [],\n description: `Vote ${args.vote} on proposal ${proposalId.toString()}.`,\n note: \"Voter must hold ERC20Votes shares of the vault at the proposal's snapshot timestamp; double-voting reverts. Use the proposal read endpoint to check `voteEnd` first.\",\n };\n}\nfunction lifecycleAction(fn, proposalId, governor, chainId, description, note) {\n const data = encodeFunctionData({\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: fn,\n args: [proposalId],\n });\n return {\n txs: [governorTx(governor, chainId, data)],\n preconditions: [],\n description,\n note,\n };\n}\nexport function encodeExecute(args, chainId) {\n const id = parseProposalId(args.proposalId);\n return lifecycleAction(\"executeProposal\", id, parseGovernor(args.governor), chainId, `Execute proposal ${id.toString()} (open the strategy).`, \"Reverts if the proposal is not in the `Approved` state. Check `state == Approved` via the proposal read endpoint first.\");\n}\nexport function encodeSettle(args, chainId) {\n const id = parseProposalId(args.proposalId);\n return lifecycleAction(\"settleProposal\", id, parseGovernor(args.governor), chainId, `Settle proposal ${id.toString()} (close the strategy and distribute fees).`, \"Proposer can settle anytime; anyone can settle after the strategy duration elapses.\");\n}\nexport function encodeCancel(args, chainId) {\n const id = parseProposalId(args.proposalId);\n return lifecycleAction(\"cancelProposal\", id, parseGovernor(args.governor), chainId, `Cancel proposal ${id.toString()} (proposer-only).`, \"Only the proposer can cancel, and only while the proposal is in `Pending`, `GuardianReview`, or `Approved`.\");\n}\nexport function encodeVeto(args, chainId) {\n const id = parseProposalId(args.proposalId);\n return lifecycleAction(\"vetoProposal\", id, parseGovernor(args.governor), chainId, `Veto proposal ${id.toString()} (vault-owner only, only while \\`Pending\\`).`, \"Vault owner only. Reverts after the proposal enters `GuardianReview`. To block at that point, depend on guardian block-quorum.\");\n}\nexport { parseProposalId };\n/** Coerce a caller-supplied amount to bigint, rejecting the shapes that are not. */\nfunction toBigInt(v, label) {\n if (typeof v === \"bigint\")\n return v;\n if (typeof v === \"number\" && Number.isInteger(v) && v >= 0)\n return BigInt(v);\n if (typeof v === \"string\" && /^\\d+$/.test(v))\n return BigInt(v);\n throw usage(`\\`${label}\\` must be a non-negative integer (string, number, or bigint)`);\n}\n/** Validate a per-call cap array against its batch, then coerce it. */\nfunction validateCaps(caps, calls, maxCapital, scope) {\n if (!Array.isArray(caps)) {\n throw usage(`\\`${scope}\\` must be an array of per-call caps, one per call`);\n }\n if (caps.length !== calls.length) {\n // The governor reverts `CallCapsLengthMismatch` for this, which names the\n // mismatch but not which batch it came from.\n throw usage(`\\`${scope}\\` has ${caps.length} entries for ${calls.length} calls — every call must declare exactly one cap`);\n }\n const out = caps.map((c, i) => toBigInt(c, `${scope}[${i}]`));\n const sum = out.reduce((a, b) => a + b, 0n);\n if (sum > maxCapital) {\n // Checked here as well as on chain because the on-chain revert\n // (`CallCapsExceedMaxCapital`) cannot say by how much.\n throw usage(`\\`${scope}\\` sums to ${sum} which exceeds \\`envelope.maxCapital\\` (${maxCapital})`);\n }\n return out;\n}\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nfunction validateBatchCall(call, scope, idx) {\n if (!call || typeof call !== \"object\") {\n throw usage(`\\`${scope}[${idx}]\\` must be an object`);\n }\n const c = call;\n if (typeof c.target !== \"string\" || !isAddress(c.target)) {\n throw usage(`\\`${scope}[${idx}].target\\` must be a 0x-prefixed address`);\n }\n if (typeof c.data !== \"string\" || !/^0x[0-9a-fA-F]*$/.test(c.data)) {\n throw usage(`\\`${scope}[${idx}].data\\` must be a 0x-prefixed hex string`);\n }\n let value;\n if (typeof c.value === \"string\") {\n if (!/^\\d+$/.test(c.value)) {\n throw usage(`\\`${scope}[${idx}].value\\` must be a non-negative integer string`);\n }\n value = BigInt(c.value);\n }\n else if (typeof c.value === \"bigint\") {\n if (c.value < 0n) {\n throw usage(`\\`${scope}[${idx}].value\\` must be non-negative`);\n }\n value = c.value;\n }\n else if (c.value === undefined || c.value === null) {\n value = 0n;\n }\n else {\n throw usage(`\\`${scope}[${idx}].value\\` must be a non-negative integer string (or omitted for 0)`);\n }\n return { target: getAddress(c.target), data: c.data, value };\n}\nexport function encodePropose(args, chainId) {\n const vault = getAddress(args.vault);\n const governor = parseGovernor(args.governor);\n const strategy = args.strategy === ZERO_ADDRESS ? ZERO_ADDRESS : getAddress(args.strategy);\n if (typeof args.metadataURI !== \"string\" || args.metadataURI.length === 0) {\n throw usage(\"`metadataURI` must be a non-empty string (e.g. ipfs://...)\");\n }\n const strategyDuration = typeof args.strategyDuration === \"bigint\"\n ? args.strategyDuration\n : BigInt(args.strategyDuration);\n if (strategyDuration <= 0n) {\n throw usage(\"`strategyDuration` must be > 0 (seconds)\");\n }\n if (!Array.isArray(args.executeCalls)) {\n throw usage(\"`executeCalls` must be an array of {target, data, value} objects\");\n }\n if (!Array.isArray(args.settlementCalls)) {\n throw usage(\"`settlementCalls` must be an array of {target, data, value} objects\");\n }\n const executeCalls = args.executeCalls.map((c, i) => validateBatchCall(c, \"executeCalls\", i));\n const settlementCalls = args.settlementCalls.map((c, i) => validateBatchCall(c, \"settlementCalls\", i));\n const coProposers = (args.coProposers ?? []).map((cp, i) => {\n if (!cp || typeof cp !== \"object\") {\n throw usage(`\\`coProposers[${i}]\\` must be an object`);\n }\n const agent = cp.agent;\n const splitBps = cp.splitBps;\n if (typeof agent !== \"string\" || !isAddress(agent)) {\n throw usage(`\\`coProposers[${i}].agent\\` must be a 0x-prefixed address`);\n }\n let bps;\n if (typeof splitBps === \"string\" && /^\\d+$/.test(splitBps)) {\n bps = BigInt(splitBps);\n }\n else if (typeof splitBps === \"bigint\") {\n bps = splitBps;\n }\n else if (typeof splitBps === \"number\" && Number.isInteger(splitBps) && splitBps >= 0) {\n bps = BigInt(splitBps);\n }\n else {\n throw usage(`\\`coProposers[${i}].splitBps\\` must be a non-negative integer (string, number, or bigint)`);\n }\n if (bps < 0n || bps > 10000n) {\n throw usage(`\\`coProposers[${i}].splitBps\\` must be in [0, 10000]`);\n }\n return { agent: getAddress(agent), splitBps: bps };\n });\n if (!args.envelope || typeof args.envelope !== \"object\") {\n throw usage(\"`envelope` must be an object of {maxCapital, maxDrawdownBps}\");\n }\n const maxCapital = toBigInt(args.envelope.maxCapital, \"envelope.maxCapital\");\n if (maxCapital === 0n) {\n throw usage(\"`envelope.maxCapital` must be > 0 (the governor rejects zero as ZeroMaxCapital)\");\n }\n const maxDrawdownBps = args.envelope.maxDrawdownBps;\n if (!Number.isInteger(maxDrawdownBps) || maxDrawdownBps < 0 || maxDrawdownBps > 10_000) {\n throw usage(\"`envelope.maxDrawdownBps` must be an integer in [0, 10000]\");\n }\n const executeCallCaps = validateCaps(args.executeCallCaps, executeCalls, maxCapital, \"executeCallCaps\");\n // The two batches are bounded INDEPENDENTLY on chain: they run in separate\n // transactions, each metered on its own, so a shared budget would halve every\n // proposal's settlement allowance for no safety gain.\n const settlementCallCaps = validateCaps(args.settlementCallCaps, settlementCalls, maxCapital, \"settlementCallCaps\");\n const data = encodeFunctionData({\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"propose\",\n args: [\n vault,\n strategy,\n args.metadataURI,\n strategyDuration,\n { maxCapital, maxDrawdownBps },\n executeCalls,\n executeCallCaps,\n settlementCalls,\n settlementCallCaps,\n coProposers,\n ],\n });\n return {\n txs: [governorTx(governor, chainId, data)],\n preconditions: [\n { type: \"vault-not-locked\", vault },\n ],\n description: `Propose a strategy on ${vault} (duration ${strategyDuration.toString()}s). Agent fee is snapshotted from the vault's agentFeeBps at propose time, then clamped to maxPerformanceFeeBps at settlement.`,\n note: \"Reverts if the vault has an active proposal (cooldown not elapsed). The strategy address is immutable post-propose; pass address(0) to opt out of live NAV. `coProposers[].splitBps` total must satisfy contract-side constraints.\",\n };\n}\n// ── Emergency settlement (GovernorEmergency, V1.5) ───────\nexport function encodeUnstick(args, chainId) {\n const governor = parseGovernor(args.governor);\n const id = parseProposalId(args.proposalId);\n const data = encodeFunctionData({\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"unstick\",\n args: [id],\n });\n return {\n txs: [governorTx(governor, chainId, data)],\n preconditions: [],\n description: `Unstick proposal ${id.toString()} — run its governance-approved settlement calls (owner-instant, no funds beyond the approved calls).`,\n note: \"Vault-owner only. Valid only when the proposal is Executed AND its strategy duration has elapsed. Runs the proposal's pre-committed settlement calls and finalizes settlement; no owner stake required. Reverts if those calls revert — if they can't succeed, open an emergency-settle with custom unwind calls instead.\",\n };\n}\nexport function encodeEmergencySettle(args, chainId) {\n const governor = parseGovernor(args.governor);\n const id = parseProposalId(args.proposalId);\n if (!Array.isArray(args.calls)) {\n throw usage(\"`calls` must be an array of {target, data, value} objects\");\n }\n const calls = args.calls.map((c, i) => validateBatchCall(c, \"calls\", i));\n const data = encodeFunctionData({\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"emergencySettleWithCalls\",\n args: [id, calls],\n });\n return {\n txs: [governorTx(governor, chainId, data)],\n preconditions: [],\n description: `Open an emergency-settle review on proposal ${id.toString()} with ${calls.length} unwind call(s).`,\n note: \"Vault-owner only, requires bonded owner stake. Does NOT execute immediately — it commits the calls' hash and opens a guardian-reviewed window (default ~24h). After the window, finalize with finalizeEmergencySettle; guardians can block within it (owner stake burned on block-quorum).\",\n };\n}\n// ── Parameter setters (GovernorParameters, V1.5) ─────────\nfunction parseUintArg(value, label) {\n if (typeof value === \"bigint\") {\n if (value < 0n)\n throw usage(`\\`${label}\\` must be a non-negative integer`);\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isInteger(value) || value < 0) {\n throw usage(`\\`${label}\\` must be a non-negative integer`);\n }\n return BigInt(value);\n }\n if (!/^\\d+$/.test(value)) {\n throw usage(`\\`${label}\\` must be a non-negative integer string, got \"${value}\"`);\n }\n return BigInt(value);\n}\n/**\n * Maps a friendly parameter name to its on-chain setter. Every setter takes a\n * single uint256 and is owner-instant (V1.5 dropped the on-chain timelock).\n */\nconst GOVERNOR_PARAM_SETTERS = {\n votingPeriod: \"setVotingPeriod\",\n executionWindow: \"setExecutionWindow\",\n vetoThresholdBps: \"setVetoThresholdBps\",\n maxPerformanceFeeBps: \"setMaxPerformanceFeeBps\",\n maxStrategyDuration: \"setMaxStrategyDuration\",\n cooldownPeriod: \"setCooldownPeriod\",\n};\nexport function encodeGovernorParam(args, chainId) {\n const governor = parseGovernor(args.governor);\n const fn = GOVERNOR_PARAM_SETTERS[args.param];\n if (!fn) {\n throw usage(`Unknown governor param \"${args.param}\" — must be one of: ${Object.keys(GOVERNOR_PARAM_SETTERS).join(\", \")}`);\n }\n const value = parseUintArg(args.value, args.param);\n const data = encodeFunctionData({\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: fn,\n args: [value],\n });\n return {\n txs: [governorTx(governor, chainId, data)],\n preconditions: [],\n description: `Set governor parameter ${args.param} = ${value.toString()}.`,\n note: \"Vault-owner only. V1.5 has no on-chain parameter timelock — the change applies immediately on this call. Bounds are validated on-chain; out-of-range values revert.\",\n };\n}\n/** Parse one split leg as a uint16 bps value. */\nfunction parseSplitBps(value, label) {\n const v = Number(parseUintArg(value, label));\n if (v > 10_000)\n throw usage(`\\`${label}\\` must be <= 10000 bps, got ${v}`);\n return v;\n}\nfunction requireSplitSum(legs) {\n const sum = Object.values(legs).reduce((a, b) => a + b, 0);\n if (sum !== 10_000) {\n const parts = Object.entries(legs)\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n throw usage(`split legs must sum to 10000 bps, got ${sum} (${parts})`);\n }\n}\n/**\n * Encode `ProtocolConfig.setMgmtSplit({agentBps, protocolBps, guardianBps})`.\n * Post-audit ProtocolConfig exposes the management-fee SPLIT, not a per-rate\n * protocol fee — the fee rates live on the vault/governor; this divides them.\n * Legs must sum to 10000 bps. Protocol-owner (multisig) only.\n */\nexport function encodeMgmtSplit(args, chainId) {\n if (!isAddress(args.protocolConfig)) {\n throw usage(`\\`protocolConfig\\` must be a valid address, got \"${args.protocolConfig}\"`);\n }\n const protocolConfig = getAddress(args.protocolConfig);\n const s = {\n agentBps: parseSplitBps(args.agentBps, \"agentBps\"),\n protocolBps: parseSplitBps(args.protocolBps, \"protocolBps\"),\n guardianBps: parseSplitBps(args.guardianBps, \"guardianBps\"),\n };\n requireSplitSum(s);\n const data = encodeFunctionData({\n abi: PROTOCOL_CONFIG_ABI,\n functionName: \"setMgmtSplit\",\n args: [s],\n });\n return {\n txs: [governorTx(protocolConfig, chainId, data)],\n preconditions: [],\n description: `Set ProtocolConfig mgmtSplit = agent ${s.agentBps} / protocol ${s.protocolBps} / guardian ${s.guardianBps} bps.`,\n note: \"Protocol-owner only (the protocol multisig), NOT the vault owner. Targets the protocol-wide ProtocolConfig contract; in-flight proposals keep the split snapshotted at propose time.\",\n };\n}\n/**\n * Encode `ProtocolConfig.setPerfSplit({agentBps, protocolBps, guardianBps,\n * ownerBps})`. Legs must sum to 10000 bps. Protocol-owner (multisig) only.\n */\nexport function encodePerfSplit(args, chainId) {\n if (!isAddress(args.protocolConfig)) {\n throw usage(`\\`protocolConfig\\` must be a valid address, got \"${args.protocolConfig}\"`);\n }\n const protocolConfig = getAddress(args.protocolConfig);\n const s = {\n agentBps: parseSplitBps(args.agentBps, \"agentBps\"),\n protocolBps: parseSplitBps(args.protocolBps, \"protocolBps\"),\n guardianBps: parseSplitBps(args.guardianBps, \"guardianBps\"),\n ownerBps: parseSplitBps(args.ownerBps, \"ownerBps\"),\n };\n requireSplitSum(s);\n const data = encodeFunctionData({\n abi: PROTOCOL_CONFIG_ABI,\n functionName: \"setPerfSplit\",\n args: [s],\n });\n return {\n txs: [governorTx(protocolConfig, chainId, data)],\n preconditions: [],\n description: `Set ProtocolConfig perfSplit = agent ${s.agentBps} / protocol ${s.protocolBps} / guardian ${s.guardianBps} / owner ${s.ownerBps} bps.`,\n note: \"Protocol-owner only (the protocol multisig), NOT the vault owner. Targets the protocol-wide ProtocolConfig contract; in-flight proposals keep the split snapshotted at propose time.\",\n };\n}\n","import { encodeFunctionData, getAddress } from \"viem\";\nimport { SYNDICATE_FACTORY_ABI } from \"../abis.js\";\nimport { getDeployment } from \"../addresses.js\";\nimport { usage } from \"../errors.js\";\nconst ZERO_VALUE = \"0x0\";\nconst SUBDOMAIN_RE = /^[a-z0-9-]{1,63}$/;\nexport function encodeCreateFund(args, chainId) {\n if (typeof args.metadataURI !== \"string\" || args.metadataURI.length === 0) {\n throw usage(\"`metadataURI` must be a non-empty string (e.g. ipfs://...)\");\n }\n if (typeof args.name !== \"string\" || args.name.length === 0) {\n throw usage(\"`name` must be a non-empty string\");\n }\n if (typeof args.symbol !== \"string\" || args.symbol.length === 0) {\n throw usage(\"`symbol` must be a non-empty string\");\n }\n if (typeof args.openDeposits !== \"boolean\") {\n throw usage(\"`openDeposits` must be a boolean\");\n }\n if (!SUBDOMAIN_RE.test(args.subdomain)) {\n throw usage(\"`subdomain` must match /^[a-z0-9-]{1,63}$/ (lowercase letters, digits, hyphens)\");\n }\n const asset = getAddress(args.asset);\n const creatorAgentId = typeof args.creatorAgentId === \"bigint\"\n ? args.creatorAgentId\n : BigInt(args.creatorAgentId);\n if (creatorAgentId < 0n)\n throw usage(\"`creatorAgentId` must be non-negative\");\n const factory = getDeployment(chainId).sherwood.factory;\n const data = encodeFunctionData({\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"createSyndicate\",\n args: [\n creatorAgentId,\n {\n metadataURI: args.metadataURI,\n asset,\n name: args.name,\n symbol: args.symbol,\n openDeposits: args.openDeposits,\n subdomain: args.subdomain,\n },\n ],\n });\n return {\n txs: [{ to: factory, data, value: ZERO_VALUE, chainId }],\n preconditions: [\n // Creator must own the ERC-8004 NFT for `creatorAgentId` and have\n // pre-staked the owner bond via StakedWood.prepareOwnerStake.\n // No on-chain check from the SDK side — agent verifies upstream.\n ],\n description: `Create fund \"${args.subdomain}\" with ${args.openDeposits ? \"open\" : \"whitelisted\"} deposits.`,\n note: \"Caller must own the ERC-8004 NFT for `creatorAgentId` and must have called `StakedWood.prepareOwnerStake` first to bond the owner stake. The factory's `createSyndicate` deploys a vault proxy + binds the owner stake atomically.\",\n };\n}\n","import { concatHex, encodeAbiParameters, encodeFunctionData, encodePacked, getAddress, getCreate2Address, isHex, keccak256, } from \"viem\";\nimport { STRATEGY_FACTORY_ABI } from \"../abis.js\";\nimport { getDeployment } from \"../addresses.js\";\nimport { unavailable, usage } from \"../errors.js\";\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst ZERO_VALUE = \"0x0\";\n// ERC-1167 minimal-proxy creation code, split around the 20-byte implementation\n// address. Byte-identical to OpenZeppelin `Clones.sol` (the same bytes\n// `StrategyFactory.cloneAndInitDeterministic` deploys via CREATE2), so the\n// CREATE2 address derived from it matches `Clones.predictDeterministicAddress`.\nconst ERC1167_PREFIX = \"0x3d602d80600a3d3981f3363d3d373d3d3d363d73\";\nconst ERC1167_SUFFIX = \"0x5af43d82803e903d91602b57fd5bf3\";\n/**\n * Predict the CREATE2 address of an ERC-1167 clone of `template` deployed by\n * `factory` with `salt`. Mirrors OpenZeppelin `Clones.predictDeterministicAddress`.\n *\n * Pure — no RPC. The clone is deterministic in `(factory, template, salt)`\n * ONLY; it does NOT depend on `vault`/`proposer`. See `deriveStrategySalt` and\n * the note in `encodeStrategyDeploy` for the front-running implication.\n */\nexport function predictStrategyCloneAddress(factory, template, salt) {\n const initCode = concatHex([\n ERC1167_PREFIX,\n getAddress(template),\n ERC1167_SUFFIX,\n ]);\n return getCreate2Address({\n from: getAddress(factory),\n salt,\n bytecode: initCode,\n });\n}\n/**\n * Default CREATE2 salt for a strategy deploy: a keccak of the inputs. Two deploys\n * with identical `(vault, proposer, template, initData)` collide (the second\n * `cloneAndInitDeterministic` reverts, address already taken) — pass an explicit\n * `salt` to re-deploy the same parameters (e.g. propose → cancel → re-propose).\n */\nexport function deriveStrategySalt(vault, proposer, template, initData) {\n return keccak256(encodePacked([\"address\", \"address\", \"address\", \"bytes\"], [getAddress(vault), getAddress(proposer), getAddress(template), initData]));\n}\n/**\n * The actual CREATE2 salt the factory uses: `keccak256(abi.encode(vault, salt))`.\n *\n * `StrategyFactory.cloneAndInitDeterministic` folds the vault into the salt so\n * the predicted address lives in a per-vault namespace; combined with the\n * factory's `_authClone(vault)` gate (only the vault's owner/agents may deploy),\n * a front-runner who reads `salt` from the mempool cannot occupy the address.\n * This MUST stay byte-identical to the on-chain fold or predictions diverge from\n * the deployed address.\n */\nexport function effectiveStrategySalt(vault, salt) {\n return keccak256(encodeAbiParameters([{ type: \"address\" }, { type: \"bytes32\" }], [getAddress(vault), salt]));\n}\nfunction requireSalt(value) {\n if (typeof value !== \"string\" || !isHex(value) || value.length !== 66) {\n throw usage(\"`salt` must be a 0x-prefixed 32-byte hex string (66 chars)\");\n }\n return value;\n}\n/**\n * Encode `StrategyFactory.cloneAndInitDeterministic(template, vault, proposer,\n * initData, salt)` — one unsigned tx that atomically clones the template via\n * CREATE2 and initializes it. Returns the predicted clone address so the caller\n * can build the proposal's `strategy` arg + executeCalls/settlementCalls against\n * it BEFORE the tx is mined — which is what unblocks keyless strategy proposals\n * (#387). Works for any template (Moonwell, Aerodrome, Venice, Portfolio, …):\n * the mechanism is template-agnostic, only `initData` differs.\n */\nexport function encodeStrategyDeploy(args, chainId) {\n const template = getAddress(args.template);\n const vault = getAddress(args.vault);\n const proposer = getAddress(args.proposer);\n if (typeof args.initData !== \"string\" || !isHex(args.initData)) {\n throw usage(\"`initData` must be a 0x-prefixed hex string\");\n }\n if (template === ZERO_ADDRESS) {\n throw usage(\"`template` must be a non-zero address\");\n }\n if (proposer === ZERO_ADDRESS) {\n throw usage(\"`proposer` must be a non-zero address\");\n }\n const factory = args.factory\n ? getAddress(args.factory)\n : getDeployment(chainId).sherwood.strategyFactory;\n if (factory === ZERO_ADDRESS) {\n throw unavailable(`StrategyFactory is not yet deployed on chain ${chainId} — mirror its address into the SDK once it lands (issue #387), or pass an explicit \\`factory\\`.`);\n }\n // `salt` is what's passed in the calldata; the factory folds the vault in\n // (keccak256(abi.encode(vault, salt))) before CREATE2, so the prediction must\n // fold too — see `effectiveStrategySalt`.\n const salt = args.salt\n ? requireSalt(args.salt)\n : deriveStrategySalt(vault, proposer, template, args.initData);\n const clone = predictStrategyCloneAddress(factory, template, effectiveStrategySalt(vault, salt));\n const data = encodeFunctionData({\n abi: STRATEGY_FACTORY_ABI,\n functionName: \"cloneAndInitDeterministic\",\n args: [template, vault, proposer, args.initData, salt],\n });\n const tx = { to: factory, data, value: ZERO_VALUE, chainId };\n return {\n txs: [tx],\n preconditions: [],\n clone,\n salt,\n factory,\n description: `Deploy a strategy clone of ${template} for vault ${vault} (deterministic — clone at ${clone}).`,\n note: \"Broadcast this tx from `proposer` — the factory requires proposer == msg.sender, and msg.sender must be the vault owner or a registered agent. The vault must be registered on the SyndicateFactory and `template` must be on the factory's allowlist (the factory reverts otherwise). The clone address is fixed by (factory, template, vault, salt) — reference it as the proposal `strategy` and inside executeCalls/settlementCalls. The factory binds the salt to the vault, and `_authClone` lets only the vault's owner/agents deploy there, so the predicted address can't be front-run.\",\n };\n}\n","import { encodeFunctionData, getAddress } from \"viem\";\nimport { IDENTITY_REGISTRY_ABI } from \"../abis.js\";\nimport { getDeployment } from \"../addresses.js\";\nimport { unsupported, usage } from \"../errors.js\";\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst ERC8004_TYPE = \"https://eips.ethereum.org/EIPS/eip-8004#registration-v1\";\nconst B64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n/**\n * Standard base64 of a UTF-8 string using only ES built-ins (no Buffer / btoa /\n * TextEncoder) so the SDK stays browser-safe and Node-types-free. Byte-identical\n * to `Buffer.from(str, \"utf8\").toString(\"base64\")` — pinned by the golden mint\n * test against the confirmed on-chain calldata.\n */\nfunction toBase64Utf8(str) {\n // UTF-8 bytes as a Latin1 (\"binary\") string via encodeURIComponent.\n const bin = encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, h) => String.fromCharCode(parseInt(h, 16)));\n let out = \"\";\n for (let i = 0; i < bin.length; i += 3) {\n const a = bin.charCodeAt(i);\n const hasB = i + 1 < bin.length;\n const hasC = i + 2 < bin.length;\n const b = hasB ? bin.charCodeAt(i + 1) : 0;\n const c = hasC ? bin.charCodeAt(i + 2) : 0;\n out += B64_ALPHABET[a >> 2];\n out += B64_ALPHABET[((a & 3) << 4) | (b >> 4)];\n out += hasB ? B64_ALPHABET[((b & 15) << 2) | (c >> 6)] : \"=\";\n out += hasC ? B64_ALPHABET[c & 63] : \"=\";\n }\n return out;\n}\n/**\n * Encode an ERC-8004 agent-identity mint as a single `register(agentURI, [])`\n * call against the IdentityRegistry — the same on-chain shape Agent0's\n * `registerOnChain()` produces, but built with viem only (no Agent0 SDK / IPFS).\n *\n * `agentURI` is a `data:application/json;base64,…` URI carrying the ERC-8004\n * registration JSON. The registry assigns the next token id and stores the URI;\n * the soft metadata fields don't affect the mint. The minted `chainId:tokenId`\n * is referenced cross-chain when creating/joining funds.\n *\n * ERC-8004 lives on Base only — throws UNSUPPORTED on other chains.\n */\nexport function encodeIdentityMint(args, chainId) {\n const registry = getDeployment(chainId).identityRegistry;\n if (registry === ZERO_ADDRESS) {\n throw unsupported(`ERC-8004 identity registry is not deployed on chain ${chainId} — mint on Base (8453).`);\n }\n if (!args.name)\n throw usage(\"`name` is required\");\n if (!args.description)\n throw usage(\"`description` is required\");\n // Key order is significant for byte-stable output — mirrors Agent0's\n // on-chain data-URI registration JSON: type, name, description, image?,\n // services, active, x402Support.\n const reg = {\n type: ERC8004_TYPE,\n name: args.name,\n description: args.description,\n };\n if (args.image)\n reg.image = args.image;\n reg.services = [];\n reg.active = args.active ?? true;\n reg.x402Support = args.x402Support ?? false;\n const json = JSON.stringify(reg);\n const dataUri = `data:application/json;base64,${toBase64Utf8(json)}`;\n return {\n txs: [\n {\n to: getAddress(registry),\n data: encodeFunctionData({\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"register\",\n args: [dataUri, []],\n }),\n value: \"0x0\",\n chainId,\n },\n ],\n preconditions: [],\n description: `Mint an ERC-8004 agent identity \"${args.name}\" on chain ${chainId}.`,\n note: \"ERC-8004 identity is minted on Base. Read the resulting token id from the mint receipt (chainId:tokenId); reference it when creating or joining funds.\",\n };\n}\n","import { encodeAbiParameters, encodeFunctionData, getAddress, parseAbiParameters, } from \"viem\";\nimport { EAS_ABI } from \"../abis.js\";\nimport { getDeployment } from \"../addresses.js\";\nimport { encodeRegisterAgent } from \"./vault.js\";\nimport { unsupported } from \"../errors.js\";\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\nconst JOIN_REQUEST_PARAMS = parseAbiParameters(\"uint256, uint256, address, string\");\nconst AGENT_APPROVED_PARAMS = parseAbiParameters(\"uint256, uint256, address\");\nconst toBig = (x) => (typeof x === \"bigint\" ? x : BigInt(x));\n// ── Message-prefix helpers (ported from cli/src/lib/eas.ts) ──\n//\n// Join-request messages carry CLI metadata as bracketed prefixes so a creator\n// querying the coordination-chain EAS can recover the source chain + referrer. Order is\n// `[chain:<slug>] [ref:<id>] body` — chain outer, ref inner. Kept byte-identical\n// to the CLI so calldata-built join requests are indistinguishable from\n// CLI-signed ones in `sherwood fund requests`.\nfunction formatMessageWithRef(message, referrerAgentId) {\n if (referrerAgentId == null)\n return message;\n return `[ref:${referrerAgentId}] ${message}`;\n}\nfunction formatMessageWithChain(message, sourceSlug, easSlug) {\n if (sourceSlug === easSlug)\n return message;\n return `[chain:${sourceSlug}] ${message}`;\n}\n/** Build an EAS `attest` tx (revocable, no expiry, no refUID, zero value). */\nfunction buildAttestTx(easAddress, schema, recipient, data, chainId) {\n return {\n to: getAddress(easAddress),\n data: encodeFunctionData({\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [\n {\n schema,\n data: {\n recipient,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n },\n ],\n }),\n value: \"0x0\",\n chainId,\n };\n}\n/**\n * Encode a SYNDICATE_JOIN_REQUEST EAS attestation (agent → creator).\n *\n * The attest tx ALWAYS lands on the COORDINATION chain — the one this\n * deployment's `eas.chainId` names, currently Robinhood mainnet (4663) — even\n * when the fund runs elsewhere. A `[chain:<slug>]` prefix carries the source\n * chain so the creator can recover it. Throws UNSUPPORTED only on deployments\n * with no EAS at all.\n */\nexport function encodeJoinRequest(args, chainId) {\n const dep = getDeployment(chainId);\n const eas = dep.eas;\n if (eas.address === ZERO_ADDRESS) {\n throw unsupported(`No EAS coordination path on chain ${chainId} — join requests require a deployment whose attestations are pinned to a coordination chain.`);\n }\n const easSlug = getDeployment(eas.chainId).slug;\n const message = formatMessageWithChain(formatMessageWithRef(args.message, args.referrerAgentId), dep.slug, easSlug);\n const data = encodeAbiParameters(JOIN_REQUEST_PARAMS, [\n toBig(args.fundId),\n toBig(args.agentId),\n getAddress(args.vault),\n message,\n ]);\n return {\n txs: [\n buildAttestTx(eas.address, eas.schemas.joinRequest, getAddress(args.creator), data, eas.chainId),\n ],\n preconditions: [],\n description: `Request to join fund ${toBig(args.fundId).toString()} (vault ${getAddress(args.vault)}).`,\n note: \"EAS coordination attestation — submitted on the coordination chain (see txs[0].chainId), not necessarily the fund's chain. Revocable; the creator discovers it via the join-request schema.\",\n };\n}\n/**\n * Encode the two txs a creator submits to approve an agent:\n * 1. `vault.registerAgent(agentId, agentAddress)` on the fund's own chain\n * 2. AGENT_APPROVED EAS attestation on the coordination chain\n *\n * These land on two different chains — `txs[0].chainId` is the fund chain,\n * `txs[1].chainId` is the coordination chain, not the fund's.\n */\nexport function encodeApproveAgent(args, chainId) {\n const dep = getDeployment(chainId);\n const eas = dep.eas;\n if (eas.address === ZERO_ADDRESS) {\n throw unsupported(`No EAS coordination path on chain ${chainId} — approvals require a deployment whose attestations are pinned to a coordination chain.`);\n }\n const registerTx = encodeRegisterAgent({\n vault: args.vault,\n agentAddress: args.agentAddress,\n agentId: toBig(args.agentId),\n }, chainId).txs[0];\n const data = encodeAbiParameters(AGENT_APPROVED_PARAMS, [\n toBig(args.fundId),\n toBig(args.agentId),\n getAddress(args.vault),\n ]);\n const attestTx = buildAttestTx(eas.address, eas.schemas.agentApproved, getAddress(args.agentAddress), data, eas.chainId);\n return {\n txs: [registerTx, attestTx],\n preconditions: [],\n description: `Approve agent ${toBig(args.agentId).toString()} for fund ${toBig(args.fundId).toString()}: register on the vault (chain ${chainId}) + AGENT_APPROVED attestation on the coordination chain.`,\n note: \"Vault owner only. Two txs, potentially on two chains: registerAgent runs on the fund's chain; the approval attestation runs on the coordination chain (see txs[1].chainId).\",\n };\n}\n","import { encodeFunctionData, getAddress } from \"viem\";\nimport { ERC20_ABI, GUARDIAN_REGISTRY_ABI, STAKED_WOOD_ABI } from \"../abis.js\";\nimport { getDeployment } from \"../addresses.js\";\nimport { unsupported, usage } from \"../errors.js\";\nimport { GUARDIAN_VOTE_TYPES } from \"../generated/state-machines.js\";\nconst ZERO_VALUE = \"0x0\";\nfunction swoodTx(chainId, data) {\n const swood = getDeployment(chainId).sherwood.stakedWood;\n if (swood === \"0x0000000000000000000000000000000000000000\") {\n throw unsupported(`sWOOD (StakedWood) is not deployed on chain ${chainId} yet`);\n }\n return { to: swood, data, value: ZERO_VALUE, chainId };\n}\nfunction registryTx(chainId, data) {\n const registry = getDeployment(chainId).sherwood.guardianRegistry;\n if (registry === \"0x0000000000000000000000000000000000000000\") {\n throw unsupported(`Guardian registry is not deployed on chain ${chainId} yet`);\n }\n return { to: registry, data, value: ZERO_VALUE, chainId };\n}\nfunction parseUint(value, field) {\n if (typeof value === \"bigint\") {\n if (value < 0n)\n throw usage(`\\`${field}\\` must be a non-negative integer`);\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isInteger(value) || value < 0) {\n throw usage(`\\`${field}\\` must be a non-negative integer`);\n }\n return BigInt(value);\n }\n if (!/^\\d+$/.test(value)) {\n throw usage(`\\`${field}\\` must be a non-negative integer string, got \"${value}\"`);\n }\n return BigInt(value);\n}\n// ── Guardian self-stake ───────────────────────────────────\nexport function encodeGuardianStake(args, chainId) {\n if (args.amount <= 0n)\n throw usage(\"`amount` must be > 0\");\n const agentId = parseUint(args.agentId, \"agentId\");\n const data = encodeFunctionData({\n abi: STAKED_WOOD_ABI,\n functionName: \"stakeAsGuardian\",\n args: [args.amount, agentId],\n });\n const deployment = getDeployment(chainId);\n const wood = deployment.tokens.wood?.address;\n const swood = deployment.sherwood.stakedWood;\n if (!wood ||\n wood === \"0x0000000000000000000000000000000000000000\" ||\n swood === \"0x0000000000000000000000000000000000000000\") {\n throw unsupported(`WOOD / sWOOD is not deployed on chain ${chainId} yet`);\n }\n return {\n txs: [swoodTx(chainId, data)],\n preconditions: [\n // Caller must have approved WOOD for sWOOD (StakedWood); agent should\n // check this client-side and prepend an ERC20.approve if needed.\n {\n type: \"allowance\",\n token: wood,\n spender: swood,\n min: args.amount.toString(),\n minDecimal: args.amount.toString(),\n },\n ],\n description: `Stake ${args.amount.toString()} WOOD as guardian (agent ${agentId.toString()}).`,\n note: \"Caller must have approved WOOD for sWOOD (StakedWood) first. Stake locks the WOOD; use /prepare/guardian-unstake later to start the 7d unstake cooldown.\",\n };\n}\n// ── Vault-creator owner bond ──────────────────────────────\n/**\n * WOOD.approve(StakedWood, amount) + StakedWood.prepareOwnerStake(amount).\n * `createSyndicate` binds the prepared stake atomically and reverts\n * PreparedStakeNotFound without it. Unlike the guardian stake, the approval is\n * emitted as a tx rather than a precondition: this runs once per creator, and\n * an external signer has no key-side step that would add it.\n */\nexport function encodePrepareOwnerStake(args, chainId) {\n if (args.amount <= 0n)\n throw usage(\"`amount` must be > 0\");\n const wood = getDeployment(chainId).tokens.wood?.address;\n if (!wood || wood === \"0x0000000000000000000000000000000000000000\") {\n throw unsupported(`WOOD is not deployed on chain ${chainId} yet`);\n }\n const stake = swoodTx(chainId, encodeFunctionData({\n abi: STAKED_WOOD_ABI,\n functionName: \"prepareOwnerStake\",\n args: [args.amount],\n }));\n const approve = {\n to: wood,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [stake.to, args.amount],\n }),\n value: ZERO_VALUE,\n chainId,\n };\n return {\n txs: [approve, stake],\n preconditions: [],\n description: `Bond ${args.amount.toString()} WOOD (raw) as the vault-creator owner stake.`,\n note: \"Send in order from the wallet that will create the vault. Must be at least StakedWood.minOwnerStake(). Required once before `createSyndicate`, which binds the prepared stake to the new vault.\",\n };\n}\nconst GUARDIAN_UNSTAKE_FN = {\n request: \"requestUnstakeGuardian\",\n cancel: \"cancelUnstakeGuardian\",\n claim: \"claimUnstakeGuardian\",\n};\nexport function encodeGuardianUnstake(args, chainId) {\n const fn = GUARDIAN_UNSTAKE_FN[args.action];\n if (!fn) {\n throw usage(`\\`action\\` must be one of: ${Object.keys(GUARDIAN_UNSTAKE_FN).join(\", \")}`);\n }\n // sWOOD, NOT the registry: the sWOOD split made StakedWood the sole WOOD\n // custodian, so these three live there. Sending them to GuardianRegistry\n // reverts with empty returndata — the caller gets no signal (SHE-185).\n const data = encodeFunctionData({\n abi: STAKED_WOOD_ABI,\n functionName: fn,\n args: [],\n });\n return {\n txs: [swoodTx(chainId, data)],\n preconditions: [],\n description: `Guardian unstake ${args.action}.`,\n note: args.action === \"request\"\n ? \"Targets sWOOD (StakedWood), not the guardian registry. Starts a 7-day cooldown. After it elapses, call again with action=claim to withdraw.\"\n : args.action === \"claim\"\n ? \"Withdraws the unstake amount once the 7-day cooldown has elapsed.\"\n : \"Cancels a pending unstake request and re-activates the guardian.\",\n };\n}\n// Delegation and commission encoders were removed (SHE-86): stake-pool\n// delegation and DPoS commission no longer exist on the post-audit protocol —\n// delegateStake / requestUnstakeDelegation / cancelUnstakeDelegation /\n// claimUnstakeDelegation / setCommission are absent from the deployed\n// StakedWood, so those encoders emitted selectors no contract implements.\n// Guardian-fee reward claims are no longer on-chain. Fees route to the\n// `guardiansFeeRecipient` multisig at settlement and are distributed as WOOD\n// off-chain via Merkl (claim at merkl.xyz) — the on-chain\n// claimProposalReward / claimDelegatorProposalReward encoders were removed.\n// ── Review vote ───────────────────────────────────────────\n/**\n * GuardianRegistry.voteOnProposal(governor, proposalId, support, lockWood).\n * Selector `0x4915ace5`. The 3-arg form (0x3ad95b6d) is on no deployed\n * registry.\n *\n * `GuardianVoteType` on-chain: None=0, Approve=1, Block=2. None reverts.\n * Approve books coverage against the caller's own slashable guardian bond\n * via `ExposureLedger.recordApproval` — not someone else's.\n *\n * `lockWood` is the approver's DECLARATION: the WOOD it puts behind this\n * proposal. The ledger locks `min(lockWood, free budget)` and never rejects\n * the vote over it; a Block vote ignores it. Required with no default — the\n * contract has deliberately no overload without the amount, so no caller\n * approves without stating what it is willing to lose.\n *\n * Discriminants are the generated `GUARDIAN_VOTE_TYPES` indexes\n * (`Approve` === 1, `Block` === 2). None is rejected, not encoded.\n */\nexport function encodeVoteOnProposal(args, chainId) {\n let governor;\n try {\n governor = getAddress(args.governor);\n }\n catch {\n throw usage(\"`governor` must be a 0x-prefixed 40-char hex address\");\n }\n const support = GUARDIAN_VOTE_TYPES.indexOf(args.vote);\n if (support <= 0) {\n throw usage(\"`vote` must be one of: Approve, Block\");\n }\n const proposalId = parseUint(args.proposalId, \"proposalId\");\n // bigint only, deliberately: a JS number cannot hold an 18-decimal WOOD\n // amount without silently rounding it.\n if (typeof args.lockWood !== \"bigint\" || args.lockWood < 0n) {\n throw usage(\"`lockWood` must be a non-negative bigint of WOOD base units\");\n }\n const lockWood = args.lockWood;\n const data = encodeFunctionData({\n abi: GUARDIAN_REGISTRY_ABI,\n functionName: \"voteOnProposal\",\n args: [governor, proposalId, support, lockWood],\n });\n const underwriting = args.vote === \"Approve\"\n ? ` APPROVE books coverage against the CALLER'S OWN slashable guardian bond (ExposureLedger.recordApproval): you declare ${lockWood.toString()} WOOD, the ledger locks that clamped to your free budget. If this proposal is later challenged or slashed, your WOOD stake is at risk — not another guardian's. An over-exposed guardian books nothing rather than reverting; the vote still lands.`\n : \" Block votes do not book coverage, and `lockWood` is ignored. Slash severity is computed at resolveReview from block-side decisiveness.\";\n return {\n txs: [registryTx(chainId, data)],\n preconditions: [],\n description: `Guardian review vote ${args.vote} on proposal ${proposalId.toString()} (governor ${governor}).`,\n note: `voteOnProposal(governor, proposalId, vote, lockWood) — 4 args, selector 0x4915ace5.${underwriting}`,\n };\n}\n","import { getAddress } from \"viem\";\nimport { SYNDICATE_FACTORY_ABI, SYNDICATE_VAULT_ABI } from \"../abis.js\";\nimport { getDeployment } from \"../addresses.js\";\nimport { notFound, unavailable, usage } from \"../errors.js\";\nconst SECONDS_PER_DAY = 86400n;\nexport async function readActiveFunds(client, chainId, opts = {}) {\n const factory = getDeployment(chainId).sherwood.factory;\n let raw;\n try {\n raw = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"getAllActiveSyndicates\",\n }));\n }\n catch (err) {\n throw unavailable(`Failed to read getAllActiveSyndicates from chain ${chainId}`, err);\n }\n // Newest-first, then truncate to `limit`. Default 25, hard cap 100 — same\n // shape as /v1/proposals.\n const limit = Math.min(opts.limit ?? 25, 100);\n const sorted = [...raw].sort((a, b) => a.createdAt < b.createdAt ? 1 : a.createdAt > b.createdAt ? -1 : 0);\n const page = sorted.slice(0, limit);\n if (page.length === 0)\n return [];\n // One round-trip per vault: totalAssets + getAgentCount + paused +\n // openDeposits. Use Promise.all rather than multicall3 because the SDK\n // doesn't ship the multicall3 ABI today (would add weight + a new dep).\n // Page is small (default 25) so the parallel-RPC fan-out is fine.\n const enriched = await Promise.all(page.map(async (s) => {\n const [totalAssets, agentCount, paused, openDeposits] = await Promise.all([\n client\n .readContract({\n address: s.vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"totalAssets\",\n })\n .catch(() => 0n),\n client\n .readContract({\n address: s.vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"getAgentCount\",\n })\n .catch(() => 0n),\n client\n .readContract({\n address: s.vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"paused\",\n })\n .catch(() => false),\n client\n .readContract({\n address: s.vault,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"openDeposits\",\n })\n .catch(() => false),\n ]);\n const nowSec = BigInt(Math.floor(Date.now() / 1000));\n const ageSec = nowSec > s.createdAt ? nowSec - s.createdAt : 0n;\n return {\n id: s.id.toString(),\n vault: s.vault,\n creator: s.creator,\n subdomain: s.subdomain,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt.toString(),\n ageDays: Number(ageSec / SECONDS_PER_DAY),\n agentCount: Number(agentCount),\n totalAssets: totalAssets.toString(),\n paused,\n openDeposits,\n };\n }));\n return enriched;\n}\n/**\n * Resolve a fund's id (and canonical vault/creator/subdomain) from either\n * its vault address or its subdomain — the reliable path the issue's reporter\n * lacked. `vault.syndicateId()` does not exist; resolution goes through the\n * factory's `vaultToSyndicate` / `subdomainToSyndicate` → `syndicates(id)`.\n *\n * Throws USAGE when neither key is given, NOT_FOUND when nothing maps.\n */\nexport async function readFundResolution(client, chainId, by) {\n const factory = getDeployment(chainId).sherwood.factory;\n let id;\n if (by.vault) {\n id = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"vaultToSyndicate\",\n args: [getAddress(by.vault)],\n }));\n }\n else if (by.subdomain) {\n id = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"subdomainToSyndicate\",\n args: [by.subdomain],\n }));\n }\n else {\n throw usage(\"Provide `vault` or `subdomain` to resolve a fund\");\n }\n if (id === 0n) {\n throw notFound(`No fund found for ${by.vault ? `vault ${by.vault}` : `subdomain ${by.subdomain}`} on chain ${chainId}`);\n }\n const s = (await client.readContract({\n address: factory,\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicates\",\n args: [id],\n }));\n return {\n fundId: s[0].toString(),\n vault: s[1],\n creator: s[2],\n subdomain: s[6],\n };\n}\n"],"mappings":"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","names":["getAddress","isAddress","base","encodeFunctionData","getAddress","isAddress","ZERO_VALUE","isAddress","getAddress","encodeFunctionData","ZERO_ADDRESS","isAddress","getAddress","encodeFunctionData","encodeFunctionData","getAddress","ZERO_VALUE","getAddress","encodeFunctionData","encodeFunctionData","getAddress","ZERO_ADDRESS","ZERO_VALUE","getAddress","encodeFunctionData","encodeFunctionData","getAddress","ZERO_ADDRESS","getAddress","encodeFunctionData","encodeAbiParameters","encodeFunctionData","getAddress","ZERO_ADDRESS","ZERO_BYTES32","getAddress","encodeFunctionData","encodeAbiParameters","encodeFunctionData","getAddress","ZERO_VALUE","encodeFunctionData","getAddress","getAddress","IDENTITY_REGISTRY_ABI","idStr","isAddress","getAddress","savedId","spinner"]}