@sherwoodagent/cli 0.86.0 → 0.86.1

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 (43) hide show
  1. package/dist/{chat-PRYOT3ZV.js → chat-ETZSKQDI.js} +5 -5
  2. package/dist/{chunk-ARSQ5UQA.js → chunk-3IAZQMAW.js} +2 -2
  3. package/dist/{chunk-LRUSZUEU.js → chunk-6QBGTX2Q.js} +87 -13
  4. package/dist/chunk-6QBGTX2Q.js.map +1 -0
  5. package/dist/{chunk-HODME7UJ.js → chunk-EA65CDQH.js} +2 -2
  6. package/dist/{chunk-53W6CYYV.js → chunk-EVUKJ7CJ.js} +2 -2
  7. package/dist/{chunk-AM6MI2JF.js → chunk-IAM4VIU2.js} +146 -23
  8. package/dist/chunk-IAM4VIU2.js.map +1 -0
  9. package/dist/{chunk-M4GX5PL2.js → chunk-OUYMZ5ZC.js} +2 -2
  10. package/dist/{chunk-5NFAEOFG.js → chunk-XPVXNG2K.js} +3 -3
  11. package/dist/{chunk-6N7EVSAZ.js → chunk-YAS52NEF.js} +19 -6
  12. package/dist/{chunk-6N7EVSAZ.js.map → chunk-YAS52NEF.js.map} +1 -1
  13. package/dist/{chunk-I2BBOJNC.js → chunk-ZN2MHIB7.js} +2 -2
  14. package/dist/{eas-D3BVHBJH.js → eas-KMDAMLXW.js} +3 -3
  15. package/dist/{governor-35IXAEDJ.js → governor-JNSWPJVQ.js} +7 -5
  16. package/dist/{identity-XOAYQFUW.js → identity-ATWV2O7Y.js} +4 -4
  17. package/dist/index.js +101 -35
  18. package/dist/index.js.map +1 -1
  19. package/dist/{price-I5T77X7Y.js → price-YNPYE2EO.js} +3 -3
  20. package/dist/{research-NKGP3M4J.js → research-W74PNYPO.js} +3 -3
  21. package/dist/{session-LJT3SAED.js → session-HVRZ6AJM.js} +6 -6
  22. package/dist/{trade-OTZ7UHDK.js → trade-EOQY72L7.js} +6 -6
  23. package/dist/{vault-7O4N6WZG.js → vault-HWJQJW5U.js} +5 -5
  24. package/dist/{xmtp-R25Q5GWY.js → xmtp-KW73BGVO.js} +3 -3
  25. package/package.json +1 -1
  26. package/dist/chunk-AM6MI2JF.js.map +0 -1
  27. package/dist/chunk-LRUSZUEU.js.map +0 -1
  28. /package/dist/{chat-PRYOT3ZV.js.map → chat-ETZSKQDI.js.map} +0 -0
  29. /package/dist/{chunk-ARSQ5UQA.js.map → chunk-3IAZQMAW.js.map} +0 -0
  30. /package/dist/{chunk-HODME7UJ.js.map → chunk-EA65CDQH.js.map} +0 -0
  31. /package/dist/{chunk-53W6CYYV.js.map → chunk-EVUKJ7CJ.js.map} +0 -0
  32. /package/dist/{chunk-M4GX5PL2.js.map → chunk-OUYMZ5ZC.js.map} +0 -0
  33. /package/dist/{chunk-5NFAEOFG.js.map → chunk-XPVXNG2K.js.map} +0 -0
  34. /package/dist/{chunk-I2BBOJNC.js.map → chunk-ZN2MHIB7.js.map} +0 -0
  35. /package/dist/{eas-D3BVHBJH.js.map → eas-KMDAMLXW.js.map} +0 -0
  36. /package/dist/{governor-35IXAEDJ.js.map → governor-JNSWPJVQ.js.map} +0 -0
  37. /package/dist/{identity-XOAYQFUW.js.map → identity-ATWV2O7Y.js.map} +0 -0
  38. /package/dist/{price-I5T77X7Y.js.map → price-YNPYE2EO.js.map} +0 -0
  39. /package/dist/{research-NKGP3M4J.js.map → research-W74PNYPO.js.map} +0 -0
  40. /package/dist/{session-LJT3SAED.js.map → session-HVRZ6AJM.js.map} +0 -0
  41. /package/dist/{trade-OTZ7UHDK.js.map → trade-EOQY72L7.js.map} +0 -0
  42. /package/dist/{vault-7O4N6WZG.js.map → vault-HWJQJW5U.js.map} +0 -0
  43. /package/dist/{xmtp-R25Q5GWY.js.map → xmtp-KW73BGVO.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/identity.ts","../src/lib/virtuals.ts","../src/lib/calldata.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 * Wraps the Agent0 SDK (@agent0-sdk) for ERC-8004 agent identity management.\n * Handles: mint (register), set metadata, check status, load existing agent.\n * Required before creating or joining funds.\n */\n\nimport { Command } from \"commander\";\nimport 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 } from \"../lib/network.js\";\nimport { COORDINATION_NETWORK } from \"../lib/eas.js\";\nimport { getExplorerUrl, getChain, getChainConfig, getRpcUrl } from \"../lib/network.js\";\nimport { AGENT_REGISTRY } from \"../lib/addresses.js\";\nimport {\n setAgentId,\n getAgentId,\n requirePrivateKey,\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// ── ABI (minimal, for status reads without 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] as const;\n\n/**\n * Initialize the Agent0 SDK with the current network config.\n */\nfunction getAgent0SDK(): SDK {\n const key = requirePrivateKey();\n\n const chain = getChain();\n const sdkConfig: ConstructorParameters<typeof SDK>[0] = {\n chainId: chain.id,\n rpcUrl: getRpcUrl(),\n privateKey: key,\n };\n\n // Custom-chainId vnet (SIM_CHAIN_ID override active — getChain().id differs\n // from the registry's canonical id): the Agent0 SDK resolves the ERC-8004\n // registries by chain id and doesn't know the fork's id, so hand it the\n // CLI's own registry addresses (the forked Base state contains them).\n if (chain.id !== getChainConfig().chain.id) {\n sdkConfig.registryOverrides = {\n [chain.id]: {\n IDENTITY: AGENT_REGISTRY().IDENTITY_REGISTRY,\n REPUTATION: AGENT_REGISTRY().REPUTATION_REGISTRY,\n },\n };\n }\n\n return new SDK(sdkConfig);\n}\n\n/**\n * Resolve an agent's ERC-8004 tokenId from its wallet, on the coordination\n * chain. The canonical 4663 registry is NOT ERC721Enumerable (no\n * tokenOfOwnerByIndex — probed on-chain), so this walks mint Transfer logs\n * (from = 0x0, to = wallet) instead and returns the most recent mint.\n * Returns null when the wallet holds no identity.\n */\nexport async function lookupAgentIdByWallet(wallet: Address): Promise<bigint | null> {\n return withNetwork(COORDINATION_NETWORK, async () => {\n const client = getPublicClient();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const balance = (await client.readContract({\n address: registry,\n abi: [{\n name: \"balanceOf\", type: \"function\", stateMutability: \"view\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n }] as const,\n functionName: \"balanceOf\",\n args: [wallet],\n })) as bigint;\n if (balance === 0n) return null;\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 last = logs[logs.length - 1];\n return last?.args?.tokenId ?? null;\n });\n}\n\nexport function registerIdentityCommands(program: Command): void {\n const identity = program.command(\"identity\").description(\"Manage ERC-8004 agent identity (via Agent0 SDK)\");\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 4663 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 4663 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 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 } 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 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 via Agent0 SDK)\")\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 via the Agent0 SDK\n // against the issuing chain. The SDK is only used for a read-only\n // registry search here, so hand it an EPHEMERAL key — never the\n // operational key (review 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 {\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(\"Search ERC-8004 agents by wallet address or name (recover a lost agent ID)\")\n .option(\"--wallet <address>\", \"Filter by owner / wallet address\")\n .option(\"--name <text>\", \"Filter by agent name (exact or substring match, depending on registry)\")\n .option(\"--all-chains\", \"Search across all chains, not just the active one\")\n .action(async (opts) => {\n if (!opts.wallet && !opts.name) {\n console.error(chalk.red(\"Pass --wallet <address> or --name <text> (or both).\"));\n process.exit(1);\n }\n\n const spinner = ora(\"Searching ERC-8004 registry...\").start();\n try {\n const sdk = getAgent0SDK();\n const filters: Record<string, unknown> = {};\n if (opts.wallet) filters.walletAddress = opts.wallet;\n if (opts.name) filters.name = opts.name;\n // SearchFilters['chains']: explicit list per-chain or 'all'\n filters.chains = opts.allChains ? \"all\" : [getChain().id];\n\n const results = await sdk.searchAgents(filters);\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.dim(\"No agents found matching those filters.\"));\n console.log(chalk.dim(\"If you minted on a different chain, retry with --all-chains.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Found ${results.length} agent${results.length === 1 ? \"\" : \"s\"}`));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (const a of results) {\n // Agent0 agentId format is \"chainId:tokenId\" — split for display\n const idStr = String(a.agentId);\n const tokenId = idStr.includes(\":\") ? idStr.split(\":\")[1] : idStr;\n console.log(` ${chalk.bold(`#${tokenId}`)} ${a.name || chalk.dim(\"(no name)\")}`);\n console.log(chalk.dim(` Chain: ${a.chainId}`));\n console.log(chalk.dim(` Full: ${idStr}`));\n if (a.owners?.length) {\n console.log(chalk.dim(` Owner: ${a.owners[0]}`));\n }\n if (a.walletAddress) {\n console.log(chalk.dim(` Wallet: ${a.walletAddress}`));\n }\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 registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const client = getPublicClient();\n\n const spinner = ora(\"Checking identity...\").start();\n try {\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 spinner.stop();\n\n const savedId = getAgentId();\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(` Registry: ${registry}`);\n console.log(` NFTs owned: ${balance.toString()}`);\n\n if (savedId) {\n // Verify the saved ID is still owned by this wallet\n try {\n const owner = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(savedId)],\n }) as Address;\n\n const isOwner = owner.toLowerCase() === account.address.toLowerCase();\n console.log(` Saved ID: #${savedId} ${isOwner ? chalk.green(\"(verified)\") : chalk.red(\"(owned by \" + owner + \")\")}`);\n\n // Load full agent details via SDK if verified\n if (isOwner) {\n try {\n const sdk = getAgent0SDK();\n const agent = await sdk.loadAgent(`${getChain().id}:${savedId}`);\n if (agent.name) console.log(` Name: ${agent.name}`);\n if (agent.description) console.log(` Desc: ${chalk.dim(agent.description)}`);\n if (agent.walletAddress) console.log(` Wallet: ${agent.walletAddress}`);\n } catch {\n // SDK load failed — not critical, basic info already shown\n }\n }\n } catch {\n console.log(` Saved ID: #${savedId} ${chalk.red(\"(token not found)\")}`);\n }\n console.log();\n } else if (balance > 0n) {\n // Wallet owns identities but none saved locally — fetch and surface\n // them so the user can pick one to bind. Closes the trap where a\n // fresh CLI install on a wallet with prior identities reports\n // \"Saved ID: none\" without explaining what's actually on-chain.\n console.log(` Saved ID: ${chalk.yellow(\"none (but this wallet owns NFTs — listing below)\")}`);\n console.log();\n\n const lookupSpinner = ora(\"Resolving owned token IDs via Agent0 SDK...\").start();\n try {\n const sdk = getAgent0SDK();\n const results = await sdk.searchAgents({\n walletAddress: account.address,\n chains: [getChain().id],\n });\n lookupSpinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.dim(\" No agents resolved for this wallet on the active chain.\"));\n console.log(chalk.dim(\" If you minted on a different chain, try:\"));\n console.log(chalk.dim(\" sherwood identity find --wallet \" + account.address + \" --all-chains\"));\n } else {\n console.log(chalk.bold(` Owned identities on this chain (${results.length}):`));\n for (const a of results) {\n const idStr = String(a.agentId);\n const tokenId = idStr.includes(\":\") ? idStr.split(\":\")[1] : idStr;\n console.log(` ${chalk.bold(`#${tokenId}`)} ${a.name || chalk.dim(\"(no name)\")}`);\n }\n console.log();\n console.log(chalk.green(\" Bind one to this machine:\"));\n if (results.length === 1) {\n const idStr = String(results[0].agentId);\n const tokenId = idStr.includes(\":\") ? idStr.split(\":\")[1] : idStr;\n console.log(chalk.dim(` sherwood identity load --id ${tokenId}`));\n } else {\n console.log(chalk.dim(\" sherwood identity load --id <tokenId>\"));\n }\n }\n } catch (err) {\n lookupSpinner.warn(\"Could not resolve owned token IDs via Agent0 SDK\");\n console.log(chalk.dim(` ${(err as Error).message}`));\n console.log(chalk.dim(\" Try: sherwood identity find --wallet \" + account.address));\n }\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 * 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 * `--calldata-only` support.\n *\n * When the global `--calldata-only` flag is set, state-changing commands build\n * the unsigned EIP-5792-style calldata via the shared `@sherwoodagent/sdk`\n * encoders and print it as JSON instead of signing/sending — so an external\n * signer (MetaMask Agent Wallet, Frame, Privy, …) that can't export a private\n * key can take the final step. Output matches the HTTP API's `/v1/prepare/*`\n * envelope (the SDK `PreparedAction` shape).\n */\nimport type { PreparedAction } from \"@sherwoodagent/sdk\";\n\nlet _calldataOnly = false;\n\n/** Set by the root preAction hook from the global `--calldata-only` flag. */\nexport function setCalldataOnly(value: boolean): void {\n _calldataOnly = value;\n}\n\nexport function isCalldataOnly(): boolean {\n return _calldataOnly;\n}\n\n/**\n * Print a PreparedAction as pretty JSON. Each tx is `{ to, data, value, chainId }`\n * with a hex `value` (EIP-5792). `chainId` is per-tx, so multi-chain flows\n * (e.g. approve-agent: registerAgent on the fund chain + attest on Base)\n * are explicit.\n */\nexport function emitCalldata(action: PreparedAction): void {\n process.stdout.write(JSON.stringify(action, null, 2) + \"\\n\");\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 // Governor-only: mint + fund + run a single-use CallSandbox.\n // ICallSandbox.Call is TWO fields (address,bytes). There is NO `value`.\n {\n name: \"runSandbox\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"pid\", type: \"uint256\" },\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n },\n { name: \"declaredTokens\", type: \"address[]\" },\n { name: \"funding\", type: \"uint256\" },\n ],\n outputs: [{ name: \"sandbox\", type: \"address\" }],\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 // proposeWithSandbox — same 10 args as propose, prefixed with SandboxPayload.\n // ICallSandbox.Call is TWO fields (address,bytes). There is NO `value`:\n // native value would open a transfer channel with no metering story\n // (ICallSandbox.sol:44-51). Aliasing BatchExecutorLib.Call would reintroduce it.\n {\n name: \"proposeWithSandbox\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n {\n name: \"sandbox\",\n type: \"tuple\",\n components: [\n { name: \"funding\", type: \"uint256\" },\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n },\n { name: \"declaredTokens\", type: \"address[]\" },\n ],\n },\n { name: \"vault\", type: \"address\" },\n { name: \"strategy\", type: \"address\" },\n { name: \"metadataURI\", type: \"string\" },\n { name: \"strategyDuration\", type: \"uint256\" },\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 { 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 { name: \"votesFor\", type: \"uint256\" },\n { name: \"votesAgainst\", type: \"uint256\" },\n { name: \"votesAbstain\", 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 ],\n },\n ],\n },\n // sandboxPayload — ISyndicateGovernor.sol ~730 / SyndicateGovernor.sol:506.\n // Returns SandboxPayload {funding, calls, declaredTokens}. Calls are\n // ICallSandbox.Call = (address target, bytes data) ONLY — no `value`.\n // Non-sandbox (and unknown) pids return the mapping default: zero funding,\n // empty calls, empty declaredTokens. The contract does not revert.\n {\n name: \"sandboxPayload\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"proposalId\", type: \"uint256\" }],\n outputs: [\n {\n name: \"payload\",\n type: \"tuple\",\n components: [\n { name: \"funding\", type: \"uint256\" },\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"data\", type: \"bytes\" },\n ],\n },\n { name: \"declaredTokens\", type: \"address[]\" },\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 {\n name: \"protocolFeeBps\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"guardianFeeBps\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"protocolFeeRecipient\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n },\n // Protocol-owner setters — post-audit ProtocolConfig has no per-rate\n // protocol fee; the two-number model exposes the SPLITS instead. (The old\n // `setProtocolFeeBps` entry described a function the contract no longer\n // has; every call through it reverted.)\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 — 3 args, no slashBps. Selector 0x3ad95b6d.\n // GuardianVoteType: None=0, Approve=1, Block=2 (uint8).\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 ],\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 // 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];\n// CallSandbox — isolation boundary for a tier-2 payload. `sweep` returns\n// leftover vault-asset to the vault (vault-only; the permissionless door is\n// SyndicateVault.collectResidue). Selector 0x35faa416.\nexport const CALL_SANDBOX_ABI = [\n {\n name: \"sweep\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [{ name: \"assets\", type: \"uint256\" }],\n },\n {\n name: \"run\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [],\n outputs: [],\n },\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 `f21600b0d03d6f742bdb952c5376abf7230741fd`\n * (origin/post-audit). Do not invent these; recompute with `cast sig` if an\n * interface argument list changes.\n *\n * ISyndicateGovernor.propose 10 args\n * ISyndicateGovernor.proposeWithSandbox SandboxPayload + the same 10\n * IGuardianRegistry.voteOnProposal (address,uint256,uint8) — Approve=1, Block=2, no slashBps\n * IGuardianRegistry.getReviewState (address,uint256) → (bool,bool,bool)\n * ISyndicateVault.runSandbox ICallSandbox.Call has no `value`\n * ICallSandbox.sweep permissionless leftover return (vault-only; collectResidue is the public door)\n */\nexport const PROTOCOL_PIN = \"f21600b0d03d6f742bdb952c5376abf7230741fd\";\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 proposeWithSandbox: {\n iface: \"ISyndicateGovernor\",\n signature: \"proposeWithSandbox((uint256,(address,bytes)[],address[]),address,address,string,uint256,(uint256,uint16),(address,bytes,uint256)[],uint256[],(address,bytes,uint256)[],uint256[],(address,uint256)[])\",\n selector: \"0x16c0fa9c\",\n },\n voteOnProposal: {\n iface: \"IGuardianRegistry\",\n signature: \"voteOnProposal(address,uint256,uint8)\",\n selector: \"0x3ad95b6d\",\n },\n getReviewState: {\n iface: \"IGuardianRegistry\",\n signature: \"getReviewState(address,uint256)\",\n selector: \"0x043bd8b9\",\n },\n runSandbox: {\n iface: \"ISyndicateVault\",\n signature: \"runSandbox(uint256,(address,bytes)[],address[],uint256)\",\n selector: \"0xb0f4c59d\",\n },\n sweep: {\n iface: \"ICallSandbox\",\n signature: \"sweep()\",\n selector: \"0x35faa416\",\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 /** getReviewState(uint256) — missing the per-vault governor (input-arity). */\n getReviewStateUnary: \"0xee89569a\",\n /** runSandbox with BatchExecutorLib.Call (has `value`) instead of ICallSandbox.Call. */\n runSandboxCallWithValue: \"0x9f2d37ae\",\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 \"propose-with-sandbox\": [\n { target: \"governor\", selector: \"0x16c0fa9c\", signature: PROTOCOL_SELECTORS.proposeWithSandbox.signature },\n ],\n vote: [\n { target: \"governor\", selector: \"0x943e8216\", signature: \"vote(uint256,uint8)\" },\n ],\n \"vote-on-proposal\": [\n { target: \"guardianRegistry\", selector: \"0x3ad95b6d\", 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 callSandboxImpl: ZERO_ADDRESS,\n exposureLedger: ZERO_ADDRESS,\n proposerBondEscrow: ZERO_ADDRESS,\n challengeGame: ZERO_ADDRESS,\n tokenCourt: 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 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 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 // 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 callSandboxImpl: \"0xf09f6AF7DeBB964eD731376C9Af389F2Ce3d872A\",\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 // 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: \"0x02bc9B9C1A4322D5A5df86DadA0a2a02e45108B9\",\n guardianRegistry: \"0xdfEe38C4D7595c9c04AdBcaFE01E4Fd6FD6117f4\",\n stakedWood: \"0xD3037D28693cc7BB3DbF1E17B6e01C4ce628f6DF\",\n vaultImpl: \"0x9BF51da59B13746e6cCeb1b35c398EDA9776a4Dc\",\n batchExecutorLib: \"0xdBdBce2af4222Abe0cCDAc05f84364a50577B5a2\",\n strategyFactory: \"0xb3C009aECAeDd5ccC62Ec12eDAAA55F19C4A1eFb\",\n // Guardian-era contracts from sherwood-protocol/chains/9994663.json (SHE-93).\n governorBeacon: \"0x2e8aB422Db9127F1a70d8C38A15903f22B51DA97\",\n protocolConfig: \"0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab\",\n // Not in chains/9994663.json (no PriceRouter / CallSandbox on the fork).\n priceRouter: ZERO_ADDRESS,\n tierRegistry: \"0x42B089B816F994d792481fAa308199E9CF63be9f\",\n callSandboxImpl: ZERO_ADDRESS,\n exposureLedger: \"0x223e2Fd41aD6487333146fc3998d000E74CB1549\",\n proposerBondEscrow: \"0xef2D6994faCad11e6CfAF3DaBf7b0B2091009B05\",\n challengeGame: \"0x202c1F133006D6706e872433CCAfD729c7A8AE56\",\n tokenCourt: \"0x5DC603881f5d77f41bbd4202F1d518263Dfd497f\",\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 vnet a3fb16: reads + tx broadcast, no state-cheat\n // surface. Admin/cheat RPCs stay private (Tenderly dashboard).\n rpcs: [\n \"https://virtual.robinhood-chain.eu.rpc.tenderly.co/moonwell/wormhole-bridge/231af1\",\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 the on-chain\n * `FeeConstants` library: `MAX_AGENT_FEE_BPS` is the vault's hard cap (15%) and\n * `DEFAULT_AGENT_FEE_BPS` is the getter's unset fallback (5%). Exported so\n * consumers and the encode-time guard share one searchable source rather than a\n * bare literal (PR #384 review pass 3).\n */\nexport const MAX_AGENT_FEE_BPS = 1500n;\nexport const DEFAULT_AGENT_FEE_BPS = 500n;\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, 1500] (max 15%)\");\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 1500 bps (15%, 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/** CallSandbox.sol bounds — an unbounded payload is a gas-griefing surface. */\nconst MAX_SANDBOX_CALLS = 32;\nconst MAX_SANDBOX_TOKENS = 16;\n/**\n * Validate one ICallSandbox.Call. A `value` field is refused rather than\n * dropped: aliasing BatchExecutorLib.Call would reintroduce an unmetered\n * native-transfer channel (ICallSandbox.sol:44-51).\n */\nfunction validateSandboxCall(call, idx) {\n if (!call || typeof call !== \"object\") {\n throw usage(`\\`sandbox.calls[${idx}]\\` must be an object of {target, data}`);\n }\n const c = call;\n if (\"value\" in c && c.value !== undefined && c.value !== null) {\n throw usage(`\\`sandbox.calls[${idx}]\\` must be (address,bytes) only — ICallSandbox.Call has no \\`value\\` field (native value would open an unmetered transfer channel). Do not alias BatchExecutorLib.Call.`);\n }\n if (typeof c.target !== \"string\" || !isAddress(c.target)) {\n throw usage(`\\`sandbox.calls[${idx}].target\\` must be a 0x-prefixed address`);\n }\n if (getAddress(c.target) === ZERO_ADDRESS) {\n throw usage(`\\`sandbox.calls[${idx}].target\\` must not be the zero address (the governor reverts ZeroSandboxTarget)`);\n }\n if (typeof c.data !== \"string\" || !/^0x[0-9a-fA-F]*$/.test(c.data)) {\n throw usage(`\\`sandbox.calls[${idx}].data\\` must be a 0x-prefixed hex string`);\n }\n return { target: getAddress(c.target), data: c.data };\n}\nfunction validateSandboxPayload(sandbox, maxCapital) {\n if (!sandbox || typeof sandbox !== \"object\") {\n throw usage(\"`sandbox` must be an object of {funding, calls, declaredTokens}\");\n }\n const s = sandbox;\n const funding = toBigInt(s.funding, \"sandbox.funding\");\n if (funding === 0n) {\n throw usage(\"`sandbox.funding` must be > 0 (the governor rejects zero as ZeroSandboxFunding)\");\n }\n if (funding > maxCapital) {\n throw usage(`\\`sandbox.funding\\` (${funding}) exceeds \\`envelope.maxCapital\\` (${maxCapital}) — the sandbox is funded out of the declared envelope, not beside it`);\n }\n if (!Array.isArray(s.calls)) {\n throw usage(\"`sandbox.calls` must be an array of {target, data} objects (no value)\");\n }\n if (s.calls.length === 0) {\n throw usage(\"`sandbox.calls` must be non-empty (the governor rejects empty as EmptySandboxCalls)\");\n }\n if (s.calls.length > MAX_SANDBOX_CALLS) {\n throw usage(`\\`sandbox.calls\\` has ${s.calls.length} entries; max is ${MAX_SANDBOX_CALLS}`);\n }\n const calls = s.calls.map((c, i) => validateSandboxCall(c, i));\n const rawTokens = s.declaredTokens ?? [];\n if (!Array.isArray(rawTokens)) {\n throw usage(\"`sandbox.declaredTokens` must be an array of addresses\");\n }\n if (rawTokens.length > MAX_SANDBOX_TOKENS) {\n throw usage(`\\`sandbox.declaredTokens\\` has ${rawTokens.length} entries; max is ${MAX_SANDBOX_TOKENS}`);\n }\n const declaredTokens = [];\n const seen = new Set();\n for (let i = 0; i < rawTokens.length; i++) {\n const t = rawTokens[i];\n if (typeof t !== \"string\" || !isAddress(t)) {\n throw usage(`\\`sandbox.declaredTokens[${i}]\\` must be a 0x-prefixed address`);\n }\n const addr = getAddress(t);\n if (seen.has(addr.toLowerCase())) {\n throw usage(`\\`sandbox.declaredTokens[${i}]\\` duplicates ${addr} (the governor reverts DuplicateSandboxToken)`);\n }\n seen.add(addr.toLowerCase());\n declaredTokens.push(addr);\n }\n return { funding, calls, declaredTokens };\n}\n/**\n * Encode `ISyndicateGovernor.proposeWithSandbox`. Arity/order matches\n * post-audit `ISyndicateGovernor.sol`: SandboxPayload first, then the same\n * 10 arguments as `propose`.\n */\nexport function encodeProposeWithSandbox(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 const settlementCallCaps = validateCaps(args.settlementCallCaps, settlementCalls, maxCapital, \"settlementCallCaps\");\n const sandbox = validateSandboxPayload(args.sandbox, maxCapital);\n const data = encodeFunctionData({\n abi: SYNDICATE_GOVERNOR_ABI,\n functionName: \"proposeWithSandbox\",\n args: [\n sandbox,\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 sandbox strategy on ${vault} (funding ${sandbox.funding.toString()}, ${sandbox.calls.length} sandbox call(s), duration ${strategyDuration.toString()}s).`,\n note: \"Reverts if the vault has an active proposal, has no CallSandbox implementation bound, or the payload fails propose-time sandbox gates (empty calls, zero funding, funding > maxCapital, zero target, duplicate declared tokens). ICallSandbox.Call is (address,bytes) only — no native value.\",\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 guardianRegistry.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 `guardianRegistry.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 { 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}\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).\n * Selector `0x3ad95b6d`. Three args — slashBps was removed post-audit.\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 * 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 const data = encodeFunctionData({\n abi: GUARDIAN_REGISTRY_ABI,\n functionName: \"voteOnProposal\",\n args: [governor, proposalId, support],\n });\n const underwriting = args.vote === \"Approve\"\n ? \" APPROVE books coverage against the CALLER'S OWN slashable guardian bond (ExposureLedger.recordApproval). 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. 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) — 3 args, selector 0x3ad95b6d, no slashBps.${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":["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","spinner"]}