@sherwoodagent/cli 0.17.3 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/providers/moonwell.ts","../src/providers/uniswap.ts","../src/commands/strategy-template.ts","../src/lib/clone.ts","../src/lib/batch.ts","../src/strategies/moonwell-supply-template.ts","../src/strategies/venice-inference-template.ts","../src/strategies/aerodrome-lp-template.ts","../src/strategies/wsteth-moonwell-template.ts","../src/lib/factory.ts","../src/lib/subgraph.ts","../src/commands/venice.ts","../src/lib/quote.ts","../src/strategies/venice-fund.ts","../src/lib/venice.ts","../src/commands/allowance.ts","../src/strategies/allowance-disburse.ts","../src/commands/identity.ts","../src/commands/proposal.ts","../src/lib/format.ts","../src/commands/governor.ts"],"sourcesContent":["#!/usr/bin/env node\n// Load .env if present (dev convenience — production uses ~/.sherwood/config.json)\nimport { config as loadDotenv } from \"dotenv\";\ntry { loadDotenv(); } catch {};\nimport { createRequire } from \"node:module\";\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require(\"../package.json\");\nimport { Command, Option } from \"commander\";\nimport { parseUnits, isAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { input, confirm, select } from \"@inquirer/prompts\";\nimport { setNetwork, getNetwork, VALID_NETWORKS } from \"./lib/network.js\";\nimport { getExplorerUrl, getChain } from \"./lib/network.js\";\nimport type { Network } from \"./lib/network.js\";\nimport { TOKENS } from \"./lib/addresses.js\";\nimport { getPublicClient, getAccount } from \"./lib/client.js\";\nimport { ERC20_ABI } from \"./lib/abis.js\";\nimport { MoonwellProvider } from \"./providers/moonwell.js\";\nimport { UniswapProvider } from \"./providers/uniswap.js\";\nimport { registerStrategyTemplateCommands } from \"./commands/strategy-template.js\";\nimport * as vaultLib from \"./lib/vault.js\";\nimport * as factoryLib from \"./lib/factory.js\";\nimport * as subgraphLib from \"./lib/subgraph.js\";\n// registryLib removed — strategy registry is deprecated, replaced by template commands\nimport { uploadMetadata } from \"./lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"./lib/ipfs.js\";\nimport { registerVeniceCommands } from \"./commands/venice.js\";\nimport { registerAllowanceCommands } from \"./commands/allowance.js\";\nimport { registerIdentityCommands } from \"./commands/identity.js\";\nimport { registerProposalCommands } from \"./commands/proposal.js\";\nimport { registerGovernorCommands } from \"./commands/governor.js\";\nimport { setTextRecord, getTextRecord, resolveVaultSyndicate, resolveSyndicate } from \"./lib/ens.js\";\nimport * as easLib from \"./lib/eas.js\";\nimport { EAS_SCHEMAS } from \"./lib/addresses.js\";\n\n// XMTP shells out to @xmtp/cli binary — lazy-load to avoid breaking\n// non-chat commands if the CLI is not installed.\nasync function loadXmtp() {\n return import(\"./lib/xmtp.js\");\n}\n// Lazy-load cron module (only needed for openclaw agents)\nasync function loadCron() {\n return import(\"./lib/cron.js\");\n}\nimport { cacheGroupId, getCachedGroupId, setChainContract, getChainContracts, loadConfig, setPrivateKey, getAgentId, setConfigRpcUrl, getNotifyTo, setNotifyTo } from \"./lib/config.js\";\nimport { isTestnet } from \"./lib/network.js\";\n\n// ── Theme ──\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction validateAddress(value: string, name: string): Address {\n if (!isAddress(value)) {\n console.error(chalk.red(`Invalid ${name} address: ${value}`));\n process.exit(1);\n }\n return value as Address;\n}\n\n/** Set vault address from --vault flag or fall back to config. */\nfunction resolveVault(opts: { vault?: string }) {\n if (opts.vault) {\n vaultLib.setVaultAddress(validateAddress(opts.vault, \"vault\"));\n }\n // If no --vault flag, getVaultAddress() in vault.ts reads from config\n}\n\nconst program = new Command();\n\nprogram\n .name(\"sherwood\")\n .description(\"CLI for agent-managed investment syndicates\")\n .version(CLI_VERSION)\n .addOption(\n new Option(\"--chain <network>\", \"Target network\")\n .choices(VALID_NETWORKS)\n .default(\"base\"),\n )\n .option(\"--testnet\", \"Alias for --chain base-sepolia (deprecated)\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n let network: string = opts.chain;\n if (opts.testnet) {\n process.env.ENABLE_TESTNET = \"true\";\n if (network !== \"base\") {\n console.warn(\n chalk.yellow(\"[warn] --testnet ignored, --chain takes precedence\"),\n );\n } else {\n network = \"base-sepolia\";\n }\n }\n setNetwork(network as Network);\n if (getNetwork() !== \"base\") {\n console.log(chalk.yellow(`[${getNetwork()}]`));\n }\n });\n\n// ── Syndicate commands ──\nconst syndicate = program.command(\"syndicate\");\n\nsyndicate\n .command(\"create\")\n .description(\"Create a new syndicate via the factory (interactive)\")\n .option(\"--subdomain <name>\", \"ENS subdomain (skip prompt)\")\n .option(\"--name <name>\", \"Syndicate name (skip prompt)\")\n .option(\"--agent-id <id>\", \"ERC-8004 agent identity token ID (skip prompt)\")\n .option(\"--asset <symbol-or-address>\", \"Vault asset: USDC, WETH, or a token address\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--metadata-uri <uri>\", \"Override metadata URI (skip IPFS upload)\")\n .option(\"--open-deposits\", \"Allow anyone to deposit (no whitelist)\")\n .option(\"--public-chat\", \"Enable dashboard spectator mode\", false)\n .option(\"-y, --yes\", \"Skip confirmation prompt (non-interactive mode)\", false)\n .action(async (opts) => {\n try {\n // ── Header ──\n console.log();\n console.log(LABEL(\" ◆ Create Syndicate\"));\n SEP();\n\n const wallet = getAccount();\n console.log(DIM(` Wallet: ${wallet.address}`));\n console.log(DIM(` Network: ${getChain().name}`));\n SEP();\n\n // ── Gather inputs (prompt if not provided via flags) ──\n\n const savedAgentId = getAgentId();\n\n const nonInteractive = opts.yes;\n\n const name = opts.name || (nonInteractive\n ? (() => { throw new Error(\"--name is required in non-interactive mode (-y)\"); })()\n : await input({\n message: G(\"Syndicate name\"),\n validate: (v: string) => v.length > 0 || \"Name is required\",\n }));\n\n const subdomain = opts.subdomain || (nonInteractive\n ? name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\")\n : await input({\n message: G(\"ENS subdomain\"),\n default: name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\"),\n validate: (v: string) => v.length >= 3 || \"Must be at least 3 characters\",\n }));\n\n const description = opts.description || (nonInteractive\n ? `${name} — a Sherwood syndicate`\n : await input({\n message: G(\"Description\"),\n default: `${name} — a Sherwood syndicate`,\n }));\n\n const agentIdStr = opts.agentId || (savedAgentId\n ? (nonInteractive\n ? String(savedAgentId)\n : await input({ message: G(\"Agent ID (ERC-8004)\"), default: String(savedAgentId) }))\n : (nonInteractive\n ? \"0\"\n : await input({ message: G(\"Agent ID (ERC-8004)\"), validate: (v: string) => /^\\d+$/.test(v) || \"Must be a number\" }))\n );\n\n const openDeposits = opts.openDeposits !== undefined ? opts.openDeposits : (nonInteractive\n ? true\n : await confirm({\n message: G(\"Open deposits? (anyone can deposit)\"),\n default: true,\n }));\n\n // ── Resolve asset ──\n // Supported symbols (testnet + mainnet). Will expand on mainnet launch.\n const ASSET_SYMBOLS: Record<string, Address> = {\n USDC: TOKENS().USDC,\n WETH: TOKENS().WETH,\n };\n\n let asset: Address;\n if (opts.asset) {\n const upper = opts.asset.toUpperCase();\n if (ASSET_SYMBOLS[upper]) {\n asset = ASSET_SYMBOLS[upper];\n } else if (opts.asset.startsWith(\"0x\") && opts.asset.length === 42) {\n asset = opts.asset as Address;\n } else {\n const supported = Object.keys(ASSET_SYMBOLS).join(\", \");\n console.error(chalk.red(` Unknown asset \"${opts.asset}\". Use a symbol (${supported}) or a 0x address.`));\n process.exit(1);\n }\n } else if (nonInteractive) {\n // Default to WETH on chains without USDC, otherwise USDC\n asset = TOKENS().USDC !== \"0x0000000000000000000000000000000000000000\"\n ? ASSET_SYMBOLS.USDC\n : ASSET_SYMBOLS.WETH;\n } else {\n // Interactive prompt\n const assetChoice = await select({\n message: G(\"Vault asset (what token do depositors provide?)\"),\n choices: [\n { name: \"USDC\", value: \"USDC\", description: \"USD Coin (6 decimals)\" },\n { name: \"WETH\", value: \"WETH\", description: \"Wrapped Ether (18 decimals)\" },\n ],\n });\n asset = ASSET_SYMBOLS[assetChoice];\n }\n\n const publicClient = getPublicClient();\n const [decimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n ]);\n const symbol = `sw${assetSymbol}`;\n\n // ── Confirmation ──\n console.log();\n console.log(LABEL(\" ◆ Review\"));\n SEP();\n console.log(W(` Name: ${BOLD(name)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Description: ${DIM(description)}`));\n console.log(W(` Agent ID: #${agentIdStr}`));\n console.log(W(` Asset: ${assetSymbol} (${asset.slice(0, 10)}...)`));\n console.log(W(` Share token: ${symbol}`));\n console.log(W(` Open deposits: ${openDeposits ? G(\"yes\") : chalk.red(\"no (whitelist)\")}`));\n SEP();\n\n if (!nonInteractive) {\n const go = await confirm({ message: G(\"Deploy syndicate?\"), default: true });\n if (!go) {\n console.log(DIM(\" Cancelled.\"));\n return;\n }\n }\n\n // ── Upload metadata to IPFS ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {\n feeModel: \"none\",\n },\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(`IPFS upload failed — using inline metadata`));\n const json = JSON.stringify({ name, description, subdomain, asset: assetSymbol, openDeposits, createdBy: \"@sherwoodagent/cli\" });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Deploy ──\n const spinner = ora({ text: W(\"Deploying vault via factory...\"), color: \"green\" }).start();\n\n const result = await factoryLib.createSyndicate({\n creatorAgentId: BigInt(agentIdStr),\n metadataURI,\n asset,\n name,\n symbol,\n openDeposits,\n subdomain,\n });\n\n // Auto-save vault address to config\n setChainContract(getChain().id, \"vault\", result.vault);\n\n // ── Register creator as agent on the vault ──\n // Brief delay to let the RPC node sync its nonce after createSyndicate tx\n await new Promise((r) => setTimeout(r, 2000));\n spinner.text = W(\"Registering creator as agent...\");\n try {\n vaultLib.setVaultAddress(result.vault);\n const creatorAddress = getAccount().address;\n await vaultLib.registerAgent(\n BigInt(agentIdStr),\n creatorAddress, // agentAddress = creator EOA (direct execution)\n );\n } catch (regErr) {\n // Non-fatal — creator can register later via `syndicate add`\n console.warn(chalk.yellow(\"\\n ⚠ Could not auto-register creator as agent — register manually with `syndicate add`\"));\n }\n\n spinner.text = W(\"Setting up chat...\");\n\n // Create XMTP group for syndicate chat\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const groupId = await xmtp.createSyndicateGroup(xmtpClient, subdomain, opts.publicChat);\n await setTextRecord(subdomain, \"xmtpGroupId\", groupId, result.vault as Address);\n cacheGroupId(subdomain, groupId);\n } catch {\n console.warn(chalk.yellow(\"\\n ⚠ Could not create XMTP chat group\"));\n console.warn(chalk.dim(` Recover later with: sherwood chat ${subdomain} init`));\n }\n\n // ── Auto-register participation crons ──\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (15m check + hourly summary)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n spinner.stop();\n\n // ── Success ──\n console.log();\n console.log(LABEL(\" ◆ Syndicate Created\"));\n SEP();\n console.log(W(` ID: ${G(`#${result.syndicateId}`)}`));\n console.log(W(` Vault: ${G(result.vault)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n console.log(W(` Explorer: ${DIM(getExplorerUrl(result.hash))}`));\n console.log(W(` Chat: ${DIM(`sherwood chat ${subdomain}`)}`));\n SEP();\n console.log(G(\" ✓ Vault saved to ~/.sherwood/config.json\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"list\")\n .description(\"List active syndicates (queries subgraph, falls back to on-chain)\")\n .option(\"--creator <address>\", \"Filter by creator address\")\n .action(async (opts) => {\n const spinner = ora(\"Loading syndicates...\").start();\n try {\n // Try subgraph first (fast, indexed), fall back to on-chain\n let syndicates: { id: string | bigint; vault: string; creator: string; metadataURI: string; createdAt: string | bigint; totalDeposits?: string; totalWithdrawals?: string; subdomain?: string }[];\n\n if (process.env.SUBGRAPH_URL) {\n const result = await subgraphLib.getActiveSyndicates(opts.creator);\n syndicates = result;\n } else {\n const result = await factoryLib.getActiveSyndicates();\n syndicates = result.map((s) => ({\n id: s.id.toString(),\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt.toString(),\n subdomain: s.subdomain,\n }));\n }\n\n spinner.stop();\n\n if (syndicates.length === 0) {\n console.log(chalk.dim(\"No active syndicates found.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Active Syndicates (${syndicates.length})`));\n if (!process.env.SUBGRAPH_URL) {\n console.log(chalk.dim(\" (Set SUBGRAPH_URL for faster indexed queries)\"));\n }\n console.log(chalk.dim(\"─\".repeat(70)));\n\n for (const s of syndicates) {\n const ts = typeof s.createdAt === \"string\" ? Number(s.createdAt) : Number(s.createdAt);\n const date = new Date(ts * 1000).toLocaleDateString();\n const ensName = s.subdomain ? `${s.subdomain}.sherwoodagent.eth` : \"\";\n console.log(` #${s.id} ${chalk.bold(ensName || String(s.vault))}`);\n if (ensName) console.log(` Vault: ${chalk.cyan(String(s.vault))}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Created: ${date}`);\n if (s.totalDeposits) {\n console.log(` Deposits: ${s.totalDeposits} USDC`);\n }\n if (s.metadataURI) {\n console.log(` Metadata: ${chalk.dim(s.metadataURI)}`);\n }\n console.log();\n }\n } catch (err) {\n spinner.fail(\"Failed to load syndicates\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"info\")\n .description(\"Display syndicate details by ID\")\n .argument(\"<id>\", \"Syndicate ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading syndicate info...\").start();\n try {\n const id = BigInt(idStr);\n const info = await factoryLib.getSyndicate(id);\n spinner.stop();\n\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n console.log(chalk.red(`Syndicate #${id} not found.`));\n process.exit(1);\n }\n\n const date = new Date(Number(info.createdAt) * 1000).toLocaleDateString();\n console.log();\n console.log(chalk.bold(`Syndicate #${info.id}`));\n console.log(chalk.dim(\"─\".repeat(40)));\n if (info.subdomain) {\n console.log(` ENS: ${chalk.bold(`${info.subdomain}.sherwoodagent.eth`)}`);\n }\n console.log(` Vault: ${chalk.cyan(info.vault)}`);\n console.log(` Creator: ${info.creator}`);\n console.log(` Created: ${date}`);\n console.log(` Active: ${info.active ? chalk.green(\"yes\") : chalk.red(\"no\")}`);\n if (info.metadataURI) {\n console.log(` Metadata: ${chalk.dim(info.metadataURI)}`);\n }\n\n // Also show vault info\n vaultLib.setVaultAddress(info.vault);\n const vaultInfo = await vaultLib.getVaultInfo();\n console.log();\n console.log(chalk.bold(\" Vault Stats\"));\n console.log(` Total Assets: ${vaultInfo.totalAssets}`);\n console.log(` Agent Count: ${vaultInfo.agentCount}`);\n console.log(` Redemptions Locked: ${vaultInfo.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(vaultInfo.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load syndicate info\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"update-metadata\")\n .description(\"Update syndicate metadata (creator only)\")\n .requiredOption(\"--id <id>\", \"Syndicate ID\")\n .option(\"--name <name>\", \"Syndicate name\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--uri <uri>\", \"Direct metadata URI (skips IPFS upload)\")\n .action(async (opts) => {\n const spinner = ora({ text: W(\"Loading syndicate...\"), color: \"green\" }).start();\n try {\n const syndicateId = BigInt(opts.id);\n let metadataURI = opts.uri;\n\n if (!metadataURI) {\n const info = await factoryLib.getSyndicate(syndicateId);\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n spinner.fail(`Syndicate #${opts.id} not found.`);\n process.exit(1);\n }\n\n const name = opts.name || info.subdomain;\n const description = opts.description || `${name} — a Sherwood syndicate on ${info.subdomain}.sherwoodagent.eth`;\n\n spinner.text = W(\"Uploading metadata to IPFS...\");\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {},\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.text = W(\"Updating on-chain metadata...\");\n }\n\n const hash = await factoryLib.updateMetadata(syndicateId, metadataURI);\n spinner.succeed(G(`Metadata updated`));\n console.log(DIM(` IPFS: ${metadataURI}`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Metadata update failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve-depositor\")\n .description(\"Approve an address to deposit (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to approve\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Approving depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.approveDepositor(depositor);\n spinner.succeed(`Depositor approved: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"remove-depositor\")\n .description(\"Remove an address from the depositor whitelist (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to remove\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Removing depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.removeDepositor(depositor);\n spinner.succeed(`Depositor removed: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Removal failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"add\")\n .description(\"Register an agent on a syndicate vault (creator only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault address from --vault flag or config\n resolveVault(opts);\n const vaultAddress = vaultLib.getVaultAddress();\n\n // Verify caller is the syndicate creator\n const { creator, subdomain } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can add agents\");\n process.exit(1);\n }\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n spinner.text = \"Registering agent...\";\n const hash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n agentWallet,\n );\n spinner.succeed(`Agent registered: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n\n // Auto-add agent to XMTP chat group\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(chalk.dim(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n } catch (err) {\n spinner.fail(\"Registration failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n// ── EAS Join Request / Approval Commands ──\n\nsyndicate\n .command(\"join\")\n .description(\"Request to join a syndicate (creates an EAS attestation)\")\n .requiredOption(\"--subdomain <name>\", \"Syndicate subdomain to join\")\n .option(\"--message <text>\", \"Message to the creator\", \"Requesting to join your syndicate\")\n .action(async (opts) => {\n const spinner = ora(\"Resolving syndicate...\").start();\n try {\n const agentId = getAgentId();\n if (!agentId) {\n spinner.fail(\"No agent identity found. Run 'sherwood identity mint' first.\");\n process.exit(1);\n }\n\n const syndicate = await resolveSyndicate(opts.subdomain);\n const callerAddress = getAccount().address;\n\n // Check if already registered as an agent on this vault\n spinner.text = \"Checking membership...\";\n vaultLib.setVaultAddress(syndicate.vault);\n const alreadyAgent = await vaultLib.isAgent(callerAddress);\n if (alreadyAgent) {\n spinner.succeed(\"You are already a registered agent on this syndicate\");\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n // Auto-register participation crons (idempotent)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(opts.subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(chalk.green(\" ✓ Participation crons registered\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(chalk.dim(\" Tip: Set up a scheduled process to run `sherwood session check \" + opts.subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n return;\n }\n\n // Check for existing pending join request\n spinner.text = \"Checking pending requests...\";\n const pendingRequests = await easLib.queryJoinRequests(syndicate.creator);\n const existingRequest = pendingRequests.find(\n (r) => r.attester.toLowerCase() === callerAddress.toLowerCase()\n && r.decoded.vault.toLowerCase() === syndicate.vault.toLowerCase(),\n );\n if (existingRequest) {\n spinner.succeed(\"You already have a pending join request for this syndicate\");\n console.log(chalk.dim(` Attestation: ${existingRequest.uid}`));\n console.log(chalk.dim(` Submitted: ${new Date(existingRequest.time * 1000).toLocaleString()}`));\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n return;\n }\n\n spinner.text = \"Creating join request attestation...\";\n const { uid, hash } = await easLib.createJoinRequest(\n syndicate.id,\n BigInt(agentId),\n syndicate.vault,\n syndicate.creator,\n opts.message,\n );\n\n // Pre-register XMTP identity so the creator can add us to the group on approval\n try {\n spinner.text = \"Registering XMTP identity...\";\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n spinner.succeed(\"Join request created (XMTP identity ready)\");\n } catch {\n spinner.succeed(\"Join request created\");\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity — creator may not be able to auto-add you to chat\"));\n }\n\n // Auto-register participation crons (will HEARTBEAT_OK until approved)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(opts.subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (will activate after approval)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + opts.subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n console.log();\n console.log(LABEL(\" ◆ Join Request Submitted\"));\n SEP();\n console.log(W(` Syndicate: ${G(`${opts.subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Agent ID: #${agentId}`));\n console.log(W(` Creator: ${DIM(syndicate.creator)}`));\n console.log(W(` Attestation: ${DIM(uid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(uid))}`));\n console.log(W(` Explorer: ${DIM(getExplorerUrl(hash))}`));\n SEP();\n console.log(G(\" ✓ The creator can review with:\"));\n console.log(DIM(` sherwood syndicate requests --subdomain ${opts.subdomain}`));\n console.log();\n } catch (err) {\n spinner.fail(\"Join request failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"requests\")\n .description(\"View pending join requests for a syndicate (creator only)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n const spinner = ora(\"Loading join requests...\").start();\n try {\n let creatorAddress: Address;\n let subdomain: string;\n let syndicateVault: Address;\n\n if (opts.subdomain) {\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n creatorAddress = syndicateInfo.creator;\n subdomain = opts.subdomain;\n syndicateVault = syndicateInfo.vault as Address;\n } else {\n resolveVault(opts);\n syndicateVault = vaultLib.getVaultAddress();\n const syndicateInfo = await resolveVaultSyndicate(syndicateVault);\n creatorAddress = syndicateInfo.creator;\n subdomain = syndicateInfo.subdomain;\n }\n\n // Verify caller is creator\n const callerAddress = getAccount().address.toLowerCase();\n if (creatorAddress.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can view join requests\");\n process.exit(1);\n }\n\n spinner.text = \"Querying EAS attestations...\";\n const [allRequests, approvals] = await Promise.all([\n easLib.queryJoinRequests(creatorAddress),\n easLib.queryApprovals(creatorAddress),\n ]);\n\n // Filter out agents that have already been approved for the same vault\n const approvedKeys = new Set(\n approvals\n .filter((a) => a.decoded.vault.toLowerCase() === syndicateVault.toLowerCase())\n .map((a) => a.decoded.agentId.toString()),\n );\n const requests = allRequests.filter(\n (r) => !approvedKeys.has(r.decoded.agentId.toString())\n && r.decoded.vault.toLowerCase() === syndicateVault.toLowerCase(),\n );\n\n spinner.stop();\n\n if (requests.length === 0) {\n console.log(DIM(\"\\n No pending join requests.\\n\"));\n return;\n }\n\n console.log();\n console.log(LABEL(` ◆ Pending Join Requests (${requests.length})`));\n SEP();\n\n for (let i = 0; i < requests.length; i++) {\n const req = requests[i];\n const date = new Date(req.time * 1000).toLocaleString();\n console.log(W(` ${i + 1}. Agent #${req.decoded.agentId} ${DIM(`(${req.attester})`)}`));\n console.log(DIM(` Message: \"${req.decoded.message}\"`));\n console.log(DIM(` Requested: ${date}`));\n console.log(DIM(` Attestation: ${req.uid}`));\n console.log();\n }\n\n console.log(G(\" To approve:\"));\n console.log(DIM(` sherwood syndicate approve --agent-id <id> --wallet <addr>`));\n console.log(G(\" To reject:\"));\n console.log(DIM(` sherwood syndicate reject --attestation <uid>`));\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load requests\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve\")\n .description(\"Approve an agent join request (registers agent + creates EAS approval)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain (alternative to --vault)\")\n .requiredOption(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault from subdomain or --vault/config\n if (opts.subdomain && !opts.vault) {\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n vaultLib.setVaultAddress(syndicateInfo.vault);\n } else {\n resolveVault(opts);\n }\n const vaultAddress = vaultLib.getVaultAddress();\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n\n // Verify caller is creator\n const { creator, subdomain, id: syndicateId } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can approve agents\");\n process.exit(1);\n }\n\n // 1. Register agent on-chain (same as syndicate add)\n spinner.text = \"Registering agent on vault...\";\n let agentWasRegistered = false;\n try {\n const regHash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n agentWallet,\n );\n agentWasRegistered = true;\n console.log(DIM(` Agent registered: ${getExplorerUrl(regHash)}`));\n } catch (regErr) {\n const msg = regErr instanceof Error ? regErr.message : String(regErr);\n if (msg.includes(\"0xe098d3ee\") || msg.includes(\"AgentAlreadyRegistered\")) {\n console.log(DIM(\" Agent already registered on vault — skipping\"));\n } else {\n throw regErr;\n }\n }\n\n // Brief delay after on-chain registration to let the RPC node sync its nonce\n if (agentWasRegistered) {\n await new Promise((r) => setTimeout(r, 2000));\n }\n\n // 2. Create AGENT_APPROVED attestation (skip if one already exists)\n spinner.text = \"Checking for existing approval...\";\n const existingApprovals = await easLib.queryApprovals(getAccount().address);\n const alreadyApproved = existingApprovals.find(\n (a) => a.decoded.agentId === BigInt(opts.agentId) && a.decoded.vault.toLowerCase() === vaultAddress.toLowerCase(),\n );\n\n let approvalUid: `0x${string}`;\n if (alreadyApproved) {\n approvalUid = alreadyApproved.uid;\n console.log(DIM(` Approval attestation already exists — skipping`));\n } else {\n spinner.text = \"Creating approval attestation...\";\n const result = await easLib.createApproval(\n syndicateId,\n BigInt(opts.agentId),\n vaultAddress,\n agentWallet,\n );\n approvalUid = result.uid;\n }\n\n // 3. Auto-add agent to XMTP chat group\n try {\n spinner.text = \"Adding to chat...\";\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(DIM(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n\n spinner.succeed(\"Agent approved and registered\");\n console.log();\n console.log(LABEL(\" ◆ Agent Approved\"));\n SEP();\n console.log(W(` Agent ID: #${opts.agentId}`));\n console.log(W(` Wallet: ${G(opts.wallet)}`));\n console.log(W(` Approval: ${DIM(approvalUid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(approvalUid))}`));\n SEP();\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"reject\")\n .description(\"Reject a join request by revoking its attestation\")\n .requiredOption(\"--attestation <uid>\", \"Join request attestation UID to revoke\")\n .action(async (opts) => {\n const spinner = ora(\"Revoking attestation...\").start();\n try {\n const hash = await easLib.revokeAttestation(\n EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n opts.attestation as `0x${string}`,\n );\n spinner.succeed(\"Join request rejected\");\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Rejection failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n// ── Vault commands ──\nconst vaultCmd = program.command(\"vault\");\n\nvaultCmd\n .command(\"deposit\")\n .description(\"Deposit into a vault\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--amount <amount>\", \"Amount to deposit (in asset units)\")\n .action(async (opts) => {\n resolveVault(opts);\n const decimals = await vaultLib.getAssetDecimals();\n const amount = parseUnits(opts.amount, decimals);\n const spinner = ora(`Depositing ${opts.amount}...`).start();\n try {\n const hash = await vaultLib.deposit(amount);\n spinner.succeed(`Deposited: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Deposit failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"info\")\n .description(\"Display vault state\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading vault info...\").start();\n try {\n const info = await vaultLib.getVaultInfo();\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"Vault Info\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Address: ${info.address}`);\n console.log(` Total Assets: ${info.totalAssets}`);\n console.log(` Agent Count: ${info.agentCount}`);\n console.log(` Redemptions Locked: ${info.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(info.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load vault info\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"balance\")\n .description(\"Show LP share balance and asset value\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--address <address>\", \"Address to check (default: your wallet)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading balance...\").start();\n try {\n const balance = await vaultLib.getBalance(opts.address as Address | undefined);\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"LP Position\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Shares: ${balance.shares.toString()}`);\n console.log(` Asset Value: ${balance.assetsValue}`);\n console.log(` % of Vault: ${balance.percentOfVault}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load balance\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n// ── Strategy commands ──\nconst strategy = program.command(\"strategy\").description(\"Strategy templates — list, clone, propose\");\nregisterStrategyTemplateCommands(strategy);\n\n// ── Provider info ──\nprogram\n .command(\"providers\")\n .description(\"List available DeFi providers\")\n .action(async () => {\n const { MessariProvider, NansenProvider } = await import(\"./providers/research/index.js\");\n const providers = [new MoonwellProvider(), new UniswapProvider(), new MessariProvider(), new NansenProvider()];\n for (const p of providers) {\n const info = p.info();\n console.log(`\\n${info.name} (${info.type})`);\n console.log(` Capabilities: ${info.capabilities.join(\", \")}`);\n console.log(` Chains: ${info.supportedChains.map((c) => c.name).join(\", \")}`);\n }\n });\n\n// ── Chat commands (lazy-loaded — requires @xmtp/cli binary) ──\ntry {\n const { registerChatCommands } = await import(\"./commands/chat.js\");\n registerChatCommands(program);\n} catch {\n program\n .command(\"chat <name> [action] [actionArgs...]\")\n .description(\"Syndicate chat (XMTP) — requires @xmtp/cli\")\n .action(() => {\n console.error(chalk.red(\"XMTP CLI not available.\"));\n console.error(chalk.dim(\"Install with: npm install -g @xmtp/cli\"));\n console.error(chalk.dim(\"Or reinstall: npm i -g @sherwoodagent/cli\"));\n process.exit(1);\n });\n}\n\n// ── Session commands ──\nconst { registerSessionCommands } = await import(\"./commands/session.js\");\nregisterSessionCommands(program);\n\n// ── Venice commands ──\nregisterVeniceCommands(program);\n\n// ── Allowance commands ──\nregisterAllowanceCommands(program);\n\n// ── Identity commands ──\nregisterIdentityCommands(program);\n\n// ── Proposal commands ──\nregisterProposalCommands(program);\n\n// ── Governor commands ──\nregisterGovernorCommands(program);\n\n// ── Research commands ──\nconst { registerResearchCommands } = await import(\"./commands/research.js\");\nregisterResearchCommands(program);\n\n// ── Config commands ──\nconst configCmd = program.command(\"config\");\n\nconfigCmd\n .command(\"set\")\n .description(\"Save settings to ~/.sherwood/config.json (persists across sessions)\")\n .option(\"--private-key <key>\", \"Wallet private key (0x-prefixed)\")\n .option(\"--vault <address>\", \"Default SyndicateVault address\")\n .option(\"--rpc <url>\", \"Custom RPC URL for the active --chain network\")\n .option(\"--notify-to <id>\", \"Destination for cron summaries (Telegram chat ID, phone, etc.)\")\n .action((opts) => {\n let saved = false;\n\n if (opts.privateKey) {\n setPrivateKey(opts.privateKey);\n const account = getAccount();\n console.log(chalk.green(\"Private key saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Wallet: ${account.address}`));\n saved = true;\n }\n\n if (opts.vault) {\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", opts.vault);\n console.log(chalk.green(`Vault saved to ~/.sherwood/config.json (chain ${chainId})`));\n console.log(chalk.dim(` Vault: ${opts.vault}`));\n saved = true;\n }\n\n if (opts.rpc) {\n const network = getNetwork();\n setConfigRpcUrl(network, opts.rpc);\n console.log(chalk.green(`RPC URL saved for ${network}`));\n console.log(chalk.dim(` RPC: ${opts.rpc}`));\n saved = true;\n }\n\n if (opts.notifyTo) {\n setNotifyTo(opts.notifyTo);\n console.log(chalk.green(\"Notify destination saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Notify to: ${opts.notifyTo}`));\n saved = true;\n }\n\n if (!saved) {\n console.log(chalk.red(\"Provide at least one of: --private-key, --vault, --rpc, --notify-to\"));\n process.exit(1);\n }\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Display current config for the active network\")\n .action(() => {\n const network = getNetwork();\n const chainId = getChain().id;\n const contracts = getChainContracts(chainId);\n const config = loadConfig();\n const customRpc = config.rpc?.[network];\n\n console.log();\n console.log(chalk.bold(`Sherwood Config`));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(` Network: ${chalk.cyan(network)} (chain ${chainId})`);\n console.log(` RPC: ${customRpc ? chalk.green(customRpc) : chalk.dim(\"default\")}`);\n console.log(` Wallet: ${config.privateKey ? chalk.green(\"configured\") : chalk.dim(\"not set\")}`);\n console.log(` Agent ID: ${config.agentId ?? chalk.dim(\"not set\")}`);\n console.log(` Vault: ${contracts.vault ?? chalk.dim(\"not set\")}`);\n console.log();\n console.log(chalk.dim(\" Config file: ~/.sherwood/config.json\"));\n console.log();\n });\n\nprogram.parse();\n","// TODO: Not yet implemented. All methods throw \"Not implemented\".\n// This provider is registered but non-functional.\n\nimport type { Address, Chain } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { LendingProvider, ProviderInfo, DepositParams, BorrowParams, RepayParams, WithdrawParams, TxResult, LendingPosition } from \"../types.js\";\nimport { MOONWELL as getMoonwell } from \"../lib/addresses.js\";\n\nexport class MoonwellProvider implements LendingProvider {\n info(): ProviderInfo {\n return {\n name: \"moonwell\",\n type: \"lending\",\n capabilities: [\n \"lend.deposit\",\n \"lend.borrow\",\n \"lend.repay\",\n \"lend.withdraw\",\n \"lend.positions\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async depositCollateral(params: DepositParams): Promise<TxResult> {\n // TODO: Build and send tx via viem\n throw new Error(\"Not implemented — wire up viem client\");\n }\n\n async borrow(params: BorrowParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async repay(params: RepayParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async withdrawCollateral(params: WithdrawParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async getPosition(account: Address): Promise<LendingPosition> {\n throw new Error(\"Not implemented\");\n }\n}\n","// TODO: Not yet implemented. All methods throw \"Not implemented\".\n// This provider is registered but non-functional.\n\nimport type { Address } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { TradingProvider, ProviderInfo, SwapParams, SwapQuoteParams, TxResult, SwapQuote } from \"../types.js\";\n\nexport class UniswapProvider implements TradingProvider {\n info(): ProviderInfo {\n return {\n name: \"uniswap\",\n type: \"trading\",\n capabilities: [\n \"swap.exact-input\",\n \"swap.quote\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async swap(params: SwapParams): Promise<TxResult> {\n // TODO: Build and send tx via viem\n throw new Error(\"Not implemented — wire up viem client\");\n }\n\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\n throw new Error(\"Not implemented\");\n }\n}\n","/**\n * Strategy template commands — clone, build calls, propose.\n *\n * Replaces the old strategy registry commands with template-based workflow:\n * sherwood strategy list — show available templates\n * sherwood strategy clone — clone + initialize a template\n * sherwood strategy propose — clone + init + build calls + submit proposal (all-in-one)\n */\n\nimport type { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { parseUnits, isAddress, erc20Abi } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { getPublicClient, getWalletClient, getAccount } from \"../lib/client.js\";\nimport { getChain, getExplorerUrl } from \"../lib/network.js\";\nimport { TOKENS, MOONWELL, VENICE, AERODROME, STRATEGY_TEMPLATES } from \"../lib/addresses.js\";\nimport { BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport { cloneTemplate } from \"../lib/clone.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { formatBatch } from \"../lib/batch.js\";\n\nimport * as moonwellBuilder from \"../strategies/moonwell-supply-template.js\";\nimport * as veniceBuilder from \"../strategies/venice-inference-template.js\";\nimport * as aerodromeBuilder from \"../strategies/aerodrome-lp-template.js\";\nimport * as wstethBuilder from \"../strategies/wsteth-moonwell-template.js\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\n\n// ── Template definitions ──\n\ninterface TemplateDef {\n name: string;\n key: string;\n description: string;\n addressKey: keyof ReturnType<typeof STRATEGY_TEMPLATES>;\n}\n\nconst TEMPLATES: TemplateDef[] = [\n {\n name: \"Moonwell Supply\",\n key: \"moonwell-supply\",\n description: \"Supply tokens to Moonwell lending market, earn yield\",\n addressKey: \"MOONWELL_SUPPLY\",\n },\n {\n name: \"Aerodrome LP\",\n key: \"aerodrome-lp\",\n description: \"Provide liquidity on Aerodrome DEX + optional gauge staking\",\n addressKey: \"AERODROME_LP\",\n },\n {\n name: \"Venice Inference\",\n key: \"venice-inference\",\n description: \"Stake VVV for sVVV — Venice private AI inference\",\n addressKey: \"VENICE_INFERENCE\",\n },\n {\n name: \"wstETH Moonwell Yield\",\n key: \"wsteth-moonwell\",\n description: \"WETH → wstETH → Moonwell — stack Lido + lending yield\",\n addressKey: \"WSTETH_MOONWELL\",\n },\n];\n\nfunction resolveTemplate(key: string): { def: TemplateDef; address: Address } {\n const def = TEMPLATES.find((t) => t.key === key);\n if (!def) {\n console.error(chalk.red(`Unknown template: ${key}`));\n console.error(chalk.dim(`Available: ${TEMPLATES.map((t) => t.key).join(\", \")}`));\n process.exit(1);\n }\n const address = STRATEGY_TEMPLATES()[def.addressKey];\n if (address === ZERO) {\n console.error(chalk.red(`Template \"${def.name}\" not deployed on this network.`));\n process.exit(1);\n }\n return { def, address };\n}\n\n// ── Helpers for building init data per template ──\n\nasync function buildInitDataForTemplate(\n templateKey: string,\n opts: Record<string, string | boolean | undefined>,\n vault: Address,\n): Promise<{ initData: Hex; asset: Address; assetAmount: bigint; extraApprovals?: { token: Address; amount: bigint }[] }> {\n if (templateKey === \"moonwell-supply\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for moonwell-supply template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const mToken = resolveMToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n const supplyAmount = parseUnits(opts.amount as string, decimals);\n const minRedeem = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n\n return {\n initData: moonwellBuilder.buildInitData(underlying, mToken, supplyAmount, minRedeem),\n asset: underlying,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"venice-inference\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for venice-inference template\"));\n process.exit(1);\n }\n const assetSymbol = (opts.asset as string) || \"USDC\";\n const asset = resolveToken(assetSymbol);\n const vvv = VENICE().VVV;\n const isDirect = asset.toLowerCase() === vvv.toLowerCase();\n const decimals = assetSymbol.toUpperCase() === \"USDC\" ? 6 : 18;\n const assetAmount = parseUnits(opts.amount as string, decimals);\n const agent = (opts.agent as Address) || getAccount().address;\n\n const params: veniceBuilder.VeniceInferenceInitParams = {\n asset,\n weth: isDirect ? ZERO : TOKENS().WETH,\n vvv,\n sVVV: VENICE().STAKING,\n aeroRouter: isDirect ? ZERO : AERODROME().ROUTER,\n aeroFactory: isDirect ? ZERO : AERODROME().FACTORY,\n agent,\n assetAmount,\n minVVV: isDirect ? 0n : parseUnits((opts.minVvv as string) || \"0\", 18),\n deadlineOffset: 300n,\n singleHop: !!opts.singleHop,\n };\n\n return {\n initData: veniceBuilder.buildInitData(params),\n asset,\n assetAmount,\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n for (const flag of [\"tokenA\", \"tokenB\", \"amountA\", \"amountB\", \"lpToken\"]) {\n if (!opts[flag]) {\n console.error(chalk.red(`--${flag.replace(/([A-Z])/g, \"-$1\").toLowerCase()} is required for aerodrome-lp template`));\n process.exit(1);\n }\n }\n const tokenA = opts.tokenA as Address;\n const tokenB = opts.tokenB as Address;\n const publicClient = getPublicClient();\n const [decimalsA, decimalsB] = await Promise.all([\n publicClient.readContract({ address: tokenA, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: tokenB, abi: erc20Abi, functionName: \"decimals\" }),\n ]);\n const amountA = parseUnits(opts.amountA as string, decimalsA);\n const amountB = parseUnits(opts.amountB as string, decimalsB);\n const minAOut = parseUnits((opts.minAOut as string) || \"0\", decimalsA);\n const minBOut = parseUnits((opts.minBOut as string) || \"0\", decimalsB);\n\n const params: aerodromeBuilder.AerodromeLPInitParams = {\n tokenA,\n tokenB,\n stable: !!opts.stable,\n factory: AERODROME().FACTORY,\n router: AERODROME().ROUTER,\n gauge: (opts.gauge as Address) || ZERO,\n lpToken: opts.lpToken as Address,\n amountADesired: amountA,\n amountBDesired: amountB,\n amountAMin: amountA, // use desired as min for now\n amountBMin: amountB,\n minAmountAOut: minAOut,\n minAmountBOut: minBOut,\n };\n\n return {\n initData: aerodromeBuilder.buildInitData(params),\n asset: tokenA,\n assetAmount: amountA,\n extraApprovals: [{ token: tokenB, amount: amountB }],\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for wsteth-moonwell template\"));\n process.exit(1);\n }\n const supplyAmount = parseUnits(opts.amount as string, 18); // WETH = 18 decimals\n const slippageBps = BigInt((opts.slippage as string) || \"500\"); // default 5% slippage\n const minWstethOut = supplyAmount - (supplyAmount * slippageBps) / 10000n;\n const minWethOut = supplyAmount - (supplyAmount * slippageBps) / 10000n;\n\n const params: wstethBuilder.WstETHMoonwellInitParams = {\n weth: TOKENS().WETH,\n wsteth: TOKENS().wstETH,\n mwsteth: MOONWELL().mWstETH,\n aeroRouter: AERODROME().ROUTER,\n aeroFactory: AERODROME().FACTORY,\n supplyAmount,\n minWstethOut,\n minWethOut,\n deadlineOffset: 300n,\n };\n\n return {\n initData: wstethBuilder.buildInitData(params),\n asset: TOKENS().WETH,\n assetAmount: supplyAmount,\n };\n }\n\n throw new Error(`No init builder for template: ${templateKey}`);\n}\n\nfunction buildCallsForTemplate(\n templateKey: string,\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n extraApprovals?: { token: Address; amount: bigint }[],\n): { executeCalls: BatchCall[]; settleCalls: BatchCall[] } {\n if (templateKey === \"moonwell-supply\") {\n return {\n executeCalls: moonwellBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: moonwellBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"venice-inference\") {\n return {\n executeCalls: veniceBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: veniceBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n const tokenB = extraApprovals?.[0]?.token ?? ZERO;\n const amountB = extraApprovals?.[0]?.amount ?? 0n;\n return {\n executeCalls: aerodromeBuilder.buildExecuteCalls(clone, asset, assetAmount, tokenB, amountB),\n settleCalls: aerodromeBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n return {\n executeCalls: wstethBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: wstethBuilder.buildSettleCalls(clone),\n };\n }\n\n throw new Error(`No call builder for template: ${templateKey}`);\n}\n\n// ── Token resolution ──\n\nfunction resolveToken(symbolOrAddress: string): Address {\n if (isAddress(symbolOrAddress)) return symbolOrAddress as Address;\n const upper = symbolOrAddress.toUpperCase();\n const tokens = TOKENS();\n const tokenMap: Record<string, Address> = {\n USDC: tokens.USDC,\n WETH: tokens.WETH,\n DAI: tokens.DAI,\n AERO: tokens.AERO,\n VVV: VENICE().VVV,\n };\n const addr = tokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`Unknown token: ${symbolOrAddress}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction resolveMToken(tokenSymbol: string): Address {\n const upper = tokenSymbol.toUpperCase();\n const moonwell = MOONWELL();\n const mTokenMap: Record<string, Address> = {\n USDC: moonwell.mUSDC,\n WETH: moonwell.mWETH,\n };\n const addr = mTokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`No Moonwell market for: ${tokenSymbol}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction serializeCalls(calls: BatchCall[]): string {\n return JSON.stringify(\n calls.map((c) => ({\n target: c.target,\n data: c.data,\n value: c.value.toString(),\n })),\n null,\n 2,\n );\n}\n\n// ── Commands ──\n\nexport function registerStrategyTemplateCommands(strategy: Command): void {\n // ── strategy list ──\n\n strategy\n .command(\"list\")\n .description(\"List available strategy templates\")\n .action(() => {\n const templates = STRATEGY_TEMPLATES();\n\n console.log();\n console.log(chalk.bold(\"Strategy Templates\"));\n console.log(chalk.dim(\"─\".repeat(60)));\n\n for (const t of TEMPLATES) {\n const addr = templates[t.addressKey];\n const deployed = addr !== ZERO;\n console.log();\n console.log(` ${chalk.bold(t.name)} (${chalk.cyan(t.key)})`);\n console.log(` ${t.description}`);\n console.log(` Template: ${deployed ? chalk.green(addr) : chalk.red(\"not deployed\")}`);\n }\n\n console.log();\n console.log(chalk.dim(\"Clone a template: sherwood strategy clone <template> --vault <addr> ...\"));\n console.log(chalk.dim(\"Full proposal: sherwood strategy propose <template> --vault <addr> ...\"));\n console.log();\n });\n\n // ── strategy clone ──\n\n strategy\n .command(\"clone\")\n .description(\"Clone a strategy template and initialize it\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n // moonwell-supply / wsteth-moonwell\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n // venice-inference\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n // aerodrome-lp\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n let cloneHash: Hex;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneHash = result.hash;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(cloneHash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n try {\n const { initData } = await buildInitDataForTemplate(templateKey, opts, vault);\n const account = getAccount();\n const wallet = getWalletClient();\n\n const initHash = await wallet.writeContract({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, initData],\n });\n\n await getPublicClient().waitForTransactionReceipt({ hash: initHash });\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.bold(\"Strategy clone ready:\"), chalk.green(clone));\n console.log(chalk.dim(\"Use this address in your proposal batch calls.\"));\n console.log();\n });\n\n // ── strategy propose ──\n\n strategy\n .command(\"propose\")\n .description(\"Clone + init + build calls + submit governance proposal (all-in-one)\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .option(\"--write-calls <dir>\", \"Write execute/settle JSON to directory (skip proposal submission)\")\n // proposal metadata (required unless --write-calls)\n .option(\"--name <name>\", \"Proposal name\")\n .option(\"--description <text>\", \"Proposal description\")\n .option(\"--performance-fee <bps>\", \"Agent fee in bps\")\n .option(\"--duration <duration>\", \"Strategy duration (7d, 24h, etc.)\")\n // template-specific (same as clone)\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(result.hash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n let asset: Address;\n let assetAmount: bigint;\n let extraApprovals: { token: Address; amount: bigint }[] | undefined;\n try {\n const built = await buildInitDataForTemplate(templateKey, opts, vault);\n asset = built.asset;\n assetAmount = built.assetAmount;\n extraApprovals = built.extraApprovals;\n\n const account = getAccount();\n const wallet = getWalletClient();\n\n const initHash = await wallet.writeContract({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, built.initData],\n });\n\n await getPublicClient().waitForTransactionReceipt({ hash: initHash });\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // 3. Build batch calls\n const { executeCalls, settleCalls } = buildCallsForTemplate(\n templateKey, clone, asset, assetAmount, extraApprovals,\n );\n\n console.log();\n console.log(chalk.bold(`Execute calls (${executeCalls.length}):`));\n console.log(formatBatch(executeCalls));\n console.log(chalk.bold(`Settle calls (${settleCalls.length}):`));\n console.log(formatBatch(settleCalls));\n\n // 4. Write files or submit proposal\n if (opts.writeCalls) {\n const dir = resolve(opts.writeCalls as string);\n mkdirSync(dir, { recursive: true });\n\n const execPath = resolve(dir, \"execute.json\");\n const settlePath = resolve(dir, \"settle.json\");\n writeFileSync(execPath, serializeCalls(executeCalls));\n writeFileSync(settlePath, serializeCalls(settleCalls));\n\n console.log();\n console.log(chalk.green(`Execute calls: ${execPath}`));\n console.log(chalk.green(`Settle calls: ${settlePath}`));\n console.log(chalk.green(`Clone address: ${clone}`));\n console.log();\n console.log(chalk.dim(\"Submit with:\"));\n console.log(chalk.dim(` sherwood proposal create \\\\`));\n console.log(chalk.dim(` --vault ${vault} \\\\`));\n console.log(chalk.dim(` --name \"...\" --description \"...\" \\\\`));\n console.log(chalk.dim(` --performance-fee 0 --duration 7d \\\\`));\n console.log(chalk.dim(` --execute-calls ${execPath} \\\\`));\n console.log(chalk.dim(` --settle-calls ${settlePath}`));\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Reminder: before settlement, agent must approve repayment:\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n console.log(chalk.yellow(\" Agent can update repayment via strategy.updateParams(newRepayment, 0, 0)\"));\n }\n\n console.log();\n return;\n }\n\n // Direct proposal submission requires metadata flags\n if (!opts.name || !opts.performanceFee || !opts.duration) {\n console.error(chalk.red(\"Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission.\"));\n process.exit(1);\n }\n\n // Lazy import governor to avoid pulling it in for --write-calls path\n const { propose } = await import(\"../lib/governor.js\");\n const { pinJSON } = await import(\"../lib/ipfs.js\");\n const { parseDuration } = await import(\"../lib/governor.js\");\n\n const performanceFeeBps = BigInt(opts.performanceFee as string);\n if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {\n console.error(chalk.red(\"--performance-fee must be 0-10000 (basis points)\"));\n process.exit(1);\n }\n const strategyDuration = parseDuration(opts.duration as string);\n const account = getAccount();\n\n const metaSpinner = ora(\"Pinning metadata to IPFS...\").start();\n let metadataURI: string;\n try {\n const metadata = {\n name: opts.name,\n description: opts.description || \"\",\n proposer: account.address,\n vault,\n strategyClone: clone,\n template: def.key,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: new Date().toISOString(),\n };\n metadataURI = await pinJSON(metadata, opts.name as string);\n metaSpinner.succeed(`Metadata pinned: ${metadataURI}`);\n } catch (err) {\n metaSpinner.fail(\"IPFS pin failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n const proposeSpinner = ora(\"Submitting proposal...\").start();\n try {\n const { hash, proposalId } = await propose(\n vault, metadataURI, performanceFeeBps, strategyDuration,\n executeCalls, settleCalls,\n );\n proposeSpinner.succeed(`Proposal #${proposalId} created`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(hash)}`));\n console.log(chalk.dim(` Clone: ${clone}`));\n } catch (err) {\n proposeSpinner.fail(\"Proposal failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Next steps:\"));\n console.log(chalk.yellow(\" 1. After execution: sherwood venice provision\"));\n console.log(chalk.yellow(\" 2. Use inference: sherwood venice infer --model <id> --prompt '...'\"));\n console.log(chalk.yellow(\" 3. Before settlement: approve repayment (principal + profit):\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n }\n\n console.log();\n });\n}\n","/**\n * ERC-1167 minimal proxy cloning from TypeScript.\n *\n * Mirrors OpenZeppelin's Clones.clone() — constructs the creation\n * bytecode for a minimal proxy and deploys via a raw transaction.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { concat } from \"viem\";\nimport { getWalletClient, getPublicClient, getAccount } from \"./client.js\";\nimport { getChain } from \"./network.js\";\n\n/**\n * Deploy an ERC-1167 minimal proxy clone of a template contract.\n *\n * @param template - Address of the deployed template (implementation)\n * @returns The clone address and deployment tx hash\n */\nexport async function cloneTemplate(\n template: Address,\n): Promise<{ clone: Address; hash: Hex }> {\n // ERC-1167 creation code (matches OpenZeppelin Clones.sol):\n // Init code: 3d602d80600a3d3981f3\n // Runtime code: 363d3d373d3d3d363d73 <address> 5af43d82803e903d91602b57fd5bf3\n const creationCode = concat([\n \"0x3d602d80600a3d3981f3363d3d373d3d3d363d73\",\n template,\n \"0x5af43d82803e903d91602b57fd5bf3\",\n ]);\n\n const wallet = getWalletClient();\n const account = getAccount();\n const chain = getChain();\n\n const hash = await wallet.sendTransaction({\n account,\n chain,\n data: creationCode as Hex,\n value: 0n,\n });\n\n const receipt = await getPublicClient().waitForTransactionReceipt({ hash });\n\n if (!receipt.contractAddress) {\n throw new Error(`Clone deployment failed — no contract address in receipt (tx: ${hash})`);\n }\n\n return { clone: receipt.contractAddress, hash };\n}\n","/**\n * Types and helpers for batch call construction.\n *\n * Calls go directly to vault.executeBatch() — no separate executor contract.\n */\n\nimport type { Address, Hex } from \"viem\";\n\nexport interface BatchCall {\n target: Address;\n data: Hex;\n value: bigint;\n}\n\n/**\n * Format a batch for human-readable display (CLI output before simulation).\n */\nexport function formatBatch(calls: BatchCall[]): string {\n return calls\n .map((call, i) => {\n const selector = call.data.slice(0, 10);\n return ` ${i + 1}. ${call.target} :: ${selector}... (${call.value > 0n ? call.value + \" wei\" : \"no value\"})`;\n })\n .join(\"\\n\");\n}\n","/**\n * MoonwellSupplyStrategy call builder.\n *\n * InitParams (Solidity): (address underlying, address mToken, uint256 supplyAmount, uint256 minRedeemAmount)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mToken: Address,\n supplyAmount: bigint,\n minRedeemAmount: bigint,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n ],\n [underlying, mToken, supplyAmount, minRedeemAmount],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, supplyAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * VeniceInferenceStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address asset, address weth, address vvv, address sVVV,\n * address aeroRouter, address aeroFactory, address agent,\n * uint256 assetAmount, uint256 minVVV, uint256 deadlineOffset, bool singleHop\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface VeniceInferenceInitParams {\n asset: Address;\n weth: Address;\n vvv: Address;\n sVVV: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n agent: Address;\n assetAmount: bigint;\n minVVV: bigint;\n deadlineOffset: bigint;\n singleHop: boolean;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"asset\", type: \"address\" as const },\n { name: \"weth\", type: \"address\" as const },\n { name: \"vvv\", type: \"address\" as const },\n { name: \"sVVV\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"agent\", type: \"address\" as const },\n { name: \"assetAmount\", type: \"uint256\" as const },\n { name: \"minVVV\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n { name: \"singleHop\", type: \"bool\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: VeniceInferenceInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, assetAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * AerodromeLPStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address tokenA, address tokenB, bool stable,\n * address factory, address router, address gauge, address lpToken,\n * uint256 amountADesired, uint256 amountBDesired,\n * uint256 amountAMin, uint256 amountBMin,\n * uint256 minAmountAOut, uint256 minAmountBOut\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface AerodromeLPInitParams {\n tokenA: Address;\n tokenB: Address;\n stable: boolean;\n factory: Address;\n router: Address;\n gauge: Address;\n lpToken: Address;\n amountADesired: bigint;\n amountBDesired: bigint;\n amountAMin: bigint;\n amountBMin: bigint;\n minAmountAOut: bigint;\n minAmountBOut: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"tokenA\", type: \"address\" as const },\n { name: \"tokenB\", type: \"address\" as const },\n { name: \"stable\", type: \"bool\" as const },\n { name: \"factory\", type: \"address\" as const },\n { name: \"router\", type: \"address\" as const },\n { name: \"gauge\", type: \"address\" as const },\n { name: \"lpToken\", type: \"address\" as const },\n { name: \"amountADesired\", type: \"uint256\" as const },\n { name: \"amountBDesired\", type: \"uint256\" as const },\n { name: \"amountAMin\", type: \"uint256\" as const },\n { name: \"amountBMin\", type: \"uint256\" as const },\n { name: \"minAmountAOut\", type: \"uint256\" as const },\n { name: \"minAmountBOut\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: AerodromeLPInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n tokenA: Address,\n amountA: bigint,\n tokenB: Address,\n amountB: bigint,\n): BatchCall[] {\n return [\n {\n target: tokenA,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountA],\n }),\n value: 0n,\n },\n {\n target: tokenB,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountB],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * WstETHMoonwellStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address weth, address wsteth, address mwsteth,\n * address aeroRouter, address aeroFactory,\n * uint256 supplyAmount, uint256 minWstethOut, uint256 minWethOut, uint256 deadlineOffset\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface WstETHMoonwellInitParams {\n weth: Address;\n wsteth: Address;\n mwsteth: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n supplyAmount: bigint;\n minWstethOut: bigint;\n minWethOut: bigint;\n deadlineOffset: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"weth\", type: \"address\" as const },\n { name: \"wsteth\", type: \"address\" as const },\n { name: \"mwsteth\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"supplyAmount\", type: \"uint256\" as const },\n { name: \"minWstethOut\", type: \"uint256\" as const },\n { name: \"minWethOut\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: WstETHMoonwellInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n weth: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, supplyAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * SyndicateFactory contract wrapper.\n *\n * Creates new syndicate vaults via the factory. Each syndicate = one vault proxy\n * with shared executor lib and vault implementation.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { parseUnits, formatUnits, decodeEventLog } from \"viem\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { getPublicClient, getWalletClient, getAccount } from \"./client.js\";\nimport { SYNDICATE_FACTORY_ABI } from \"./abis.js\";\nimport { TOKENS, SHERWOOD } from \"./addresses.js\";\n\nexport interface SyndicateInfo {\n id: bigint;\n vault: Address;\n creator: Address;\n metadataURI: string;\n createdAt: bigint;\n active: boolean;\n subdomain: string;\n}\n\nexport interface CreateSyndicateParams {\n creatorAgentId: bigint;\n metadataURI: string;\n asset: Address;\n name: string;\n symbol: string;\n openDeposits: boolean;\n subdomain: string;\n}\n\nfunction getFactoryAddress(): Address {\n return SHERWOOD().FACTORY;\n}\n\nexport interface CreateSyndicateResult {\n hash: Hex;\n syndicateId: bigint;\n vault: Address;\n}\n\n/**\n * Create a new syndicate via the factory.\n * Deploys a UUPS vault proxy, initializes it, and registers in the factory.\n * Waits for receipt and extracts vault address from SyndicateCreated event.\n */\nexport async function createSyndicate(params: CreateSyndicateParams): Promise<CreateSyndicateResult> {\n const wallet = getWalletClient();\n const client = getPublicClient();\n\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"createSyndicate\",\n args: [\n params.creatorAgentId,\n {\n metadataURI: params.metadataURI,\n asset: params.asset,\n name: params.name,\n symbol: params.symbol,\n openDeposits: params.openDeposits,\n subdomain: params.subdomain,\n },\n ],\n });\n\n // Wait for receipt and extract vault from SyndicateCreated event\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n // Parse SyndicateCreated event from receipt logs\n for (const log of receipt.logs) {\n try {\n const event = decodeEventLog({\n abi: SYNDICATE_FACTORY_ABI,\n data: log.data,\n topics: log.topics,\n });\n if (event.eventName === \"SyndicateCreated\") {\n const args = event.args as { id: bigint; vault: Address; creator: Address };\n return {\n hash,\n syndicateId: args.id,\n vault: args.vault,\n };\n }\n } catch {\n // Not our event, skip\n }\n }\n\n // Fallback: read from factory state (may lag on RPC replicas)\n const count = await getSyndicateCount();\n const info = await getSyndicate(count);\n\n return {\n hash,\n syndicateId: count,\n vault: info.vault,\n };\n}\n\n/**\n * Get syndicate info by ID.\n */\nexport async function getSyndicate(id: bigint): Promise<SyndicateInfo> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicates\",\n args: [id],\n })) as [bigint, Address, Address, string, bigint, boolean, string];\n\n return {\n id: result[0],\n vault: result[1],\n creator: result[2],\n metadataURI: result[3],\n createdAt: result[4],\n active: result[5],\n subdomain: result[6],\n };\n}\n\n/**\n * Get the total number of syndicates created.\n */\nexport async function getSyndicateCount(): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicateCount\",\n }) as Promise<bigint>;\n}\n\n/**\n * Get all active syndicates from the factory.\n */\nexport async function getActiveSyndicates(): Promise<SyndicateInfo[]> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"getAllActiveSyndicates\",\n })) as readonly {\n id: bigint;\n vault: Address;\n creator: Address;\n metadataURI: string;\n createdAt: bigint;\n active: boolean;\n subdomain: string;\n }[];\n\n return result.map((s) => ({\n id: s.id,\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt,\n active: s.active,\n subdomain: s.subdomain,\n }));\n}\n\n/**\n * Update syndicate metadata (creator only).\n */\nexport async function updateMetadata(syndicateId: bigint, metadataURI: string): Promise<Hex> {\n const wallet = getWalletClient();\n const client = getPublicClient();\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"updateMetadata\",\n args: [syndicateId, metadataURI],\n });\n await client.waitForTransactionReceipt({ hash });\n return hash;\n}\n","/**\n * Subgraph query wrapper for syndicate discovery.\n *\n * Queries The Graph's hosted/studio subgraph for indexed\n * factory + vault events. Much faster than on-chain iteration.\n *\n * Requires SUBGRAPH_URL env var pointing to the subgraph's\n * query endpoint (from The Graph Studio).\n */\n\nexport interface SubgraphSyndicate {\n id: string;\n vault: string;\n creator: string;\n metadataURI: string;\n createdAt: string;\n active: boolean;\n totalDeposits: string;\n totalWithdrawals: string;\n}\n\nexport interface SubgraphAgent {\n id: string;\n agentAddress: string;\n active: boolean;\n registeredAt: string;\n totalBatches: string;\n totalAssetAmount: string;\n}\n\nexport interface SubgraphDeposit {\n id: string;\n sender: string;\n owner: string;\n assets: string;\n shares: string;\n timestamp: string;\n txHash: string;\n}\n\nexport interface SyndicateDetails extends SubgraphSyndicate {\n agents: SubgraphAgent[];\n deposits: SubgraphDeposit[];\n}\n\nfunction getSubgraphUrl(): string {\n const url = process.env.SUBGRAPH_URL;\n if (!url) {\n throw new Error(\n \"SUBGRAPH_URL env var is required. Set it to your The Graph Studio query endpoint.\",\n );\n }\n return url;\n}\n\nasync function query<T>(graphql: string, variables?: Record<string, unknown>): Promise<T> {\n const url = getSubgraphUrl();\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ query: graphql, variables }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Subgraph query failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { data?: T; errors?: { message: string }[] };\n\n if (result.errors?.length) {\n throw new Error(`Subgraph query error: ${result.errors.map((e) => e.message).join(\", \")}`);\n }\n\n if (!result.data) {\n throw new Error(\"Subgraph returned no data\");\n }\n\n return result.data;\n}\n\n/**\n * Get all active syndicates, optionally filtered by creator.\n */\nexport async function getActiveSyndicates(\n creator?: string,\n): Promise<SubgraphSyndicate[]> {\n if (creator) {\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(\n `query($creator: String!) {\n syndicates(where: { active: true, creator: $creator }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }`,\n { creator: creator.toLowerCase() },\n );\n return data.syndicates;\n }\n\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(`\n {\n syndicates(where: { active: true }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }\n `);\n\n return data.syndicates;\n}\n\n/**\n * Get detailed syndicate info including agents, recent deposits, and batch executions.\n */\nexport async function getSyndicateDetails(\n syndicateId: string,\n): Promise<SyndicateDetails | null> {\n const data = await query<{ syndicate: SyndicateDetails | null }>(\n `query($id: ID!) {\n syndicate(id: $id) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n agents(first: 50) {\n id\n agentAddress\n active\n registeredAt\n totalBatches\n totalAssetAmount\n }\n deposits(first: 10, orderBy: timestamp, orderDirection: desc) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }\n }`,\n { id: syndicateId },\n );\n\n return data.syndicate;\n}\n\n/**\n * Get deposit/withdrawal history for a specific depositor across all syndicates.\n */\nexport async function getDepositorHistory(\n depositorAddress: string,\n): Promise<{ deposits: SubgraphDeposit[]; withdrawals: SubgraphDeposit[] }> {\n const addr = depositorAddress.toLowerCase();\n\n const data = await query<{\n deposits: SubgraphDeposit[];\n withdrawals: SubgraphDeposit[];\n }>(\n `query($owner: String!) {\n deposits(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n withdrawals: withdrawals(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }`,\n { owner: addr },\n );\n\n return { deposits: data.deposits, withdrawals: data.withdrawals };\n}\n","/**\n * Venice commands — sherwood venice <subcommand>\n *\n * Manages Venice private inference: swap vault profits to VVV,\n * stake for sVVV, distribute to agents, provision API keys.\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount } from \"../lib/client.js\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport { TOKENS, VENICE } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI, VENICE_STAKING_ABI } from \"../lib/abis.js\";\nimport { getQuote, getMultiHopQuote, encodeSwapPath, applySlippage } from \"../lib/quote.js\";\nimport { formatBatch } from \"../lib/batch.js\";\nimport { executeBatch } from \"../lib/vault.js\";\nimport { buildFundBatch, type VeniceFundConfig } from \"../strategies/venice-fund.js\";\nimport { provisionApiKey, checkApiKeyValid, chatCompletion, listModels } from \"../lib/venice.js\";\nimport { getVeniceApiKey } from \"../lib/config.js\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nconst VALID_FEES = [500, 3000, 10000] as const;\n\nexport function registerVeniceCommands(program: Command): void {\n const venice = program.command(\"venice\").description(\"Venice private inference — stake VVV, provision API keys\");\n\n // ── venice fund ──\n\n venice\n .command(\"fund\")\n .description(\"Swap vault profits → VVV → stake → distribute sVVV to agents\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .requiredOption(\"--amount <amount>\", \"Deposit token amount to convert (e.g. 500)\")\n .option(\"--fee1 <tier>\", \"Fee tier for asset → WETH hop (500, 3000, 10000)\", \"3000\")\n .option(\"--fee2 <tier>\", \"Fee tier for WETH → VVV hop\", \"10000\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"100\")\n .option(\"--execute\", \"Execute on-chain (default: simulate only)\", false)\n .option(\"--write-calls <path>\", \"Write batch calls to JSON file for proposal create (skips execution)\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const fee1 = Number(opts.fee1);\n const fee2 = Number(opts.fee2);\n if (!VALID_FEES.includes(fee1 as 500 | 3000 | 10000) || !VALID_FEES.includes(fee2 as 500 | 3000 | 10000)) {\n console.error(chalk.red(`Invalid fee tier. Valid: ${VALID_FEES.join(\", \")}`));\n process.exit(1);\n }\n const slippageBps = Number(opts.slippage);\n\n const client = getPublicClient();\n\n // ── Read vault state ──\n\n const spinner = ora(\"Reading vault state...\").start();\n let assetAddress: Address;\n let assetDecimals: number;\n let assetSymbol: string;\n let totalDeposited: bigint;\n let assetBalance: bigint;\n let agents: Address[];\n\n try {\n [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Failed to read vault state\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n if (agents.length === 0) {\n console.error(chalk.red(\"No agents registered in vault. Register agents first.\"));\n process.exit(1);\n }\n\n const requestedAmount = parseUnits(opts.amount, assetDecimals);\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n // ── Display config ──\n\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n\n console.log();\n console.log(chalk.bold(\"Venice Fund\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Asset: ${assetSymbol} (${assetDecimals} decimals)`);\n console.log(` Amount: ${opts.amount} ${assetSymbol}`);\n console.log(` Vault balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` Agents: ${agents.length} (sVVV will be split equally)`);\n console.log(` Routing: ${isWeth ? `WETH → VVV (fee ${fee2})` : `${assetSymbol} → WETH (fee ${fee1}) → VVV (fee ${fee2})`}`);\n console.log(` Slippage: ${(slippageBps / 100).toFixed(2)}%`);\n console.log(` Vault: ${vaultAddress}`);\n console.log();\n\n if (requestedAmount > profit) {\n console.warn(chalk.yellow(` Warning: amount (${opts.amount}) exceeds available profit (${formatUnits(profit, assetDecimals)})`));\n console.warn(chalk.yellow(\" This will use deposited capital, not just profits.\"));\n console.log();\n }\n\n // ── Get Uniswap quote ──\n\n const quoteSpinner = ora(\"Fetching Uniswap quote...\").start();\n let amountOut: bigint;\n let minOut: bigint;\n let swapPath: `0x${string}` | null = null;\n\n try {\n if (isWeth) {\n // Single-hop: WETH → VVV\n const quote = await getQuote({\n tokenIn: TOKENS().WETH,\n tokenOut: VENICE().VVV,\n amountIn: requestedAmount,\n fee: fee2,\n });\n amountOut = quote.amountOut;\n } else {\n // Multi-hop: asset → WETH → VVV\n swapPath = encodeSwapPath(\n [assetAddress, TOKENS().WETH, VENICE().VVV],\n [fee1, fee2],\n );\n const quote = await getMultiHopQuote({\n path: swapPath,\n amountIn: requestedAmount,\n });\n amountOut = quote.amountOut;\n }\n\n minOut = applySlippage(amountOut, slippageBps);\n\n quoteSpinner.succeed(\n `Quote: ${formatUnits(amountOut, 18)} VVV ` +\n `(min: ${formatUnits(minOut, 18)}, per agent: ${formatUnits(minOut / BigInt(agents.length), 18)})`\n );\n } catch (err) {\n quoteSpinner.fail(\"Failed to fetch quote\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // ── Build batch ──\n\n const config: VeniceFundConfig = {\n amount: opts.amount,\n fee1,\n fee2,\n slippageBps,\n };\n\n const calls = buildFundBatch(config, vaultAddress, agents, assetAddress, assetDecimals, minOut, swapPath);\n\n console.log();\n console.log(chalk.bold(`Batch calls (${calls.length}):`));\n console.log(formatBatch(calls));\n console.log();\n\n // ── Write calls to file (for governance proposals) ──\n\n if (opts.writeCalls) {\n const callsJson = calls.map((c: BatchCall) => ({\n target: c.target,\n data: c.data,\n value: c.value.toString(),\n }));\n writeFileSync(opts.writeCalls, JSON.stringify(callsJson, null, 2));\n\n const settlePath = `${opts.writeCalls}.settle.json`;\n writeFileSync(settlePath, \"[]\");\n\n console.log(chalk.green(`Execute calls written to: ${opts.writeCalls}`));\n console.log(chalk.green(`Settlement calls written to: ${settlePath}`));\n console.log();\n console.log(chalk.dim(\"Use with: sherwood proposal create --execute-calls <path> --settle-calls <path>\"));\n return;\n }\n\n // ── Execute ──\n\n if (!opts.execute) {\n console.log();\n console.log(chalk.yellow(\"Dry run complete. Add --execute to submit on-chain, or --write-calls <path> to export for proposals.\"));\n return;\n }\n\n const execSpinner = ora(\"Executing batch via vault...\").start();\n try {\n const txHash = await executeBatch(calls);\n execSpinner.succeed(`Batch executed: ${txHash}`);\n console.log(chalk.dim(` ${getExplorerUrl(txHash)}`));\n } catch (err) {\n execSpinner.fail(\"Execution failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── venice provision ──\n\n venice\n .command(\"provision\")\n .description(\"Self-provision a Venice API key (requires sVVV in wallet)\")\n .action(async () => {\n const account = getAccount();\n const client = getPublicClient();\n\n // Check sVVV balance\n const checkSpinner = ora(\"Checking sVVV balance...\").start();\n try {\n const sVvvBalance = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n if (sVvvBalance === 0n) {\n checkSpinner.fail(\"No sVVV found in wallet\");\n console.log(chalk.yellow(\" Your wallet must hold staked VVV (sVVV) to provision a Venice API key.\"));\n console.log(chalk.yellow(\" Run 'sherwood venice fund' first to distribute sVVV to agents.\"));\n process.exit(1);\n }\n\n checkSpinner.succeed(`sVVV balance: ${formatUnits(sVvvBalance, 18)}`);\n } catch (err) {\n checkSpinner.fail(\"Failed to check sVVV balance\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // Provision API key\n const keySpinner = ora(\"Provisioning Venice API key...\").start();\n try {\n const apiKey = await provisionApiKey();\n keySpinner.succeed(\"Venice API key provisioned\");\n console.log(chalk.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));\n console.log(chalk.dim(\" Saved to ~/.sherwood/config.json\"));\n } catch (err) {\n keySpinner.fail(\"Failed to provision API key\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── venice status ──\n\n venice\n .command(\"status\")\n .description(\"Show Venice inference status: sVVV balances, DIEM, API key\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const account = getAccount();\n const spinner = ora(\"Loading Venice status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read VVV balance on vault\n const vaultVvvBalance = await client.readContract({\n address: VENICE().VVV,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [vaultAddress],\n }) as bigint;\n\n // Read per-agent sVVV balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n // Check current agent's sVVV + pending rewards\n const [mySvvv, myPending] = await Promise.all([\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as Promise<bigint>,\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"pendingRewards\",\n args: [account.address],\n }) as Promise<bigint>,\n ]);\n\n // Check API key\n const apiKeyValid = await checkApiKeyValid();\n const apiKey = getVeniceApiKey();\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n console.log();\n console.log(chalk.bold(\"Venice Inference Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Profit available: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` VVV (unstaked): ${formatUnits(vaultVvvBalance, 18)}`);\n\n console.log(chalk.bold(\"\\n Agent sVVV Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 18)} sVVV`);\n }\n\n console.log(chalk.bold(\"\\n Your Wallet\"));\n console.log(` sVVV: ${formatUnits(mySvvv, 18)}`);\n console.log(` Pending rewards: ${formatUnits(myPending, 18)} VVV`);\n\n console.log(chalk.bold(\"\\n Venice API\"));\n console.log(` Key: ${apiKey ? `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}` : chalk.dim(\"not provisioned\")}`);\n console.log(` Status: ${apiKeyValid ? chalk.green(\"valid\") : chalk.red(\"invalid/missing\")}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── venice models ──\n\n venice\n .command(\"models\")\n .description(\"List available Venice inference models\")\n .action(async () => {\n const spinner = ora(\"Fetching Venice models...\").start();\n try {\n const models = await listModels();\n spinner.succeed(`${models.length} models available`);\n console.log();\n for (const model of models) {\n console.log(` ${model}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to list models\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── venice infer ──\n\n venice\n .command(\"infer\")\n .description(\"Run private inference via Venice chat completions\")\n .requiredOption(\"--prompt <text>\", \"User prompt\")\n .requiredOption(\"--model <id>\", \"Venice model ID (use 'venice models' to list)\")\n .option(\"--system <text>\", \"System prompt\")\n .option(\"--data <path>\", \"Path to data file — contents prepended to prompt as context\")\n .option(\"--web-search\", \"Enable Venice web search\", false)\n .option(\"--no-thinking\", \"Disable chain-of-thought reasoning\")\n .option(\"--temperature <n>\", \"Sampling temperature (0-2)\")\n .option(\"--max-tokens <n>\", \"Maximum completion tokens\")\n .option(\"--json\", \"Output raw JSON response\", false)\n .action(async (opts) => {\n // Build messages\n const messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[] = [];\n\n if (opts.system) {\n messages.push({ role: \"system\", content: opts.system });\n }\n\n let userContent = opts.prompt;\n if (opts.data) {\n try {\n const data = readFileSync(opts.data, \"utf-8\");\n userContent = `Context data:\\n\\`\\`\\`\\n${data}\\n\\`\\`\\`\\n\\n${opts.prompt}`;\n } catch (err) {\n console.error(chalk.red(`Failed to read data file: ${opts.data}`));\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n }\n messages.push({ role: \"user\", content: userContent });\n\n const spinner = ora(`Running inference (${opts.model})...`).start();\n try {\n const result = await chatCompletion({\n model: opts.model,\n messages,\n temperature: opts.temperature !== undefined ? Number(opts.temperature) : undefined,\n maxTokens: opts.maxTokens !== undefined ? Number(opts.maxTokens) : undefined,\n enableWebSearch: opts.webSearch,\n disableThinking: opts.thinking === false,\n });\n\n spinner.succeed(\"Inference complete\");\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log();\n console.log(result.content);\n console.log();\n console.log(chalk.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));\n }\n } catch (err) {\n spinner.fail(\"Inference failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Uniswap V3 Quoter V2 integration for swap quotes.\n *\n * quoteExactInputSingle is NOT a view function — it reverts internally\n * after computing the quote. Must use eth_call to get the return data.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult, concat, pad, numberToHex } from \"viem\";\nimport { getPublicClient } from \"./client.js\";\nimport { UNISWAP_QUOTER_V2_ABI } from \"./abis.js\";\nimport { UNISWAP } from \"./addresses.js\";\n\nexport interface QuoteResult {\n amountOut: bigint;\n sqrtPriceX96After: bigint;\n gasEstimate: bigint;\n}\n\n/**\n * Get a swap quote from Uniswap Quoter V2.\n */\nexport async function getQuote(params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n fee: number;\n}): Promise<QuoteResult> {\n const client = getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n const { data } = await client.call({\n to: UNISWAP().QUOTER_V2,\n data: calldata,\n });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this pair/fee\");\n }\n\n const [amountOut, sqrtPriceX96After, , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n data,\n }) as [bigint, bigint, number, bigint];\n\n return { amountOut, sqrtPriceX96After, gasEstimate };\n}\n\n/**\n * Apply slippage tolerance to a quote amount.\n * Returns the minimum acceptable output amount.\n */\nexport function applySlippage(amountOut: bigint, slippageBps: number): bigint {\n return (amountOut * BigInt(10000 - slippageBps)) / 10000n;\n}\n\n/**\n * Encode a Uniswap V3 multi-hop swap path.\n * Format: abi.encodePacked(address, uint24, address, uint24, address, ...)\n */\nexport function encodeSwapPath(tokens: Address[], fees: number[]): Hex {\n if (tokens.length < 2 || fees.length !== tokens.length - 1) {\n throw new Error(\"Invalid path: need at least 2 tokens and (tokens-1) fees\");\n }\n\n const parts: Hex[] = [];\n for (let i = 0; i < tokens.length; i++) {\n // Address: 20 bytes (no padding)\n parts.push(tokens[i].toLowerCase() as Hex);\n if (i < fees.length) {\n // Fee: 3 bytes (uint24), left-padded to 3 bytes\n parts.push(pad(numberToHex(fees[i]), { size: 3 }) as Hex);\n }\n }\n return concat(parts);\n}\n\n/**\n * Get a multi-hop swap quote from Uniswap Quoter V2.\n */\nexport async function getMultiHopQuote(params: {\n path: Hex;\n amountIn: bigint;\n}): Promise<QuoteResult> {\n const client = getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n args: [params.path, params.amountIn],\n });\n\n const { data } = await client.call({\n to: UNISWAP().QUOTER_V2,\n data: calldata,\n });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this path\");\n }\n\n const [amountOut, , , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n data,\n }) as [bigint, bigint[], number[], bigint];\n\n return { amountOut, sqrtPriceX96After: 0n, gasEstimate };\n}\n\n/** Token decimals for display purposes. */\nexport const TOKEN_DECIMALS: Record<string, number> = {\n USDC: 6,\n WETH: 18,\n cbETH: 18,\n wstETH: 18,\n cbBTC: 8,\n DAI: 18,\n AERO: 18,\n};\n","/**\n * Venice Fund Strategy — swap vault profits to VVV → stake → distribute sVVV to agents.\n *\n * The vault's deposit token is swapped to VVV via Uniswap V3 multi-hop routing\n * (asset → WETH → VVV). If the asset IS WETH, a single-hop swap is used instead.\n *\n * The staking contract's stake(recipient, amount) mints sVVV directly to each agent's\n * operator wallet — no separate transfer step needed.\n *\n * sVVV holders can then self-provision Venice API keys for private inference.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseUnits } from \"viem\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { TOKENS, UNISWAP, VENICE } from \"../lib/addresses.js\";\n\n// ── Strategy Config ──\n\nexport interface VeniceFundConfig {\n /** Deposit token amount to convert (human-readable, e.g. \"500\") */\n amount: string;\n /** Fee tier for asset → WETH hop (ignored if asset = WETH) */\n fee1: number;\n /** Fee tier for WETH → VVV hop */\n fee2: number;\n /** Max slippage in basis points (e.g. 100 = 1%) */\n slippageBps: number;\n}\n\n// ── ABIs (minimal, for encoding batch calls) ──\n\nconst ERC20_ABI = [\n {\n name: \"approve\",\n type: \"function\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI = [\n {\n name: \"exactInputSingle\",\n type: \"function\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_EXACT_INPUT_ABI = [\n {\n name: \"exactInput\",\n type: \"function\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"path\", type: \"bytes\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\nconst STAKING_ABI = [\n {\n name: \"stake\",\n type: \"function\",\n inputs: [\n { name: \"recipient\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [],\n },\n] as const;\n\n// ── Batch Builders ──\n\n/**\n * Build the Venice fund batch.\n *\n * @param config - Strategy parameters\n * @param vaultAddress - Vault contract address (delegatecall identity)\n * @param agents - Agent operator EOA addresses to receive sVVV\n * @param assetAddress - Vault's deposit token address\n * @param assetDecimals - Deposit token decimals\n * @param minVVV - Minimum VVV output (post-slippage from Uniswap quote)\n * @param swapPath - Encoded Uniswap V3 path for multi-hop (null if single-hop)\n */\nexport function buildFundBatch(\n config: VeniceFundConfig,\n vaultAddress: Address,\n agents: Address[],\n assetAddress: Address,\n assetDecimals: number,\n minVVV: bigint,\n swapPath: Hex | null,\n): BatchCall[] {\n // Guard: fail early if Venice is not deployed (e.g. on testnet)\n const ZERO = \"0x0000000000000000000000000000000000000000\";\n if (VENICE().VVV === ZERO || VENICE().STAKING === ZERO) {\n throw new Error(\"Venice (VVV/sVVV) is not deployed on this network — venice fund requires Venice staking contracts\");\n }\n\n const assetAmount = parseUnits(config.amount, assetDecimals);\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n const calls: BatchCall[] = [];\n\n // 1. Approve SwapRouter to spend vault asset\n calls.push({\n target: assetAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, assetAmount],\n }),\n value: 0n,\n });\n\n // 2. Swap asset → VVV\n if (isWeth) {\n // Single-hop: WETH → VVV\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: TOKENS().WETH,\n tokenOut: VENICE().VVV,\n fee: config.fee2,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minVVV,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n });\n } else {\n // Multi-hop: asset → WETH → VVV\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_ABI,\n functionName: \"exactInput\",\n args: [\n {\n path: swapPath!,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minVVV,\n },\n ],\n }),\n value: 0n,\n });\n }\n\n // 3. Approve staking contract to pull VVV\n calls.push({\n target: VENICE().VVV,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [VENICE().STAKING, minVVV],\n }),\n value: 0n,\n });\n\n // 4. Stake VVV directly to each agent's operator wallet\n const perAgent = minVVV / BigInt(agents.length);\n for (const agent of agents) {\n calls.push({\n target: VENICE().STAKING,\n data: encodeFunctionData({\n abi: STAKING_ABI,\n functionName: \"stake\",\n args: [agent, perAgent],\n }),\n value: 0n,\n });\n }\n\n return calls;\n}\n","/**\n * Venice AI API integration — web3 key generation, validation, and inference.\n *\n * Key provisioning flow:\n * 1. GET /api_keys/generate_web3_key → validation token\n * 2. Sign token with agent wallet (EIP-191)\n * 3. POST /api_keys/generate_web3_key → API key\n *\n * Inference:\n * POST /chat/completions with Bearer auth → chat completion response\n *\n * The API key is stored in ~/.sherwood/config.json.\n * Venice requires the signing wallet to hold staked VVV (sVVV).\n */\n\nimport { getAccount } from \"./client.js\";\nimport { setVeniceApiKey, getVeniceApiKey } from \"./config.js\";\n\nconst VENICE_API_BASE = \"https://api.venice.ai/api/v1\";\n\n/**\n * Provision a Venice API key via web3 wallet signature.\n * The wallet must hold sVVV for this to succeed.\n */\nexport async function provisionApiKey(): Promise<string> {\n const account = getAccount();\n\n // 1. Get validation token\n const tokenRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n signal: AbortSignal.timeout(15_000),\n });\n if (!tokenRes.ok) {\n throw new Error(`Failed to get validation token: ${tokenRes.status} ${tokenRes.statusText}`);\n }\n const tokenData = await tokenRes.json();\n const token = tokenData?.data?.token;\n if (!token) {\n throw new Error(\"Venice API returned no validation token\");\n }\n\n // 2. Sign token with wallet (EIP-191)\n const signature = await account.signMessage({ message: token });\n\n // 3. Generate API key\n const keyRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n signal: AbortSignal.timeout(15_000),\n body: JSON.stringify({\n address: account.address,\n signature,\n token,\n apiKeyType: \"INFERENCE\",\n description: \"Sherwood syndicate agent\",\n }),\n });\n\n if (!keyRes.ok) {\n const body = await keyRes.text();\n throw new Error(`Failed to generate API key: ${keyRes.status} ${body}`);\n }\n\n const keyData = await keyRes.json();\n const apiKey = keyData?.data?.apiKey;\n if (!apiKey) {\n throw new Error(\"Venice API returned no API key\");\n }\n\n // Store in config\n setVeniceApiKey(apiKey);\n\n return apiKey;\n}\n\n/**\n * Check if the stored Venice API key is still valid.\n */\nexport async function checkApiKeyValid(): Promise<boolean> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) return false;\n\n try {\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n// ── Inference ──\n\nexport interface ChatCompletionMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatCompletionOptions {\n model: string;\n messages: ChatCompletionMessage[];\n temperature?: number;\n maxTokens?: number;\n enableWebSearch?: boolean;\n disableThinking?: boolean;\n}\n\nexport interface ChatCompletionResult {\n content: string;\n model: string;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Call Venice chat completions API for private inference.\n * Requires a provisioned API key (run `sherwood venice provision` first).\n */\nexport async function chatCompletion(opts: ChatCompletionOptions): Promise<ChatCompletionResult> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const body: Record<string, unknown> = {\n model: opts.model,\n messages: opts.messages,\n };\n if (opts.temperature !== undefined) body.temperature = opts.temperature;\n if (opts.maxTokens !== undefined) body.max_tokens = opts.maxTokens;\n\n const veniceParams: Record<string, unknown> = {};\n if (opts.enableWebSearch) veniceParams.enable_web_search = \"on\";\n if (opts.disableThinking) veniceParams.disable_thinking = true;\n if (Object.keys(veniceParams).length > 0) body.venice_parameters = veniceParams;\n\n const res = await fetch(`${VENICE_API_BASE}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n signal: AbortSignal.timeout(120_000), // inference can be slow\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`Venice inference failed: ${res.status} ${errBody}`);\n }\n\n const data = await res.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Venice returned no choices\");\n }\n\n return {\n content: choice.message?.content ?? \"\",\n model: data.model ?? opts.model,\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n}\n\n/**\n * List available Venice models.\n * Requires a provisioned API key.\n */\nexport async function listModels(): Promise<string[]> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Failed to list Venice models: ${res.status} ${res.statusText}`);\n }\n\n const data = await res.json();\n return (data.data ?? []).map((m: { id: string }) => m.id);\n}\n","/**\n * Allowance commands — sherwood allowance <subcommand>\n *\n * Disburses vault profits as USDC to agent operator wallets for\n * operational expenses (gas, x402 API payments, etc.).\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount } from \"../lib/client.js\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport { TOKENS } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI } from \"../lib/abis.js\";\nimport { getQuote, getMultiHopQuote, encodeSwapPath, applySlippage } from \"../lib/quote.js\";\nimport { formatBatch } from \"../lib/batch.js\";\nimport { executeBatch } from \"../lib/vault.js\";\nimport { buildDisburseBatch, type AllowanceDisbursConfig } from \"../strategies/allowance-disburse.js\";\n\nconst VALID_FEES = [500, 3000, 10000] as const;\n\nexport function registerAllowanceCommands(program: Command): void {\n const allowance = program.command(\"allowance\").description(\"Disburse vault profits to agent wallets\");\n\n // ── allowance disburse ──\n\n allowance\n .command(\"disburse\")\n .description(\"Swap vault profits → USDC → distribute to all agent operator wallets\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .requiredOption(\"--amount <amount>\", \"Deposit token amount to convert & distribute (e.g. 500)\")\n .option(\"--fee <tier>\", \"Fee tier for asset → USDC swap (500, 3000, 10000)\", \"3000\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"100\")\n .option(\"--execute\", \"Execute on-chain (default: simulate only)\", false)\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const fee = Number(opts.fee);\n if (!VALID_FEES.includes(fee as 500 | 3000 | 10000)) {\n console.error(chalk.red(`Invalid fee tier. Valid: ${VALID_FEES.join(\", \")}`));\n process.exit(1);\n }\n const slippageBps = Number(opts.slippage);\n\n const client = getPublicClient();\n\n // ── Read vault state ──\n\n const spinner = ora(\"Reading vault state...\").start();\n let assetAddress: Address;\n let assetDecimals: number;\n let assetSymbol: string;\n let totalDeposited: bigint;\n let assetBalance: bigint;\n let agents: Address[];\n\n try {\n [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Failed to read vault state\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n if (agents.length === 0) {\n console.error(chalk.red(\"No agents registered in vault. Register agents first.\"));\n process.exit(1);\n }\n\n const requestedAmount = parseUnits(opts.amount, assetDecimals);\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n // ── Display config ──\n\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n\n console.log();\n console.log(chalk.bold(\"Allowance Disburse\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Asset: ${assetSymbol} (${assetDecimals} decimals)`);\n console.log(` Amount: ${opts.amount} ${assetSymbol}`);\n console.log(` Vault balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` Agents: ${agents.length} (USDC will be split equally)`);\n if (!isUsdc) {\n console.log(` Routing: ${isWeth ? `WETH → USDC (fee ${fee})` : `${assetSymbol} → WETH → USDC (fee ${fee})`}`);\n console.log(` Slippage: ${(slippageBps / 100).toFixed(2)}%`);\n }\n console.log(` Vault: ${vaultAddress}`);\n console.log();\n\n if (requestedAmount > profit) {\n console.warn(chalk.yellow(` Warning: amount (${opts.amount}) exceeds available profit (${formatUnits(profit, assetDecimals)})`));\n console.warn(chalk.yellow(\" This will use deposited capital, not just profits.\"));\n console.log();\n }\n\n // ── Get USDC amount (quote or direct) ──\n\n let minUsdc: bigint;\n let swapPath: `0x${string}` | null = null;\n\n if (isUsdc) {\n // No swap needed — distribute the asset directly\n minUsdc = requestedAmount;\n } else {\n const quoteSpinner = ora(\"Fetching Uniswap quote...\").start();\n try {\n let amountOut: bigint;\n\n if (isWeth) {\n // Single-hop: WETH → USDC\n const quote = await getQuote({\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n amountIn: requestedAmount,\n fee,\n });\n amountOut = quote.amountOut;\n } else {\n // Multi-hop: asset → WETH → USDC\n swapPath = encodeSwapPath(\n [assetAddress, TOKENS().WETH, TOKENS().USDC],\n [fee, 500], // WETH→USDC typically uses 500 (0.05%) fee tier\n );\n const quote = await getMultiHopQuote({\n path: swapPath,\n amountIn: requestedAmount,\n });\n amountOut = quote.amountOut;\n }\n\n minUsdc = applySlippage(amountOut, slippageBps);\n\n quoteSpinner.succeed(\n `Quote: ${formatUnits(amountOut, 6)} USDC ` +\n `(min: ${formatUnits(minUsdc, 6)}, per agent: ${formatUnits(minUsdc / BigInt(agents.length), 6)})`\n );\n } catch (err) {\n quoteSpinner.fail(\"Failed to fetch quote\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n }\n\n // ── Per-agent display ──\n\n const perAgent = minUsdc / BigInt(agents.length);\n if (isUsdc) {\n console.log(chalk.dim(` Per agent: ${formatUnits(perAgent, 6)} USDC`));\n console.log();\n }\n\n // ── Build batch ──\n\n const config: AllowanceDisbursConfig = {\n amount: opts.amount,\n fee,\n slippageBps,\n };\n\n const calls = buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDecimals, minUsdc, swapPath);\n\n console.log();\n console.log(chalk.bold(`Batch calls (${calls.length}):`));\n console.log(formatBatch(calls));\n console.log();\n\n // ── Execute ──\n\n if (!opts.execute) {\n console.log();\n console.log(chalk.yellow(\"Dry run complete. Add --execute to submit on-chain.\"));\n return;\n }\n\n const execSpinner = ora(\"Executing batch via vault...\").start();\n try {\n const txHash = await executeBatch(calls);\n execSpinner.succeed(`Batch executed: ${txHash}`);\n console.log(chalk.dim(` ${getExplorerUrl(txHash)}`));\n } catch (err) {\n execSpinner.fail(\"Execution failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── allowance status ──\n\n allowance\n .command(\"status\")\n .description(\"Show vault profit and agent USDC balances\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const spinner = ora(\"Loading allowance status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read per-agent USDC balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: TOKENS().USDC,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n const account = getAccount();\n\n console.log();\n console.log(chalk.bold(\"Allowance Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Asset: ${assetSymbol}`);\n console.log(` Balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n\n console.log(chalk.bold(\"\\n Agent USDC Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 6)} USDC`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Allowance Disburse Strategy — swap vault profits to USDC and distribute to agents.\n *\n * If the vault's deposit token is already USDC, transfers directly to each agent.\n * Otherwise, swaps asset → USDC via Uniswap V3 (single-hop or multi-hop via WETH),\n * then distributes USDC equally to each agent's operator wallet.\n *\n * Agents use USDC for operational expenses: gas, x402 API payments, etc.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseUnits } from \"viem\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { TOKENS, UNISWAP } from \"../lib/addresses.js\";\n\n// ── Strategy Config ──\n\nexport interface AllowanceDisbursConfig {\n /** Deposit token amount to convert & distribute (human-readable, e.g. \"500\") */\n amount: string;\n /** Fee tier for asset → USDC swap (ignored if asset = USDC) */\n fee: number;\n /** Max slippage in basis points (e.g. 100 = 1%) */\n slippageBps: number;\n}\n\n// ── ABIs (minimal, for encoding batch calls) ──\n\nconst ERC20_ABI = [\n {\n name: \"approve\",\n type: \"function\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"transfer\",\n type: \"function\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI = [\n {\n name: \"exactInputSingle\",\n type: \"function\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_EXACT_INPUT_ABI = [\n {\n name: \"exactInput\",\n type: \"function\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"path\", type: \"bytes\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Batch Builder ──\n\n/**\n * Build the allowance disburse batch.\n *\n * @param config - Strategy parameters\n * @param vaultAddress - Vault contract address (delegatecall identity)\n * @param agents - Agent operator EOA addresses to receive USDC\n * @param assetAddress - Vault's deposit token address\n * @param assetDecimals - Deposit token decimals\n * @param minUsdc - Minimum USDC output (post-slippage), or raw amount if asset IS USDC\n * @param swapPath - Encoded Uniswap V3 path for multi-hop (null if single-hop or no swap)\n */\nexport function buildDisburseBatch(\n config: AllowanceDisbursConfig,\n vaultAddress: Address,\n agents: Address[],\n assetAddress: Address,\n assetDecimals: number,\n minUsdc: bigint,\n swapPath: Hex | null,\n): BatchCall[] {\n const assetAmount = parseUnits(config.amount, assetDecimals);\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n const calls: BatchCall[] = [];\n\n if (!isUsdc) {\n // 1. Approve SwapRouter to spend vault asset\n calls.push({\n target: assetAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, assetAmount],\n }),\n value: 0n,\n });\n\n // 2. Swap asset → USDC\n if (isWeth) {\n // Single-hop: WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n fee: config.fee,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n });\n } else {\n // Multi-hop: asset → WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_ABI,\n functionName: \"exactInput\",\n args: [\n {\n path: swapPath!,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n },\n ],\n }),\n value: 0n,\n });\n }\n }\n\n // 3. Transfer USDC to each agent equally\n const perAgent = minUsdc / BigInt(agents.length);\n for (const agent of agents) {\n calls.push({\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [agent, perAgent],\n }),\n value: 0n,\n });\n }\n\n return calls;\n}\n","/**\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 syndicates.\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { SDK } from \"agent0-sdk\";\nimport { getPublicClient, getAccount } from \"../lib/client.js\";\nimport { getExplorerUrl, getChain, getRpcUrl } from \"../lib/network.js\";\nimport { AGENT_REGISTRY } from \"../lib/addresses.js\";\nimport { setAgentId, getAgentId, loadConfig } from \"../lib/config.js\";\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 // Read key from config first, env var as fallback\n const config = loadConfig();\n const key = config.privateKey || process.env.PRIVATE_KEY;\n if (!key) {\n throw new Error(\n \"Private key not found. Run 'sherwood config set --private-key <key>' or set PRIVATE_KEY env var.\",\n );\n }\n\n return new SDK({\n chainId: getChain().id,\n rpcUrl: getRpcUrl(),\n privateKey: key.startsWith(\"0x\") ? key : `0x${key}`,\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 syndicates)\")\n .requiredOption(\"--name <name>\", \"Agent name (e.g. 'Alpha Seeker Agent')\")\n .option(\"--description <desc>\", \"Agent description\", \"Sherwood syndicate agent\")\n .option(\"--image <uri>\", \"Agent image URI (IPFS recommended)\")\n .action(async (opts) => {\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 const spinner = ora(\"Initializing Agent0 SDK...\").start();\n try {\n const sdk = getAgent0SDK();\n\n // Create agent with metadata\n spinner.text = \"Creating agent profile...\";\n const agent = sdk.createAgent(opts.name, opts.description, opts.image);\n\n // Register on-chain (mints ERC-8004 NFT)\n spinner.text = \"Registering on-chain (minting ERC-8004 identity)...\";\n const txHandle = await agent.registerOnChain();\n\n spinner.text = \"Waiting for confirmation...\";\n await txHandle.waitMined();\n\n const agentId = agent.agentId;\n if (!agentId) {\n spinner.warn(\"Identity registered but could not read agentId\");\n console.log(chalk.dim(\" Check the transaction on the explorer.\"));\n return;\n }\n\n // Agent0 agentId format is \"chainId:tokenId\" — extract the token ID\n const tokenId = Number(agentId.includes(\":\") ? agentId.split(\":\")[1] : agentId);\n\n // Save to config\n setAgentId(tokenId);\n\n spinner.succeed(`Agent identity registered: #${tokenId}`);\n console.log(chalk.dim(` Agent0 ID: ${agentId}`));\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 syndicates:\"));\n console.log(chalk.dim(` sherwood syndicate create --agent-id ${tokenId} --subdomain <name> --name <name>`));\n } catch (err) {\n spinner.fail(\"Failed to register identity\");\n console.error(chalk.red(err instanceof Error ? err.message : String(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 client = getPublicClient();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const tokenId = Number(opts.id);\n\n const spinner = ora(`Verifying ownership of agent #${tokenId}...`).start();\n try {\n const owner = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(tokenId)],\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(err instanceof Error ? err.message : String(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 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 } else {\n console.log(` Saved ID: ${chalk.dim(\"none — run 'sherwood identity mint --name <name>'\")}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to check identity\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Proposal commands — sherwood proposal <subcommand>\n *\n * Manages the full proposal lifecycle: create, list, show, vote,\n * execute, settle, cancel.\n */\n\nimport { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFileSync } from \"node:fs\";\nimport { getAccount } from \"../lib/client.js\";\nimport { getExplorerUrl, getNetwork } from \"../lib/network.js\";\nimport { uploadMetadata } from \"../lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"../lib/ipfs.js\";\nimport { fetchMetadata } from \"../lib/ipfs.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getProposal,\n getProposalState,\n proposalCount,\n propose,\n vote,\n executeProposal,\n settleProposal,\n emergencySettle,\n getExecuteCalls,\n getSettlementCalls,\n cancelProposal,\n emergencyCancel,\n getVoteWeight,\n hasVoted,\n getCapitalSnapshot,\n parseDuration,\n PROPOSAL_STATES,\n PROPOSAL_STATE,\n VOTE_TYPE,\n} from \"../lib/governor.js\";\nimport type { BatchCall } from \"../lib/governor.js\";\nimport { formatDurationShort as formatDuration, formatShares, formatUSDC, parseBigIntArg } from \"../lib/format.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction formatTimestamp(ts: bigint): string {\n if (ts === 0n) return \"—\";\n return new Date(Number(ts) * 1000).toLocaleString();\n}\n\nfunction parseCallsFile(path: string): BatchCall[] {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = JSON.parse(raw) as { target: string; data: string; value: string }[];\n return parsed.map((c) => ({\n target: c.target as Address,\n data: c.data as Hex,\n value: BigInt(c.value || \"0\"),\n }));\n}\n\nexport function registerProposalCommands(program: Command): void {\n const proposal = program.command(\"proposal\").description(\"Governance proposals — create, vote, execute, settle\");\n\n // ── proposal create ──\n\n proposal\n .command(\"create\")\n .description(\"Submit a strategy proposal\")\n .requiredOption(\"--vault <address>\", \"Vault address the proposal targets\")\n .requiredOption(\"--name <name>\", \"Strategy name\")\n .requiredOption(\"--description <text>\", \"Strategy rationale and risk summary\")\n .requiredOption(\"--performance-fee <bps>\", \"Agent fee in bps (e.g. 1500 = 15%)\")\n .requiredOption(\"--duration <duration>\", \"Strategy duration (e.g. 7d, 24h, 3600)\")\n .requiredOption(\"--execute-calls <path>\", \"Path to JSON file with execute Call[] array\")\n .requiredOption(\"--settle-calls <path>\", \"Path to JSON file with settlement Call[] array\")\n .option(\"--metadata-uri <uri>\", \"Override — skip IPFS upload and use this URI directly\")\n .action(async (opts) => {\n try {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const performanceFeeBps = parseBigIntArg(opts.performanceFee, \"performance-fee\");\n const strategyDuration = parseDuration(opts.duration);\n const executeCalls = parseCallsFile(opts.executeCalls);\n const settleCalls = parseCallsFile(opts.settleCalls);\n\n // ── Pin metadata ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const account = getAccount();\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/proposal/v1\",\n name: opts.name,\n description: opts.description,\n chain: getNetwork(),\n strategies: [],\n terms: {},\n links: {},\n };\n // Attach proposal-specific fields\n const proposalMeta = {\n ...metadata,\n proposer: account.address,\n vault,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: Math.floor(Date.now() / 1000),\n };\n // Use the existing upload function — it accepts SyndicateMetadata shape\n metadataURI = await uploadMetadata(proposalMeta as unknown as SyndicateMetadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(\"IPFS upload failed — using inline metadata\"));\n const json = JSON.stringify({ name: opts.name, description: opts.description, vault });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Summary ──\n console.log();\n console.log(LABEL(\" ◆ Proposal Summary\"));\n SEP();\n console.log(W(` Name: ${BOLD(opts.name)}`));\n console.log(W(` Vault: ${G(vault)}`));\n console.log(W(` Performance Fee: ${Number(performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(strategyDuration)}`));\n console.log(W(` Calls: ${executeCalls.length} execute + ${settleCalls.length} settle`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n SEP();\n\n // ── Submit ──\n const spinner = ora({ text: W(\"Submitting proposal...\"), color: \"green\" }).start();\n const result = await propose(vault, metadataURI, performanceFeeBps, strategyDuration, executeCalls, settleCalls);\n spinner.succeed(G(\"Proposal submitted\"));\n\n console.log();\n console.log(LABEL(\" ◆ Proposal Created\"));\n SEP();\n console.log(W(` Proposal ID: ${G(`#${result.proposalId}`)}`));\n console.log(W(` Tx: ${DIM(getExplorerUrl(result.hash))}`));\n SEP();\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal list ──\n\n proposal\n .command(\"list\")\n .description(\"List proposals\")\n .option(\"--vault <address>\", \"Filter by vault\")\n .option(\"--state <filter>\", \"Filter by state: draft, pending, approved, executed, settled, all\", \"all\")\n .action(async (opts) => {\n const spinner = ora(\"Loading proposals...\").start();\n try {\n const count = await proposalCount();\n if (count === 0n) {\n spinner.stop();\n console.log(DIM(\"\\n No proposals found.\\n\"));\n return;\n }\n\n const vaultFilter = opts.vault ? (opts.vault as string).toLowerCase() : null;\n const stateFilter = opts.state.toLowerCase();\n const stateIndex = PROPOSAL_STATES.findIndex((s) => s.toLowerCase() === stateFilter);\n\n // Fetch all proposals + computed states concurrently\n const ids = Array.from({ length: Number(count) }, (_, i) => BigInt(i + 1));\n const results = await Promise.all(\n ids.map(async (id) => {\n const [p, state] = await Promise.all([getProposal(id), getProposalState(id)]);\n return { ...p, computedState: state };\n }),\n );\n\n const proposals = results.filter((p) => {\n if (vaultFilter && p.vault.toLowerCase() !== vaultFilter) return false;\n if (stateFilter !== \"all\" && stateIndex >= 0 && p.computedState !== stateIndex) return false;\n return true;\n });\n\n spinner.stop();\n\n if (proposals.length === 0) {\n console.log(DIM(\"\\n No matching proposals.\\n\"));\n return;\n }\n\n console.log();\n console.log(BOLD(`Proposals (${proposals.length})`));\n console.log(DIM(\"─\".repeat(90)));\n console.log(\n DIM(\" ID \") +\n DIM(\"Agent\".padEnd(14)) +\n DIM(\"State\".padEnd(12)) +\n DIM(\"Votes (For/Against)\".padEnd(22)) +\n DIM(\"Fee\".padEnd(8)) +\n DIM(\"Duration\".padEnd(10)) +\n DIM(\"Created\"),\n );\n console.log(DIM(\"─\".repeat(90)));\n\n for (const p of proposals) {\n const state = PROPOSAL_STATES[p.computedState] || \"Unknown\";\n const created = p.snapshotTimestamp > 0n\n ? new Date(Number(p.snapshotTimestamp) * 1000).toLocaleDateString()\n : \"—\";\n const agent = `${p.proposer.slice(0, 6)}...${p.proposer.slice(-4)}`;\n const fee = `${Number(p.performanceFeeBps) / 100}%`;\n const dur = formatDuration(p.strategyDuration);\n const votes = `${formatShares(p.votesFor)}/${formatShares(p.votesAgainst)}`;\n\n console.log(\n ` ${String(p.id).padEnd(4)}` +\n `${agent.padEnd(14)}` +\n `${state.padEnd(12)}` +\n `${votes.padEnd(22)}` +\n `${fee.padEnd(8)}` +\n `${dur.padEnd(10)}` +\n `${created}`,\n );\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposals\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── proposal show ──\n\n proposal\n .command(\"show\")\n .description(\"Show full proposal details\")\n .argument(\"<id>\", \"Proposal ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading proposal...\").start();\n try {\n const id = parseBigIntArg(idStr, \"proposal ID\");\n const p = await getProposal(id);\n const state = await getProposalState(id);\n const params = await getGovernorParams();\n\n spinner.stop();\n\n const stateLabel = PROPOSAL_STATES[state] || \"Unknown\";\n const totalVotes = p.votesFor + p.votesAgainst;\n const quorumNeeded = totalVotes > 0n ? `${Number(params.vetoThresholdBps) / 100}%` : \"—\";\n\n console.log();\n console.log(LABEL(` ◆ Proposal #${p.id}`));\n SEP();\n\n // Try to resolve IPFS metadata\n if (p.metadataURI && p.metadataURI.startsWith(\"ipfs://\")) {\n try {\n const meta = await fetchMetadata(p.metadataURI);\n console.log(W(` Name: ${BOLD(meta.name)}`));\n console.log(W(` Description: ${DIM(meta.description)}`));\n } catch {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n } else if (p.metadataURI) {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n\n console.log(W(` State: ${BOLD(stateLabel)}`));\n console.log(W(` Proposer: ${G(p.proposer)}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(` Performance Fee: ${Number(p.performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(p.strategyDuration)}`));\n\n console.log();\n console.log(LABEL(\" Timestamps\"));\n console.log(W(` Snapshot: ${formatTimestamp(p.snapshotTimestamp)}`));\n console.log(W(` Vote End: ${formatTimestamp(p.voteEnd)}`));\n console.log(W(` Execute By: ${formatTimestamp(p.executeBy)}`));\n console.log(W(` Executed At: ${formatTimestamp(p.executedAt)}`));\n\n console.log();\n console.log(LABEL(\" Votes\"));\n console.log(W(` For: ${formatShares(p.votesFor)}`));\n console.log(W(` Against: ${formatShares(p.votesAgainst)}`));\n console.log(W(` Abstain: ${formatShares(p.votesAbstain)}`));\n console.log(W(` Veto Threshold: ${quorumNeeded}`));\n\n if (state === PROPOSAL_STATE.Executed || state === PROPOSAL_STATE.Settled) {\n try {\n const cap = await getCapitalSnapshot(id);\n console.log();\n console.log(LABEL(\" Capital\"));\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(W(` Snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot */ }\n }\n\n const execCalls = await getExecuteCalls(id);\n const settlCalls = await getSettlementCalls(id);\n\n console.log();\n console.log(LABEL(` Execute Calls (${execCalls.length})`));\n for (let i = 0; i < execCalls.length; i++) {\n console.log(DIM(` [${i}] target=${execCalls[i].target}`));\n console.log(DIM(` data=${execCalls[i].data.slice(0, 20)}... value=${execCalls[i].value}`));\n }\n console.log(LABEL(` Settlement Calls (${settlCalls.length})`));\n for (let i = 0; i < settlCalls.length; i++) {\n console.log(DIM(` [${i}] target=${settlCalls[i].target}`));\n console.log(DIM(` data=${settlCalls[i].data.slice(0, 20)}... value=${settlCalls[i].value}`));\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposal\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── proposal vote ──\n\n proposal\n .command(\"vote\")\n .description(\"Cast a vote on a pending proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .requiredOption(\"--support <for|against|abstain>\", \"Vote direction: for, against, or abstain\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const supportRaw = String(opts.support).toLowerCase();\n const support = supportRaw === \"yes\" || supportRaw === \"for\"\n ? VOTE_TYPE.For\n : supportRaw === \"no\" || supportRaw === \"against\"\n ? VOTE_TYPE.Against\n : supportRaw === \"abstain\"\n ? VOTE_TYPE.Abstain\n : null;\n if (support === null) {\n console.error(chalk.red(`Invalid support value \"${opts.support}\". Use for|against|abstain.`));\n process.exit(1);\n }\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Pending`);\n process.exit(1);\n }\n\n const alreadyVoted = await hasVoted(proposalId, account.address);\n if (alreadyVoted) {\n spinner.fail(\"You have already voted on this proposal\");\n process.exit(1);\n }\n\n const weight = await getVoteWeight(proposalId, account.address);\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Cast Vote\"));\n SEP();\n console.log(W(` Proposal: #${proposalId}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(\n ` Support: ${\n support === VOTE_TYPE.For ? G(\"FOR\")\n : support === VOTE_TYPE.Against ? chalk.red(\"AGAINST\")\n : DIM(\"ABSTAIN\")\n }`,\n ));\n console.log(W(` Weight: ${formatShares(weight)} shares`));\n SEP();\n\n const voteSpinner = ora({ text: W(\"Submitting vote...\"), color: \"green\" }).start();\n const hash = await vote(proposalId, support);\n voteSpinner.succeed(G(\"Vote cast\"));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal execute ──\n\n proposal\n .command(\"execute\")\n .description(\"Execute an approved proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Approved) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Approved`);\n process.exit(1);\n }\n\n spinner.text = W(\"Executing proposal...\");\n const hash = await executeProposal(proposalId);\n spinner.succeed(G(\"Proposal executed\"));\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n\n try {\n const cap = await getCapitalSnapshot(proposalId);\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(DIM(` Capital snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot yet */ }\n\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal settle ──\n\n proposal\n .command(\"settle\")\n .description(\"Settle an executed proposal (auto-routes settlement path)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--calls <path>\", \"Path to JSON file with settle Call[] (for agent/emergency settle)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Executed) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Executed`);\n process.exit(1);\n }\n\n const isProposer = account.address.toLowerCase() === p.proposer.toLowerCase();\n const now = BigInt(Math.floor(Date.now() / 1000));\n const durationElapsed = p.executedAt > 0n && now >= p.executedAt + p.strategyDuration;\n\n let hash: Hex;\n\n if (isProposer && !durationElapsed) {\n // Proposer can settle anytime\n spinner.text = W(\"Settling (proposer)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled by proposer\"));\n } else if (durationElapsed && !opts.calls) {\n // Permissionless settle after duration\n spinner.text = W(\"Settling (permissionless)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled (permissionless)\"));\n } else if (durationElapsed && opts.calls) {\n // Emergency settle — owner with custom calls\n spinner.text = W(\"Emergency settling...\");\n const calls = parseCallsFile(opts.calls);\n hash = await emergencySettle(proposalId, calls);\n spinner.succeed(G(\"Emergency settled\"));\n } else {\n spinner.fail(\"Cannot settle: duration not elapsed and you are not the proposer.\");\n process.exit(1);\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal cancel ──\n\n proposal\n .command(\"cancel\")\n .description(\"Cancel a proposal (proposer or vault owner)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--emergency\", \"Emergency cancel (vault owner only, any non-settled state)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state === PROPOSAL_STATE.Settled || state === PROPOSAL_STATE.Cancelled) {\n spinner.fail(`Proposal is already ${PROPOSAL_STATES[state]}`);\n process.exit(1);\n }\n\n let hash: Hex;\n\n if (opts.emergency) {\n spinner.text = W(\"Emergency cancelling...\");\n hash = await emergencyCancel(proposalId);\n spinner.succeed(G(\"Emergency cancelled\"));\n } else {\n if (state !== PROPOSAL_STATE.Draft && state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"} — use --emergency for non-pending/approved`);\n process.exit(1);\n }\n spinner.text = W(\"Cancelling proposal...\");\n hash = await cancelProposal(proposalId);\n spinner.succeed(G(\"Proposal cancelled\"));\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * Shared formatting helpers for CLI output.\n */\n\n/** Compact duration: \"3d\", \"2.5h\", \"15m\", \"30s\" */\nexport function formatDurationShort(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)}d`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)}h`;\n if (s >= 60) return `${(s / 60).toFixed(0)}m`;\n return `${s}s`;\n}\n\n/** Verbose duration: \"3 days\", \"2.5 hours\", \"15 min\", \"30s\" */\nexport function formatDurationLong(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)} day${s >= 172800 ? \"s\" : \"\"}`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)} hour${s >= 7200 ? \"s\" : \"\"}`;\n if (s >= 60) return `${(s / 60).toFixed(0)} min`;\n return `${s}s`;\n}\n\n/** Format raw share amounts to human-readable (e.g. 124000000000 → \"124,000\") */\nexport function formatShares(raw: bigint, decimals: number = 6): string {\n const num = Number(raw) / 10 ** decimals;\n return num.toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n}\n\n/** Format USDC amount (6 decimals) to human-readable (e.g. 50000000000 → \"$50,000.00\") */\nexport function formatUSDC(raw: bigint): string {\n const num = Number(raw) / 1e6;\n return `$${num.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/** Validate string as BigInt, throw user-friendly error */\nexport function parseBigIntArg(value: string, name: string): bigint {\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(`Invalid ${name}: \"${value}\" is not a valid integer`);\n }\n return BigInt(value);\n}\n","/**\n * Governor commands — sherwood governor <subcommand>\n *\n * View and manage SyndicateGovernor parameters (owner-only setters).\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getRegisteredVaults,\n setVotingPeriod,\n setExecutionWindow,\n setVetoThresholdBps,\n setProtocolFeeBps,\n setMaxPerformanceFeeBps,\n setMaxStrategyDuration,\n setCooldownPeriod,\n} from \"../lib/governor.js\";\nimport { formatDurationLong as formatDuration, parseBigIntArg } from \"../lib/format.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nexport function registerGovernorCommands(program: Command): void {\n const governor = program.command(\"governor\").description(\"Governor parameters and vault management\");\n\n // ── governor info ──\n\n governor\n .command(\"info\")\n .description(\"Display current governor parameters and registered vaults\")\n .action(async () => {\n const spinner = ora(\"Loading governor info...\").start();\n try {\n const [params, vaults] = await Promise.all([\n getGovernorParams(),\n getRegisteredVaults(),\n ]);\n\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Governor Parameters\"));\n SEP();\n console.log(W(` Address: ${G(getGovernorAddress())}`));\n console.log(W(` Voting Period: ${BOLD(formatDuration(params.votingPeriod))}`));\n console.log(W(` Execution Window: ${BOLD(formatDuration(params.executionWindow))}`));\n console.log(W(` Veto Threshold: ${BOLD(`${Number(params.vetoThresholdBps) / 100}%`)}`));\n console.log(W(` Max Performance Fee: ${BOLD(`${Number(params.maxPerformanceFeeBps) / 100}%`)}`));\n console.log(W(` Max Strategy Duration:${BOLD(` ${formatDuration(params.maxStrategyDuration)}`)}`));\n console.log(W(` Cooldown Period: ${BOLD(formatDuration(params.cooldownPeriod))}`));\n\n console.log();\n console.log(LABEL(` Registered Vaults (${vaults.length})`));\n if (vaults.length === 0) {\n console.log(DIM(\" (none)\"));\n } else {\n for (const v of vaults) {\n console.log(W(` ${G(v)}`));\n }\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load governor info\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-voting-period ──\n\n governor\n .command(\"set-voting-period\")\n .description(\"Set the voting period (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New voting period in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting voting period...\").start();\n try {\n const hash = await setVotingPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Voting period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set voting period\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-execution-window ──\n\n governor\n .command(\"set-execution-window\")\n .description(\"Set the execution window (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New execution window in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting execution window...\").start();\n try {\n const hash = await setExecutionWindow(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Execution window change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set execution window\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-veto-threshold ──\n\n governor\n .command(\"set-veto-threshold\")\n .description(\"Set the veto threshold in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New veto threshold in bps (e.g. 4000 = 40%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting veto threshold...\").start();\n try {\n const hash = await setVetoThresholdBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Veto threshold change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set veto threshold\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-fee ──\n\n governor\n .command(\"set-max-fee\")\n .description(\"Set the max performance fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New max fee in bps (e.g. 3000 = 30%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max fee...\").start();\n try {\n const hash = await setMaxPerformanceFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Max performance fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max fee\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-duration ──\n\n governor\n .command(\"set-max-duration\")\n .description(\"Set the max strategy duration in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New max duration in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max duration...\").start();\n try {\n const hash = await setMaxStrategyDuration(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Max strategy duration change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max duration\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-cooldown ──\n\n governor\n .command(\"set-cooldown\")\n .description(\"Set the cooldown period in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New cooldown in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting cooldown...\").start();\n try {\n const hash = await setCooldownPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Cooldown period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set cooldown\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-protocol-fee ──\n\n governor\n .command(\"set-protocol-fee\")\n .description(\"Set the protocol fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New protocol fee in bps (e.g. 500 = 5%, max 1000 = 10%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting protocol fee...\").start();\n try {\n const hash = await setProtocolFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Protocol fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set protocol fee\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["parseUnits","isAddress","chalk","ora","base","baseSepolia","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","buildInitData","buildExecuteCalls","buildSettleCalls","strategy","account","propose","parseDuration","getActiveSyndicates","data","parseUnits","formatUnits","isAddress","chalk","ora","encodeFunctionData","concat","encodeFunctionData","concat","encodeFunctionData","parseUnits","ERC20_ABI","ZERO","parseUnits","encodeFunctionData","writeFileSync","program","isAddress","chalk","ora","parseUnits","formatUnits","parseUnits","formatUnits","isAddress","chalk","ora","encodeFunctionData","parseUnits","ERC20_ABI","SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI","SWAP_ROUTER_EXACT_INPUT_ABI","parseUnits","encodeFunctionData","VALID_FEES","program","isAddress","chalk","ora","parseUnits","formatUnits","chalk","ora","program","chalk","ora","isAddress","chalk","ora","readFileSync","chalk","readFileSync","program","isAddress","spinner","ora","chalk","ora","G","chalk","W","DIM","BOLD","LABEL","SEP","program","ora","require","G","chalk","W","DIM","BOLD","LABEL","SEP","isAddress","spinner","ora","getActiveSyndicates","syndicate","parseUnits"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/providers/moonwell.ts","../src/providers/uniswap.ts","../src/commands/strategy-template.ts","../src/lib/clone.ts","../src/lib/batch.ts","../src/strategies/moonwell-supply-template.ts","../src/strategies/venice-inference-template.ts","../src/strategies/aerodrome-lp-template.ts","../src/strategies/wsteth-moonwell-template.ts","../src/lib/factory.ts","../src/lib/subgraph.ts","../src/commands/venice.ts","../src/lib/venice.ts","../src/commands/allowance.ts","../src/lib/quote.ts","../src/strategies/allowance-disburse.ts","../src/commands/identity.ts","../src/commands/proposal.ts","../src/lib/format.ts","../src/commands/governor.ts"],"sourcesContent":["#!/usr/bin/env node\n// Load .env if present (dev convenience — production uses ~/.sherwood/config.json)\nimport { config as loadDotenv } from \"dotenv\";\ntry { loadDotenv(); } catch {};\nimport { createRequire } from \"node:module\";\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require(\"../package.json\");\nimport { Command, Option } from \"commander\";\nimport { parseUnits, isAddress } from \"viem\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { input, confirm, select } from \"@inquirer/prompts\";\nimport { setNetwork, getNetwork, VALID_NETWORKS } from \"./lib/network.js\";\nimport { getExplorerUrl, getChain } from \"./lib/network.js\";\nimport type { Network } from \"./lib/network.js\";\nimport { TOKENS } from \"./lib/addresses.js\";\nimport { getPublicClient, getAccount } from \"./lib/client.js\";\nimport { ERC20_ABI } from \"./lib/abis.js\";\nimport { MoonwellProvider } from \"./providers/moonwell.js\";\nimport { UniswapProvider } from \"./providers/uniswap.js\";\nimport { registerStrategyTemplateCommands } from \"./commands/strategy-template.js\";\nimport * as vaultLib from \"./lib/vault.js\";\nimport * as factoryLib from \"./lib/factory.js\";\nimport * as subgraphLib from \"./lib/subgraph.js\";\n// registryLib removed — strategy registry is deprecated, replaced by template commands\nimport { uploadMetadata } from \"./lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"./lib/ipfs.js\";\nimport { registerVeniceCommands } from \"./commands/venice.js\";\nimport { registerAllowanceCommands } from \"./commands/allowance.js\";\nimport { registerIdentityCommands } from \"./commands/identity.js\";\nimport { registerProposalCommands } from \"./commands/proposal.js\";\nimport { registerGovernorCommands } from \"./commands/governor.js\";\nimport { setTextRecord, getTextRecord, resolveVaultSyndicate, resolveSyndicate } from \"./lib/ens.js\";\nimport * as easLib from \"./lib/eas.js\";\nimport { EAS_SCHEMAS } from \"./lib/addresses.js\";\n\n// XMTP shells out to @xmtp/cli binary — lazy-load to avoid breaking\n// non-chat commands if the CLI is not installed.\nasync function loadXmtp() {\n return import(\"./lib/xmtp.js\");\n}\n// Lazy-load cron module (only needed for openclaw agents)\nasync function loadCron() {\n return import(\"./lib/cron.js\");\n}\nimport { cacheGroupId, getCachedGroupId, setChainContract, getChainContracts, loadConfig, setPrivateKey, getAgentId, setConfigRpcUrl, getNotifyTo, setNotifyTo } from \"./lib/config.js\";\nimport { isTestnet } from \"./lib/network.js\";\n\n// ── Theme ──\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction validateAddress(value: string, name: string): Address {\n if (!isAddress(value)) {\n console.error(chalk.red(`Invalid ${name} address: ${value}`));\n process.exit(1);\n }\n return value as Address;\n}\n\n/** Set vault address from --vault flag or fall back to config. */\nfunction resolveVault(opts: { vault?: string }) {\n if (opts.vault) {\n vaultLib.setVaultAddress(validateAddress(opts.vault, \"vault\"));\n }\n // If no --vault flag, getVaultAddress() in vault.ts reads from config\n}\n\nconst program = new Command();\n\nprogram\n .name(\"sherwood\")\n .description(\"CLI for agent-managed investment syndicates\")\n .version(CLI_VERSION)\n .addOption(\n new Option(\"--chain <network>\", \"Target network\")\n .choices(VALID_NETWORKS)\n .default(\"base\"),\n )\n .option(\"--testnet\", \"Alias for --chain base-sepolia (deprecated)\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n let network: string = opts.chain;\n if (opts.testnet) {\n process.env.ENABLE_TESTNET = \"true\";\n if (network !== \"base\") {\n console.warn(\n chalk.yellow(\"[warn] --testnet ignored, --chain takes precedence\"),\n );\n } else {\n network = \"base-sepolia\";\n }\n }\n setNetwork(network as Network);\n if (getNetwork() !== \"base\") {\n console.log(chalk.yellow(`[${getNetwork()}]`));\n }\n });\n\n// ── Syndicate commands ──\nconst syndicate = program.command(\"syndicate\");\n\nsyndicate\n .command(\"create\")\n .description(\"Create a new syndicate via the factory (interactive)\")\n .option(\"--subdomain <name>\", \"ENS subdomain (skip prompt)\")\n .option(\"--name <name>\", \"Syndicate name (skip prompt)\")\n .option(\"--agent-id <id>\", \"ERC-8004 agent identity token ID (skip prompt)\")\n .option(\"--asset <symbol-or-address>\", \"Vault asset: USDC, WETH, or a token address\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--metadata-uri <uri>\", \"Override metadata URI (skip IPFS upload)\")\n .option(\"--open-deposits\", \"Allow anyone to deposit (no whitelist)\")\n .option(\"--public-chat\", \"Enable dashboard spectator mode\", false)\n .option(\"-y, --yes\", \"Skip confirmation prompt (non-interactive mode)\", false)\n .action(async (opts) => {\n try {\n // ── Header ──\n console.log();\n console.log(LABEL(\" ◆ Create Syndicate\"));\n SEP();\n\n const wallet = getAccount();\n console.log(DIM(` Wallet: ${wallet.address}`));\n console.log(DIM(` Network: ${getChain().name}`));\n SEP();\n\n // ── Gather inputs (prompt if not provided via flags) ──\n\n const savedAgentId = getAgentId();\n\n const nonInteractive = opts.yes;\n\n const name = opts.name || (nonInteractive\n ? (() => { throw new Error(\"--name is required in non-interactive mode (-y)\"); })()\n : await input({\n message: G(\"Syndicate name\"),\n validate: (v: string) => v.length > 0 || \"Name is required\",\n }));\n\n const subdomain = opts.subdomain || (nonInteractive\n ? name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\")\n : await input({\n message: G(\"ENS subdomain\"),\n default: name.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\"),\n validate: (v: string) => v.length >= 3 || \"Must be at least 3 characters\",\n }));\n\n const description = opts.description || (nonInteractive\n ? `${name} — a Sherwood syndicate`\n : await input({\n message: G(\"Description\"),\n default: `${name} — a Sherwood syndicate`,\n }));\n\n const agentIdStr = opts.agentId || (savedAgentId\n ? (nonInteractive\n ? String(savedAgentId)\n : await input({ message: G(\"Agent ID (ERC-8004)\"), default: String(savedAgentId) }))\n : (nonInteractive\n ? \"0\"\n : await input({ message: G(\"Agent ID (ERC-8004)\"), validate: (v: string) => /^\\d+$/.test(v) || \"Must be a number\" }))\n );\n\n const openDeposits = opts.openDeposits !== undefined ? opts.openDeposits : (nonInteractive\n ? true\n : await confirm({\n message: G(\"Open deposits? (anyone can deposit)\"),\n default: true,\n }));\n\n // ── Resolve asset ──\n // Supported symbols (testnet + mainnet). Will expand on mainnet launch.\n const ASSET_SYMBOLS: Record<string, Address> = {\n USDC: TOKENS().USDC,\n WETH: TOKENS().WETH,\n };\n\n let asset: Address;\n if (opts.asset) {\n const upper = opts.asset.toUpperCase();\n if (ASSET_SYMBOLS[upper]) {\n asset = ASSET_SYMBOLS[upper];\n } else if (opts.asset.startsWith(\"0x\") && opts.asset.length === 42) {\n asset = opts.asset as Address;\n } else {\n const supported = Object.keys(ASSET_SYMBOLS).join(\", \");\n console.error(chalk.red(` Unknown asset \"${opts.asset}\". Use a symbol (${supported}) or a 0x address.`));\n process.exit(1);\n }\n } else if (nonInteractive) {\n // Default to WETH on chains without USDC, otherwise USDC\n asset = TOKENS().USDC !== \"0x0000000000000000000000000000000000000000\"\n ? ASSET_SYMBOLS.USDC\n : ASSET_SYMBOLS.WETH;\n } else {\n // Interactive prompt\n const assetChoice = await select({\n message: G(\"Vault asset (what token do depositors provide?)\"),\n choices: [\n { name: \"USDC\", value: \"USDC\", description: \"USD Coin (6 decimals)\" },\n { name: \"WETH\", value: \"WETH\", description: \"Wrapped Ether (18 decimals)\" },\n ],\n });\n asset = ASSET_SYMBOLS[assetChoice];\n }\n\n const publicClient = getPublicClient();\n const [decimals, assetSymbol] = await Promise.all([\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n publicClient.readContract({ address: asset, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n ]);\n const symbol = `sw${assetSymbol}`;\n\n // ── Confirmation ──\n console.log();\n console.log(LABEL(\" ◆ Review\"));\n SEP();\n console.log(W(` Name: ${BOLD(name)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Description: ${DIM(description)}`));\n console.log(W(` Agent ID: #${agentIdStr}`));\n console.log(W(` Asset: ${assetSymbol} (${asset.slice(0, 10)}...)`));\n console.log(W(` Share token: ${symbol}`));\n console.log(W(` Open deposits: ${openDeposits ? G(\"yes\") : chalk.red(\"no (whitelist)\")}`));\n SEP();\n\n if (!nonInteractive) {\n const go = await confirm({ message: G(\"Deploy syndicate?\"), default: true });\n if (!go) {\n console.log(DIM(\" Cancelled.\"));\n return;\n }\n }\n\n // ── Upload metadata to IPFS ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {\n feeModel: \"none\",\n },\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(`IPFS upload failed — using inline metadata`));\n const json = JSON.stringify({ name, description, subdomain, asset: assetSymbol, openDeposits, createdBy: \"@sherwoodagent/cli\" });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Deploy ──\n const spinner = ora({ text: W(\"Deploying vault via factory...\"), color: \"green\" }).start();\n\n const result = await factoryLib.createSyndicate({\n creatorAgentId: BigInt(agentIdStr),\n metadataURI,\n asset,\n name,\n symbol,\n openDeposits,\n subdomain,\n });\n\n // Auto-save vault address to config\n setChainContract(getChain().id, \"vault\", result.vault);\n\n // ── Register creator as agent on the vault ──\n // Brief delay to let the RPC node sync its nonce after createSyndicate tx\n await new Promise((r) => setTimeout(r, 2000));\n spinner.text = W(\"Registering creator as agent...\");\n try {\n vaultLib.setVaultAddress(result.vault);\n const creatorAddress = getAccount().address;\n await vaultLib.registerAgent(\n BigInt(agentIdStr),\n creatorAddress, // agentAddress = creator EOA (direct execution)\n );\n } catch (regErr) {\n // Non-fatal — creator can register later via `syndicate add`\n console.warn(chalk.yellow(\"\\n ⚠ Could not auto-register creator as agent — register manually with `syndicate add`\"));\n }\n\n spinner.text = W(\"Setting up chat...\");\n\n // Create XMTP group for syndicate chat\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const groupId = await xmtp.createSyndicateGroup(xmtpClient, subdomain, opts.publicChat);\n await setTextRecord(subdomain, \"xmtpGroupId\", groupId, result.vault as Address);\n cacheGroupId(subdomain, groupId);\n } catch {\n console.warn(chalk.yellow(\"\\n ⚠ Could not create XMTP chat group\"));\n console.warn(chalk.dim(` Recover later with: sherwood chat ${subdomain} init`));\n }\n\n // ── Auto-register participation crons ──\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (15m check + hourly summary)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n spinner.stop();\n\n // ── Success ──\n console.log();\n console.log(LABEL(\" ◆ Syndicate Created\"));\n SEP();\n console.log(W(` ID: ${G(`#${result.syndicateId}`)}`));\n console.log(W(` Vault: ${G(result.vault)}`));\n console.log(W(` ENS: ${G(`${subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n console.log(W(` Explorer: ${DIM(getExplorerUrl(result.hash))}`));\n console.log(W(` Chat: ${DIM(`sherwood chat ${subdomain}`)}`));\n SEP();\n console.log(G(\" ✓ Vault saved to ~/.sherwood/config.json\"));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"list\")\n .description(\"List active syndicates (queries subgraph, falls back to on-chain)\")\n .option(\"--creator <address>\", \"Filter by creator address\")\n .action(async (opts) => {\n const spinner = ora(\"Loading syndicates...\").start();\n try {\n // Try subgraph first (fast, indexed), fall back to on-chain\n let syndicates: { id: string | bigint; vault: string; creator: string; metadataURI: string; createdAt: string | bigint; totalDeposits?: string; totalWithdrawals?: string; subdomain?: string }[];\n\n if (process.env.SUBGRAPH_URL) {\n const result = await subgraphLib.getActiveSyndicates(opts.creator);\n syndicates = result;\n } else {\n const result = await factoryLib.getActiveSyndicates();\n syndicates = result.map((s) => ({\n id: s.id.toString(),\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt.toString(),\n subdomain: s.subdomain,\n }));\n }\n\n spinner.stop();\n\n if (syndicates.length === 0) {\n console.log(chalk.dim(\"No active syndicates found.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Active Syndicates (${syndicates.length})`));\n if (!process.env.SUBGRAPH_URL) {\n console.log(chalk.dim(\" (Set SUBGRAPH_URL for faster indexed queries)\"));\n }\n console.log(chalk.dim(\"─\".repeat(70)));\n\n for (const s of syndicates) {\n const ts = typeof s.createdAt === \"string\" ? Number(s.createdAt) : Number(s.createdAt);\n const date = new Date(ts * 1000).toLocaleDateString();\n const ensName = s.subdomain ? `${s.subdomain}.sherwoodagent.eth` : \"\";\n console.log(` #${s.id} ${chalk.bold(ensName || String(s.vault))}`);\n if (ensName) console.log(` Vault: ${chalk.cyan(String(s.vault))}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Created: ${date}`);\n if (s.totalDeposits) {\n console.log(` Deposits: ${s.totalDeposits} USDC`);\n }\n if (s.metadataURI) {\n console.log(` Metadata: ${chalk.dim(s.metadataURI)}`);\n }\n console.log();\n }\n } catch (err) {\n spinner.fail(\"Failed to load syndicates\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"info\")\n .description(\"Display syndicate details by ID\")\n .argument(\"<id>\", \"Syndicate ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading syndicate info...\").start();\n try {\n const id = BigInt(idStr);\n const info = await factoryLib.getSyndicate(id);\n spinner.stop();\n\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n console.log(chalk.red(`Syndicate #${id} not found.`));\n process.exit(1);\n }\n\n const date = new Date(Number(info.createdAt) * 1000).toLocaleDateString();\n console.log();\n console.log(chalk.bold(`Syndicate #${info.id}`));\n console.log(chalk.dim(\"─\".repeat(40)));\n if (info.subdomain) {\n console.log(` ENS: ${chalk.bold(`${info.subdomain}.sherwoodagent.eth`)}`);\n }\n console.log(` Vault: ${chalk.cyan(info.vault)}`);\n console.log(` Creator: ${info.creator}`);\n console.log(` Created: ${date}`);\n console.log(` Active: ${info.active ? chalk.green(\"yes\") : chalk.red(\"no\")}`);\n if (info.metadataURI) {\n console.log(` Metadata: ${chalk.dim(info.metadataURI)}`);\n }\n\n // Also show vault info\n vaultLib.setVaultAddress(info.vault);\n const vaultInfo = await vaultLib.getVaultInfo();\n console.log();\n console.log(chalk.bold(\" Vault Stats\"));\n console.log(` Total Assets: ${vaultInfo.totalAssets}`);\n console.log(` Agent Count: ${vaultInfo.agentCount}`);\n console.log(` Redemptions Locked: ${vaultInfo.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(vaultInfo.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load syndicate info\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"update-metadata\")\n .description(\"Update syndicate metadata (creator only)\")\n .requiredOption(\"--id <id>\", \"Syndicate ID\")\n .option(\"--name <name>\", \"Syndicate name\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--uri <uri>\", \"Direct metadata URI (skips IPFS upload)\")\n .action(async (opts) => {\n const spinner = ora({ text: W(\"Loading syndicate...\"), color: \"green\" }).start();\n try {\n const syndicateId = BigInt(opts.id);\n let metadataURI = opts.uri;\n\n if (!metadataURI) {\n const info = await factoryLib.getSyndicate(syndicateId);\n if (!info.vault || info.vault === \"0x0000000000000000000000000000000000000000\") {\n spinner.fail(`Syndicate #${opts.id} not found.`);\n process.exit(1);\n }\n\n const name = opts.name || info.subdomain;\n const description = opts.description || `${name} — a Sherwood syndicate on ${info.subdomain}.sherwoodagent.eth`;\n\n spinner.text = W(\"Uploading metadata to IPFS...\");\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/syndicate/v1\",\n name,\n description,\n chain: getChain().name,\n strategies: [],\n terms: {},\n links: {},\n };\n metadataURI = await uploadMetadata(metadata);\n spinner.text = W(\"Updating on-chain metadata...\");\n }\n\n const hash = await factoryLib.updateMetadata(syndicateId, metadataURI);\n spinner.succeed(G(`Metadata updated`));\n console.log(DIM(` IPFS: ${metadataURI}`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Metadata update failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve-depositor\")\n .description(\"Approve an address to deposit (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to approve\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Approving depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.approveDepositor(depositor);\n spinner.succeed(`Depositor approved: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"remove-depositor\")\n .description(\"Remove an address from the depositor whitelist (owner only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--depositor <address>\", \"Address to remove\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Removing depositor...\").start();\n try {\n const depositor = validateAddress(opts.depositor, \"depositor\");\n const hash = await vaultLib.removeDepositor(depositor);\n spinner.succeed(`Depositor removed: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Removal failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"add\")\n .description(\"Register an agent on a syndicate vault (creator only)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault address from --vault flag or config\n resolveVault(opts);\n const vaultAddress = vaultLib.getVaultAddress();\n\n // Verify caller is the syndicate creator\n const { creator, subdomain } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can add agents\");\n process.exit(1);\n }\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n spinner.text = \"Registering agent...\";\n const hash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n agentWallet,\n );\n spinner.succeed(`Agent registered: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n\n // Auto-add agent to XMTP chat group\n try {\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(chalk.dim(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n } catch (err) {\n spinner.fail(\"Registration failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n// ── EAS Join Request / Approval Commands ──\n\nsyndicate\n .command(\"join\")\n .description(\"Request to join a syndicate (creates an EAS attestation)\")\n .requiredOption(\"--subdomain <name>\", \"Syndicate subdomain to join\")\n .option(\"--message <text>\", \"Message to the creator\", \"Requesting to join your syndicate\")\n .action(async (opts) => {\n const spinner = ora(\"Resolving syndicate...\").start();\n try {\n const agentId = getAgentId();\n if (!agentId) {\n spinner.fail(\"No agent identity found. Run 'sherwood identity mint' first.\");\n process.exit(1);\n }\n\n const syndicate = await resolveSyndicate(opts.subdomain);\n const callerAddress = getAccount().address;\n\n // Check if already registered as an agent on this vault\n spinner.text = \"Checking membership...\";\n vaultLib.setVaultAddress(syndicate.vault);\n const alreadyAgent = await vaultLib.isAgent(callerAddress);\n if (alreadyAgent) {\n spinner.succeed(\"You are already a registered agent on this syndicate\");\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n // Auto-register participation crons (idempotent)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(opts.subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(chalk.green(\" ✓ Participation crons registered\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(chalk.dim(\" Tip: Set up a scheduled process to run `sherwood session check \" + opts.subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n return;\n }\n\n // Check for existing pending join request\n spinner.text = \"Checking pending requests...\";\n const pendingRequests = await easLib.queryJoinRequests(syndicate.creator);\n const existingRequest = pendingRequests.find(\n (r) => r.attester.toLowerCase() === callerAddress.toLowerCase()\n && r.decoded.vault.toLowerCase() === syndicate.vault.toLowerCase(),\n );\n if (existingRequest) {\n spinner.succeed(\"You already have a pending join request for this syndicate\");\n console.log(chalk.dim(` Attestation: ${existingRequest.uid}`));\n console.log(chalk.dim(` Submitted: ${new Date(existingRequest.time * 1000).toLocaleString()}`));\n // Still ensure XMTP identity is ready\n try {\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n console.log(chalk.dim(\" XMTP identity ready\"));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity\"));\n }\n return;\n }\n\n spinner.text = \"Creating join request attestation...\";\n const { uid, hash } = await easLib.createJoinRequest(\n syndicate.id,\n BigInt(agentId),\n syndicate.vault,\n syndicate.creator,\n opts.message,\n );\n\n // Pre-register XMTP identity so the creator can add us to the group on approval\n try {\n spinner.text = \"Registering XMTP identity...\";\n const xmtp = await loadXmtp();\n await xmtp.getXmtpClient();\n spinner.succeed(\"Join request created (XMTP identity ready)\");\n } catch {\n spinner.succeed(\"Join request created\");\n console.warn(chalk.yellow(\" ⚠ Could not initialize XMTP identity — creator may not be able to auto-add you to chat\"));\n }\n\n // Auto-register participation crons (will HEARTBEAT_OK until approved)\n try {\n const cron = await loadCron();\n const cronResult = cron.registerSyndicateCrons(opts.subdomain, isTestnet(), getNotifyTo());\n if (cronResult.isOpenClaw && cronResult.registered) {\n console.log(G(\" ✓ Participation crons registered (will activate after approval)\"));\n } else if (!cronResult.isOpenClaw) {\n console.log(DIM(\" Tip: Set up a scheduled process to run `sherwood session check \" + opts.subdomain + \"` periodically\"));\n }\n } catch { /* non-fatal */ }\n\n console.log();\n console.log(LABEL(\" ◆ Join Request Submitted\"));\n SEP();\n console.log(W(` Syndicate: ${G(`${opts.subdomain}.sherwoodagent.eth`)}`));\n console.log(W(` Agent ID: #${agentId}`));\n console.log(W(` Creator: ${DIM(syndicate.creator)}`));\n console.log(W(` Attestation: ${DIM(uid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(uid))}`));\n console.log(W(` Explorer: ${DIM(getExplorerUrl(hash))}`));\n SEP();\n console.log(G(\" ✓ The creator can review with:\"));\n console.log(DIM(` sherwood syndicate requests --subdomain ${opts.subdomain}`));\n console.log();\n } catch (err) {\n spinner.fail(\"Join request failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"requests\")\n .description(\"View pending join requests for a syndicate (creator only)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n const spinner = ora(\"Loading join requests...\").start();\n try {\n let creatorAddress: Address;\n let subdomain: string;\n let syndicateVault: Address;\n\n if (opts.subdomain) {\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n creatorAddress = syndicateInfo.creator;\n subdomain = opts.subdomain;\n syndicateVault = syndicateInfo.vault as Address;\n } else {\n resolveVault(opts);\n syndicateVault = vaultLib.getVaultAddress();\n const syndicateInfo = await resolveVaultSyndicate(syndicateVault);\n creatorAddress = syndicateInfo.creator;\n subdomain = syndicateInfo.subdomain;\n }\n\n // Verify caller is creator\n const callerAddress = getAccount().address.toLowerCase();\n if (creatorAddress.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can view join requests\");\n process.exit(1);\n }\n\n spinner.text = \"Querying EAS attestations...\";\n const [allRequests, approvals] = await Promise.all([\n easLib.queryJoinRequests(creatorAddress),\n easLib.queryApprovals(creatorAddress),\n ]);\n\n // Filter out agents that have already been approved for the same vault\n const approvedKeys = new Set(\n approvals\n .filter((a) => a.decoded.vault.toLowerCase() === syndicateVault.toLowerCase())\n .map((a) => a.decoded.agentId.toString()),\n );\n const requests = allRequests.filter(\n (r) => !approvedKeys.has(r.decoded.agentId.toString())\n && r.decoded.vault.toLowerCase() === syndicateVault.toLowerCase(),\n );\n\n spinner.stop();\n\n if (requests.length === 0) {\n console.log(DIM(\"\\n No pending join requests.\\n\"));\n return;\n }\n\n console.log();\n console.log(LABEL(` ◆ Pending Join Requests (${requests.length})`));\n SEP();\n\n for (let i = 0; i < requests.length; i++) {\n const req = requests[i];\n const date = new Date(req.time * 1000).toLocaleString();\n console.log(W(` ${i + 1}. Agent #${req.decoded.agentId} ${DIM(`(${req.attester})`)}`));\n console.log(DIM(` Message: \"${req.decoded.message}\"`));\n console.log(DIM(` Requested: ${date}`));\n console.log(DIM(` Attestation: ${req.uid}`));\n console.log();\n }\n\n console.log(G(\" To approve:\"));\n console.log(DIM(` sherwood syndicate approve --agent-id <id> --wallet <addr>`));\n console.log(G(\" To reject:\"));\n console.log(DIM(` sherwood syndicate reject --attestation <uid>`));\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load requests\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"approve\")\n .description(\"Approve an agent join request (registers agent + creates EAS approval)\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--subdomain <name>\", \"Syndicate subdomain (alternative to --vault)\")\n .requiredOption(\"--agent-id <id>\", \"Agent's ERC-8004 identity token ID\")\n .requiredOption(\"--wallet <address>\", \"Agent wallet address\")\n .action(async (opts) => {\n const spinner = ora(\"Verifying creator...\").start();\n try {\n // Resolve vault from subdomain or --vault/config\n if (opts.subdomain && !opts.vault) {\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n vaultLib.setVaultAddress(syndicateInfo.vault);\n } else {\n resolveVault(opts);\n }\n const vaultAddress = vaultLib.getVaultAddress();\n\n const agentWallet = validateAddress(opts.wallet, \"wallet\");\n\n // Verify caller is creator\n const { creator, subdomain, id: syndicateId } = await resolveVaultSyndicate(vaultAddress);\n const callerAddress = getAccount().address.toLowerCase();\n if (creator.toLowerCase() !== callerAddress) {\n spinner.fail(\"Only the syndicate creator can approve agents\");\n process.exit(1);\n }\n\n // 1. Register agent on-chain (same as syndicate add)\n spinner.text = \"Registering agent on vault...\";\n let agentWasRegistered = false;\n try {\n const regHash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n agentWallet,\n );\n agentWasRegistered = true;\n console.log(DIM(` Agent registered: ${getExplorerUrl(regHash)}`));\n } catch (regErr) {\n const msg = regErr instanceof Error ? regErr.message : String(regErr);\n if (msg.includes(\"0xe098d3ee\") || msg.includes(\"AgentAlreadyRegistered\")) {\n console.log(DIM(\" Agent already registered on vault — skipping\"));\n } else {\n throw regErr;\n }\n }\n\n // Brief delay after on-chain registration to let the RPC node sync its nonce\n if (agentWasRegistered) {\n await new Promise((r) => setTimeout(r, 2000));\n }\n\n // 2. Create AGENT_APPROVED attestation (skip if one already exists)\n spinner.text = \"Checking for existing approval...\";\n const existingApprovals = await easLib.queryApprovals(getAccount().address);\n const alreadyApproved = existingApprovals.find(\n (a) => a.decoded.agentId === BigInt(opts.agentId) && a.decoded.vault.toLowerCase() === vaultAddress.toLowerCase(),\n );\n\n let approvalUid: `0x${string}`;\n if (alreadyApproved) {\n approvalUid = alreadyApproved.uid;\n console.log(DIM(` Approval attestation already exists — skipping`));\n } else {\n spinner.text = \"Creating approval attestation...\";\n const result = await easLib.createApproval(\n syndicateId,\n BigInt(opts.agentId),\n vaultAddress,\n agentWallet,\n );\n approvalUid = result.uid;\n }\n\n // 3. Auto-add agent to XMTP chat group\n try {\n spinner.text = \"Adding to chat...\";\n const xmtp = await loadXmtp();\n const xmtpClient = await xmtp.getXmtpClient();\n const group = await xmtp.getGroup(xmtpClient, subdomain);\n await xmtp.addMember(group, opts.wallet);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.wallet },\n syndicate: subdomain,\n timestamp: Math.floor(Date.now() / 1000),\n });\n console.log(DIM(` Added to chat: ${subdomain}`));\n } catch {\n console.warn(chalk.yellow(\" ⚠ Could not add agent to chat group\"));\n console.warn(chalk.dim(` If no group exists, run: sherwood chat ${subdomain} init`));\n }\n\n spinner.succeed(\"Agent approved and registered\");\n console.log();\n console.log(LABEL(\" ◆ Agent Approved\"));\n SEP();\n console.log(W(` Agent ID: #${opts.agentId}`));\n console.log(W(` Wallet: ${G(opts.wallet)}`));\n console.log(W(` Approval: ${DIM(approvalUid)}`));\n console.log(W(` EAS Scan: ${DIM(easLib.getEasScanUrl(approvalUid))}`));\n SEP();\n } catch (err) {\n spinner.fail(\"Approval failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nsyndicate\n .command(\"reject\")\n .description(\"Reject a join request by revoking its attestation\")\n .requiredOption(\"--attestation <uid>\", \"Join request attestation UID to revoke\")\n .action(async (opts) => {\n const spinner = ora(\"Revoking attestation...\").start();\n try {\n const hash = await easLib.revokeAttestation(\n EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n opts.attestation as `0x${string}`,\n );\n spinner.succeed(\"Join request rejected\");\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Rejection failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n// ── Vault commands ──\nconst vaultCmd = program.command(\"vault\");\n\nvaultCmd\n .command(\"deposit\")\n .description(\"Deposit into a vault\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--amount <amount>\", \"Amount to deposit (in asset units)\")\n .action(async (opts) => {\n resolveVault(opts);\n const decimals = await vaultLib.getAssetDecimals();\n const amount = parseUnits(opts.amount, decimals);\n const spinner = ora(`Depositing ${opts.amount}...`).start();\n try {\n const hash = await vaultLib.deposit(amount);\n spinner.succeed(`Deposited: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Deposit failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"info\")\n .description(\"Display vault state\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading vault info...\").start();\n try {\n const info = await vaultLib.getVaultInfo();\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"Vault Info\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Address: ${info.address}`);\n console.log(` Total Assets: ${info.totalAssets}`);\n console.log(` Agent Count: ${info.agentCount}`);\n console.log(` Redemptions Locked: ${info.redemptionsLocked}`);\n console.log(` Management Fee: ${Number(info.managementFeeBps) / 100}%`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load vault info\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nvaultCmd\n .command(\"balance\")\n .description(\"Show LP share balance and asset value\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .option(\"--address <address>\", \"Address to check (default: your wallet)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Loading balance...\").start();\n try {\n const balance = await vaultLib.getBalance(opts.address as Address | undefined);\n spinner.stop();\n console.log();\n console.log(chalk.bold(\"LP Position\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Shares: ${balance.shares.toString()}`);\n console.log(` Asset Value: ${balance.assetsValue}`);\n console.log(` % of Vault: ${balance.percentOfVault}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load balance\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n// ── Strategy commands ──\nconst strategy = program.command(\"strategy\").description(\"Strategy templates — list, clone, propose\");\nregisterStrategyTemplateCommands(strategy);\n\n// ── Provider info ──\nprogram\n .command(\"providers\")\n .description(\"List available DeFi providers\")\n .action(async () => {\n const { MessariProvider, NansenProvider } = await import(\"./providers/research/index.js\");\n const providers = [new MoonwellProvider(), new UniswapProvider(), new MessariProvider(), new NansenProvider()];\n for (const p of providers) {\n const info = p.info();\n console.log(`\\n${info.name} (${info.type})`);\n console.log(` Capabilities: ${info.capabilities.join(\", \")}`);\n console.log(` Chains: ${info.supportedChains.map((c) => c.name).join(\", \")}`);\n }\n });\n\n// ── Chat commands (lazy-loaded — requires @xmtp/cli binary) ──\ntry {\n const { registerChatCommands } = await import(\"./commands/chat.js\");\n registerChatCommands(program);\n} catch {\n program\n .command(\"chat <name> [action] [actionArgs...]\")\n .description(\"Syndicate chat (XMTP) — requires @xmtp/cli\")\n .action(() => {\n console.error(chalk.red(\"XMTP CLI not available.\"));\n console.error(chalk.dim(\"Install with: npm install -g @xmtp/cli\"));\n console.error(chalk.dim(\"Or reinstall: npm i -g @sherwoodagent/cli\"));\n process.exit(1);\n });\n}\n\n// ── Session commands ──\nconst { registerSessionCommands } = await import(\"./commands/session.js\");\nregisterSessionCommands(program);\n\n// ── Venice commands ──\nregisterVeniceCommands(program);\n\n// ── Allowance commands ──\nregisterAllowanceCommands(program);\n\n// ── Identity commands ──\nregisterIdentityCommands(program);\n\n// ── Proposal commands ──\nregisterProposalCommands(program);\n\n// ── Governor commands ──\nregisterGovernorCommands(program);\n\n// ── Research commands ──\nconst { registerResearchCommands } = await import(\"./commands/research.js\");\nregisterResearchCommands(program);\n\n// ── Config commands ──\nconst configCmd = program.command(\"config\");\n\nconfigCmd\n .command(\"set\")\n .description(\"Save settings to ~/.sherwood/config.json (persists across sessions)\")\n .option(\"--private-key <key>\", \"Wallet private key (0x-prefixed)\")\n .option(\"--vault <address>\", \"Default SyndicateVault address\")\n .option(\"--rpc <url>\", \"Custom RPC URL for the active --chain network\")\n .option(\"--notify-to <id>\", \"Destination for cron summaries (Telegram chat ID, phone, etc.)\")\n .action((opts) => {\n let saved = false;\n\n if (opts.privateKey) {\n setPrivateKey(opts.privateKey);\n const account = getAccount();\n console.log(chalk.green(\"Private key saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Wallet: ${account.address}`));\n saved = true;\n }\n\n if (opts.vault) {\n const chainId = getChain().id;\n setChainContract(chainId, \"vault\", opts.vault);\n console.log(chalk.green(`Vault saved to ~/.sherwood/config.json (chain ${chainId})`));\n console.log(chalk.dim(` Vault: ${opts.vault}`));\n saved = true;\n }\n\n if (opts.rpc) {\n const network = getNetwork();\n setConfigRpcUrl(network, opts.rpc);\n console.log(chalk.green(`RPC URL saved for ${network}`));\n console.log(chalk.dim(` RPC: ${opts.rpc}`));\n saved = true;\n }\n\n if (opts.notifyTo) {\n setNotifyTo(opts.notifyTo);\n console.log(chalk.green(\"Notify destination saved to ~/.sherwood/config.json\"));\n console.log(chalk.dim(` Notify to: ${opts.notifyTo}`));\n saved = true;\n }\n\n if (!saved) {\n console.log(chalk.red(\"Provide at least one of: --private-key, --vault, --rpc, --notify-to\"));\n process.exit(1);\n }\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Display current config for the active network\")\n .action(() => {\n const network = getNetwork();\n const chainId = getChain().id;\n const contracts = getChainContracts(chainId);\n const config = loadConfig();\n const customRpc = config.rpc?.[network];\n\n console.log();\n console.log(chalk.bold(`Sherwood Config`));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(` Network: ${chalk.cyan(network)} (chain ${chainId})`);\n console.log(` RPC: ${customRpc ? chalk.green(customRpc) : chalk.dim(\"default\")}`);\n console.log(` Wallet: ${config.privateKey ? chalk.green(\"configured\") : chalk.dim(\"not set\")}`);\n console.log(` Agent ID: ${config.agentId ?? chalk.dim(\"not set\")}`);\n console.log(` Vault: ${contracts.vault ?? chalk.dim(\"not set\")}`);\n console.log();\n console.log(chalk.dim(\" Config file: ~/.sherwood/config.json\"));\n console.log();\n });\n\nprogram.parse();\n","// TODO: Not yet implemented. All methods throw \"Not implemented\".\n// This provider is registered but non-functional.\n\nimport type { Address, Chain } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { LendingProvider, ProviderInfo, DepositParams, BorrowParams, RepayParams, WithdrawParams, TxResult, LendingPosition } from \"../types.js\";\nimport { MOONWELL as getMoonwell } from \"../lib/addresses.js\";\n\nexport class MoonwellProvider implements LendingProvider {\n info(): ProviderInfo {\n return {\n name: \"moonwell\",\n type: \"lending\",\n capabilities: [\n \"lend.deposit\",\n \"lend.borrow\",\n \"lend.repay\",\n \"lend.withdraw\",\n \"lend.positions\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async depositCollateral(params: DepositParams): Promise<TxResult> {\n // TODO: Build and send tx via viem\n throw new Error(\"Not implemented — wire up viem client\");\n }\n\n async borrow(params: BorrowParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async repay(params: RepayParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async withdrawCollateral(params: WithdrawParams): Promise<TxResult> {\n throw new Error(\"Not implemented\");\n }\n\n async getPosition(account: Address): Promise<LendingPosition> {\n throw new Error(\"Not implemented\");\n }\n}\n","// TODO: Not yet implemented. All methods throw \"Not implemented\".\n// This provider is registered but non-functional.\n\nimport type { Address } from \"viem\";\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { TradingProvider, ProviderInfo, SwapParams, SwapQuoteParams, TxResult, SwapQuote } from \"../types.js\";\n\nexport class UniswapProvider implements TradingProvider {\n info(): ProviderInfo {\n return {\n name: \"uniswap\",\n type: \"trading\",\n capabilities: [\n \"swap.exact-input\",\n \"swap.quote\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async swap(params: SwapParams): Promise<TxResult> {\n // TODO: Build and send tx via viem\n throw new Error(\"Not implemented — wire up viem client\");\n }\n\n async quote(params: SwapQuoteParams): Promise<SwapQuote> {\n throw new Error(\"Not implemented\");\n }\n}\n","/**\n * Strategy template commands — clone, build calls, propose.\n *\n * Replaces the old strategy registry commands with template-based workflow:\n * sherwood strategy list — show available templates\n * sherwood strategy clone — clone + initialize a template\n * sherwood strategy propose — clone + init + build calls + submit proposal (all-in-one)\n */\n\nimport type { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { parseUnits, isAddress, erc20Abi } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport { getPublicClient, getWalletClient, getAccount } from \"../lib/client.js\";\nimport { getChain, getExplorerUrl } from \"../lib/network.js\";\nimport { TOKENS, MOONWELL, VENICE, AERODROME, STRATEGY_TEMPLATES } from \"../lib/addresses.js\";\nimport { BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport { cloneTemplate } from \"../lib/clone.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { formatBatch } from \"../lib/batch.js\";\n\nimport * as moonwellBuilder from \"../strategies/moonwell-supply-template.js\";\nimport * as veniceBuilder from \"../strategies/venice-inference-template.js\";\nimport * as aerodromeBuilder from \"../strategies/aerodrome-lp-template.js\";\nimport * as wstethBuilder from \"../strategies/wsteth-moonwell-template.js\";\n\nconst ZERO: Address = \"0x0000000000000000000000000000000000000000\";\n\n// ── Template definitions ──\n\ninterface TemplateDef {\n name: string;\n key: string;\n description: string;\n addressKey: keyof ReturnType<typeof STRATEGY_TEMPLATES>;\n}\n\nconst TEMPLATES: TemplateDef[] = [\n {\n name: \"Moonwell Supply\",\n key: \"moonwell-supply\",\n description: \"Supply tokens to Moonwell lending market, earn yield\",\n addressKey: \"MOONWELL_SUPPLY\",\n },\n {\n name: \"Aerodrome LP\",\n key: \"aerodrome-lp\",\n description: \"Provide liquidity on Aerodrome DEX + optional gauge staking\",\n addressKey: \"AERODROME_LP\",\n },\n {\n name: \"Venice Inference\",\n key: \"venice-inference\",\n description: \"Stake VVV for sVVV — Venice private AI inference\",\n addressKey: \"VENICE_INFERENCE\",\n },\n {\n name: \"wstETH Moonwell Yield\",\n key: \"wsteth-moonwell\",\n description: \"WETH → wstETH → Moonwell — stack Lido + lending yield\",\n addressKey: \"WSTETH_MOONWELL\",\n },\n];\n\nfunction resolveTemplate(key: string): { def: TemplateDef; address: Address } {\n const def = TEMPLATES.find((t) => t.key === key);\n if (!def) {\n console.error(chalk.red(`Unknown template: ${key}`));\n console.error(chalk.dim(`Available: ${TEMPLATES.map((t) => t.key).join(\", \")}`));\n process.exit(1);\n }\n const address = STRATEGY_TEMPLATES()[def.addressKey];\n if (address === ZERO) {\n console.error(chalk.red(`Template \"${def.name}\" not deployed on this network.`));\n process.exit(1);\n }\n return { def, address };\n}\n\n// ── Helpers for building init data per template ──\n\nasync function buildInitDataForTemplate(\n templateKey: string,\n opts: Record<string, string | boolean | undefined>,\n vault: Address,\n): Promise<{ initData: Hex; asset: Address; assetAmount: bigint; extraApprovals?: { token: Address; amount: bigint }[] }> {\n if (templateKey === \"moonwell-supply\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for moonwell-supply template\"));\n process.exit(1);\n }\n const token = (opts.token as string) || \"USDC\";\n const underlying = resolveToken(token);\n const mToken = resolveMToken(token);\n const decimals = token.toUpperCase() === \"USDC\" ? 6 : 18;\n const supplyAmount = parseUnits(opts.amount as string, decimals);\n const minRedeem = parseUnits((opts.minRedeem as string) || opts.amount as string, decimals);\n\n return {\n initData: moonwellBuilder.buildInitData(underlying, mToken, supplyAmount, minRedeem),\n asset: underlying,\n assetAmount: supplyAmount,\n };\n }\n\n if (templateKey === \"venice-inference\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for venice-inference template\"));\n process.exit(1);\n }\n const assetSymbol = (opts.asset as string) || \"USDC\";\n const asset = resolveToken(assetSymbol);\n const vvv = VENICE().VVV;\n const isDirect = asset.toLowerCase() === vvv.toLowerCase();\n const decimals = assetSymbol.toUpperCase() === \"USDC\" ? 6 : 18;\n const assetAmount = parseUnits(opts.amount as string, decimals);\n const agent = (opts.agent as Address) || getAccount().address;\n\n const params: veniceBuilder.VeniceInferenceInitParams = {\n asset,\n weth: isDirect ? ZERO : TOKENS().WETH,\n vvv,\n sVVV: VENICE().STAKING,\n aeroRouter: isDirect ? ZERO : AERODROME().ROUTER,\n aeroFactory: isDirect ? ZERO : AERODROME().FACTORY,\n agent,\n assetAmount,\n minVVV: isDirect ? 0n : parseUnits((opts.minVvv as string) || \"0\", 18),\n deadlineOffset: 300n,\n singleHop: !!opts.singleHop,\n };\n\n return {\n initData: veniceBuilder.buildInitData(params),\n asset,\n assetAmount,\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n for (const flag of [\"tokenA\", \"tokenB\", \"amountA\", \"amountB\", \"lpToken\"]) {\n if (!opts[flag]) {\n console.error(chalk.red(`--${flag.replace(/([A-Z])/g, \"-$1\").toLowerCase()} is required for aerodrome-lp template`));\n process.exit(1);\n }\n }\n const tokenA = opts.tokenA as Address;\n const tokenB = opts.tokenB as Address;\n const publicClient = getPublicClient();\n const [decimalsA, decimalsB] = await Promise.all([\n publicClient.readContract({ address: tokenA, abi: erc20Abi, functionName: \"decimals\" }),\n publicClient.readContract({ address: tokenB, abi: erc20Abi, functionName: \"decimals\" }),\n ]);\n const amountA = parseUnits(opts.amountA as string, decimalsA);\n const amountB = parseUnits(opts.amountB as string, decimalsB);\n const minAOut = parseUnits((opts.minAOut as string) || \"0\", decimalsA);\n const minBOut = parseUnits((opts.minBOut as string) || \"0\", decimalsB);\n\n const params: aerodromeBuilder.AerodromeLPInitParams = {\n tokenA,\n tokenB,\n stable: !!opts.stable,\n factory: AERODROME().FACTORY,\n router: AERODROME().ROUTER,\n gauge: (opts.gauge as Address) || ZERO,\n lpToken: opts.lpToken as Address,\n amountADesired: amountA,\n amountBDesired: amountB,\n amountAMin: amountA, // use desired as min for now\n amountBMin: amountB,\n minAmountAOut: minAOut,\n minAmountBOut: minBOut,\n };\n\n return {\n initData: aerodromeBuilder.buildInitData(params),\n asset: tokenA,\n assetAmount: amountA,\n extraApprovals: [{ token: tokenB, amount: amountB }],\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n if (!opts.amount) {\n console.error(chalk.red(\"--amount is required for wsteth-moonwell template\"));\n process.exit(1);\n }\n const supplyAmount = parseUnits(opts.amount as string, 18); // WETH = 18 decimals\n const slippageBps = BigInt((opts.slippage as string) || \"500\"); // default 5% slippage\n const minWstethOut = supplyAmount - (supplyAmount * slippageBps) / 10000n;\n const minWethOut = supplyAmount - (supplyAmount * slippageBps) / 10000n;\n\n const params: wstethBuilder.WstETHMoonwellInitParams = {\n weth: TOKENS().WETH,\n wsteth: TOKENS().wstETH,\n mwsteth: MOONWELL().mWstETH,\n aeroRouter: AERODROME().ROUTER,\n aeroFactory: AERODROME().FACTORY,\n supplyAmount,\n minWstethOut,\n minWethOut,\n deadlineOffset: 300n,\n };\n\n return {\n initData: wstethBuilder.buildInitData(params),\n asset: TOKENS().WETH,\n assetAmount: supplyAmount,\n };\n }\n\n throw new Error(`No init builder for template: ${templateKey}`);\n}\n\nfunction buildCallsForTemplate(\n templateKey: string,\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n extraApprovals?: { token: Address; amount: bigint }[],\n): { executeCalls: BatchCall[]; settleCalls: BatchCall[] } {\n if (templateKey === \"moonwell-supply\") {\n return {\n executeCalls: moonwellBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: moonwellBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"venice-inference\") {\n return {\n executeCalls: veniceBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: veniceBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"aerodrome-lp\") {\n const tokenB = extraApprovals?.[0]?.token ?? ZERO;\n const amountB = extraApprovals?.[0]?.amount ?? 0n;\n return {\n executeCalls: aerodromeBuilder.buildExecuteCalls(clone, asset, assetAmount, tokenB, amountB),\n settleCalls: aerodromeBuilder.buildSettleCalls(clone),\n };\n }\n\n if (templateKey === \"wsteth-moonwell\") {\n return {\n executeCalls: wstethBuilder.buildExecuteCalls(clone, asset, assetAmount),\n settleCalls: wstethBuilder.buildSettleCalls(clone),\n };\n }\n\n throw new Error(`No call builder for template: ${templateKey}`);\n}\n\n// ── Token resolution ──\n\nfunction resolveToken(symbolOrAddress: string): Address {\n if (isAddress(symbolOrAddress)) return symbolOrAddress as Address;\n const upper = symbolOrAddress.toUpperCase();\n const tokens = TOKENS();\n const tokenMap: Record<string, Address> = {\n USDC: tokens.USDC,\n WETH: tokens.WETH,\n DAI: tokens.DAI,\n AERO: tokens.AERO,\n VVV: VENICE().VVV,\n };\n const addr = tokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`Unknown token: ${symbolOrAddress}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction resolveMToken(tokenSymbol: string): Address {\n const upper = tokenSymbol.toUpperCase();\n const moonwell = MOONWELL();\n const mTokenMap: Record<string, Address> = {\n USDC: moonwell.mUSDC,\n WETH: moonwell.mWETH,\n };\n const addr = mTokenMap[upper];\n if (!addr || addr === ZERO) {\n console.error(chalk.red(`No Moonwell market for: ${tokenSymbol}`));\n process.exit(1);\n }\n return addr;\n}\n\nfunction serializeCalls(calls: BatchCall[]): string {\n return JSON.stringify(\n calls.map((c) => ({\n target: c.target,\n data: c.data,\n value: c.value.toString(),\n })),\n null,\n 2,\n );\n}\n\n// ── Commands ──\n\nexport function registerStrategyTemplateCommands(strategy: Command): void {\n // ── strategy list ──\n\n strategy\n .command(\"list\")\n .description(\"List available strategy templates\")\n .action(() => {\n const templates = STRATEGY_TEMPLATES();\n\n console.log();\n console.log(chalk.bold(\"Strategy Templates\"));\n console.log(chalk.dim(\"─\".repeat(60)));\n\n for (const t of TEMPLATES) {\n const addr = templates[t.addressKey];\n const deployed = addr !== ZERO;\n console.log();\n console.log(` ${chalk.bold(t.name)} (${chalk.cyan(t.key)})`);\n console.log(` ${t.description}`);\n console.log(` Template: ${deployed ? chalk.green(addr) : chalk.red(\"not deployed\")}`);\n }\n\n console.log();\n console.log(chalk.dim(\"Clone a template: sherwood strategy clone <template> --vault <addr> ...\"));\n console.log(chalk.dim(\"Full proposal: sherwood strategy propose <template> --vault <addr> ...\"));\n console.log();\n });\n\n // ── strategy clone ──\n\n strategy\n .command(\"clone\")\n .description(\"Clone a strategy template and initialize it\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n // moonwell-supply / wsteth-moonwell\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n // venice-inference\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n // aerodrome-lp\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n let cloneHash: Hex;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneHash = result.hash;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(cloneHash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n try {\n const { initData } = await buildInitDataForTemplate(templateKey, opts, vault);\n const account = getAccount();\n const wallet = getWalletClient();\n\n const initHash = await wallet.writeContract({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, initData],\n });\n\n await getPublicClient().waitForTransactionReceipt({ hash: initHash });\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n console.log();\n console.log(chalk.bold(\"Strategy clone ready:\"), chalk.green(clone));\n console.log(chalk.dim(\"Use this address in your proposal batch calls.\"));\n console.log();\n });\n\n // ── strategy propose ──\n\n strategy\n .command(\"propose\")\n .description(\"Clone + init + build calls + submit governance proposal (all-in-one)\")\n .argument(\"<template>\", \"Template: moonwell-supply, aerodrome-lp, venice-inference, wsteth-moonwell\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .option(\"--write-calls <dir>\", \"Write execute/settle JSON to directory (skip proposal submission)\")\n // proposal metadata (required unless --write-calls)\n .option(\"--name <name>\", \"Proposal name\")\n .option(\"--description <text>\", \"Proposal description\")\n .option(\"--performance-fee <bps>\", \"Agent fee in bps\")\n .option(\"--duration <duration>\", \"Strategy duration (7d, 24h, etc.)\")\n // template-specific (same as clone)\n .option(\"--amount <n>\", \"Asset amount to deploy\")\n .option(\"--min-redeem <n>\", \"Min asset on settlement (Moonwell)\")\n .option(\"--token <symbol>\", \"Asset token symbol (default: USDC)\")\n .option(\"--asset <symbol>\", \"Asset token (USDC, VVV, or address)\")\n .option(\"--agent <address>\", \"Agent wallet (Venice, default: your wallet)\")\n .option(\"--min-vvv <n>\", \"Min VVV from swap (Venice)\")\n .option(\"--single-hop\", \"Single-hop Aerodrome swap (Venice)\")\n .option(\"--token-a <address>\", \"Token A (Aerodrome)\")\n .option(\"--token-b <address>\", \"Token B (Aerodrome)\")\n .option(\"--amount-a <n>\", \"Token A amount (Aerodrome)\")\n .option(\"--amount-b <n>\", \"Token B amount (Aerodrome)\")\n .option(\"--stable\", \"Stable pool (Aerodrome)\")\n .option(\"--gauge <address>\", \"Gauge address (Aerodrome)\")\n .option(\"--lp-token <address>\", \"LP token address (Aerodrome)\")\n .option(\"--min-a-out <n>\", \"Min token A on settle (Aerodrome)\")\n .option(\"--min-b-out <n>\", \"Min token B on settle (Aerodrome)\")\n // wsteth-moonwell\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps (wstETH, default: 500 = 5%)\")\n .action(async (templateKey: string, opts) => {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(\"Invalid vault address\"));\n process.exit(1);\n }\n\n const { def, address: templateAddr } = resolveTemplate(templateKey);\n\n // 1. Clone\n const cloneSpinner = ora(`Cloning ${def.name} template...`).start();\n let clone: Address;\n try {\n const result = await cloneTemplate(templateAddr);\n clone = result.clone;\n cloneSpinner.succeed(`Cloned: ${chalk.green(clone)}`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(result.hash)}`));\n } catch (err) {\n cloneSpinner.fail(\"Clone failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // 2. Initialize\n const initSpinner = ora(\"Initializing strategy...\").start();\n let asset: Address;\n let assetAmount: bigint;\n let extraApprovals: { token: Address; amount: bigint }[] | undefined;\n try {\n const built = await buildInitDataForTemplate(templateKey, opts, vault);\n asset = built.asset;\n assetAmount = built.assetAmount;\n extraApprovals = built.extraApprovals;\n\n const account = getAccount();\n const wallet = getWalletClient();\n\n const initHash = await wallet.writeContract({\n account,\n chain: getChain(),\n address: clone,\n abi: BASE_STRATEGY_ABI,\n functionName: \"initialize\",\n args: [vault, account.address, built.initData],\n });\n\n await getPublicClient().waitForTransactionReceipt({ hash: initHash });\n initSpinner.succeed(\"Initialized\");\n } catch (err) {\n initSpinner.fail(\"Initialize failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // 3. Build batch calls\n const { executeCalls, settleCalls } = buildCallsForTemplate(\n templateKey, clone, asset, assetAmount, extraApprovals,\n );\n\n console.log();\n console.log(chalk.bold(`Execute calls (${executeCalls.length}):`));\n console.log(formatBatch(executeCalls));\n console.log(chalk.bold(`Settle calls (${settleCalls.length}):`));\n console.log(formatBatch(settleCalls));\n\n // 4. Write files or submit proposal\n if (opts.writeCalls) {\n const dir = resolve(opts.writeCalls as string);\n mkdirSync(dir, { recursive: true });\n\n const execPath = resolve(dir, \"execute.json\");\n const settlePath = resolve(dir, \"settle.json\");\n writeFileSync(execPath, serializeCalls(executeCalls));\n writeFileSync(settlePath, serializeCalls(settleCalls));\n\n console.log();\n console.log(chalk.green(`Execute calls: ${execPath}`));\n console.log(chalk.green(`Settle calls: ${settlePath}`));\n console.log(chalk.green(`Clone address: ${clone}`));\n console.log();\n console.log(chalk.dim(\"Submit with:\"));\n console.log(chalk.dim(` sherwood proposal create \\\\`));\n console.log(chalk.dim(` --vault ${vault} \\\\`));\n console.log(chalk.dim(` --name \"...\" --description \"...\" \\\\`));\n console.log(chalk.dim(` --performance-fee 0 --duration 7d \\\\`));\n console.log(chalk.dim(` --execute-calls ${execPath} \\\\`));\n console.log(chalk.dim(` --settle-calls ${settlePath}`));\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Reminder: before settlement, agent must approve repayment:\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n console.log(chalk.yellow(\" Agent can update repayment via strategy.updateParams(newRepayment, 0, 0)\"));\n }\n\n console.log();\n return;\n }\n\n // Direct proposal submission requires metadata flags\n if (!opts.name || !opts.performanceFee || !opts.duration) {\n console.error(chalk.red(\"Missing --name, --performance-fee, or --duration. Use --write-calls to skip proposal submission.\"));\n process.exit(1);\n }\n\n // Lazy import governor to avoid pulling it in for --write-calls path\n const { propose } = await import(\"../lib/governor.js\");\n const { pinJSON } = await import(\"../lib/ipfs.js\");\n const { parseDuration } = await import(\"../lib/governor.js\");\n\n const performanceFeeBps = BigInt(opts.performanceFee as string);\n if (performanceFeeBps < 0n || performanceFeeBps > 10000n) {\n console.error(chalk.red(\"--performance-fee must be 0-10000 (basis points)\"));\n process.exit(1);\n }\n const strategyDuration = parseDuration(opts.duration as string);\n const account = getAccount();\n\n const metaSpinner = ora(\"Pinning metadata to IPFS...\").start();\n let metadataURI: string;\n try {\n const metadata = {\n name: opts.name,\n description: opts.description || \"\",\n proposer: account.address,\n vault,\n strategyClone: clone,\n template: def.key,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: new Date().toISOString(),\n };\n metadataURI = await pinJSON(metadata, opts.name as string);\n metaSpinner.succeed(`Metadata pinned: ${metadataURI}`);\n } catch (err) {\n metaSpinner.fail(\"IPFS pin failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n const proposeSpinner = ora(\"Submitting proposal...\").start();\n try {\n const { hash, proposalId } = await propose(\n vault, metadataURI, performanceFeeBps, strategyDuration,\n executeCalls, settleCalls,\n );\n proposeSpinner.succeed(`Proposal #${proposalId} created`);\n console.log(chalk.dim(` Tx: ${getExplorerUrl(hash)}`));\n console.log(chalk.dim(` Clone: ${clone}`));\n } catch (err) {\n proposeSpinner.fail(\"Proposal failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n if (templateKey === \"venice-inference\") {\n console.log();\n console.log(chalk.yellow(\"Next steps:\"));\n console.log(chalk.yellow(\" 1. After execution: sherwood venice provision\"));\n console.log(chalk.yellow(\" 2. Use inference: sherwood venice infer --model <id> --prompt '...'\"));\n console.log(chalk.yellow(\" 3. Before settlement: approve repayment (principal + profit):\"));\n console.log(chalk.yellow(` asset.approve(${clone}, <repaymentAmount>)`));\n }\n\n console.log();\n });\n}\n","/**\n * ERC-1167 minimal proxy cloning from TypeScript.\n *\n * Mirrors OpenZeppelin's Clones.clone() — constructs the creation\n * bytecode for a minimal proxy and deploys via a raw transaction.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { concat } from \"viem\";\nimport { getWalletClient, getPublicClient, getAccount } from \"./client.js\";\nimport { getChain } from \"./network.js\";\n\n/**\n * Deploy an ERC-1167 minimal proxy clone of a template contract.\n *\n * @param template - Address of the deployed template (implementation)\n * @returns The clone address and deployment tx hash\n */\nexport async function cloneTemplate(\n template: Address,\n): Promise<{ clone: Address; hash: Hex }> {\n // ERC-1167 creation code (matches OpenZeppelin Clones.sol):\n // Init code: 3d602d80600a3d3981f3\n // Runtime code: 363d3d373d3d3d363d73 <address> 5af43d82803e903d91602b57fd5bf3\n const creationCode = concat([\n \"0x3d602d80600a3d3981f3363d3d373d3d3d363d73\",\n template,\n \"0x5af43d82803e903d91602b57fd5bf3\",\n ]);\n\n const wallet = getWalletClient();\n const account = getAccount();\n const chain = getChain();\n\n const hash = await wallet.sendTransaction({\n account,\n chain,\n data: creationCode as Hex,\n value: 0n,\n });\n\n const receipt = await getPublicClient().waitForTransactionReceipt({ hash });\n\n if (!receipt.contractAddress) {\n throw new Error(`Clone deployment failed — no contract address in receipt (tx: ${hash})`);\n }\n\n return { clone: receipt.contractAddress, hash };\n}\n","/**\n * Types and helpers for batch call construction.\n *\n * Calls go directly to vault.executeBatch() — no separate executor contract.\n */\n\nimport type { Address, Hex } from \"viem\";\n\nexport interface BatchCall {\n target: Address;\n data: Hex;\n value: bigint;\n}\n\n/**\n * Format a batch for human-readable display (CLI output before simulation).\n */\nexport function formatBatch(calls: BatchCall[]): string {\n return calls\n .map((call, i) => {\n const selector = call.data.slice(0, 10);\n return ` ${i + 1}. ${call.target} :: ${selector}... (${call.value > 0n ? call.value + \" wei\" : \"no value\"})`;\n })\n .join(\"\\n\");\n}\n","/**\n * MoonwellSupplyStrategy call builder.\n *\n * InitParams (Solidity): (address underlying, address mToken, uint256 supplyAmount, uint256 minRedeemAmount)\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport function buildInitData(\n underlying: Address,\n mToken: Address,\n supplyAmount: bigint,\n minRedeemAmount: bigint,\n): Hex {\n return encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n ],\n [underlying, mToken, supplyAmount, minRedeemAmount],\n );\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n underlying: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: underlying,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, supplyAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * VeniceInferenceStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address asset, address weth, address vvv, address sVVV,\n * address aeroRouter, address aeroFactory, address agent,\n * uint256 assetAmount, uint256 minVVV, uint256 deadlineOffset, bool singleHop\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface VeniceInferenceInitParams {\n asset: Address;\n weth: Address;\n vvv: Address;\n sVVV: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n agent: Address;\n assetAmount: bigint;\n minVVV: bigint;\n deadlineOffset: bigint;\n singleHop: boolean;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"asset\", type: \"address\" as const },\n { name: \"weth\", type: \"address\" as const },\n { name: \"vvv\", type: \"address\" as const },\n { name: \"sVVV\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"agent\", type: \"address\" as const },\n { name: \"assetAmount\", type: \"uint256\" as const },\n { name: \"minVVV\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n { name: \"singleHop\", type: \"bool\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: VeniceInferenceInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n asset: Address,\n assetAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: asset,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, assetAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * AerodromeLPStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address tokenA, address tokenB, bool stable,\n * address factory, address router, address gauge, address lpToken,\n * uint256 amountADesired, uint256 amountBDesired,\n * uint256 amountAMin, uint256 amountBMin,\n * uint256 minAmountAOut, uint256 minAmountBOut\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface AerodromeLPInitParams {\n tokenA: Address;\n tokenB: Address;\n stable: boolean;\n factory: Address;\n router: Address;\n gauge: Address;\n lpToken: Address;\n amountADesired: bigint;\n amountBDesired: bigint;\n amountAMin: bigint;\n amountBMin: bigint;\n minAmountAOut: bigint;\n minAmountBOut: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"tokenA\", type: \"address\" as const },\n { name: \"tokenB\", type: \"address\" as const },\n { name: \"stable\", type: \"bool\" as const },\n { name: \"factory\", type: \"address\" as const },\n { name: \"router\", type: \"address\" as const },\n { name: \"gauge\", type: \"address\" as const },\n { name: \"lpToken\", type: \"address\" as const },\n { name: \"amountADesired\", type: \"uint256\" as const },\n { name: \"amountBDesired\", type: \"uint256\" as const },\n { name: \"amountAMin\", type: \"uint256\" as const },\n { name: \"amountBMin\", type: \"uint256\" as const },\n { name: \"minAmountAOut\", type: \"uint256\" as const },\n { name: \"minAmountBOut\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: AerodromeLPInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n tokenA: Address,\n amountA: bigint,\n tokenB: Address,\n amountB: bigint,\n): BatchCall[] {\n return [\n {\n target: tokenA,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountA],\n }),\n value: 0n,\n },\n {\n target: tokenB,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, amountB],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * WstETHMoonwellStrategy call builder.\n *\n * InitParams (Solidity struct):\n * address weth, address wsteth, address mwsteth,\n * address aeroRouter, address aeroFactory,\n * uint256 supplyAmount, uint256 minWstethOut, uint256 minWethOut, uint256 deadlineOffset\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, encodeFunctionData } from \"viem\";\nimport { ERC20_ABI, BASE_STRATEGY_ABI } from \"../lib/abis.js\";\nimport type { BatchCall } from \"../lib/batch.js\";\n\nexport interface WstETHMoonwellInitParams {\n weth: Address;\n wsteth: Address;\n mwsteth: Address;\n aeroRouter: Address;\n aeroFactory: Address;\n supplyAmount: bigint;\n minWstethOut: bigint;\n minWethOut: bigint;\n deadlineOffset: bigint;\n}\n\nconst INIT_PARAMS_TYPES = [\n {\n type: \"tuple\" as const,\n components: [\n { name: \"weth\", type: \"address\" as const },\n { name: \"wsteth\", type: \"address\" as const },\n { name: \"mwsteth\", type: \"address\" as const },\n { name: \"aeroRouter\", type: \"address\" as const },\n { name: \"aeroFactory\", type: \"address\" as const },\n { name: \"supplyAmount\", type: \"uint256\" as const },\n { name: \"minWstethOut\", type: \"uint256\" as const },\n { name: \"minWethOut\", type: \"uint256\" as const },\n { name: \"deadlineOffset\", type: \"uint256\" as const },\n ],\n },\n] as const;\n\nexport function buildInitData(params: WstETHMoonwellInitParams): Hex {\n return encodeAbiParameters(INIT_PARAMS_TYPES, [params]);\n}\n\nexport function buildExecuteCalls(\n clone: Address,\n weth: Address,\n supplyAmount: bigint,\n): BatchCall[] {\n return [\n {\n target: weth,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [clone, supplyAmount],\n }),\n value: 0n,\n },\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"execute\",\n }),\n value: 0n,\n },\n ];\n}\n\nexport function buildSettleCalls(clone: Address): BatchCall[] {\n return [\n {\n target: clone,\n data: encodeFunctionData({\n abi: BASE_STRATEGY_ABI,\n functionName: \"settle\",\n }),\n value: 0n,\n },\n ];\n}\n","/**\n * SyndicateFactory contract wrapper.\n *\n * Creates new syndicate vaults via the factory. Each syndicate = one vault proxy\n * with shared executor lib and vault implementation.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { parseUnits, formatUnits, decodeEventLog } from \"viem\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { getPublicClient, getWalletClient, getAccount } from \"./client.js\";\nimport { SYNDICATE_FACTORY_ABI } from \"./abis.js\";\nimport { TOKENS, SHERWOOD } from \"./addresses.js\";\n\nexport interface SyndicateInfo {\n id: bigint;\n vault: Address;\n creator: Address;\n metadataURI: string;\n createdAt: bigint;\n active: boolean;\n subdomain: string;\n}\n\nexport interface CreateSyndicateParams {\n creatorAgentId: bigint;\n metadataURI: string;\n asset: Address;\n name: string;\n symbol: string;\n openDeposits: boolean;\n subdomain: string;\n}\n\nfunction getFactoryAddress(): Address {\n return SHERWOOD().FACTORY;\n}\n\nexport interface CreateSyndicateResult {\n hash: Hex;\n syndicateId: bigint;\n vault: Address;\n}\n\n/**\n * Create a new syndicate via the factory.\n * Deploys a UUPS vault proxy, initializes it, and registers in the factory.\n * Waits for receipt and extracts vault address from SyndicateCreated event.\n */\nexport async function createSyndicate(params: CreateSyndicateParams): Promise<CreateSyndicateResult> {\n const wallet = getWalletClient();\n const client = getPublicClient();\n\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"createSyndicate\",\n args: [\n params.creatorAgentId,\n {\n metadataURI: params.metadataURI,\n asset: params.asset,\n name: params.name,\n symbol: params.symbol,\n openDeposits: params.openDeposits,\n subdomain: params.subdomain,\n },\n ],\n });\n\n // Wait for receipt and extract vault from SyndicateCreated event\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n // Parse SyndicateCreated event from receipt logs\n for (const log of receipt.logs) {\n try {\n const event = decodeEventLog({\n abi: SYNDICATE_FACTORY_ABI,\n data: log.data,\n topics: log.topics,\n });\n if (event.eventName === \"SyndicateCreated\") {\n const args = event.args as { id: bigint; vault: Address; creator: Address };\n return {\n hash,\n syndicateId: args.id,\n vault: args.vault,\n };\n }\n } catch {\n // Not our event, skip\n }\n }\n\n // Fallback: read from factory state (may lag on RPC replicas)\n const count = await getSyndicateCount();\n const info = await getSyndicate(count);\n\n return {\n hash,\n syndicateId: count,\n vault: info.vault,\n };\n}\n\n/**\n * Get syndicate info by ID.\n */\nexport async function getSyndicate(id: bigint): Promise<SyndicateInfo> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicates\",\n args: [id],\n })) as [bigint, Address, Address, string, bigint, boolean, string];\n\n return {\n id: result[0],\n vault: result[1],\n creator: result[2],\n metadataURI: result[3],\n createdAt: result[4],\n active: result[5],\n subdomain: result[6],\n };\n}\n\n/**\n * Get the total number of syndicates created.\n */\nexport async function getSyndicateCount(): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"syndicateCount\",\n }) as Promise<bigint>;\n}\n\n/**\n * Get all active syndicates from the factory.\n */\nexport async function getActiveSyndicates(): Promise<SyndicateInfo[]> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"getAllActiveSyndicates\",\n })) as readonly {\n id: bigint;\n vault: Address;\n creator: Address;\n metadataURI: string;\n createdAt: bigint;\n active: boolean;\n subdomain: string;\n }[];\n\n return result.map((s) => ({\n id: s.id,\n vault: s.vault,\n creator: s.creator,\n metadataURI: s.metadataURI,\n createdAt: s.createdAt,\n active: s.active,\n subdomain: s.subdomain,\n }));\n}\n\n/**\n * Update syndicate metadata (creator only).\n */\nexport async function updateMetadata(syndicateId: bigint, metadataURI: string): Promise<Hex> {\n const wallet = getWalletClient();\n const client = getPublicClient();\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: getFactoryAddress(),\n abi: SYNDICATE_FACTORY_ABI,\n functionName: \"updateMetadata\",\n args: [syndicateId, metadataURI],\n });\n await client.waitForTransactionReceipt({ hash });\n return hash;\n}\n","/**\n * Subgraph query wrapper for syndicate discovery.\n *\n * Queries The Graph's hosted/studio subgraph for indexed\n * factory + vault events. Much faster than on-chain iteration.\n *\n * Requires SUBGRAPH_URL env var pointing to the subgraph's\n * query endpoint (from The Graph Studio).\n */\n\nexport interface SubgraphSyndicate {\n id: string;\n vault: string;\n creator: string;\n metadataURI: string;\n createdAt: string;\n active: boolean;\n totalDeposits: string;\n totalWithdrawals: string;\n}\n\nexport interface SubgraphAgent {\n id: string;\n agentAddress: string;\n active: boolean;\n registeredAt: string;\n totalBatches: string;\n totalAssetAmount: string;\n}\n\nexport interface SubgraphDeposit {\n id: string;\n sender: string;\n owner: string;\n assets: string;\n shares: string;\n timestamp: string;\n txHash: string;\n}\n\nexport interface SyndicateDetails extends SubgraphSyndicate {\n agents: SubgraphAgent[];\n deposits: SubgraphDeposit[];\n}\n\nfunction getSubgraphUrl(): string {\n const url = process.env.SUBGRAPH_URL;\n if (!url) {\n throw new Error(\n \"SUBGRAPH_URL env var is required. Set it to your The Graph Studio query endpoint.\",\n );\n }\n return url;\n}\n\nasync function query<T>(graphql: string, variables?: Record<string, unknown>): Promise<T> {\n const url = getSubgraphUrl();\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ query: graphql, variables }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Subgraph query failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { data?: T; errors?: { message: string }[] };\n\n if (result.errors?.length) {\n throw new Error(`Subgraph query error: ${result.errors.map((e) => e.message).join(\", \")}`);\n }\n\n if (!result.data) {\n throw new Error(\"Subgraph returned no data\");\n }\n\n return result.data;\n}\n\n/**\n * Get all active syndicates, optionally filtered by creator.\n */\nexport async function getActiveSyndicates(\n creator?: string,\n): Promise<SubgraphSyndicate[]> {\n if (creator) {\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(\n `query($creator: String!) {\n syndicates(where: { active: true, creator: $creator }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }`,\n { creator: creator.toLowerCase() },\n );\n return data.syndicates;\n }\n\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(`\n {\n syndicates(where: { active: true }, orderBy: createdAt, orderDirection: desc, first: 100) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n }\n }\n `);\n\n return data.syndicates;\n}\n\n/**\n * Get detailed syndicate info including agents, recent deposits, and batch executions.\n */\nexport async function getSyndicateDetails(\n syndicateId: string,\n): Promise<SyndicateDetails | null> {\n const data = await query<{ syndicate: SyndicateDetails | null }>(\n `query($id: ID!) {\n syndicate(id: $id) {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n agents(first: 50) {\n id\n agentAddress\n active\n registeredAt\n totalBatches\n totalAssetAmount\n }\n deposits(first: 10, orderBy: timestamp, orderDirection: desc) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }\n }`,\n { id: syndicateId },\n );\n\n return data.syndicate;\n}\n\n/**\n * Get deposit/withdrawal history for a specific depositor across all syndicates.\n */\nexport async function getDepositorHistory(\n depositorAddress: string,\n): Promise<{ deposits: SubgraphDeposit[]; withdrawals: SubgraphDeposit[] }> {\n const addr = depositorAddress.toLowerCase();\n\n const data = await query<{\n deposits: SubgraphDeposit[];\n withdrawals: SubgraphDeposit[];\n }>(\n `query($owner: String!) {\n deposits(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n withdrawals: withdrawals(where: { owner: $owner }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }`,\n { owner: addr },\n );\n\n return { deposits: data.deposits, withdrawals: data.withdrawals };\n}\n","/**\n * Venice commands — sherwood venice <subcommand>\n *\n * Manages Venice private inference: provision API keys, check status,\n * list models, run inference.\n *\n * Venice funding uses the VeniceInferenceStrategy template via the\n * proposal flow (sherwood proposal create).\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount } from \"../lib/client.js\";\nimport { VENICE } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI, VENICE_STAKING_ABI } from \"../lib/abis.js\";\nimport { provisionApiKey, checkApiKeyValid, chatCompletion, listModels } from \"../lib/venice.js\";\nimport { getVeniceApiKey } from \"../lib/config.js\";\nimport { readFileSync } from \"node:fs\";\n\nexport function registerVeniceCommands(program: Command): void {\n const venice = program.command(\"venice\").description(\"Venice private inference — provision API keys, run inference\");\n\n // ── venice provision ──\n\n venice\n .command(\"provision\")\n .description(\"Self-provision a Venice API key (requires sVVV in wallet)\")\n .action(async () => {\n const account = getAccount();\n const client = getPublicClient();\n\n // Check sVVV balance\n const checkSpinner = ora(\"Checking sVVV balance...\").start();\n try {\n const sVvvBalance = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as bigint;\n\n if (sVvvBalance === 0n) {\n checkSpinner.fail(\"No sVVV found in wallet\");\n console.log(chalk.yellow(\" Your wallet must hold staked VVV (sVVV) to provision a Venice API key.\"));\n console.log(chalk.yellow(\" Use the VeniceInferenceStrategy via a proposal to distribute sVVV to agents.\"));\n process.exit(1);\n }\n\n checkSpinner.succeed(`sVVV balance: ${formatUnits(sVvvBalance, 18)}`);\n } catch (err) {\n checkSpinner.fail(\"Failed to check sVVV balance\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n // Provision API key\n const keySpinner = ora(\"Provisioning Venice API key...\").start();\n try {\n const apiKey = await provisionApiKey();\n keySpinner.succeed(\"Venice API key provisioned\");\n console.log(chalk.dim(` Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`));\n console.log(chalk.dim(\" Saved to ~/.sherwood/config.json\"));\n } catch (err) {\n keySpinner.fail(\"Failed to provision API key\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── venice status ──\n\n venice\n .command(\"status\")\n .description(\"Show Venice inference status: sVVV balances, DIEM, API key\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const account = getAccount();\n const spinner = ora(\"Loading Venice status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read VVV balance on vault\n const vaultVvvBalance = await client.readContract({\n address: VENICE().VVV,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [vaultAddress],\n }) as bigint;\n\n // Read per-agent sVVV balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n // Check current agent's sVVV + pending rewards\n const [mySvvv, myPending] = await Promise.all([\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"balanceOf\",\n args: [account.address],\n }) as Promise<bigint>,\n client.readContract({\n address: VENICE().STAKING,\n abi: VENICE_STAKING_ABI,\n functionName: \"pendingRewards\",\n args: [account.address],\n }) as Promise<bigint>,\n ]);\n\n // Check API key\n const apiKeyValid = await checkApiKeyValid();\n const apiKey = getVeniceApiKey();\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n console.log();\n console.log(chalk.bold(\"Venice Inference Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Profit available: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` VVV (unstaked): ${formatUnits(vaultVvvBalance, 18)}`);\n\n console.log(chalk.bold(\"\\n Agent sVVV Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 18)} sVVV`);\n }\n\n console.log(chalk.bold(\"\\n Your Wallet\"));\n console.log(` sVVV: ${formatUnits(mySvvv, 18)}`);\n console.log(` Pending rewards: ${formatUnits(myPending, 18)} VVV`);\n\n console.log(chalk.bold(\"\\n Venice API\"));\n console.log(` Key: ${apiKey ? `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}` : chalk.dim(\"not provisioned\")}`);\n console.log(` Status: ${apiKeyValid ? chalk.green(\"valid\") : chalk.red(\"invalid/missing\")}`);\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── venice models ──\n\n venice\n .command(\"models\")\n .description(\"List available Venice inference models\")\n .action(async () => {\n const spinner = ora(\"Fetching Venice models...\").start();\n try {\n const models = await listModels();\n spinner.succeed(`${models.length} models available`);\n console.log();\n for (const model of models) {\n console.log(` ${model}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to list models\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── venice infer ──\n\n venice\n .command(\"infer\")\n .description(\"Run private inference via Venice chat completions\")\n .requiredOption(\"--prompt <text>\", \"User prompt\")\n .requiredOption(\"--model <id>\", \"Venice model ID (use 'venice models' to list)\")\n .option(\"--system <text>\", \"System prompt\")\n .option(\"--data <path>\", \"Path to data file — contents prepended to prompt as context\")\n .option(\"--web-search\", \"Enable Venice web search\", false)\n .option(\"--no-thinking\", \"Disable chain-of-thought reasoning\")\n .option(\"--temperature <n>\", \"Sampling temperature (0-2)\")\n .option(\"--max-tokens <n>\", \"Maximum completion tokens\")\n .option(\"--json\", \"Output raw JSON response\", false)\n .action(async (opts) => {\n // Build messages\n const messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[] = [];\n\n if (opts.system) {\n messages.push({ role: \"system\", content: opts.system });\n }\n\n let userContent = opts.prompt;\n if (opts.data) {\n try {\n const data = readFileSync(opts.data, \"utf-8\");\n userContent = `Context data:\\n\\`\\`\\`\\n${data}\\n\\`\\`\\`\\n\\n${opts.prompt}`;\n } catch (err) {\n console.error(chalk.red(`Failed to read data file: ${opts.data}`));\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n }\n messages.push({ role: \"user\", content: userContent });\n\n const spinner = ora(`Running inference (${opts.model})...`).start();\n try {\n const result = await chatCompletion({\n model: opts.model,\n messages,\n temperature: opts.temperature !== undefined ? Number(opts.temperature) : undefined,\n maxTokens: opts.maxTokens !== undefined ? Number(opts.maxTokens) : undefined,\n enableWebSearch: opts.webSearch,\n disableThinking: opts.thinking === false,\n });\n\n spinner.succeed(\"Inference complete\");\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log();\n console.log(result.content);\n console.log();\n console.log(chalk.dim(`Model: ${result.model} | Tokens: ${result.usage.promptTokens} in, ${result.usage.completionTokens} out, ${result.usage.totalTokens} total`));\n }\n } catch (err) {\n spinner.fail(\"Inference failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Venice AI API integration — web3 key generation, validation, and inference.\n *\n * Key provisioning flow:\n * 1. GET /api_keys/generate_web3_key → validation token\n * 2. Sign token with agent wallet (EIP-191)\n * 3. POST /api_keys/generate_web3_key → API key\n *\n * Inference:\n * POST /chat/completions with Bearer auth → chat completion response\n *\n * The API key is stored in ~/.sherwood/config.json.\n * Venice requires the signing wallet to hold staked VVV (sVVV).\n */\n\nimport { getAccount } from \"./client.js\";\nimport { setVeniceApiKey, getVeniceApiKey } from \"./config.js\";\n\nconst VENICE_API_BASE = \"https://api.venice.ai/api/v1\";\n\n/**\n * Provision a Venice API key via web3 wallet signature.\n * The wallet must hold sVVV for this to succeed.\n */\nexport async function provisionApiKey(): Promise<string> {\n const account = getAccount();\n\n // 1. Get validation token\n const tokenRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n signal: AbortSignal.timeout(15_000),\n });\n if (!tokenRes.ok) {\n throw new Error(`Failed to get validation token: ${tokenRes.status} ${tokenRes.statusText}`);\n }\n const tokenData = await tokenRes.json();\n const token = tokenData?.data?.token;\n if (!token) {\n throw new Error(\"Venice API returned no validation token\");\n }\n\n // 2. Sign token with wallet (EIP-191)\n const signature = await account.signMessage({ message: token });\n\n // 3. Generate API key\n const keyRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n signal: AbortSignal.timeout(15_000),\n body: JSON.stringify({\n address: account.address,\n signature,\n token,\n apiKeyType: \"INFERENCE\",\n description: \"Sherwood syndicate agent\",\n }),\n });\n\n if (!keyRes.ok) {\n const body = await keyRes.text();\n throw new Error(`Failed to generate API key: ${keyRes.status} ${body}`);\n }\n\n const keyData = await keyRes.json();\n const apiKey = keyData?.data?.apiKey;\n if (!apiKey) {\n throw new Error(\"Venice API returned no API key\");\n }\n\n // Store in config\n setVeniceApiKey(apiKey);\n\n return apiKey;\n}\n\n/**\n * Check if the stored Venice API key is still valid.\n */\nexport async function checkApiKeyValid(): Promise<boolean> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) return false;\n\n try {\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n// ── Inference ──\n\nexport interface ChatCompletionMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatCompletionOptions {\n model: string;\n messages: ChatCompletionMessage[];\n temperature?: number;\n maxTokens?: number;\n enableWebSearch?: boolean;\n disableThinking?: boolean;\n}\n\nexport interface ChatCompletionResult {\n content: string;\n model: string;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Call Venice chat completions API for private inference.\n * Requires a provisioned API key (run `sherwood venice provision` first).\n */\nexport async function chatCompletion(opts: ChatCompletionOptions): Promise<ChatCompletionResult> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const body: Record<string, unknown> = {\n model: opts.model,\n messages: opts.messages,\n };\n if (opts.temperature !== undefined) body.temperature = opts.temperature;\n if (opts.maxTokens !== undefined) body.max_tokens = opts.maxTokens;\n\n const veniceParams: Record<string, unknown> = {};\n if (opts.enableWebSearch) veniceParams.enable_web_search = \"on\";\n if (opts.disableThinking) veniceParams.disable_thinking = true;\n if (Object.keys(veniceParams).length > 0) body.venice_parameters = veniceParams;\n\n const res = await fetch(`${VENICE_API_BASE}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n signal: AbortSignal.timeout(120_000), // inference can be slow\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`Venice inference failed: ${res.status} ${errBody}`);\n }\n\n const data = await res.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Venice returned no choices\");\n }\n\n return {\n content: choice.message?.content ?? \"\",\n model: data.model ?? opts.model,\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n}\n\n/**\n * List available Venice models.\n * Requires a provisioned API key.\n */\nexport async function listModels(): Promise<string[]> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Failed to list Venice models: ${res.status} ${res.statusText}`);\n }\n\n const data = await res.json();\n return (data.data ?? []).map((m: { id: string }) => m.id);\n}\n","/**\n * Allowance commands — sherwood allowance <subcommand>\n *\n * Disburses vault profits as USDC to agent operator wallets for\n * operational expenses (gas, x402 API payments, etc.).\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getPublicClient, getAccount } from \"../lib/client.js\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport { TOKENS } from \"../lib/addresses.js\";\nimport { SYNDICATE_VAULT_ABI, ERC20_ABI } from \"../lib/abis.js\";\nimport { getQuote, getMultiHopQuote, encodeSwapPath, applySlippage } from \"../lib/quote.js\";\nimport { formatBatch } from \"../lib/batch.js\";\nimport { executeBatch } from \"../lib/vault.js\";\nimport { buildDisburseBatch, type AllowanceDisbursConfig } from \"../strategies/allowance-disburse.js\";\n\nconst VALID_FEES = [500, 3000, 10000] as const;\n\nexport function registerAllowanceCommands(program: Command): void {\n const allowance = program.command(\"allowance\").description(\"Disburse vault profits to agent wallets\");\n\n // ── allowance disburse ──\n\n allowance\n .command(\"disburse\")\n .description(\"Swap vault profits → USDC → distribute to all agent operator wallets\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .requiredOption(\"--amount <amount>\", \"Deposit token amount to convert & distribute (e.g. 500)\")\n .option(\"--fee <tier>\", \"Fee tier for asset → USDC swap (500, 3000, 10000)\", \"3000\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"100\")\n .option(\"--execute\", \"Execute on-chain (default: simulate only)\", false)\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const fee = Number(opts.fee);\n if (!VALID_FEES.includes(fee as 500 | 3000 | 10000)) {\n console.error(chalk.red(`Invalid fee tier. Valid: ${VALID_FEES.join(\", \")}`));\n process.exit(1);\n }\n const slippageBps = Number(opts.slippage);\n\n const client = getPublicClient();\n\n // ── Read vault state ──\n\n const spinner = ora(\"Reading vault state...\").start();\n let assetAddress: Address;\n let assetDecimals: number;\n let assetSymbol: string;\n let totalDeposited: bigint;\n let assetBalance: bigint;\n let agents: Address[];\n\n try {\n [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Failed to read vault state\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n\n if (agents.length === 0) {\n console.error(chalk.red(\"No agents registered in vault. Register agents first.\"));\n process.exit(1);\n }\n\n const requestedAmount = parseUnits(opts.amount, assetDecimals);\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n\n // ── Display config ──\n\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n\n console.log();\n console.log(chalk.bold(\"Allowance Disburse\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Asset: ${assetSymbol} (${assetDecimals} decimals)`);\n console.log(` Amount: ${opts.amount} ${assetSymbol}`);\n console.log(` Vault balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n console.log(` Agents: ${agents.length} (USDC will be split equally)`);\n if (!isUsdc) {\n console.log(` Routing: ${isWeth ? `WETH → USDC (fee ${fee})` : `${assetSymbol} → WETH → USDC (fee ${fee})`}`);\n console.log(` Slippage: ${(slippageBps / 100).toFixed(2)}%`);\n }\n console.log(` Vault: ${vaultAddress}`);\n console.log();\n\n if (requestedAmount > profit) {\n console.warn(chalk.yellow(` Warning: amount (${opts.amount}) exceeds available profit (${formatUnits(profit, assetDecimals)})`));\n console.warn(chalk.yellow(\" This will use deposited capital, not just profits.\"));\n console.log();\n }\n\n // ── Get USDC amount (quote or direct) ──\n\n let minUsdc: bigint;\n let swapPath: `0x${string}` | null = null;\n\n if (isUsdc) {\n // No swap needed — distribute the asset directly\n minUsdc = requestedAmount;\n } else {\n const quoteSpinner = ora(\"Fetching Uniswap quote...\").start();\n try {\n let amountOut: bigint;\n\n if (isWeth) {\n // Single-hop: WETH → USDC\n const quote = await getQuote({\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n amountIn: requestedAmount,\n fee,\n });\n amountOut = quote.amountOut;\n } else {\n // Multi-hop: asset → WETH → USDC\n swapPath = encodeSwapPath(\n [assetAddress, TOKENS().WETH, TOKENS().USDC],\n [fee, 500], // WETH→USDC typically uses 500 (0.05%) fee tier\n );\n const quote = await getMultiHopQuote({\n path: swapPath,\n amountIn: requestedAmount,\n });\n amountOut = quote.amountOut;\n }\n\n minUsdc = applySlippage(amountOut, slippageBps);\n\n quoteSpinner.succeed(\n `Quote: ${formatUnits(amountOut, 6)} USDC ` +\n `(min: ${formatUnits(minUsdc, 6)}, per agent: ${formatUnits(minUsdc / BigInt(agents.length), 6)})`\n );\n } catch (err) {\n quoteSpinner.fail(\"Failed to fetch quote\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n }\n\n // ── Per-agent display ──\n\n const perAgent = minUsdc / BigInt(agents.length);\n if (isUsdc) {\n console.log(chalk.dim(` Per agent: ${formatUnits(perAgent, 6)} USDC`));\n console.log();\n }\n\n // ── Build batch ──\n\n const config: AllowanceDisbursConfig = {\n amount: opts.amount,\n fee,\n slippageBps,\n };\n\n const calls = buildDisburseBatch(config, vaultAddress, agents, assetAddress, assetDecimals, minUsdc, swapPath);\n\n console.log();\n console.log(chalk.bold(`Batch calls (${calls.length}):`));\n console.log(formatBatch(calls));\n console.log();\n\n // ── Execute ──\n\n if (!opts.execute) {\n console.log();\n console.log(chalk.yellow(\"Dry run complete. Add --execute to submit on-chain.\"));\n return;\n }\n\n const execSpinner = ora(\"Executing batch via vault...\").start();\n try {\n const txHash = await executeBatch(calls);\n execSpinner.succeed(`Batch executed: ${txHash}`);\n console.log(chalk.dim(` ${getExplorerUrl(txHash)}`));\n } catch (err) {\n execSpinner.fail(\"Execution failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── allowance status ──\n\n allowance\n .command(\"status\")\n .description(\"Show vault profit and agent USDC balances\")\n .requiredOption(\"--vault <address>\", \"Vault address\")\n .action(async (opts) => {\n const vaultAddress = opts.vault as Address;\n if (!isAddress(vaultAddress)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const client = getPublicClient();\n const spinner = ora(\"Loading allowance status...\").start();\n\n try {\n // Read vault state\n const [assetAddress, totalDeposited, agents] = await Promise.all([\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"asset\" }) as Promise<Address>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"totalDeposited\" }) as Promise<bigint>,\n client.readContract({ address: vaultAddress, abi: SYNDICATE_VAULT_ABI, functionName: \"getAgentAddresses\" }) as Promise<Address[]>,\n ]);\n\n const [assetDecimals, assetSymbol, assetBalance] = await Promise.all([\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"decimals\" }) as Promise<number>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"symbol\" }) as Promise<string>,\n client.readContract({ address: assetAddress, abi: ERC20_ABI, functionName: \"balanceOf\", args: [vaultAddress] }) as Promise<bigint>,\n ]);\n\n // Read per-agent USDC balances\n const agentBalances = await Promise.all(\n agents.map(async (agent) => {\n const bal = await client.readContract({\n address: TOKENS().USDC,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [agent],\n }) as bigint;\n return { agent, balance: bal };\n })\n );\n\n spinner.stop();\n\n const profit = assetBalance > totalDeposited ? assetBalance - totalDeposited : 0n;\n const account = getAccount();\n\n console.log();\n console.log(chalk.bold(\"Allowance Status\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n\n console.log(chalk.bold(\"\\n Vault\"));\n console.log(` Asset: ${assetSymbol}`);\n console.log(` Balance: ${formatUnits(assetBalance, assetDecimals)} ${assetSymbol}`);\n console.log(` Deposited: ${formatUnits(totalDeposited, assetDecimals)} ${assetSymbol}`);\n console.log(` Profit: ${formatUnits(profit, assetDecimals)} ${assetSymbol}`);\n\n console.log(chalk.bold(\"\\n Agent USDC Balances\"));\n for (const { agent, balance } of agentBalances) {\n const isMe = agent.toLowerCase() === account.address.toLowerCase();\n const label = isMe ? chalk.green(`${agent} (you)`) : agent;\n console.log(` ${label}: ${formatUnits(balance, 6)} USDC`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load status\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Uniswap V3 Quoter V2 integration for swap quotes.\n *\n * quoteExactInputSingle is NOT a view function — it reverts internally\n * after computing the quote. Must use eth_call to get the return data.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, decodeFunctionResult, concat, pad, numberToHex } from \"viem\";\nimport { getPublicClient } from \"./client.js\";\nimport { UNISWAP_QUOTER_V2_ABI } from \"./abis.js\";\nimport { UNISWAP } from \"./addresses.js\";\n\nexport interface QuoteResult {\n amountOut: bigint;\n sqrtPriceX96After: bigint;\n gasEstimate: bigint;\n}\n\n/**\n * Get a swap quote from Uniswap Quoter V2.\n */\nexport async function getQuote(params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n fee: number;\n}): Promise<QuoteResult> {\n const client = getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n args: [\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: 0n,\n },\n ],\n });\n\n const { data } = await client.call({\n to: UNISWAP().QUOTER_V2,\n data: calldata,\n });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this pair/fee\");\n }\n\n const [amountOut, sqrtPriceX96After, , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInputSingle\",\n data,\n }) as [bigint, bigint, number, bigint];\n\n return { amountOut, sqrtPriceX96After, gasEstimate };\n}\n\n/**\n * Apply slippage tolerance to a quote amount.\n * Returns the minimum acceptable output amount.\n */\nexport function applySlippage(amountOut: bigint, slippageBps: number): bigint {\n return (amountOut * BigInt(10000 - slippageBps)) / 10000n;\n}\n\n/**\n * Encode a Uniswap V3 multi-hop swap path.\n * Format: abi.encodePacked(address, uint24, address, uint24, address, ...)\n */\nexport function encodeSwapPath(tokens: Address[], fees: number[]): Hex {\n if (tokens.length < 2 || fees.length !== tokens.length - 1) {\n throw new Error(\"Invalid path: need at least 2 tokens and (tokens-1) fees\");\n }\n\n const parts: Hex[] = [];\n for (let i = 0; i < tokens.length; i++) {\n // Address: 20 bytes (no padding)\n parts.push(tokens[i].toLowerCase() as Hex);\n if (i < fees.length) {\n // Fee: 3 bytes (uint24), left-padded to 3 bytes\n parts.push(pad(numberToHex(fees[i]), { size: 3 }) as Hex);\n }\n }\n return concat(parts);\n}\n\n/**\n * Get a multi-hop swap quote from Uniswap Quoter V2.\n */\nexport async function getMultiHopQuote(params: {\n path: Hex;\n amountIn: bigint;\n}): Promise<QuoteResult> {\n const client = getPublicClient();\n\n const calldata = encodeFunctionData({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n args: [params.path, params.amountIn],\n });\n\n const { data } = await client.call({\n to: UNISWAP().QUOTER_V2,\n data: calldata,\n });\n\n if (!data) {\n throw new Error(\"Quoter returned no data — pool may not exist for this path\");\n }\n\n const [amountOut, , , gasEstimate] = decodeFunctionResult({\n abi: UNISWAP_QUOTER_V2_ABI,\n functionName: \"quoteExactInput\",\n data,\n }) as [bigint, bigint[], number[], bigint];\n\n return { amountOut, sqrtPriceX96After: 0n, gasEstimate };\n}\n\n/** Token decimals for display purposes. */\nexport const TOKEN_DECIMALS: Record<string, number> = {\n USDC: 6,\n WETH: 18,\n cbETH: 18,\n wstETH: 18,\n cbBTC: 8,\n DAI: 18,\n AERO: 18,\n};\n","/**\n * Allowance Disburse Strategy — swap vault profits to USDC and distribute to agents.\n *\n * If the vault's deposit token is already USDC, transfers directly to each agent.\n * Otherwise, swaps asset → USDC via Uniswap V3 (single-hop or multi-hop via WETH),\n * then distributes USDC equally to each agent's operator wallet.\n *\n * Agents use USDC for operational expenses: gas, x402 API payments, etc.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeFunctionData, parseUnits } from \"viem\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { TOKENS, UNISWAP } from \"../lib/addresses.js\";\n\n// ── Strategy Config ──\n\nexport interface AllowanceDisbursConfig {\n /** Deposit token amount to convert & distribute (human-readable, e.g. \"500\") */\n amount: string;\n /** Fee tier for asset → USDC swap (ignored if asset = USDC) */\n fee: number;\n /** Max slippage in basis points (e.g. 100 = 1%) */\n slippageBps: number;\n}\n\n// ── ABIs (minimal, for encoding batch calls) ──\n\nconst ERC20_ABI = [\n {\n name: \"approve\",\n type: \"function\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"transfer\",\n type: \"function\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI = [\n {\n name: \"exactInputSingle\",\n type: \"function\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"tokenIn\", type: \"address\" },\n { name: \"tokenOut\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n { name: \"sqrtPriceLimitX96\", type: \"uint160\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_EXACT_INPUT_ABI = [\n {\n name: \"exactInput\",\n type: \"function\",\n inputs: [\n {\n name: \"params\",\n type: \"tuple\",\n components: [\n { name: \"path\", type: \"bytes\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"amountIn\", type: \"uint256\" },\n { name: \"amountOutMinimum\", type: \"uint256\" },\n ],\n },\n ],\n outputs: [{ name: \"amountOut\", type: \"uint256\" }],\n },\n] as const;\n\n// ── Batch Builder ──\n\n/**\n * Build the allowance disburse batch.\n *\n * @param config - Strategy parameters\n * @param vaultAddress - Vault contract address (delegatecall identity)\n * @param agents - Agent operator EOA addresses to receive USDC\n * @param assetAddress - Vault's deposit token address\n * @param assetDecimals - Deposit token decimals\n * @param minUsdc - Minimum USDC output (post-slippage), or raw amount if asset IS USDC\n * @param swapPath - Encoded Uniswap V3 path for multi-hop (null if single-hop or no swap)\n */\nexport function buildDisburseBatch(\n config: AllowanceDisbursConfig,\n vaultAddress: Address,\n agents: Address[],\n assetAddress: Address,\n assetDecimals: number,\n minUsdc: bigint,\n swapPath: Hex | null,\n): BatchCall[] {\n const assetAmount = parseUnits(config.amount, assetDecimals);\n const isUsdc = assetAddress.toLowerCase() === TOKENS().USDC.toLowerCase();\n const isWeth = assetAddress.toLowerCase() === TOKENS().WETH.toLowerCase();\n const calls: BatchCall[] = [];\n\n if (!isUsdc) {\n // 1. Approve SwapRouter to spend vault asset\n calls.push({\n target: assetAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, assetAmount],\n }),\n value: 0n,\n });\n\n // 2. Swap asset → USDC\n if (isWeth) {\n // Single-hop: WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_SINGLE_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: TOKENS().WETH,\n tokenOut: TOKENS().USDC,\n fee: config.fee,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n });\n } else {\n // Multi-hop: asset → WETH → USDC\n calls.push({\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_EXACT_INPUT_ABI,\n functionName: \"exactInput\",\n args: [\n {\n path: swapPath!,\n recipient: vaultAddress,\n amountIn: assetAmount,\n amountOutMinimum: minUsdc,\n },\n ],\n }),\n value: 0n,\n });\n }\n }\n\n // 3. Transfer USDC to each agent equally\n const perAgent = minUsdc / BigInt(agents.length);\n for (const agent of agents) {\n calls.push({\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [agent, perAgent],\n }),\n value: 0n,\n });\n }\n\n return calls;\n}\n","/**\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 syndicates.\n */\n\nimport { Command } from \"commander\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { SDK } from \"agent0-sdk\";\nimport { getPublicClient, getAccount } from \"../lib/client.js\";\nimport { getExplorerUrl, getChain, getRpcUrl } from \"../lib/network.js\";\nimport { AGENT_REGISTRY } from \"../lib/addresses.js\";\nimport { setAgentId, getAgentId, loadConfig } from \"../lib/config.js\";\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 // Read key from config first, env var as fallback\n const config = loadConfig();\n const key = config.privateKey || process.env.PRIVATE_KEY;\n if (!key) {\n throw new Error(\n \"Private key not found. Run 'sherwood config set --private-key <key>' or set PRIVATE_KEY env var.\",\n );\n }\n\n return new SDK({\n chainId: getChain().id,\n rpcUrl: getRpcUrl(),\n privateKey: key.startsWith(\"0x\") ? key : `0x${key}`,\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 syndicates)\")\n .requiredOption(\"--name <name>\", \"Agent name (e.g. 'Alpha Seeker Agent')\")\n .option(\"--description <desc>\", \"Agent description\", \"Sherwood syndicate agent\")\n .option(\"--image <uri>\", \"Agent image URI (IPFS recommended)\")\n .action(async (opts) => {\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 const spinner = ora(\"Initializing Agent0 SDK...\").start();\n try {\n const sdk = getAgent0SDK();\n\n // Create agent with metadata\n spinner.text = \"Creating agent profile...\";\n const agent = sdk.createAgent(opts.name, opts.description, opts.image);\n\n // Register on-chain (mints ERC-8004 NFT)\n spinner.text = \"Registering on-chain (minting ERC-8004 identity)...\";\n const txHandle = await agent.registerOnChain();\n\n spinner.text = \"Waiting for confirmation...\";\n await txHandle.waitMined();\n\n const agentId = agent.agentId;\n if (!agentId) {\n spinner.warn(\"Identity registered but could not read agentId\");\n console.log(chalk.dim(\" Check the transaction on the explorer.\"));\n return;\n }\n\n // Agent0 agentId format is \"chainId:tokenId\" — extract the token ID\n const tokenId = Number(agentId.includes(\":\") ? agentId.split(\":\")[1] : agentId);\n\n // Save to config\n setAgentId(tokenId);\n\n spinner.succeed(`Agent identity registered: #${tokenId}`);\n console.log(chalk.dim(` Agent0 ID: ${agentId}`));\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 syndicates:\"));\n console.log(chalk.dim(` sherwood syndicate create --agent-id ${tokenId} --subdomain <name> --name <name>`));\n } catch (err) {\n spinner.fail(\"Failed to register identity\");\n console.error(chalk.red(err instanceof Error ? err.message : String(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 client = getPublicClient();\n const registry = AGENT_REGISTRY().IDENTITY_REGISTRY;\n const tokenId = Number(opts.id);\n\n const spinner = ora(`Verifying ownership of agent #${tokenId}...`).start();\n try {\n const owner = await client.readContract({\n address: registry,\n abi: IDENTITY_REGISTRY_ABI,\n functionName: \"ownerOf\",\n args: [BigInt(tokenId)],\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(err instanceof Error ? err.message : String(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 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 } else {\n console.log(` Saved ID: ${chalk.dim(\"none — run 'sherwood identity mint --name <name>'\")}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to check identity\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n","/**\n * Proposal commands — sherwood proposal <subcommand>\n *\n * Manages the full proposal lifecycle: create, list, show, vote,\n * execute, settle, cancel.\n */\n\nimport { Command } from \"commander\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFileSync } from \"node:fs\";\nimport { getAccount } from \"../lib/client.js\";\nimport { getExplorerUrl, getNetwork } from \"../lib/network.js\";\nimport { uploadMetadata } from \"../lib/ipfs.js\";\nimport type { SyndicateMetadata } from \"../lib/ipfs.js\";\nimport { fetchMetadata } from \"../lib/ipfs.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getProposal,\n getProposalState,\n proposalCount,\n propose,\n vote,\n executeProposal,\n settleProposal,\n emergencySettle,\n getExecuteCalls,\n getSettlementCalls,\n cancelProposal,\n emergencyCancel,\n getVoteWeight,\n hasVoted,\n getCapitalSnapshot,\n parseDuration,\n PROPOSAL_STATES,\n PROPOSAL_STATE,\n VOTE_TYPE,\n} from \"../lib/governor.js\";\nimport type { BatchCall } from \"../lib/governor.js\";\nimport { formatDurationShort as formatDuration, formatShares, formatUSDC, parseBigIntArg } from \"../lib/format.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nfunction formatTimestamp(ts: bigint): string {\n if (ts === 0n) return \"—\";\n return new Date(Number(ts) * 1000).toLocaleString();\n}\n\nfunction parseCallsFile(path: string): BatchCall[] {\n const raw = readFileSync(path, \"utf-8\");\n const parsed = JSON.parse(raw) as { target: string; data: string; value: string }[];\n return parsed.map((c) => ({\n target: c.target as Address,\n data: c.data as Hex,\n value: BigInt(c.value || \"0\"),\n }));\n}\n\nexport function registerProposalCommands(program: Command): void {\n const proposal = program.command(\"proposal\").description(\"Governance proposals — create, vote, execute, settle\");\n\n // ── proposal create ──\n\n proposal\n .command(\"create\")\n .description(\"Submit a strategy proposal\")\n .requiredOption(\"--vault <address>\", \"Vault address the proposal targets\")\n .requiredOption(\"--name <name>\", \"Strategy name\")\n .requiredOption(\"--description <text>\", \"Strategy rationale and risk summary\")\n .requiredOption(\"--performance-fee <bps>\", \"Agent fee in bps (e.g. 1500 = 15%)\")\n .requiredOption(\"--duration <duration>\", \"Strategy duration (e.g. 7d, 24h, 3600)\")\n .requiredOption(\"--execute-calls <path>\", \"Path to JSON file with execute Call[] array\")\n .requiredOption(\"--settle-calls <path>\", \"Path to JSON file with settlement Call[] array\")\n .option(\"--metadata-uri <uri>\", \"Override — skip IPFS upload and use this URI directly\")\n .action(async (opts) => {\n try {\n const vault = opts.vault as Address;\n if (!isAddress(vault)) {\n console.error(chalk.red(`Invalid vault address: ${opts.vault}`));\n process.exit(1);\n }\n\n const performanceFeeBps = parseBigIntArg(opts.performanceFee, \"performance-fee\");\n const strategyDuration = parseDuration(opts.duration);\n const executeCalls = parseCallsFile(opts.executeCalls);\n const settleCalls = parseCallsFile(opts.settleCalls);\n\n // ── Pin metadata ──\n let metadataURI = opts.metadataUri || \"\";\n\n if (!metadataURI) {\n const spinner = ora({ text: W(\"Uploading metadata to IPFS...\"), color: \"green\" }).start();\n try {\n const account = getAccount();\n const metadata: SyndicateMetadata = {\n schema: \"sherwood/proposal/v1\",\n name: opts.name,\n description: opts.description,\n chain: getNetwork(),\n strategies: [],\n terms: {},\n links: {},\n };\n // Attach proposal-specific fields\n const proposalMeta = {\n ...metadata,\n proposer: account.address,\n vault,\n performanceFeeBps: Number(performanceFeeBps),\n strategyDuration: Number(strategyDuration),\n createdAt: Math.floor(Date.now() / 1000),\n };\n // Use the existing upload function — it accepts SyndicateMetadata shape\n metadataURI = await uploadMetadata(proposalMeta as unknown as SyndicateMetadata);\n spinner.succeed(G(`Metadata pinned: ${DIM(metadataURI)}`));\n } catch (err) {\n spinner.warn(chalk.yellow(\"IPFS upload failed — using inline metadata\"));\n const json = JSON.stringify({ name: opts.name, description: opts.description, vault });\n metadataURI = `data:application/json;base64,${Buffer.from(json).toString(\"base64\")}`;\n }\n }\n\n // ── Summary ──\n console.log();\n console.log(LABEL(\" ◆ Proposal Summary\"));\n SEP();\n console.log(W(` Name: ${BOLD(opts.name)}`));\n console.log(W(` Vault: ${G(vault)}`));\n console.log(W(` Performance Fee: ${Number(performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(strategyDuration)}`));\n console.log(W(` Calls: ${executeCalls.length} execute + ${settleCalls.length} settle`));\n console.log(W(` Metadata: ${DIM(metadataURI.length > 50 ? metadataURI.slice(0, 50) + \"...\" : metadataURI)}`));\n SEP();\n\n // ── Submit ──\n const spinner = ora({ text: W(\"Submitting proposal...\"), color: \"green\" }).start();\n const result = await propose(vault, metadataURI, performanceFeeBps, strategyDuration, executeCalls, settleCalls);\n spinner.succeed(G(\"Proposal submitted\"));\n\n console.log();\n console.log(LABEL(\" ◆ Proposal Created\"));\n SEP();\n console.log(W(` Proposal ID: ${G(`#${result.proposalId}`)}`));\n console.log(W(` Tx: ${DIM(getExplorerUrl(result.hash))}`));\n SEP();\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal list ──\n\n proposal\n .command(\"list\")\n .description(\"List proposals\")\n .option(\"--vault <address>\", \"Filter by vault\")\n .option(\"--state <filter>\", \"Filter by state: draft, pending, approved, executed, settled, all\", \"all\")\n .action(async (opts) => {\n const spinner = ora(\"Loading proposals...\").start();\n try {\n const count = await proposalCount();\n if (count === 0n) {\n spinner.stop();\n console.log(DIM(\"\\n No proposals found.\\n\"));\n return;\n }\n\n const vaultFilter = opts.vault ? (opts.vault as string).toLowerCase() : null;\n const stateFilter = opts.state.toLowerCase();\n const stateIndex = PROPOSAL_STATES.findIndex((s) => s.toLowerCase() === stateFilter);\n\n // Fetch all proposals + computed states concurrently\n const ids = Array.from({ length: Number(count) }, (_, i) => BigInt(i + 1));\n const results = await Promise.all(\n ids.map(async (id) => {\n const [p, state] = await Promise.all([getProposal(id), getProposalState(id)]);\n return { ...p, computedState: state };\n }),\n );\n\n const proposals = results.filter((p) => {\n if (vaultFilter && p.vault.toLowerCase() !== vaultFilter) return false;\n if (stateFilter !== \"all\" && stateIndex >= 0 && p.computedState !== stateIndex) return false;\n return true;\n });\n\n spinner.stop();\n\n if (proposals.length === 0) {\n console.log(DIM(\"\\n No matching proposals.\\n\"));\n return;\n }\n\n console.log();\n console.log(BOLD(`Proposals (${proposals.length})`));\n console.log(DIM(\"─\".repeat(90)));\n console.log(\n DIM(\" ID \") +\n DIM(\"Agent\".padEnd(14)) +\n DIM(\"State\".padEnd(12)) +\n DIM(\"Votes (For/Against)\".padEnd(22)) +\n DIM(\"Fee\".padEnd(8)) +\n DIM(\"Duration\".padEnd(10)) +\n DIM(\"Created\"),\n );\n console.log(DIM(\"─\".repeat(90)));\n\n for (const p of proposals) {\n const state = PROPOSAL_STATES[p.computedState] || \"Unknown\";\n const created = p.snapshotTimestamp > 0n\n ? new Date(Number(p.snapshotTimestamp) * 1000).toLocaleDateString()\n : \"—\";\n const agent = `${p.proposer.slice(0, 6)}...${p.proposer.slice(-4)}`;\n const fee = `${Number(p.performanceFeeBps) / 100}%`;\n const dur = formatDuration(p.strategyDuration);\n const votes = `${formatShares(p.votesFor)}/${formatShares(p.votesAgainst)}`;\n\n console.log(\n ` ${String(p.id).padEnd(4)}` +\n `${agent.padEnd(14)}` +\n `${state.padEnd(12)}` +\n `${votes.padEnd(22)}` +\n `${fee.padEnd(8)}` +\n `${dur.padEnd(10)}` +\n `${created}`,\n );\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposals\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── proposal show ──\n\n proposal\n .command(\"show\")\n .description(\"Show full proposal details\")\n .argument(\"<id>\", \"Proposal ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading proposal...\").start();\n try {\n const id = parseBigIntArg(idStr, \"proposal ID\");\n const p = await getProposal(id);\n const state = await getProposalState(id);\n const params = await getGovernorParams();\n\n spinner.stop();\n\n const stateLabel = PROPOSAL_STATES[state] || \"Unknown\";\n const totalVotes = p.votesFor + p.votesAgainst;\n const quorumNeeded = totalVotes > 0n ? `${Number(params.vetoThresholdBps) / 100}%` : \"—\";\n\n console.log();\n console.log(LABEL(` ◆ Proposal #${p.id}`));\n SEP();\n\n // Try to resolve IPFS metadata\n if (p.metadataURI && p.metadataURI.startsWith(\"ipfs://\")) {\n try {\n const meta = await fetchMetadata(p.metadataURI);\n console.log(W(` Name: ${BOLD(meta.name)}`));\n console.log(W(` Description: ${DIM(meta.description)}`));\n } catch {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n } else if (p.metadataURI) {\n console.log(W(` Metadata: ${DIM(p.metadataURI)}`));\n }\n\n console.log(W(` State: ${BOLD(stateLabel)}`));\n console.log(W(` Proposer: ${G(p.proposer)}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(` Performance Fee: ${Number(p.performanceFeeBps) / 100}%`));\n console.log(W(` Duration: ${formatDuration(p.strategyDuration)}`));\n\n console.log();\n console.log(LABEL(\" Timestamps\"));\n console.log(W(` Snapshot: ${formatTimestamp(p.snapshotTimestamp)}`));\n console.log(W(` Vote End: ${formatTimestamp(p.voteEnd)}`));\n console.log(W(` Execute By: ${formatTimestamp(p.executeBy)}`));\n console.log(W(` Executed At: ${formatTimestamp(p.executedAt)}`));\n\n console.log();\n console.log(LABEL(\" Votes\"));\n console.log(W(` For: ${formatShares(p.votesFor)}`));\n console.log(W(` Against: ${formatShares(p.votesAgainst)}`));\n console.log(W(` Abstain: ${formatShares(p.votesAbstain)}`));\n console.log(W(` Veto Threshold: ${quorumNeeded}`));\n\n if (state === PROPOSAL_STATE.Executed || state === PROPOSAL_STATE.Settled) {\n try {\n const cap = await getCapitalSnapshot(id);\n console.log();\n console.log(LABEL(\" Capital\"));\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(W(` Snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot */ }\n }\n\n const execCalls = await getExecuteCalls(id);\n const settlCalls = await getSettlementCalls(id);\n\n console.log();\n console.log(LABEL(` Execute Calls (${execCalls.length})`));\n for (let i = 0; i < execCalls.length; i++) {\n console.log(DIM(` [${i}] target=${execCalls[i].target}`));\n console.log(DIM(` data=${execCalls[i].data.slice(0, 20)}... value=${execCalls[i].value}`));\n }\n console.log(LABEL(` Settlement Calls (${settlCalls.length})`));\n for (let i = 0; i < settlCalls.length; i++) {\n console.log(DIM(` [${i}] target=${settlCalls[i].target}`));\n console.log(DIM(` data=${settlCalls[i].data.slice(0, 20)}... value=${settlCalls[i].value}`));\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load proposal\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── proposal vote ──\n\n proposal\n .command(\"vote\")\n .description(\"Cast a vote on a pending proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .requiredOption(\"--support <for|against|abstain>\", \"Vote direction: for, against, or abstain\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const supportRaw = String(opts.support).toLowerCase();\n const support = supportRaw === \"yes\" || supportRaw === \"for\"\n ? VOTE_TYPE.For\n : supportRaw === \"no\" || supportRaw === \"against\"\n ? VOTE_TYPE.Against\n : supportRaw === \"abstain\"\n ? VOTE_TYPE.Abstain\n : null;\n if (support === null) {\n console.error(chalk.red(`Invalid support value \"${opts.support}\". Use for|against|abstain.`));\n process.exit(1);\n }\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Pending`);\n process.exit(1);\n }\n\n const alreadyVoted = await hasVoted(proposalId, account.address);\n if (alreadyVoted) {\n spinner.fail(\"You have already voted on this proposal\");\n process.exit(1);\n }\n\n const weight = await getVoteWeight(proposalId, account.address);\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Cast Vote\"));\n SEP();\n console.log(W(` Proposal: #${proposalId}`));\n console.log(W(` Vault: ${G(p.vault)}`));\n console.log(W(\n ` Support: ${\n support === VOTE_TYPE.For ? G(\"FOR\")\n : support === VOTE_TYPE.Against ? chalk.red(\"AGAINST\")\n : DIM(\"ABSTAIN\")\n }`,\n ));\n console.log(W(` Weight: ${formatShares(weight)} shares`));\n SEP();\n\n const voteSpinner = ora({ text: W(\"Submitting vote...\"), color: \"green\" }).start();\n const hash = await vote(proposalId, support);\n voteSpinner.succeed(G(\"Vote cast\"));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal execute ──\n\n proposal\n .command(\"execute\")\n .description(\"Execute an approved proposal\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Approved) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Approved`);\n process.exit(1);\n }\n\n spinner.text = W(\"Executing proposal...\");\n const hash = await executeProposal(proposalId);\n spinner.succeed(G(\"Proposal executed\"));\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n\n try {\n const cap = await getCapitalSnapshot(proposalId);\n // TODO: formatUSDC hardcodes 6 decimals — should use the vault's actual asset decimals\n console.log(DIM(` Capital snapshot: ${formatUSDC(cap)}`));\n } catch { /* no snapshot yet */ }\n\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal settle ──\n\n proposal\n .command(\"settle\")\n .description(\"Settle an executed proposal (auto-routes settlement path)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--calls <path>\", \"Path to JSON file with settle Call[] (for agent/emergency settle)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n const account = getAccount();\n\n const spinner = ora(\"Loading proposal...\").start();\n const p = await getProposal(proposalId);\n const state = await getProposalState(proposalId);\n\n if (state !== PROPOSAL_STATE.Executed) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"}, not Executed`);\n process.exit(1);\n }\n\n const isProposer = account.address.toLowerCase() === p.proposer.toLowerCase();\n const now = BigInt(Math.floor(Date.now() / 1000));\n const durationElapsed = p.executedAt > 0n && now >= p.executedAt + p.strategyDuration;\n\n let hash: Hex;\n\n if (isProposer && !durationElapsed) {\n // Proposer can settle anytime\n spinner.text = W(\"Settling (proposer)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled by proposer\"));\n } else if (durationElapsed && !opts.calls) {\n // Permissionless settle after duration\n spinner.text = W(\"Settling (permissionless)...\");\n hash = await settleProposal(proposalId);\n spinner.succeed(G(\"Settled (permissionless)\"));\n } else if (durationElapsed && opts.calls) {\n // Emergency settle — owner with custom calls\n spinner.text = W(\"Emergency settling...\");\n const calls = parseCallsFile(opts.calls);\n hash = await emergencySettle(proposalId, calls);\n spinner.succeed(G(\"Emergency settled\"));\n } else {\n spinner.fail(\"Cannot settle: duration not elapsed and you are not the proposer.\");\n process.exit(1);\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\n // ── proposal cancel ──\n\n proposal\n .command(\"cancel\")\n .description(\"Cancel a proposal (proposer or vault owner)\")\n .requiredOption(\"--id <proposalId>\", \"Proposal ID\")\n .option(\"--emergency\", \"Emergency cancel (vault owner only, any non-settled state)\")\n .action(async (opts) => {\n try {\n const proposalId = parseBigIntArg(opts.id, \"proposal ID\");\n\n const spinner = ora(\"Loading proposal...\").start();\n const state = await getProposalState(proposalId);\n\n if (state === PROPOSAL_STATE.Settled || state === PROPOSAL_STATE.Cancelled) {\n spinner.fail(`Proposal is already ${PROPOSAL_STATES[state]}`);\n process.exit(1);\n }\n\n let hash: Hex;\n\n if (opts.emergency) {\n spinner.text = W(\"Emergency cancelling...\");\n hash = await emergencyCancel(proposalId);\n spinner.succeed(G(\"Emergency cancelled\"));\n } else {\n if (state !== PROPOSAL_STATE.Draft && state !== PROPOSAL_STATE.Pending) {\n spinner.fail(`Proposal is ${PROPOSAL_STATES[state] || \"Unknown\"} — use --emergency for non-pending/approved`);\n process.exit(1);\n }\n spinner.text = W(\"Cancelling proposal...\");\n hash = await cancelProposal(proposalId);\n spinner.succeed(G(\"Proposal cancelled\"));\n }\n\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n console.log();\n } catch (err) {\n console.error(chalk.red(`\\n ✖ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n}\n","/**\n * Shared formatting helpers for CLI output.\n */\n\n/** Compact duration: \"3d\", \"2.5h\", \"15m\", \"30s\" */\nexport function formatDurationShort(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)}d`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)}h`;\n if (s >= 60) return `${(s / 60).toFixed(0)}m`;\n return `${s}s`;\n}\n\n/** Verbose duration: \"3 days\", \"2.5 hours\", \"15 min\", \"30s\" */\nexport function formatDurationLong(seconds: bigint): string {\n const s = Number(seconds);\n if (s >= 86400) return `${(s / 86400).toFixed(s % 86400 === 0 ? 0 : 1)} day${s >= 172800 ? \"s\" : \"\"}`;\n if (s >= 3600) return `${(s / 3600).toFixed(s % 3600 === 0 ? 0 : 1)} hour${s >= 7200 ? \"s\" : \"\"}`;\n if (s >= 60) return `${(s / 60).toFixed(0)} min`;\n return `${s}s`;\n}\n\n/** Format raw share amounts to human-readable (e.g. 124000000000 → \"124,000\") */\nexport function formatShares(raw: bigint, decimals: number = 6): string {\n const num = Number(raw) / 10 ** decimals;\n return num.toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n}\n\n/** Format USDC amount (6 decimals) to human-readable (e.g. 50000000000 → \"$50,000.00\") */\nexport function formatUSDC(raw: bigint): string {\n const num = Number(raw) / 1e6;\n return `$${num.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/** Validate string as BigInt, throw user-friendly error */\nexport function parseBigIntArg(value: string, name: string): bigint {\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(`Invalid ${name}: \"${value}\" is not a valid integer`);\n }\n return BigInt(value);\n}\n","/**\n * Governor commands — sherwood governor <subcommand>\n *\n * View and manage SyndicateGovernor parameters (owner-only setters).\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getExplorerUrl } from \"../lib/network.js\";\nimport {\n getGovernorAddress,\n getGovernorParams,\n getRegisteredVaults,\n setVotingPeriod,\n setExecutionWindow,\n setVetoThresholdBps,\n setProtocolFeeBps,\n setMaxPerformanceFeeBps,\n setMaxStrategyDuration,\n setCooldownPeriod,\n} from \"../lib/governor.js\";\nimport { formatDurationLong as formatDuration, parseBigIntArg } from \"../lib/format.js\";\n\nconst G = chalk.green;\nconst W = chalk.white;\nconst DIM = chalk.gray;\nconst BOLD = chalk.white.bold;\nconst LABEL = chalk.green.bold;\nconst SEP = () => console.log(DIM(\"─\".repeat(60)));\n\nexport function registerGovernorCommands(program: Command): void {\n const governor = program.command(\"governor\").description(\"Governor parameters and vault management\");\n\n // ── governor info ──\n\n governor\n .command(\"info\")\n .description(\"Display current governor parameters and registered vaults\")\n .action(async () => {\n const spinner = ora(\"Loading governor info...\").start();\n try {\n const [params, vaults] = await Promise.all([\n getGovernorParams(),\n getRegisteredVaults(),\n ]);\n\n spinner.stop();\n\n console.log();\n console.log(LABEL(\" ◆ Governor Parameters\"));\n SEP();\n console.log(W(` Address: ${G(getGovernorAddress())}`));\n console.log(W(` Voting Period: ${BOLD(formatDuration(params.votingPeriod))}`));\n console.log(W(` Execution Window: ${BOLD(formatDuration(params.executionWindow))}`));\n console.log(W(` Veto Threshold: ${BOLD(`${Number(params.vetoThresholdBps) / 100}%`)}`));\n console.log(W(` Max Performance Fee: ${BOLD(`${Number(params.maxPerformanceFeeBps) / 100}%`)}`));\n console.log(W(` Max Strategy Duration:${BOLD(` ${formatDuration(params.maxStrategyDuration)}`)}`));\n console.log(W(` Cooldown Period: ${BOLD(formatDuration(params.cooldownPeriod))}`));\n\n console.log();\n console.log(LABEL(` Registered Vaults (${vaults.length})`));\n if (vaults.length === 0) {\n console.log(DIM(\" (none)\"));\n } else {\n for (const v of vaults) {\n console.log(W(` ${G(v)}`));\n }\n }\n\n SEP();\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load governor info\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-voting-period ──\n\n governor\n .command(\"set-voting-period\")\n .description(\"Set the voting period (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New voting period in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting voting period...\").start();\n try {\n const hash = await setVotingPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Voting period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set voting period\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-execution-window ──\n\n governor\n .command(\"set-execution-window\")\n .description(\"Set the execution window (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New execution window in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting execution window...\").start();\n try {\n const hash = await setExecutionWindow(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Execution window change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set execution window\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-veto-threshold ──\n\n governor\n .command(\"set-veto-threshold\")\n .description(\"Set the veto threshold in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New veto threshold in bps (e.g. 4000 = 40%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting veto threshold...\").start();\n try {\n const hash = await setVetoThresholdBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Veto threshold change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set veto threshold\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-fee ──\n\n governor\n .command(\"set-max-fee\")\n .description(\"Set the max performance fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New max fee in bps (e.g. 3000 = 30%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max fee...\").start();\n try {\n const hash = await setMaxPerformanceFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Max performance fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max fee\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-max-duration ──\n\n governor\n .command(\"set-max-duration\")\n .description(\"Set the max strategy duration in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New max duration in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting max duration...\").start();\n try {\n const hash = await setMaxStrategyDuration(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Max strategy duration change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set max duration\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-cooldown ──\n\n governor\n .command(\"set-cooldown\")\n .description(\"Set the cooldown period in seconds (owner only)\")\n .requiredOption(\"--seconds <n>\", \"New cooldown in seconds\")\n .action(async (opts) => {\n const spinner = ora(\"Setting cooldown...\").start();\n try {\n const hash = await setCooldownPeriod(parseBigIntArg(opts.seconds, \"seconds\"));\n spinner.succeed(G(`Cooldown period change queued (${opts.seconds}s). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set cooldown\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\n // ── governor set-protocol-fee ──\n\n governor\n .command(\"set-protocol-fee\")\n .description(\"Set the protocol fee in bps (owner only)\")\n .requiredOption(\"--bps <n>\", \"New protocol fee in bps (e.g. 500 = 5%, max 1000 = 10%)\")\n .action(async (opts) => {\n const spinner = ora(\"Setting protocol fee...\").start();\n try {\n const hash = await setProtocolFeeBps(parseBigIntArg(opts.bps, \"bps\"));\n spinner.succeed(G(`Protocol fee change queued (${Number(opts.bps) / 100}%). Finalize after the timelock delay with \\`sherwood governor finalize-param\\`.`));\n console.log(DIM(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Failed to set protocol fee\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,UAAU,kBAAkB;AAErC,SAAS,qBAAqB;AAG9B,SAAS,SAAS,cAAc;AAChC,SAAS,cAAAA,aAAY,aAAAC,kBAAiB;AAEtC,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,OAAO,SAAS,cAAc;;;ACRvC,SAAS,MAAM,mBAAmB;AAI3B,IAAM,mBAAN,MAAkD;AAAA,EACvD,OAAqB;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAiB,CAAC,MAAM,WAAW;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,QAA0C;AAEhE,UAAM,IAAI,MAAM,4CAAuC;AAAA,EACzD;AAAA,EAEA,MAAM,OAAO,QAAyC;AACpD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAM,MAAM,QAAwC;AAClD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAM,mBAAmB,QAA2C;AAClE,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,MAAM,YAAY,SAA4C;AAC5D,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;;;ACxCA,SAAS,QAAAC,OAAM,eAAAC,oBAAmB;AAG3B,IAAM,kBAAN,MAAiD;AAAA,EACtD,OAAqB;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAiB,CAACD,OAAMC,YAAW;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAAuC;AAEhD,UAAM,IAAI,MAAM,4CAAuC;AAAA,EACzD;AAAA,EAEA,MAAM,MAAM,QAA6C;AACvD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;;;ACjBA,SAAS,YAAY,WAAW,gBAAgB;AAChD,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,SAAS,eAAe,iBAAiB;AACzC,SAAS,eAAe;;;ACPxB,SAAS,cAAc;AAUvB,eAAsB,cACpB,UACwC;AAIxC,QAAM,eAAe,OAAO;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAS,gBAAgB;AAC/B,QAAM,UAAU,WAAW;AAC3B,QAAM,QAAQ,SAAS;AAEvB,QAAM,OAAO,MAAM,OAAO,gBAAgB;AAAA,IACxC;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU,MAAM,gBAAgB,EAAE,0BAA0B,EAAE,KAAK,CAAC;AAE1E,MAAI,CAAC,QAAQ,iBAAiB;AAC5B,UAAM,IAAI,MAAM,sEAAiE,IAAI,GAAG;AAAA,EAC1F;AAEA,SAAO,EAAE,OAAO,QAAQ,iBAAiB,KAAK;AAChD;;;AC/BO,SAAS,YAAY,OAA4B;AACtD,SAAO,MACJ,IAAI,CAAC,MAAM,MAAM;AAChB,UAAM,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE;AACtC,WAAO,KAAK,IAAI,CAAC,KAAK,KAAK,MAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,KAAK,KAAK,QAAQ,SAAS,UAAU;AAAA,EAC5G,CAAC,EACA,KAAK,IAAI;AACd;;;ACjBA,SAAS,qBAAqB,0BAA0B;AAIjD,SAAS,cACd,YACA,QACA,cACA,iBACK;AACL,SAAO;AAAA,IACL;AAAA,MACE,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,MAClB,EAAE,MAAM,UAAU;AAAA,IACpB;AAAA,IACA,CAAC,YAAY,QAAQ,cAAc,eAAe;AAAA,EACpD;AACF;AAEO,SAAS,kBACd,OACA,YACA,cACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,YAAY;AAAA,MAC5B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACvDA,SAAS,uBAAAC,sBAAqB,sBAAAC,2BAA0B;AAkBxD,IAAM,oBAAoB;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV,EAAE,MAAM,SAAS,MAAM,UAAmB;AAAA,MAC1C,EAAE,MAAM,QAAQ,MAAM,UAAmB;AAAA,MACzC,EAAE,MAAM,OAAO,MAAM,UAAmB;AAAA,MACxC,EAAE,MAAM,QAAQ,MAAM,UAAmB;AAAA,MACzC,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,eAAe,MAAM,UAAmB;AAAA,MAChD,EAAE,MAAM,SAAS,MAAM,UAAmB;AAAA,MAC1C,EAAE,MAAM,eAAe,MAAM,UAAmB;AAAA,MAChD,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,MACnD,EAAE,MAAM,aAAa,MAAM,OAAgB;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAASC,eAAc,QAAwC;AACpE,SAAOC,qBAAoB,mBAAmB,CAAC,MAAM,CAAC;AACxD;AAEO,SAASC,mBACd,OACA,OACA,aACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,WAAW;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5EA,SAAS,uBAAAE,sBAAqB,sBAAAC,2BAA0B;AAoBxD,IAAMC,qBAAoB;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,UAAU,MAAM,OAAgB;AAAA,MACxC,EAAE,MAAM,WAAW,MAAM,UAAmB;AAAA,MAC5C,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,SAAS,MAAM,UAAmB;AAAA,MAC1C,EAAE,MAAM,WAAW,MAAM,UAAmB;AAAA,MAC5C,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,MACnD,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,MACnD,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,iBAAiB,MAAM,UAAmB;AAAA,MAClD,EAAE,MAAM,iBAAiB,MAAM,UAAmB;AAAA,IACpD;AAAA,EACF;AACF;AAEO,SAASC,eAAc,QAAoC;AAChE,SAAOC,qBAAoBF,oBAAmB,CAAC,MAAM,CAAC;AACxD;AAEO,SAASG,mBACd,OACA,QACA,SACA,QACA,SACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC/FA,SAAS,uBAAAE,sBAAqB,sBAAAC,2BAA0B;AAgBxD,IAAMC,qBAAoB;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV,EAAE,MAAM,QAAQ,MAAM,UAAmB;AAAA,MACzC,EAAE,MAAM,UAAU,MAAM,UAAmB;AAAA,MAC3C,EAAE,MAAM,WAAW,MAAM,UAAmB;AAAA,MAC5C,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,eAAe,MAAM,UAAmB;AAAA,MAChD,EAAE,MAAM,gBAAgB,MAAM,UAAmB;AAAA,MACjD,EAAE,MAAM,gBAAgB,MAAM,UAAmB;AAAA,MACjD,EAAE,MAAM,cAAc,MAAM,UAAmB;AAAA,MAC/C,EAAE,MAAM,kBAAkB,MAAM,UAAmB;AAAA,IACrD;AAAA,EACF;AACF;AAEO,SAASC,eAAc,QAAuC;AACnE,SAAOC,qBAAoBF,oBAAmB,CAAC,MAAM,CAAC;AACxD;AAEO,SAASG,mBACd,OACA,MACA,cACa;AACb,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,YAAY;AAAA,MAC5B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAASC,kBAAiB,OAA6B;AAC5D,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,MAAMD,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ANtDA,IAAM,OAAgB;AAWtB,IAAM,YAA2B;AAAA,EAC/B;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,KAAK;AAAA,IACL,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AACF;AAEA,SAAS,gBAAgB,KAAqD;AAC5E,QAAM,MAAM,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAC/C,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,MAAM,IAAI,qBAAqB,GAAG,EAAE,CAAC;AACnD,YAAQ,MAAM,MAAM,IAAI,cAAc,UAAU,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,mBAAmB,EAAE,IAAI,UAAU;AACnD,MAAI,YAAY,MAAM;AACpB,YAAQ,MAAM,MAAM,IAAI,aAAa,IAAI,IAAI,iCAAiC,CAAC;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO,EAAE,KAAK,QAAQ;AACxB;AAIA,eAAe,yBACb,aACA,MACA,OACwH;AACxH,MAAI,gBAAgB,mBAAmB;AACrC,QAAI,CAAC,KAAK,QAAQ;AAChB,cAAQ,MAAM,MAAM,IAAI,mDAAmD,CAAC;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,QAAS,KAAK,SAAoB;AACxC,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,SAAS,cAAc,KAAK;AAClC,UAAM,WAAW,MAAM,YAAY,MAAM,SAAS,IAAI;AACtD,UAAM,eAAe,WAAW,KAAK,QAAkB,QAAQ;AAC/D,UAAM,YAAY,WAAY,KAAK,aAAwB,KAAK,QAAkB,QAAQ;AAE1F,WAAO;AAAA,MACL,UAA0B,cAAc,YAAY,QAAQ,cAAc,SAAS;AAAA,MACnF,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,gBAAgB,oBAAoB;AACtC,QAAI,CAAC,KAAK,QAAQ;AAChB,cAAQ,MAAM,MAAM,IAAI,oDAAoD,CAAC;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,cAAe,KAAK,SAAoB;AAC9C,UAAM,QAAQ,aAAa,WAAW;AACtC,UAAM,MAAM,OAAO,EAAE;AACrB,UAAM,WAAW,MAAM,YAAY,MAAM,IAAI,YAAY;AACzD,UAAM,WAAW,YAAY,YAAY,MAAM,SAAS,IAAI;AAC5D,UAAM,cAAc,WAAW,KAAK,QAAkB,QAAQ;AAC9D,UAAM,QAAS,KAAK,SAAqB,WAAW,EAAE;AAEtD,UAAM,SAAkD;AAAA,MACtD;AAAA,MACA,MAAM,WAAW,OAAO,OAAO,EAAE;AAAA,MACjC;AAAA,MACA,MAAM,OAAO,EAAE;AAAA,MACf,YAAY,WAAW,OAAO,UAAU,EAAE;AAAA,MAC1C,aAAa,WAAW,OAAO,UAAU,EAAE;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,KAAK,WAAY,KAAK,UAAqB,KAAK,EAAE;AAAA,MACrE,gBAAgB;AAAA,MAChB,WAAW,CAAC,CAAC,KAAK;AAAA,IACpB;AAEA,WAAO;AAAA,MACL,UAAwBE,eAAc,MAAM;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,gBAAgB;AAClC,eAAW,QAAQ,CAAC,UAAU,UAAU,WAAW,WAAW,SAAS,GAAG;AACxE,UAAI,CAAC,KAAK,IAAI,GAAG;AACf,gBAAQ,MAAM,MAAM,IAAI,KAAK,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY,CAAC,wCAAwC,CAAC;AACnH,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,UAAM,SAAS,KAAK;AACpB,UAAM,SAAS,KAAK;AACpB,UAAM,eAAe,gBAAgB;AACrC,UAAM,CAAC,WAAW,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/C,aAAa,aAAa,EAAE,SAAS,QAAQ,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,MACtF,aAAa,aAAa,EAAE,SAAS,QAAQ,KAAK,UAAU,cAAc,WAAW,CAAC;AAAA,IACxF,CAAC;AACD,UAAM,UAAU,WAAW,KAAK,SAAmB,SAAS;AAC5D,UAAM,UAAU,WAAW,KAAK,SAAmB,SAAS;AAC5D,UAAM,UAAU,WAAY,KAAK,WAAsB,KAAK,SAAS;AACrE,UAAM,UAAU,WAAY,KAAK,WAAsB,KAAK,SAAS;AAErE,UAAM,SAAiD;AAAA,MACrD;AAAA,MACA;AAAA,MACA,QAAQ,CAAC,CAAC,KAAK;AAAA,MACf,SAAS,UAAU,EAAE;AAAA,MACrB,QAAQ,UAAU,EAAE;AAAA,MACpB,OAAQ,KAAK,SAAqB;AAAA,MAClC,SAAS,KAAK;AAAA,MACd,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,YAAY;AAAA;AAAA,MACZ,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAEA,WAAO;AAAA,MACL,UAA2BA,eAAc,MAAM;AAAA,MAC/C,OAAO;AAAA,MACP,aAAa;AAAA,MACb,gBAAgB,CAAC,EAAE,OAAO,QAAQ,QAAQ,QAAQ,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,gBAAgB,mBAAmB;AACrC,QAAI,CAAC,KAAK,QAAQ;AAChB,cAAQ,MAAM,MAAM,IAAI,mDAAmD,CAAC;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,eAAe,WAAW,KAAK,QAAkB,EAAE;AACzD,UAAM,cAAc,OAAQ,KAAK,YAAuB,KAAK;AAC7D,UAAM,eAAe,eAAgB,eAAe,cAAe;AACnE,UAAM,aAAa,eAAgB,eAAe,cAAe;AAEjE,UAAM,SAAiD;AAAA,MACrD,MAAM,OAAO,EAAE;AAAA,MACf,QAAQ,OAAO,EAAE;AAAA,MACjB,SAAS,SAAS,EAAE;AAAA,MACpB,YAAY,UAAU,EAAE;AAAA,MACxB,aAAa,UAAU,EAAE;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB;AAEA,WAAO;AAAA,MACL,UAAwBA,eAAc,MAAM;AAAA,MAC5C,OAAO,OAAO,EAAE;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,iCAAiC,WAAW,EAAE;AAChE;AAEA,SAAS,sBACP,aACA,OACA,OACA,aACA,gBACyD;AACzD,MAAI,gBAAgB,mBAAmB;AACrC,WAAO;AAAA,MACL,cAA8B,kBAAkB,OAAO,OAAO,WAAW;AAAA,MACzE,aAA6B,iBAAiB,KAAK;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,gBAAgB,oBAAoB;AACtC,WAAO;AAAA,MACL,cAA4BC,mBAAkB,OAAO,OAAO,WAAW;AAAA,MACvE,aAA2BC,kBAAiB,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,gBAAgB,gBAAgB;AAClC,UAAM,SAAS,iBAAiB,CAAC,GAAG,SAAS;AAC7C,UAAM,UAAU,iBAAiB,CAAC,GAAG,UAAU;AAC/C,WAAO;AAAA,MACL,cAA+BD,mBAAkB,OAAO,OAAO,aAAa,QAAQ,OAAO;AAAA,MAC3F,aAA8BC,kBAAiB,KAAK;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,gBAAgB,mBAAmB;AACrC,WAAO;AAAA,MACL,cAA4BD,mBAAkB,OAAO,OAAO,WAAW;AAAA,MACvE,aAA2BC,kBAAiB,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,iCAAiC,WAAW,EAAE;AAChE;AAIA,SAAS,aAAa,iBAAkC;AACtD,MAAI,UAAU,eAAe,EAAG,QAAO;AACvC,QAAM,QAAQ,gBAAgB,YAAY;AAC1C,QAAM,SAAS,OAAO;AACtB,QAAM,WAAoC;AAAA,IACxC,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,KAAK,OAAO,EAAE;AAAA,EAChB;AACA,QAAM,OAAO,SAAS,KAAK;AAC3B,MAAI,CAAC,QAAQ,SAAS,MAAM;AAC1B,YAAQ,MAAM,MAAM,IAAI,kBAAkB,eAAe,EAAE,CAAC;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,aAA8B;AACnD,QAAM,QAAQ,YAAY,YAAY;AACtC,QAAM,WAAW,SAAS;AAC1B,QAAM,YAAqC;AAAA,IACzC,MAAM,SAAS;AAAA,IACf,MAAM,SAAS;AAAA,EACjB;AACA,QAAM,OAAO,UAAU,KAAK;AAC5B,MAAI,CAAC,QAAQ,SAAS,MAAM;AAC1B,YAAQ,MAAM,MAAM,IAAI,2BAA2B,WAAW,EAAE,CAAC;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAA4B;AAClD,SAAO,KAAK;AAAA,IACV,MAAM,IAAI,CAAC,OAAO;AAAA,MAChB,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,OAAO,EAAE,MAAM,SAAS;AAAA,IAC1B,EAAE;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAIO,SAAS,iCAAiCC,WAAyB;AAGxE,EAAAA,UACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,OAAO,MAAM;AACZ,UAAM,YAAY,mBAAmB;AAErC,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,oBAAoB,CAAC;AAC5C,YAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,eAAW,KAAK,WAAW;AACzB,YAAM,OAAO,UAAU,EAAE,UAAU;AACnC,YAAM,WAAW,SAAS;AAC1B,cAAQ,IAAI;AACZ,cAAQ,IAAI,KAAK,MAAM,KAAK,EAAE,IAAI,CAAC,KAAK,MAAM,KAAK,EAAE,GAAG,CAAC,GAAG;AAC5D,cAAQ,IAAI,OAAO,EAAE,WAAW,EAAE;AAClC,cAAQ,IAAI,iBAAiB,WAAW,MAAM,MAAM,IAAI,IAAI,MAAM,IAAI,cAAc,CAAC,EAAE;AAAA,IACzF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,IAAI,0EAA0E,CAAC;AACjG,YAAQ,IAAI,MAAM,IAAI,4EAA4E,CAAC;AACnG,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,EAAAA,UACG,QAAQ,OAAO,EACf,YAAY,6CAA6C,EACzD,SAAS,cAAc,4EAA4E,EACnG,eAAe,qBAAqB,eAAe,EAEnD,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,oBAAoB,oCAAoC,EAE/D,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,qBAAqB,6CAA6C,EACzE,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,gBAAgB,oCAAoC,EAE3D,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,YAAY,yBAAyB,EAC5C,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,wBAAwB,8BAA8B,EAC7D,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,mBAAmB,mCAAmC,EAE7D,OAAO,oBAAoB,uDAAuD,EAClF,OAAO,OAAO,aAAqB,SAAS;AAC3C,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,KAAK,SAAS,aAAa,IAAI,gBAAgB,WAAW;AAGlE,UAAM,eAAe,IAAI,WAAW,IAAI,IAAI,cAAc,EAAE,MAAM;AAClE,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,YAAY;AAC/C,cAAQ,OAAO;AACf,kBAAY,OAAO;AACnB,mBAAa,QAAQ,WAAW,MAAM,MAAM,KAAK,CAAC,EAAE;AACpD,cAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,SAAS,CAAC,EAAE,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,mBAAa,KAAK,cAAc;AAChC,cAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,cAAc,IAAI,0BAA0B,EAAE,MAAM;AAC1D,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,MAAM,yBAAyB,aAAa,MAAM,KAAK;AAC5E,YAAM,UAAU,WAAW;AAC3B,YAAM,SAAS,gBAAgB;AAE/B,YAAM,WAAW,MAAM,OAAO,cAAc;AAAA,QAC1C;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ,SAAS,QAAQ;AAAA,MACzC,CAAC;AAED,YAAM,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AACpE,kBAAY,QAAQ,aAAa;AAAA,IACnC,SAAS,KAAK;AACZ,kBAAY,KAAK,mBAAmB;AACpC,cAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,uBAAuB,GAAG,MAAM,MAAM,KAAK,CAAC;AACnE,YAAQ,IAAI,MAAM,IAAI,gDAAgD,CAAC;AACvE,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,EAAAA,UACG,QAAQ,SAAS,EACjB,YAAY,sEAAsE,EAClF,SAAS,cAAc,4EAA4E,EACnG,eAAe,qBAAqB,eAAe,EACnD,OAAO,uBAAuB,mEAAmE,EAEjG,OAAO,iBAAiB,eAAe,EACvC,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,2BAA2B,kBAAkB,EACpD,OAAO,yBAAyB,mCAAmC,EAEnE,OAAO,gBAAgB,wBAAwB,EAC/C,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,qBAAqB,6CAA6C,EACzE,OAAO,iBAAiB,4BAA4B,EACpD,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,YAAY,yBAAyB,EAC5C,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,wBAAwB,8BAA8B,EAC7D,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,mBAAmB,mCAAmC,EAE7D,OAAO,oBAAoB,uDAAuD,EAClF,OAAO,OAAO,aAAqB,SAAS;AAC3C,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAQ,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,KAAK,SAAS,aAAa,IAAI,gBAAgB,WAAW;AAGlE,UAAM,eAAe,IAAI,WAAW,IAAI,IAAI,cAAc,EAAE,MAAM;AAClE,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,YAAY;AAC/C,cAAQ,OAAO;AACf,mBAAa,QAAQ,WAAW,MAAM,MAAM,KAAK,CAAC,EAAE;AACpD,cAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,OAAO,IAAI,CAAC,EAAE,CAAC;AAAA,IAC/D,SAAS,KAAK;AACZ,mBAAa,KAAK,cAAc;AAChC,cAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,cAAc,IAAI,0BAA0B,EAAE,MAAM;AAC1D,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,MAAM,yBAAyB,aAAa,MAAM,KAAK;AACrE,cAAQ,MAAM;AACd,oBAAc,MAAM;AACpB,uBAAiB,MAAM;AAEvB,YAAMC,WAAU,WAAW;AAC3B,YAAM,SAAS,gBAAgB;AAE/B,YAAM,WAAW,MAAM,OAAO,cAAc;AAAA,QAC1C,SAAAA;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAOA,SAAQ,SAAS,MAAM,QAAQ;AAAA,MAC/C,CAAC;AAED,YAAM,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AACpE,kBAAY,QAAQ,aAAa;AAAA,IACnC,SAAS,KAAK;AACZ,kBAAY,KAAK,mBAAmB;AACpC,cAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,EAAE,cAAc,YAAY,IAAI;AAAA,MACpC;AAAA,MAAa;AAAA,MAAO;AAAA,MAAO;AAAA,MAAa;AAAA,IAC1C;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,KAAK,kBAAkB,aAAa,MAAM,IAAI,CAAC;AACjE,YAAQ,IAAI,YAAY,YAAY,CAAC;AACrC,YAAQ,IAAI,MAAM,KAAK,iBAAiB,YAAY,MAAM,IAAI,CAAC;AAC/D,YAAQ,IAAI,YAAY,WAAW,CAAC;AAGpC,QAAI,KAAK,YAAY;AACnB,YAAM,MAAM,QAAQ,KAAK,UAAoB;AAC7C,gBAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAElC,YAAM,WAAW,QAAQ,KAAK,cAAc;AAC5C,YAAM,aAAa,QAAQ,KAAK,aAAa;AAC7C,oBAAc,UAAU,eAAe,YAAY,CAAC;AACpD,oBAAc,YAAY,eAAe,WAAW,CAAC;AAErD,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,MAAM,mBAAmB,QAAQ,EAAE,CAAC;AACtD,cAAQ,IAAI,MAAM,MAAM,mBAAmB,UAAU,EAAE,CAAC;AACxD,cAAQ,IAAI,MAAM,MAAM,mBAAmB,KAAK,EAAE,CAAC;AACnD,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,IAAI,cAAc,CAAC;AACrC,cAAQ,IAAI,MAAM,IAAI,+BAA+B,CAAC;AACtD,cAAQ,IAAI,MAAM,IAAI,eAAe,KAAK,KAAK,CAAC;AAChD,cAAQ,IAAI,MAAM,IAAI,yCAAyC,CAAC;AAChE,cAAQ,IAAI,MAAM,IAAI,0CAA0C,CAAC;AACjE,cAAQ,IAAI,MAAM,IAAI,uBAAuB,QAAQ,KAAK,CAAC;AAC3D,cAAQ,IAAI,MAAM,IAAI,sBAAsB,UAAU,EAAE,CAAC;AAEzD,UAAI,gBAAgB,oBAAoB;AACtC,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,MAAM,OAAO,4DAA4D,CAAC;AACtF,gBAAQ,IAAI,MAAM,OAAO,mBAAmB,KAAK,sBAAsB,CAAC;AACxE,gBAAQ,IAAI,MAAM,OAAO,4EAA4E,CAAC;AAAA,MACxG;AAEA,cAAQ,IAAI;AACZ;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,kBAAkB,CAAC,KAAK,UAAU;AACxD,cAAQ,MAAM,MAAM,IAAI,kGAAkG,CAAC;AAC3H,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,EAAE,SAAAC,SAAQ,IAAI,MAAM,OAAO,wBAAoB;AACrD,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,oBAAgB;AACjD,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,wBAAoB;AAE3D,UAAM,oBAAoB,OAAO,KAAK,cAAwB;AAC9D,QAAI,oBAAoB,MAAM,oBAAoB,QAAQ;AACxD,cAAQ,MAAM,MAAM,IAAI,kDAAkD,CAAC;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,mBAAmBA,eAAc,KAAK,QAAkB;AAC9D,UAAM,UAAU,WAAW;AAE3B,UAAM,cAAc,IAAI,6BAA6B,EAAE,MAAM;AAC7D,QAAI;AACJ,QAAI;AACF,YAAM,WAAW;AAAA,QACf,MAAM,KAAK;AAAA,QACX,aAAa,KAAK,eAAe;AAAA,QACjC,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA,eAAe;AAAA,QACf,UAAU,IAAI;AAAA,QACd,mBAAmB,OAAO,iBAAiB;AAAA,QAC3C,kBAAkB,OAAO,gBAAgB;AAAA,QACzC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,oBAAc,MAAM,QAAQ,UAAU,KAAK,IAAc;AACzD,kBAAY,QAAQ,oBAAoB,WAAW,EAAE;AAAA,IACvD,SAAS,KAAK;AACZ,kBAAY,KAAK,iBAAiB;AAClC,cAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,iBAAiB,IAAI,wBAAwB,EAAE,MAAM;AAC3D,QAAI;AACF,YAAM,EAAE,MAAM,WAAW,IAAI,MAAMD;AAAA,QACjC;AAAA,QAAO;AAAA,QAAa;AAAA,QAAmB;AAAA,QACvC;AAAA,QAAc;AAAA,MAChB;AACA,qBAAe,QAAQ,aAAa,UAAU,UAAU;AACxD,cAAQ,IAAI,MAAM,IAAI,SAAS,eAAe,IAAI,CAAC,EAAE,CAAC;AACtD,cAAQ,IAAI,MAAM,IAAI,YAAY,KAAK,EAAE,CAAC;AAAA,IAC5C,SAAS,KAAK;AACZ,qBAAe,KAAK,iBAAiB;AACrC,cAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,gBAAgB,oBAAoB;AACtC,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,OAAO,aAAa,CAAC;AACvC,cAAQ,IAAI,MAAM,OAAO,iDAAiD,CAAC;AAC3E,cAAQ,IAAI,MAAM,OAAO,uEAAuE,CAAC;AACjG,cAAQ,IAAI,MAAM,OAAO,iEAAiE,CAAC;AAC3F,cAAQ,IAAI,MAAM,OAAO,sBAAsB,KAAK,sBAAsB,CAAC;AAAA,IAC7E;AAEA,YAAQ,IAAI;AAAA,EACd,CAAC;AACL;;;AOjmBA,SAAkC,sBAAsB;AA0BxD,SAAS,oBAA6B;AACpC,SAAO,SAAS,EAAE;AACpB;AAaA,eAAsB,gBAAgB,QAA+D;AACnG,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAS,gBAAgB;AAE/B,QAAM,OAAO,MAAM,OAAO,cAAc;AAAA,IACtC,SAAS,WAAW;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,SAAS,kBAAkB;AAAA,IAC3B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,QACE,aAAa,OAAO;AAAA,QACpB,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,cAAc,OAAO;AAAA,QACrB,WAAW,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,MAAM,OAAO,0BAA0B,EAAE,KAAK,CAAC;AAG/D,aAAW,OAAO,QAAQ,MAAM;AAC9B,QAAI;AACF,YAAM,QAAQ,eAAe;AAAA,QAC3B,KAAK;AAAA,QACL,MAAM,IAAI;AAAA,QACV,QAAQ,IAAI;AAAA,MACd,CAAC;AACD,UAAI,MAAM,cAAc,oBAAoB;AAC1C,cAAM,OAAO,MAAM;AACnB,eAAO;AAAA,UACL;AAAA,UACA,aAAa,KAAK;AAAA,UAClB,OAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,QAAQ,MAAM,kBAAkB;AACtC,QAAM,OAAO,MAAM,aAAa,KAAK;AAErC,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,OAAO,KAAK;AAAA,EACd;AACF;AAKA,eAAsB,aAAa,IAAoC;AACrE,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAU,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS,kBAAkB;AAAA,IAC3B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,EAAE;AAAA,EACX,CAAC;AAED,SAAO;AAAA,IACL,IAAI,OAAO,CAAC;AAAA,IACZ,OAAO,OAAO,CAAC;AAAA,IACf,SAAS,OAAO,CAAC;AAAA,IACjB,aAAa,OAAO,CAAC;AAAA,IACrB,WAAW,OAAO,CAAC;AAAA,IACnB,QAAQ,OAAO,CAAC;AAAA,IAChB,WAAW,OAAO,CAAC;AAAA,EACrB;AACF;AAKA,eAAsB,oBAAqC;AACzD,QAAM,SAAS,gBAAgB;AAC/B,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS,kBAAkB;AAAA,IAC3B,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACH;AAKA,eAAsB,sBAAgD;AACpE,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAU,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS,kBAAkB;AAAA,IAC3B,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AAUD,SAAO,OAAO,IAAI,CAAC,OAAO;AAAA,IACxB,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,SAAS,EAAE;AAAA,IACX,aAAa,EAAE;AAAA,IACf,WAAW,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,WAAW,EAAE;AAAA,EACf,EAAE;AACJ;AAKA,eAAsB,eAAe,aAAqB,aAAmC;AAC3F,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAS,gBAAgB;AAC/B,QAAM,OAAO,MAAM,OAAO,cAAc;AAAA,IACtC,SAAS,WAAW;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,SAAS,kBAAkB;AAAA,IAC3B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,aAAa,WAAW;AAAA,EACjC,CAAC;AACD,QAAM,OAAO,0BAA0B,EAAE,KAAK,CAAC;AAC/C,SAAO;AACT;;;AC/IA,SAAS,iBAAyB;AAChC,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,MAAS,SAAiB,WAAiD;AACxF,QAAM,MAAM,eAAe;AAE3B,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,SAAS,UAAU,CAAC;AAAA,EACpD,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,MAAM,IAAI,EAAE;AAAA,EACvE;AAEA,QAAM,SAAU,MAAM,SAAS,KAAK;AAEpC,MAAI,OAAO,QAAQ,QAAQ;AACzB,UAAM,IAAI,MAAM,yBAAyB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC3F;AAEA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,SAAO,OAAO;AAChB;AAKA,eAAsBE,qBACpB,SAC8B;AAC9B,MAAI,SAAS;AACX,UAAMC,QAAO,MAAM;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,EAAE,SAAS,QAAQ,YAAY,EAAE;AAAA,IACnC;AACA,WAAOA,MAAK;AAAA,EACd;AAEA,QAAM,OAAO,MAAM,MAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAa7D;AAED,SAAO,KAAK;AACd;;;AC/GA,SAAS,eAAAC,cAAa,aAAAC,kBAAiB;AACvC,OAAOC,YAAW;AAClB,OAAOC,UAAS;;;ACIhB,IAAM,kBAAkB;AAMxB,eAAsB,kBAAmC;AACvD,QAAM,UAAU,WAAW;AAG3B,QAAM,WAAW,MAAM,MAAM,GAAG,eAAe,+BAA+B;AAAA,IAC5E,QAAQ,YAAY,QAAQ,IAAM;AAAA,EACpC,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,mCAAmC,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EAC7F;AACA,QAAM,YAAY,MAAM,SAAS,KAAK;AACtC,QAAM,QAAQ,WAAW,MAAM;AAC/B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAGA,QAAM,YAAY,MAAM,QAAQ,YAAY,EAAE,SAAS,MAAM,CAAC;AAG9D,QAAM,SAAS,MAAM,MAAM,GAAG,eAAe,+BAA+B;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,QAAQ,YAAY,QAAQ,IAAM;AAAA,IAClC,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,aAAa;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,IAAI,IAAI,EAAE;AAAA,EACxE;AAEA,QAAM,UAAU,MAAM,OAAO,KAAK;AAClC,QAAM,SAAS,SAAS,MAAM;AAC9B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAGA,kBAAgB,MAAM;AAEtB,SAAO;AACT;AAKA,eAAsB,mBAAqC;AACzD,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,eAAe,WAAW;AAAA,MACnD,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,MAC7C,QAAQ,YAAY,QAAQ,IAAM;AAAA,IACpC,CAAC;AACD,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAgCA,eAAsB,eAAe,MAA4D;AAC/F,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,QAAM,OAAgC;AAAA,IACpC,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,EACjB;AACA,MAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,KAAK;AAC5D,MAAI,KAAK,cAAc,OAAW,MAAK,aAAa,KAAK;AAEzD,QAAM,eAAwC,CAAC;AAC/C,MAAI,KAAK,gBAAiB,cAAa,oBAAoB;AAC3D,MAAI,KAAK,gBAAiB,cAAa,mBAAmB;AAC1D,MAAI,OAAO,KAAK,YAAY,EAAE,SAAS,EAAG,MAAK,oBAAoB;AAEnE,QAAM,MAAM,MAAM,MAAM,GAAG,eAAe,qBAAqB;AAAA,IAC7D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,QAAQ,YAAY,QAAQ,IAAO;AAAA;AAAA,IACnC,MAAM,KAAK,UAAU,IAAI;AAAA,EAC3B,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,UAAM,IAAI,MAAM,4BAA4B,IAAI,MAAM,IAAI,OAAO,EAAE;AAAA,EACrE;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,SAAS,WAAW;AAAA,IACpC,OAAO,KAAK,SAAS,KAAK;AAAA,IAC1B,OAAO;AAAA,MACL,cAAc,KAAK,OAAO,iBAAiB;AAAA,MAC3C,kBAAkB,KAAK,OAAO,qBAAqB;AAAA,MACnD,aAAa,KAAK,OAAO,gBAAgB;AAAA,IAC3C;AAAA,EACF;AACF;AAMA,eAAsB,aAAgC;AACpD,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,QAAM,MAAM,MAAM,MAAM,GAAG,eAAe,WAAW;AAAA,IACnD,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG;AAAA,IAC7C,QAAQ,YAAY,QAAQ,IAAM;AAAA,EACpC,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,iCAAiC,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,EACjF;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAsB,EAAE,EAAE;AAC1D;;;AD7KA,SAAS,oBAAoB;AAEtB,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,mEAA8D;AAInH,SACG,QAAQ,WAAW,EACnB,YAAY,2DAA2D,EACvE,OAAO,YAAY;AAClB,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,gBAAgB;AAG/B,UAAM,eAAeC,KAAI,0BAA0B,EAAE,MAAM;AAC3D,QAAI;AACF,YAAM,cAAc,MAAM,OAAO,aAAa;AAAA,QAC5C,SAAS,OAAO,EAAE;AAAA,QAClB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAED,UAAI,gBAAgB,IAAI;AACtB,qBAAa,KAAK,yBAAyB;AAC3C,gBAAQ,IAAIC,OAAM,OAAO,0EAA0E,CAAC;AACpG,gBAAQ,IAAIA,OAAM,OAAO,gFAAgF,CAAC;AAC1G,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,mBAAa,QAAQ,iBAAiBC,aAAY,aAAa,EAAE,CAAC,EAAE;AAAA,IACtE,SAAS,KAAK;AACZ,mBAAa,KAAK,8BAA8B;AAChD,cAAQ,MAAMD,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,aAAaD,KAAI,gCAAgC,EAAE,MAAM;AAC/D,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB;AACrC,iBAAW,QAAQ,4BAA4B;AAC/C,cAAQ,IAAIC,OAAM,IAAI,UAAU,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC;AAC3E,cAAQ,IAAIA,OAAM,IAAI,oCAAoC,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,iBAAW,KAAK,6BAA6B;AAC7C,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,QAAQ,EAChB,YAAY,4DAA4D,EACxE,eAAe,qBAAqB,eAAe,EACnD,OAAO,OAAO,SAAS;AACtB,UAAM,eAAe,KAAK;AAC1B,QAAI,CAACE,WAAU,YAAY,GAAG;AAC5B,cAAQ,MAAMF,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,gBAAgB;AAC/B,UAAM,UAAU,WAAW;AAC3B,UAAM,UAAUD,KAAI,0BAA0B,EAAE,MAAM;AAEtD,QAAI;AAEF,YAAM,CAAC,cAAc,gBAAgB,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,QAAQ,CAAC;AAAA,QAC9F,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,iBAAiB,CAAC;AAAA,QACvG,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,oBAAoB,CAAC;AAAA,MAC5G,CAAC;AAED,YAAM,CAAC,eAAe,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACnE,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,QACvF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,QACrF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC;AAAA,MAChH,CAAC;AAGD,YAAM,kBAAkB,MAAM,OAAO,aAAa;AAAA,QAChD,SAAS,OAAO,EAAE;AAAA,QAClB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,YAAY;AAAA,MACrB,CAAC;AAGD,YAAM,gBAAgB,MAAM,QAAQ;AAAA,QAClC,OAAO,IAAI,OAAO,UAAU;AAC1B,gBAAM,MAAM,MAAM,OAAO,aAAa;AAAA,YACpC,SAAS,OAAO,EAAE;AAAA,YAClB,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,KAAK;AAAA,UACd,CAAC;AACD,iBAAO,EAAE,OAAO,SAAS,IAAI;AAAA,QAC/B,CAAC;AAAA,MACH;AAGA,YAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC5C,OAAO,aAAa;AAAA,UAClB,SAAS,OAAO,EAAE;AAAA,UAClB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,QAAQ,OAAO;AAAA,QACxB,CAAC;AAAA,QACD,OAAO,aAAa;AAAA,UAClB,SAAS,OAAO,EAAE;AAAA,UAClB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,QAAQ,OAAO;AAAA,QACxB,CAAC;AAAA,MACH,CAAC;AAGD,YAAM,cAAc,MAAM,iBAAiB;AAC3C,YAAM,SAAS,gBAAgB;AAE/B,cAAQ,KAAK;AAEb,YAAM,SAAS,eAAe,iBAAiB,eAAe,iBAAiB;AAE/E,cAAQ,IAAI;AACZ,cAAQ,IAAIC,OAAM,KAAK,yBAAyB,CAAC;AACjD,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,cAAQ,IAAIA,OAAM,KAAK,WAAW,CAAC;AACnC,cAAQ,IAAI,0BAA0BC,aAAY,QAAQ,aAAa,CAAC,IAAI,WAAW,EAAE;AACzF,cAAQ,IAAI,0BAA0BA,aAAY,iBAAiB,EAAE,CAAC,EAAE;AAExE,cAAQ,IAAID,OAAM,KAAK,yBAAyB,CAAC;AACjD,iBAAW,EAAE,OAAO,QAAQ,KAAK,eAAe;AAC9C,cAAM,OAAO,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY;AACjE,cAAM,QAAQ,OAAOA,OAAM,MAAM,GAAG,KAAK,QAAQ,IAAI;AACrD,gBAAQ,IAAI,OAAO,KAAK,KAAKC,aAAY,SAAS,EAAE,CAAC,OAAO;AAAA,MAC9D;AAEA,cAAQ,IAAID,OAAM,KAAK,iBAAiB,CAAC;AACzC,cAAQ,IAAI,0BAA0BC,aAAY,QAAQ,EAAE,CAAC,EAAE;AAC/D,cAAQ,IAAI,0BAA0BA,aAAY,WAAW,EAAE,CAAC,MAAM;AAEtE,cAAQ,IAAID,OAAM,KAAK,gBAAgB,CAAC;AACxC,cAAQ,IAAI,gBAAgB,SAAS,GAAG,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC,KAAKA,OAAM,IAAI,iBAAiB,CAAC,EAAE;AACnH,cAAQ,IAAI,gBAAgB,cAAcA,OAAM,MAAM,OAAO,IAAIA,OAAM,IAAI,iBAAiB,CAAC,EAAE;AAC/F,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,QAAQ,EAChB,YAAY,wCAAwC,EACpD,OAAO,YAAY;AAClB,UAAM,UAAUD,KAAI,2BAA2B,EAAE,MAAM;AACvD,QAAI;AACF,YAAM,SAAS,MAAM,WAAW;AAChC,cAAQ,QAAQ,GAAG,OAAO,MAAM,mBAAmB;AACnD,cAAQ,IAAI;AACZ,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,MAC1B;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMC,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,SACG,QAAQ,OAAO,EACf,YAAY,mDAAmD,EAC/D,eAAe,mBAAmB,aAAa,EAC/C,eAAe,gBAAgB,+CAA+C,EAC9E,OAAO,mBAAmB,eAAe,EACzC,OAAO,iBAAiB,kEAA6D,EACrF,OAAO,gBAAgB,4BAA4B,KAAK,EACxD,OAAO,iBAAiB,oCAAoC,EAC5D,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,oBAAoB,2BAA2B,EACtD,OAAO,UAAU,4BAA4B,KAAK,EAClD,OAAO,OAAO,SAAS;AAEtB,UAAM,WAAyE,CAAC;AAEhF,QAAI,KAAK,QAAQ;AACf,eAAS,KAAK,EAAE,MAAM,UAAU,SAAS,KAAK,OAAO,CAAC;AAAA,IACxD;AAEA,QAAI,cAAc,KAAK;AACvB,QAAI,KAAK,MAAM;AACb,UAAI;AACF,cAAM,OAAO,aAAa,KAAK,MAAM,OAAO;AAC5C,sBAAc;AAAA;AAAA,EAA0B,IAAI;AAAA;AAAA;AAAA,EAAe,KAAK,MAAM;AAAA,MACxE,SAAS,KAAK;AACZ,gBAAQ,MAAMA,OAAM,IAAI,6BAA6B,KAAK,IAAI,EAAE,CAAC;AACjE,gBAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,aAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,YAAY,CAAC;AAEpD,UAAM,UAAUD,KAAI,sBAAsB,KAAK,KAAK,MAAM,EAAE,MAAM;AAClE,QAAI;AACF,YAAM,SAAS,MAAM,eAAe;AAAA,QAClC,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,aAAa,KAAK,gBAAgB,SAAY,OAAO,KAAK,WAAW,IAAI;AAAA,QACzE,WAAW,KAAK,cAAc,SAAY,OAAO,KAAK,SAAS,IAAI;AAAA,QACnE,iBAAiB,KAAK;AAAA,QACtB,iBAAiB,KAAK,aAAa;AAAA,MACrC,CAAC;AAED,cAAQ,QAAQ,oBAAoB;AAEpC,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,OAAO;AACL,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,OAAO,OAAO;AAC1B,gBAAQ,IAAI;AACZ,gBAAQ,IAAIC,OAAM,IAAI,UAAU,OAAO,KAAK,cAAc,OAAO,MAAM,YAAY,QAAQ,OAAO,MAAM,gBAAgB,SAAS,OAAO,MAAM,WAAW,QAAQ,CAAC;AAAA,MACpK;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,kBAAkB;AAC/B,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AE7PA,SAAS,cAAAG,aAAY,eAAAC,cAAa,aAAAC,kBAAiB;AACnD,OAAOC,YAAW;AAClB,OAAOC,UAAS;;;ACHhB,SAAS,sBAAAC,qBAAoB,sBAAsB,UAAAC,SAAQ,KAAK,mBAAmB;AAcnF,eAAsB,SAAS,QAKN;AACvB,QAAM,SAAS,gBAAgB;AAE/B,QAAM,WAAWC,oBAAmB;AAAA,IAClC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ;AAAA,QACE,SAAS,OAAO;AAAA,QAChB,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,KAAK,OAAO;AAAA,QACZ,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK;AAAA,IACjC,IAAI,QAAQ,EAAE;AAAA,IACd,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,qEAAgE;AAAA,EAClF;AAEA,QAAM,CAAC,WAAW,mBAAmB,EAAE,WAAW,IAAI,qBAAqB;AAAA,IACzE,KAAK;AAAA,IACL,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO,EAAE,WAAW,mBAAmB,YAAY;AACrD;AAMO,SAAS,cAAc,WAAmB,aAA6B;AAC5E,SAAQ,YAAY,OAAO,MAAQ,WAAW,IAAK;AACrD;AAMO,SAAS,eAAe,QAAmB,MAAqB;AACrE,MAAI,OAAO,SAAS,KAAK,KAAK,WAAW,OAAO,SAAS,GAAG;AAC1D,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,QAAM,QAAe,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AAEtC,UAAM,KAAK,OAAO,CAAC,EAAE,YAAY,CAAQ;AACzC,QAAI,IAAI,KAAK,QAAQ;AAEnB,YAAM,KAAK,IAAI,YAAY,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAQ;AAAA,IAC1D;AAAA,EACF;AACA,SAAOC,QAAO,KAAK;AACrB;AAKA,eAAsB,iBAAiB,QAGd;AACvB,QAAM,SAAS,gBAAgB;AAE/B,QAAM,WAAWD,oBAAmB;AAAA,IAClC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,OAAO,MAAM,OAAO,QAAQ;AAAA,EACrC,CAAC;AAED,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK;AAAA,IACjC,IAAI,QAAQ,EAAE;AAAA,IACd,MAAM;AAAA,EACR,CAAC;AAED,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iEAA4D;AAAA,EAC9E;AAEA,QAAM,CAAC,WAAW,EAAE,EAAE,WAAW,IAAI,qBAAqB;AAAA,IACxD,KAAK;AAAA,IACL,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO,EAAE,WAAW,mBAAmB,IAAI,YAAY;AACzD;;;AC/GA,SAAS,sBAAAE,qBAAoB,cAAAC,mBAAkB;AAiB/C,IAAMC,aAAY;AAAA,EAChB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MACnC,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,MAC9B,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AACF;AAEA,IAAM,qCAAqC;AAAA,EACzC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,UACnC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,UACpC,EAAE,MAAM,OAAO,MAAM,SAAS;AAAA,UAC9B,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,UACrC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,UACpC,EAAE,MAAM,oBAAoB,MAAM,UAAU;AAAA,UAC5C,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAAA,EAClD;AACF;AAEA,IAAM,8BAA8B;AAAA,EAClC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,QAAQ,MAAM,QAAQ;AAAA,UAC9B,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,UACrC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,UACpC,EAAE,MAAM,oBAAoB,MAAM,UAAU;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAAA,EAClD;AACF;AAeO,SAAS,mBACd,QACA,cACA,QACA,cACA,eACA,SACA,UACa;AACb,QAAM,cAAcC,YAAW,OAAO,QAAQ,aAAa;AAC3D,QAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AACxE,QAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AACxE,QAAM,QAAqB,CAAC;AAE5B,MAAI,CAAC,QAAQ;AAEX,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,MAAMC,oBAAmB;AAAA,QACvB,KAAKF;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,EAAE,aAAa,WAAW;AAAA,MAC3C,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAGD,QAAI,QAAQ;AAEV,YAAM,KAAK;AAAA,QACT,QAAQ,QAAQ,EAAE;AAAA,QAClB,MAAME,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM;AAAA,YACJ;AAAA,cACE,SAAS,OAAO,EAAE;AAAA,cAClB,UAAU,OAAO,EAAE;AAAA,cACnB,KAAK,OAAO;AAAA,cACZ,WAAW;AAAA,cACX,UAAU;AAAA,cACV,kBAAkB;AAAA,cAClB,mBAAmB;AAAA,YACrB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,OAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AAEL,YAAM,KAAK;AAAA,QACT,QAAQ,QAAQ,EAAE;AAAA,QAClB,MAAMA,oBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM;AAAA,YACJ;AAAA,cACE,MAAM;AAAA,cACN,WAAW;AAAA,cACX,UAAU;AAAA,cACV,kBAAkB;AAAA,YACpB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,WAAW,UAAU,OAAO,OAAO,MAAM;AAC/C,aAAW,SAAS,QAAQ;AAC1B,UAAM,KAAK;AAAA,MACT,QAAQ,OAAO,EAAE;AAAA,MACjB,MAAMA,oBAAmB;AAAA,QACvB,KAAKF;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ;AAAA,MACxB,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AFxKA,IAAM,aAAa,CAAC,KAAK,KAAM,GAAK;AAE7B,SAAS,0BAA0BG,UAAwB;AAChE,QAAM,YAAYA,SAAQ,QAAQ,WAAW,EAAE,YAAY,yCAAyC;AAIpG,YACG,QAAQ,UAAU,EAClB,YAAY,gFAAsE,EAClF,eAAe,qBAAqB,eAAe,EACnD,eAAe,qBAAqB,yDAAyD,EAC7F,OAAO,gBAAgB,0DAAqD,MAAM,EAClF,OAAO,oBAAoB,6BAA6B,KAAK,EAC7D,OAAO,aAAa,6CAA6C,KAAK,EACtE,OAAO,OAAO,SAAS;AACtB,UAAM,eAAe,KAAK;AAC1B,QAAI,CAACC,WAAU,YAAY,GAAG;AAC5B,cAAQ,MAAMC,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,MAAM,OAAO,KAAK,GAAG;AAC3B,QAAI,CAAC,WAAW,SAAS,GAAyB,GAAG;AACnD,cAAQ,MAAMA,OAAM,IAAI,4BAA4B,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,cAAc,OAAO,KAAK,QAAQ;AAExC,UAAM,SAAS,gBAAgB;AAI/B,UAAM,UAAUC,KAAI,wBAAwB,EAAE,MAAM;AACpD,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI;AACF,OAAC,cAAc,gBAAgB,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QACzD,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,QAAQ,CAAC;AAAA,QAC9F,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,iBAAiB,CAAC;AAAA,QACvG,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,oBAAoB,CAAC;AAAA,MAC5G,CAAC;AAED,OAAC,eAAe,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC7D,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,QACvF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,QACrF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC;AAAA,MAChH,CAAC;AACD,cAAQ,KAAK;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,MAAMD,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,MAAMA,OAAM,IAAI,uDAAuD,CAAC;AAChF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,kBAAkBE,YAAW,KAAK,QAAQ,aAAa;AAC7D,UAAM,SAAS,eAAe,iBAAiB,eAAe,iBAAiB;AAI/E,UAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AACxE,UAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AAExE,YAAQ,IAAI;AACZ,YAAQ,IAAIF,OAAM,KAAK,oBAAoB,CAAC;AAC5C,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,oBAAoB,WAAW,KAAK,aAAa,YAAY;AACzE,YAAQ,IAAI,oBAAoB,KAAK,MAAM,IAAI,WAAW,EAAE;AAC5D,YAAQ,IAAI,oBAAoBG,aAAY,cAAc,aAAa,CAAC,IAAI,WAAW,EAAE;AACzF,YAAQ,IAAI,oBAAoBA,aAAY,gBAAgB,aAAa,CAAC,IAAI,WAAW,EAAE;AAC3F,YAAQ,IAAI,oBAAoBA,aAAY,QAAQ,aAAa,CAAC,IAAI,WAAW,EAAE;AACnF,YAAQ,IAAI,oBAAoB,OAAO,MAAM,+BAA+B;AAC5E,QAAI,CAAC,QAAQ;AACX,cAAQ,IAAI,oBAAoB,SAAS,yBAAoB,GAAG,MAAM,GAAG,WAAW,iCAAuB,GAAG,GAAG,EAAE;AACnH,cAAQ,IAAI,qBAAqB,cAAc,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,IACnE;AACA,YAAQ,IAAI,oBAAoB,YAAY,EAAE;AAC9C,YAAQ,IAAI;AAEZ,QAAI,kBAAkB,QAAQ;AAC5B,cAAQ,KAAKH,OAAM,OAAO,sBAAsB,KAAK,MAAM,+BAA+BG,aAAY,QAAQ,aAAa,CAAC,GAAG,CAAC;AAChI,cAAQ,KAAKH,OAAM,OAAO,sDAAsD,CAAC;AACjF,cAAQ,IAAI;AAAA,IACd;AAIA,QAAI;AACJ,QAAI,WAAiC;AAErC,QAAI,QAAQ;AAEV,gBAAU;AAAA,IACZ,OAAO;AACL,YAAM,eAAeC,KAAI,2BAA2B,EAAE,MAAM;AAC5D,UAAI;AACF,YAAI;AAEJ,YAAI,QAAQ;AAEV,gBAAM,QAAQ,MAAM,SAAS;AAAA,YAC3B,SAAS,OAAO,EAAE;AAAA,YAClB,UAAU,OAAO,EAAE;AAAA,YACnB,UAAU;AAAA,YACV;AAAA,UACF,CAAC;AACD,sBAAY,MAAM;AAAA,QACpB,OAAO;AAEL,qBAAW;AAAA,YACT,CAAC,cAAc,OAAO,EAAE,MAAM,OAAO,EAAE,IAAI;AAAA,YAC3C,CAAC,KAAK,GAAG;AAAA;AAAA,UACX;AACA,gBAAM,QAAQ,MAAM,iBAAiB;AAAA,YACnC,MAAM;AAAA,YACN,UAAU;AAAA,UACZ,CAAC;AACD,sBAAY,MAAM;AAAA,QACpB;AAEA,kBAAU,cAAc,WAAW,WAAW;AAE9C,qBAAa;AAAA,UACX,UAAUE,aAAY,WAAW,CAAC,CAAC,eAC1BA,aAAY,SAAS,CAAC,CAAC,gBAAgBA,aAAY,UAAU,OAAO,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,QACjG;AAAA,MACF,SAAS,KAAK;AACZ,qBAAa,KAAK,uBAAuB;AACzC,gBAAQ,MAAMH,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAIA,UAAM,WAAW,UAAU,OAAO,OAAO,MAAM;AAC/C,QAAI,QAAQ;AACV,cAAQ,IAAIA,OAAM,IAAI,gBAAgBG,aAAY,UAAU,CAAC,CAAC,OAAO,CAAC;AACtE,cAAQ,IAAI;AAAA,IACd;AAIA,UAAM,SAAiC;AAAA,MACrC,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,mBAAmB,QAAQ,cAAc,QAAQ,cAAc,eAAe,SAAS,QAAQ;AAE7G,YAAQ,IAAI;AACZ,YAAQ,IAAIH,OAAM,KAAK,gBAAgB,MAAM,MAAM,IAAI,CAAC;AACxD,YAAQ,IAAI,YAAY,KAAK,CAAC;AAC9B,YAAQ,IAAI;AAIZ,QAAI,CAAC,KAAK,SAAS;AACjB,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,OAAO,qDAAqD,CAAC;AAC/E;AAAA,IACF;AAEA,UAAM,cAAcC,KAAI,8BAA8B,EAAE,MAAM;AAC9D,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,KAAK;AACvC,kBAAY,QAAQ,mBAAmB,MAAM,EAAE;AAC/C,cAAQ,IAAID,OAAM,IAAI,KAAK,eAAe,MAAM,CAAC,EAAE,CAAC;AAAA,IACtD,SAAS,KAAK;AACZ,kBAAY,KAAK,kBAAkB;AACnC,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,YACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,eAAe,qBAAqB,eAAe,EACnD,OAAO,OAAO,SAAS;AACtB,UAAM,eAAe,KAAK;AAC1B,QAAI,CAACD,WAAU,YAAY,GAAG;AAC5B,cAAQ,MAAMC,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,gBAAgB;AAC/B,UAAM,UAAUC,KAAI,6BAA6B,EAAE,MAAM;AAEzD,QAAI;AAEF,YAAM,CAAC,cAAc,gBAAgB,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/D,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,QAAQ,CAAC;AAAA,QAC9F,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,iBAAiB,CAAC;AAAA,QACvG,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,qBAAqB,cAAc,oBAAoB,CAAC;AAAA,MAC5G,CAAC;AAED,YAAM,CAAC,eAAe,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACnE,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,QACvF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,QACrF,OAAO,aAAa,EAAE,SAAS,cAAc,KAAK,WAAW,cAAc,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC;AAAA,MAChH,CAAC;AAGD,YAAM,gBAAgB,MAAM,QAAQ;AAAA,QAClC,OAAO,IAAI,OAAO,UAAU;AAC1B,gBAAM,MAAM,MAAM,OAAO,aAAa;AAAA,YACpC,SAAS,OAAO,EAAE;AAAA,YAClB,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,KAAK;AAAA,UACd,CAAC;AACD,iBAAO,EAAE,OAAO,SAAS,IAAI;AAAA,QAC/B,CAAC;AAAA,MACH;AAEA,cAAQ,KAAK;AAEb,YAAM,SAAS,eAAe,iBAAiB,eAAe,iBAAiB;AAC/E,YAAM,UAAU,WAAW;AAE3B,cAAQ,IAAI;AACZ,cAAQ,IAAID,OAAM,KAAK,kBAAkB,CAAC;AAC1C,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,cAAQ,IAAIA,OAAM,KAAK,WAAW,CAAC;AACnC,cAAQ,IAAI,wBAAwB,WAAW,EAAE;AACjD,cAAQ,IAAI,wBAAwBG,aAAY,cAAc,aAAa,CAAC,IAAI,WAAW,EAAE;AAC7F,cAAQ,IAAI,wBAAwBA,aAAY,gBAAgB,aAAa,CAAC,IAAI,WAAW,EAAE;AAC/F,cAAQ,IAAI,wBAAwBA,aAAY,QAAQ,aAAa,CAAC,IAAI,WAAW,EAAE;AAEvF,cAAQ,IAAIH,OAAM,KAAK,yBAAyB,CAAC;AACjD,iBAAW,EAAE,OAAO,QAAQ,KAAK,eAAe;AAC9C,cAAM,OAAO,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY;AACjE,cAAM,QAAQ,OAAOA,OAAM,MAAM,GAAG,KAAK,QAAQ,IAAI;AACrD,gBAAQ,IAAI,OAAO,KAAK,KAAKG,aAAY,SAAS,CAAC,CAAC,OAAO;AAAA,MAC7D;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMH,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AG5QA,OAAOI,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,WAAW;AAQpB,IAAM,wBAAwB;AAAA,EAC5B;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,IAC3C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAKA,SAAS,eAAoB;AAE3B,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,OAAO,cAAc,QAAQ,IAAI;AAC7C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,IAAI;AAAA,IACb,SAAS,SAAS,EAAE;AAAA,IACpB,QAAQ,UAAU;AAAA,IAClB,YAAY,IAAI,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG;AAAA,EACnD,CAAC;AACH;AAEO,SAAS,yBAAyBC,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,iDAAiD;AAI1G,WACG,QAAQ,MAAM,EACd,YAAY,sFAAsF,EAClG,eAAe,iBAAiB,wCAAwC,EACxE,OAAO,wBAAwB,qBAAqB,0BAA0B,EAC9E,OAAO,iBAAiB,oCAAoC,EAC5D,OAAO,OAAO,SAAS;AACtB,UAAM,UAAU,WAAW;AAG3B,UAAM,aAAa,WAAW;AAC9B,QAAI,YAAY;AACd,cAAQ,IAAIC,OAAM,OAAO,8CAA8C,UAAU,EAAE,CAAC;AACpF,cAAQ,IAAIA,OAAM,IAAI,yDAAyD,CAAC;AAChF,cAAQ,IAAI;AAAA,IACd;AAEA,UAAM,UAAUC,KAAI,4BAA4B,EAAE,MAAM;AACxD,QAAI;AACF,YAAM,MAAM,aAAa;AAGzB,cAAQ,OAAO;AACf,YAAM,QAAQ,IAAI,YAAY,KAAK,MAAM,KAAK,aAAa,KAAK,KAAK;AAGrE,cAAQ,OAAO;AACf,YAAM,WAAW,MAAM,MAAM,gBAAgB;AAE7C,cAAQ,OAAO;AACf,YAAM,SAAS,UAAU;AAEzB,YAAM,UAAU,MAAM;AACtB,UAAI,CAAC,SAAS;AACZ,gBAAQ,KAAK,gDAAgD;AAC7D,gBAAQ,IAAID,OAAM,IAAI,0CAA0C,CAAC;AACjE;AAAA,MACF;AAGA,YAAM,UAAU,OAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,CAAC,IAAI,OAAO;AAG9E,iBAAW,OAAO;AAElB,cAAQ,QAAQ,+BAA+B,OAAO,EAAE;AACxD,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,OAAO,EAAE,CAAC;AAChD,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;AAClD,cAAQ,IAAIA,OAAM,IAAI,gBAAgB,QAAQ,OAAO,EAAE,CAAC;AACxD,cAAQ,IAAIA,OAAM,IAAI,sCAAsC,CAAC;AAC7D,cAAQ,IAAI;AACZ,cAAQ,IAAIA,OAAM,MAAM,gCAAgC,CAAC;AACzD,cAAQ,IAAIA,OAAM,IAAI,0CAA0C,OAAO,mCAAmC,CAAC;AAAA,IAC7G,SAAS,KAAK;AACZ,cAAQ,KAAK,6BAA6B;AAC1C,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,2DAA2D,EACvE,eAAe,kBAAkB,wBAAwB,EACzD,OAAO,OAAO,SAAS;AACtB,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,gBAAgB;AAC/B,UAAM,WAAW,eAAe,EAAE;AAClC,UAAM,UAAU,OAAO,KAAK,EAAE;AAE9B,UAAM,UAAUC,KAAI,iCAAiC,OAAO,KAAK,EAAE,MAAM;AACzE,QAAI;AACF,YAAM,QAAQ,MAAM,OAAO,aAAa;AAAA,QACtC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,OAAO,CAAC;AAAA,MACxB,CAAC;AAED,UAAI,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY,GAAG;AACzD,gBAAQ,KAAK,UAAU,OAAO,gBAAgB,KAAK,mBAAmB;AACtE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,iBAAW,OAAO;AAClB,cAAQ,QAAQ,UAAU,OAAO,6BAA6B;AAC9D,cAAQ,IAAID,OAAM,IAAI,aAAa,QAAQ,OAAO,EAAE,CAAC;AACrD,cAAQ,IAAIA,OAAM,IAAI,oCAAoC,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,cAAQ,KAAK,yBAAyB;AACtC,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C,OAAO,YAAY;AAClB,UAAM,UAAU,WAAW;AAC3B,UAAM,WAAW,eAAe,EAAE;AAClC,UAAM,SAAS,gBAAgB;AAE/B,UAAM,UAAUC,KAAI,sBAAsB,EAAE,MAAM;AAClD,QAAI;AACF,YAAM,UAAU,MAAM,OAAO,aAAa;AAAA,QACxC,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,OAAO;AAAA,MACxB,CAAC;AAED,cAAQ,KAAK;AAEb,YAAM,UAAU,WAAW;AAE3B,cAAQ,IAAI;AACZ,cAAQ,IAAID,OAAM,KAAK,2BAA2B,CAAC;AACnD,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,cAAQ,IAAI,iBAAiB,QAAQ,OAAO,EAAE;AAC9C,cAAQ,IAAI,iBAAiB,QAAQ,EAAE;AACvC,cAAQ,IAAI,iBAAiB,QAAQ,SAAS,CAAC,EAAE;AAEjD,UAAI,SAAS;AAEX,YAAI;AACF,gBAAM,QAAQ,MAAM,OAAO,aAAa;AAAA,YACtC,SAAS;AAAA,YACT,KAAK;AAAA,YACL,cAAc;AAAA,YACd,MAAM,CAAC,OAAO,OAAO,CAAC;AAAA,UACxB,CAAC;AAED,gBAAM,UAAU,MAAM,YAAY,MAAM,QAAQ,QAAQ,YAAY;AACpE,kBAAQ,IAAI,kBAAkB,OAAO,IAAI,UAAUA,OAAM,MAAM,YAAY,IAAIA,OAAM,IAAI,eAAe,QAAQ,GAAG,CAAC,EAAE;AAGtH,cAAI,SAAS;AACX,gBAAI;AACF,oBAAM,MAAM,aAAa;AACzB,oBAAM,QAAQ,MAAM,IAAI,UAAU,GAAG,SAAS,EAAE,EAAE,IAAI,OAAO,EAAE;AAC/D,kBAAI,MAAM,KAAM,SAAQ,IAAI,iBAAiB,MAAM,IAAI,EAAE;AACzD,kBAAI,MAAM,YAAa,SAAQ,IAAI,iBAAiBA,OAAM,IAAI,MAAM,WAAW,CAAC,EAAE;AAClF,kBAAI,MAAM,cAAe,SAAQ,IAAI,iBAAiB,MAAM,aAAa,EAAE;AAAA,YAC7E,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF,QAAQ;AACN,kBAAQ,IAAI,kBAAkB,OAAO,IAAIA,OAAM,IAAI,mBAAmB,CAAC,EAAE;AAAA,QAC3E;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,iBAAiBA,OAAM,IAAI,wDAAmD,CAAC,EAAE;AAAA,MAC/F;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,0BAA0B;AACvC,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC1NA,SAAS,aAAAE,kBAAiB;AAC1B,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,gBAAAC,qBAAoB;;;ACPtB,SAAS,oBAAoB,SAAyB;AAC3D,QAAM,IAAI,OAAO,OAAO;AACxB,MAAI,KAAK,MAAO,QAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC;AACtE,MAAI,KAAK,KAAM,QAAO,IAAI,IAAI,MAAM,QAAQ,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC;AACnE,MAAI,KAAK,GAAI,QAAO,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC;AAC1C,SAAO,GAAG,CAAC;AACb;AAGO,SAAS,mBAAmB,SAAyB;AAC1D,QAAM,IAAI,OAAO,OAAO;AACxB,MAAI,KAAK,MAAO,QAAO,IAAI,IAAI,OAAO,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,MAAM,EAAE;AACnG,MAAI,KAAK,KAAM,QAAO,IAAI,IAAI,MAAM,QAAQ,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,MAAM,EAAE;AAC/F,MAAI,KAAK,GAAI,QAAO,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC;AAC1C,SAAO,GAAG,CAAC;AACb;AAGO,SAAS,aAAa,KAAa,WAAmB,GAAW;AACtE,QAAM,MAAM,OAAO,GAAG,IAAI,MAAM;AAChC,SAAO,IAAI,eAAe,SAAS,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,CAAC;AAC3F;AAGO,SAAS,WAAW,KAAqB;AAC9C,QAAM,MAAM,OAAO,GAAG,IAAI;AAC1B,SAAO,IAAI,IAAI,eAAe,SAAS,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,CAAC,CAAC;AAChG;AAGO,SAAS,eAAe,OAAe,MAAsB;AAClE,MAAI,CAAC,UAAU,KAAK,KAAK,GAAG;AAC1B,UAAM,IAAI,MAAM,WAAW,IAAI,MAAM,KAAK,0BAA0B;AAAA,EACtE;AACA,SAAO,OAAO,KAAK;AACrB;;;ADIA,IAAM,IAAIC,OAAM;AAChB,IAAM,IAAIA,OAAM;AAChB,IAAM,MAAMA,OAAM;AAClB,IAAM,OAAOA,OAAM,MAAM;AACzB,IAAM,QAAQA,OAAM,MAAM;AAC1B,IAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAEjD,SAAS,gBAAgB,IAAoB;AAC3C,MAAI,OAAO,GAAI,QAAO;AACtB,SAAO,IAAI,KAAK,OAAO,EAAE,IAAI,GAAI,EAAE,eAAe;AACpD;AAEA,SAAS,eAAe,MAA2B;AACjD,QAAM,MAAMC,cAAa,MAAM,OAAO;AACtC,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,SAAO,OAAO,IAAI,CAAC,OAAO;AAAA,IACxB,QAAQ,EAAE;AAAA,IACV,MAAM,EAAE;AAAA,IACR,OAAO,OAAO,EAAE,SAAS,GAAG;AAAA,EAC9B,EAAE;AACJ;AAEO,SAAS,yBAAyBC,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,2DAAsD;AAI/G,WACG,QAAQ,QAAQ,EAChB,YAAY,4BAA4B,EACxC,eAAe,qBAAqB,oCAAoC,EACxE,eAAe,iBAAiB,eAAe,EAC/C,eAAe,wBAAwB,qCAAqC,EAC5E,eAAe,2BAA2B,oCAAoC,EAC9E,eAAe,yBAAyB,wCAAwC,EAChF,eAAe,0BAA0B,6CAA6C,EACtF,eAAe,yBAAyB,gDAAgD,EACxF,OAAO,wBAAwB,4DAAuD,EACtF,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAACC,WAAU,KAAK,GAAG;AACrB,gBAAQ,MAAMH,OAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,oBAAoB,eAAe,KAAK,gBAAgB,iBAAiB;AAC/E,YAAM,mBAAmB,cAAc,KAAK,QAAQ;AACpD,YAAM,eAAe,eAAe,KAAK,YAAY;AACrD,YAAM,cAAc,eAAe,KAAK,WAAW;AAGnD,UAAI,cAAc,KAAK,eAAe;AAEtC,UAAI,CAAC,aAAa;AAChB,cAAMI,WAAUC,KAAI,EAAE,MAAM,EAAE,+BAA+B,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACxF,YAAI;AACF,gBAAM,UAAU,WAAW;AAC3B,gBAAM,WAA8B;AAAA,YAClC,QAAQ;AAAA,YACR,MAAM,KAAK;AAAA,YACX,aAAa,KAAK;AAAA,YAClB,OAAO,WAAW;AAAA,YAClB,YAAY,CAAC;AAAA,YACb,OAAO,CAAC;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAEA,gBAAM,eAAe;AAAA,YACnB,GAAG;AAAA,YACH,UAAU,QAAQ;AAAA,YAClB;AAAA,YACA,mBAAmB,OAAO,iBAAiB;AAAA,YAC3C,kBAAkB,OAAO,gBAAgB;AAAA,YACzC,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,UACzC;AAEA,wBAAc,MAAM,eAAe,YAA4C;AAC/E,UAAAD,SAAQ,QAAQ,EAAE,oBAAoB,IAAI,WAAW,CAAC,EAAE,CAAC;AAAA,QAC3D,SAAS,KAAK;AACZ,UAAAA,SAAQ,KAAKJ,OAAM,OAAO,iDAA4C,CAAC;AACvE,gBAAM,OAAO,KAAK,UAAU,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,aAAa,MAAM,CAAC;AACrF,wBAAc,gCAAgC,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ,CAAC;AAAA,QACpF;AAAA,MACF;AAGA,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,2BAAsB,CAAC;AACzC,UAAI;AACJ,cAAQ,IAAI,EAAE,uBAAuB,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AACvD,cAAQ,IAAI,EAAE,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;AAChD,cAAQ,IAAI,EAAE,uBAAuB,OAAO,iBAAiB,IAAI,GAAG,GAAG,CAAC;AACxE,cAAQ,IAAI,EAAE,uBAAuB,oBAAe,gBAAgB,CAAC,EAAE,CAAC;AACxE,cAAQ,IAAI,EAAE,uBAAuB,aAAa,MAAM,cAAc,YAAY,MAAM,SAAS,CAAC;AAClG,cAAQ,IAAI,EAAE,uBAAuB,IAAI,YAAY,SAAS,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,QAAQ,WAAW,CAAC,EAAE,CAAC;AACrH,UAAI;AAGJ,YAAM,UAAUK,KAAI,EAAE,MAAM,EAAE,wBAAwB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACjF,YAAM,SAAS,MAAM,QAAQ,OAAO,aAAa,mBAAmB,kBAAkB,cAAc,WAAW;AAC/G,cAAQ,QAAQ,EAAE,oBAAoB,CAAC;AAEvC,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,2BAAsB,CAAC;AACzC,UAAI;AACJ,cAAQ,IAAI,EAAE,mBAAmB,EAAE,IAAI,OAAO,UAAU,EAAE,CAAC,EAAE,CAAC;AAC9D,cAAQ,IAAI,EAAE,mBAAmB,IAAI,eAAe,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;AACpE,UAAI;AACJ,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAML,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B,OAAO,qBAAqB,iBAAiB,EAC7C,OAAO,oBAAoB,qEAAqE,KAAK,EACrG,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUK,KAAI,sBAAsB,EAAE,MAAM;AAClD,QAAI;AACF,YAAM,QAAQ,MAAM,cAAc;AAClC,UAAI,UAAU,IAAI;AAChB,gBAAQ,KAAK;AACb,gBAAQ,IAAI,IAAI,2BAA2B,CAAC;AAC5C;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,QAAS,KAAK,MAAiB,YAAY,IAAI;AACxE,YAAM,cAAc,KAAK,MAAM,YAAY;AAC3C,YAAM,aAAa,gBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,MAAM,WAAW;AAGnF,YAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC;AACzE,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,IAAI,IAAI,OAAO,OAAO;AACpB,gBAAM,CAAC,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;AAC5E,iBAAO,EAAE,GAAG,GAAG,eAAe,MAAM;AAAA,QACtC,CAAC;AAAA,MACH;AAEA,YAAM,YAAY,QAAQ,OAAO,CAAC,MAAM;AACtC,YAAI,eAAe,EAAE,MAAM,YAAY,MAAM,YAAa,QAAO;AACjE,YAAI,gBAAgB,SAAS,cAAc,KAAK,EAAE,kBAAkB,WAAY,QAAO;AACvF,eAAO;AAAA,MACT,CAAC;AAED,cAAQ,KAAK;AAEb,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,IAAI,IAAI,8BAA8B,CAAC;AAC/C;AAAA,MACF;AAEA,cAAQ,IAAI;AACZ,cAAQ,IAAI,KAAK,cAAc,UAAU,MAAM,GAAG,CAAC;AACnD,cAAQ,IAAI,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAC/B,cAAQ;AAAA,QACN,IAAI,QAAQ,IACZ,IAAI,QAAQ,OAAO,EAAE,CAAC,IACtB,IAAI,QAAQ,OAAO,EAAE,CAAC,IACtB,IAAI,sBAAsB,OAAO,EAAE,CAAC,IACpC,IAAI,MAAM,OAAO,CAAC,CAAC,IACnB,IAAI,WAAW,OAAO,EAAE,CAAC,IACzB,IAAI,SAAS;AAAA,MACf;AACA,cAAQ,IAAI,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAE/B,iBAAW,KAAK,WAAW;AACzB,cAAM,QAAQ,gBAAgB,EAAE,aAAa,KAAK;AAClD,cAAM,UAAU,EAAE,oBAAoB,KAClC,IAAI,KAAK,OAAO,EAAE,iBAAiB,IAAI,GAAI,EAAE,mBAAmB,IAChE;AACJ,cAAM,QAAQ,GAAG,EAAE,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;AACjE,cAAM,MAAM,GAAG,OAAO,EAAE,iBAAiB,IAAI,GAAG;AAChD,cAAM,MAAM,oBAAe,EAAE,gBAAgB;AAC7C,cAAM,QAAQ,GAAG,aAAa,EAAE,QAAQ,CAAC,IAAI,aAAa,EAAE,YAAY,CAAC;AAEzE,gBAAQ;AAAA,UACN,KAAK,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,GACxB,MAAM,OAAO,EAAE,CAAC,GAChB,MAAM,OAAO,EAAE,CAAC,GAChB,MAAM,OAAO,EAAE,CAAC,GAChB,IAAI,OAAO,CAAC,CAAC,GACb,IAAI,OAAO,EAAE,CAAC,GACd,OAAO;AAAA,QACZ;AAAA,MACF;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,0BAA0B;AACvC,cAAQ,MAAML,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,SAAS,QAAQ,aAAa,EAC9B,OAAO,OAAO,UAAU;AACvB,UAAM,UAAUK,KAAI,qBAAqB,EAAE,MAAM;AACjD,QAAI;AACF,YAAM,KAAK,eAAe,OAAO,aAAa;AAC9C,YAAM,IAAI,MAAM,YAAY,EAAE;AAC9B,YAAM,QAAQ,MAAM,iBAAiB,EAAE;AACvC,YAAM,SAAS,MAAM,kBAAkB;AAEvC,cAAQ,KAAK;AAEb,YAAM,aAAa,gBAAgB,KAAK,KAAK;AAC7C,YAAM,aAAa,EAAE,WAAW,EAAE;AAClC,YAAM,eAAe,aAAa,KAAK,GAAG,OAAO,OAAO,gBAAgB,IAAI,GAAG,MAAM;AAErF,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,sBAAiB,EAAE,EAAE,EAAE,CAAC;AAC1C,UAAI;AAGJ,UAAI,EAAE,eAAe,EAAE,YAAY,WAAW,SAAS,GAAG;AACxD,YAAI;AACF,gBAAM,OAAO,MAAM,cAAc,EAAE,WAAW;AAC9C,kBAAQ,IAAI,EAAE,uBAAuB,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AACvD,kBAAQ,IAAI,EAAE,uBAAuB,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;AAAA,QAC/D,QAAQ;AACN,kBAAQ,IAAI,EAAE,uBAAuB,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,QAC5D;AAAA,MACF,WAAW,EAAE,aAAa;AACxB,gBAAQ,IAAI,EAAE,uBAAuB,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,MAC5D;AAEA,cAAQ,IAAI,EAAE,uBAAuB,KAAK,UAAU,CAAC,EAAE,CAAC;AACxD,cAAQ,IAAI,EAAE,uBAAuB,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;AACrD,cAAQ,IAAI,EAAE,uBAAuB,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;AAClD,cAAQ,IAAI,EAAE,uBAAuB,OAAO,EAAE,iBAAiB,IAAI,GAAG,GAAG,CAAC;AAC1E,cAAQ,IAAI,EAAE,uBAAuB,oBAAe,EAAE,gBAAgB,CAAC,EAAE,CAAC;AAE1E,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,cAAc,CAAC;AACjC,cAAQ,IAAI,EAAE,uBAAuB,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,CAAC;AAC5E,cAAQ,IAAI,EAAE,uBAAuB,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;AAClE,cAAQ,IAAI,EAAE,uBAAuB,gBAAgB,EAAE,SAAS,CAAC,EAAE,CAAC;AACpE,cAAQ,IAAI,EAAE,uBAAuB,gBAAgB,EAAE,UAAU,CAAC,EAAE,CAAC;AAErE,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,cAAQ,IAAI,EAAE,uBAAuB,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;AAChE,cAAQ,IAAI,EAAE,uBAAuB,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;AACpE,cAAQ,IAAI,EAAE,uBAAuB,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;AACpE,cAAQ,IAAI,EAAE,uBAAuB,YAAY,EAAE,CAAC;AAEpD,UAAI,UAAU,eAAe,YAAY,UAAU,eAAe,SAAS;AACzE,YAAI;AACF,gBAAM,MAAM,MAAM,mBAAmB,EAAE;AACvC,kBAAQ,IAAI;AACZ,kBAAQ,IAAI,MAAM,WAAW,CAAC;AAE9B,kBAAQ,IAAI,EAAE,uBAAuB,WAAW,GAAG,CAAC,EAAE,CAAC;AAAA,QACzD,QAAQ;AAAA,QAAoB;AAAA,MAC9B;AAEA,YAAM,YAAY,MAAM,gBAAgB,EAAE;AAC1C,YAAM,aAAa,MAAM,mBAAmB,EAAE;AAE9C,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,oBAAoB,UAAU,MAAM,GAAG,CAAC;AAC1D,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAQ,IAAI,IAAI,MAAM,CAAC,YAAY,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;AACzD,gBAAQ,IAAI,IAAI,eAAe,UAAU,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,cAAc,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,MAClG;AACA,cAAQ,IAAI,MAAM,uBAAuB,WAAW,MAAM,GAAG,CAAC;AAC9D,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,gBAAQ,IAAI,IAAI,MAAM,CAAC,YAAY,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;AAC1D,gBAAQ,IAAI,IAAI,eAAe,WAAW,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,cAAc,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,MACpG;AAEA,UAAI;AACJ,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,yBAAyB;AACtC,cAAQ,MAAML,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,MAAM,EACd,YAAY,mCAAmC,EAC/C,eAAe,qBAAqB,aAAa,EACjD,eAAe,mCAAmC,0CAA0C,EAC5F,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AACxD,YAAM,aAAa,OAAO,KAAK,OAAO,EAAE,YAAY;AACpD,YAAM,UAAU,eAAe,SAAS,eAAe,QACnD,UAAU,MACV,eAAe,QAAQ,eAAe,YACpC,UAAU,UACV,eAAe,YACb,UAAU,UACV;AACR,UAAI,YAAY,MAAM;AACpB,gBAAQ,MAAMA,OAAM,IAAI,0BAA0B,KAAK,OAAO,6BAA6B,CAAC;AAC5F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,UAAU,WAAW;AAE3B,YAAM,UAAUK,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,IAAI,MAAM,YAAY,UAAU;AACtC,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,SAAS;AACpC,gBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,eAAe;AAC9E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,eAAe,MAAM,SAAS,YAAY,QAAQ,OAAO;AAC/D,UAAI,cAAc;AAChB,gBAAQ,KAAK,yCAAyC;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,MAAM,cAAc,YAAY,QAAQ,OAAO;AAC9D,cAAQ,KAAK;AAEb,cAAQ,IAAI;AACZ,cAAQ,IAAI,MAAM,oBAAe,CAAC;AAClC,UAAI;AACJ,cAAQ,IAAI,EAAE,iBAAiB,UAAU,EAAE,CAAC;AAC5C,cAAQ,IAAI,EAAE,gBAAgB,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;AAC3C,cAAQ,IAAI;AAAA,QACV,gBACE,YAAY,UAAU,MAAM,EAAE,KAAK,IAC/B,YAAY,UAAU,UAAUL,OAAM,IAAI,SAAS,IACjD,IAAI,SAAS,CACrB;AAAA,MACF,CAAC;AACD,cAAQ,IAAI,EAAE,gBAAgB,aAAa,MAAM,CAAC,SAAS,CAAC;AAC5D,UAAI;AAEJ,YAAM,cAAcK,KAAI,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACjF,YAAM,OAAO,MAAM,KAAK,YAAY,OAAO;AAC3C,kBAAY,QAAQ,EAAE,WAAW,CAAC;AAClC,cAAQ,IAAI,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAC5C,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAML,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,SAAS,EACjB,YAAY,8BAA8B,EAC1C,eAAe,qBAAqB,aAAa,EACjD,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AAExD,YAAM,UAAUK,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,UAAU;AACrC,gBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,gBAAgB;AAC/E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,OAAO,EAAE,uBAAuB;AACxC,YAAM,OAAO,MAAM,gBAAgB,UAAU;AAC7C,cAAQ,QAAQ,EAAE,mBAAmB,CAAC;AAEtC,cAAQ,IAAI,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAE5C,UAAI;AACF,cAAM,MAAM,MAAM,mBAAmB,UAAU;AAE/C,gBAAQ,IAAI,IAAI,uBAAuB,WAAW,GAAG,CAAC,EAAE,CAAC;AAAA,MAC3D,QAAQ;AAAA,MAAwB;AAEhC,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAML,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,QAAQ,EAChB,YAAY,2DAA2D,EACvE,eAAe,qBAAqB,aAAa,EACjD,OAAO,kBAAkB,mEAAmE,EAC5F,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AACxD,YAAM,UAAU,WAAW;AAE3B,YAAM,UAAUK,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,IAAI,MAAM,YAAY,UAAU;AACtC,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,UAAU;AACrC,gBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,gBAAgB;AAC/E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,aAAa,QAAQ,QAAQ,YAAY,MAAM,EAAE,SAAS,YAAY;AAC5E,YAAM,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC;AAChD,YAAM,kBAAkB,EAAE,aAAa,MAAM,OAAO,EAAE,aAAa,EAAE;AAErE,UAAI;AAEJ,UAAI,cAAc,CAAC,iBAAiB;AAElC,gBAAQ,OAAO,EAAE,wBAAwB;AACzC,eAAO,MAAM,eAAe,UAAU;AACtC,gBAAQ,QAAQ,EAAE,qBAAqB,CAAC;AAAA,MAC1C,WAAW,mBAAmB,CAAC,KAAK,OAAO;AAEzC,gBAAQ,OAAO,EAAE,8BAA8B;AAC/C,eAAO,MAAM,eAAe,UAAU;AACtC,gBAAQ,QAAQ,EAAE,0BAA0B,CAAC;AAAA,MAC/C,WAAW,mBAAmB,KAAK,OAAO;AAExC,gBAAQ,OAAO,EAAE,uBAAuB;AACxC,cAAM,QAAQ,eAAe,KAAK,KAAK;AACvC,eAAO,MAAM,gBAAgB,YAAY,KAAK;AAC9C,gBAAQ,QAAQ,EAAE,mBAAmB,CAAC;AAAA,MACxC,OAAO;AACL,gBAAQ,KAAK,mEAAmE;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,IAAI,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAC5C,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAML,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,QAAQ,EAChB,YAAY,6CAA6C,EACzD,eAAe,qBAAqB,aAAa,EACjD,OAAO,eAAe,4DAA4D,EAClF,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,eAAe,KAAK,IAAI,aAAa;AAExD,YAAM,UAAUK,KAAI,qBAAqB,EAAE,MAAM;AACjD,YAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,UAAI,UAAU,eAAe,WAAW,UAAU,eAAe,WAAW;AAC1E,gBAAQ,KAAK,uBAAuB,gBAAgB,KAAK,CAAC,EAAE;AAC5D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI;AAEJ,UAAI,KAAK,WAAW;AAClB,gBAAQ,OAAO,EAAE,yBAAyB;AAC1C,eAAO,MAAM,gBAAgB,UAAU;AACvC,gBAAQ,QAAQ,EAAE,qBAAqB,CAAC;AAAA,MAC1C,OAAO;AACL,YAAI,UAAU,eAAe,SAAS,UAAU,eAAe,SAAS;AACtE,kBAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,SAAS,kDAA6C;AAC5G,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,gBAAQ,OAAO,EAAE,wBAAwB;AACzC,eAAO,MAAM,eAAe,UAAU;AACtC,gBAAQ,QAAQ,EAAE,oBAAoB,CAAC;AAAA,MACzC;AAEA,cAAQ,IAAI,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAC5C,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,MAAML,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AACpF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AEphBA,OAAOM,YAAW;AAClB,OAAOC,UAAS;AAgBhB,IAAMC,KAAIC,OAAM;AAChB,IAAMC,KAAID,OAAM;AAChB,IAAME,OAAMF,OAAM;AAClB,IAAMG,QAAOH,OAAM,MAAM;AACzB,IAAMI,SAAQJ,OAAM,MAAM;AAC1B,IAAMK,OAAM,MAAM,QAAQ,IAAIH,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAE1C,SAAS,yBAAyBI,UAAwB;AAC/D,QAAM,WAAWA,SAAQ,QAAQ,UAAU,EAAE,YAAY,0CAA0C;AAInG,WACG,QAAQ,MAAM,EACd,YAAY,2DAA2D,EACvE,OAAO,YAAY;AAClB,UAAM,UAAUC,KAAI,0BAA0B,EAAE,MAAM;AACtD,QAAI;AACF,YAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QACzC,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,MACtB,CAAC;AAED,cAAQ,KAAK;AAEb,cAAQ,IAAI;AACZ,cAAQ,IAAIH,OAAM,8BAAyB,CAAC;AAC5C,MAAAC,KAAI;AACJ,cAAQ,IAAIJ,GAAE,2BAA2BF,GAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC;AACnE,cAAQ,IAAIE,GAAE,2BAA2BE,MAAK,mBAAe,OAAO,YAAY,CAAC,CAAC,EAAE,CAAC;AACrF,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,mBAAe,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC;AACxF,cAAQ,IAAIF,GAAE,6BAA6BE,MAAK,GAAG,OAAO,OAAO,gBAAgB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;AAC/F,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,GAAG,OAAO,OAAO,oBAAoB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;AACjG,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,IAAI,mBAAe,OAAO,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC;AAClG,cAAQ,IAAIF,GAAE,2BAA2BE,MAAK,mBAAe,OAAO,cAAc,CAAC,CAAC,EAAE,CAAC;AAEvF,cAAQ,IAAI;AACZ,cAAQ,IAAIC,OAAM,wBAAwB,OAAO,MAAM,GAAG,CAAC;AAC3D,UAAI,OAAO,WAAW,GAAG;AACvB,gBAAQ,IAAIF,KAAI,UAAU,CAAC;AAAA,MAC7B,OAAO;AACL,mBAAW,KAAK,QAAQ;AACtB,kBAAQ,IAAID,GAAE,OAAOF,GAAE,CAAC,CAAC,EAAE,CAAC;AAAA,QAC9B;AAAA,MACF;AAEA,MAAAM,KAAI;AACJ,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,cAAQ,KAAK,8BAA8B;AAC3C,cAAQ,MAAML,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,mBAAmB,EAC3B,YAAY,oCAAoC,EAChD,eAAe,iBAAiB,8BAA8B,EAC9D,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,0BAA0B,EAAE,MAAM;AACtD,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,eAAe,KAAK,SAAS,SAAS,CAAC;AAC1E,cAAQ,QAAQR,GAAE,gCAAgC,KAAK,OAAO,kFAAkF,CAAC;AACjJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,6BAA6B;AAC1C,cAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,sBAAsB,EAC9B,YAAY,uCAAuC,EACnD,eAAe,iBAAiB,iCAAiC,EACjE,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,6BAA6B,EAAE,MAAM;AACzD,QAAI;AACF,YAAM,OAAO,MAAM,mBAAmB,eAAe,KAAK,SAAS,SAAS,CAAC;AAC7E,cAAQ,QAAQR,GAAE,mCAAmC,KAAK,OAAO,kFAAkF,CAAC;AACpJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,gCAAgC;AAC7C,cAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,oBAAoB,EAC5B,YAAY,4CAA4C,EACxD,eAAe,aAAa,6CAA6C,EACzE,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,2BAA2B,EAAE,MAAM;AACvD,QAAI;AACF,YAAM,OAAO,MAAM,oBAAoB,eAAe,KAAK,KAAK,KAAK,CAAC;AACtE,cAAQ,QAAQR,GAAE,iCAAiC,OAAO,KAAK,GAAG,IAAI,GAAG,kFAAkF,CAAC;AAC5J,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,8BAA8B;AAC3C,cAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,aAAa,EACrB,YAAY,iDAAiD,EAC7D,eAAe,aAAa,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,oBAAoB,EAAE,MAAM;AAChD,QAAI;AACF,YAAM,OAAO,MAAM,wBAAwB,eAAe,KAAK,KAAK,KAAK,CAAC;AAC1E,cAAQ,QAAQR,GAAE,sCAAsC,OAAO,KAAK,GAAG,IAAI,GAAG,kFAAkF,CAAC;AACjK,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,uBAAuB;AACpC,cAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,kBAAkB,EAC1B,YAAY,uDAAuD,EACnE,eAAe,iBAAiB,6BAA6B,EAC7D,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,yBAAyB,EAAE,MAAM;AACrD,QAAI;AACF,YAAM,OAAO,MAAM,uBAAuB,eAAe,KAAK,SAAS,SAAS,CAAC;AACjF,cAAQ,QAAQR,GAAE,wCAAwC,KAAK,OAAO,kFAAkF,CAAC;AACzJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,cAAc,EACtB,YAAY,iDAAiD,EAC7D,eAAe,iBAAiB,yBAAyB,EACzD,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,qBAAqB,EAAE,MAAM;AACjD,QAAI;AACF,YAAM,OAAO,MAAM,kBAAkB,eAAe,KAAK,SAAS,SAAS,CAAC;AAC5E,cAAQ,QAAQR,GAAE,kCAAkC,KAAK,OAAO,kFAAkF,CAAC;AACnJ,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,wBAAwB;AACrC,cAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAIH,WACG,QAAQ,kBAAkB,EAC1B,YAAY,0CAA0C,EACtD,eAAe,aAAa,yDAAyD,EACrF,OAAO,OAAO,SAAS;AACtB,UAAM,UAAUO,KAAI,yBAAyB,EAAE,MAAM;AACrD,QAAI;AACF,YAAM,OAAO,MAAM,kBAAkB,eAAe,KAAK,KAAK,KAAK,CAAC;AACpE,cAAQ,QAAQR,GAAE,+BAA+B,OAAO,KAAK,GAAG,IAAI,GAAG,kFAAkF,CAAC;AAC1J,cAAQ,IAAIG,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,cAAQ,KAAK,4BAA4B;AACzC,cAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ApBhNA,IAAI;AAAE,aAAW;AAAG,QAAQ;AAAC;AAE7B,IAAMQ,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,SAAS,YAAY,IAAIA,SAAQ,iBAAiB;AAiC1D,eAAe,WAAW;AACxB,SAAO,OAAO,oBAAe;AAC/B;AAEA,eAAe,WAAW;AACxB,SAAO,OAAO,oBAAe;AAC/B;AAKA,IAAMC,KAAIC,OAAM;AAChB,IAAMC,KAAID,OAAM;AAChB,IAAME,OAAMF,OAAM;AAClB,IAAMG,QAAOH,OAAM,MAAM;AACzB,IAAMI,SAAQJ,OAAM,MAAM;AAC1B,IAAMK,OAAM,MAAM,QAAQ,IAAIH,KAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAEjD,SAAS,gBAAgB,OAAe,MAAuB;AAC7D,MAAI,CAACI,WAAU,KAAK,GAAG;AACrB,YAAQ,MAAMN,OAAM,IAAI,WAAW,IAAI,aAAa,KAAK,EAAE,CAAC;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAGA,SAAS,aAAa,MAA0B;AAC9C,MAAI,KAAK,OAAO;AACd,IAAS,gBAAgB,gBAAgB,KAAK,OAAO,OAAO,CAAC;AAAA,EAC/D;AAEF;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,6CAA6C,EACzD,QAAQ,WAAW,EACnB;AAAA,EACC,IAAI,OAAO,qBAAqB,gBAAgB,EAC7C,QAAQ,cAAc,EACtB,QAAQ,MAAM;AACnB,EACC,OAAO,aAAa,+CAA+C,KAAK,EACxE,KAAK,aAAa,CAAC,gBAAgB;AAClC,QAAM,OAAO,YAAY,gBAAgB;AACzC,MAAI,UAAkB,KAAK;AAC3B,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,iBAAiB;AAC7B,QAAI,YAAY,QAAQ;AACtB,cAAQ;AAAA,QACNA,OAAM,OAAO,oDAAoD;AAAA,MACnE;AAAA,IACF,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,aAAW,OAAkB;AAC7B,MAAI,WAAW,MAAM,QAAQ;AAC3B,YAAQ,IAAIA,OAAM,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC;AAAA,EAC/C;AACF,CAAC;AAGH,IAAM,YAAY,QAAQ,QAAQ,WAAW;AAE7C,UACG,QAAQ,QAAQ,EAChB,YAAY,sDAAsD,EAClE,OAAO,sBAAsB,6BAA6B,EAC1D,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,mBAAmB,gDAAgD,EAC1E,OAAO,+BAA+B,6CAA6C,EACnF,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,wBAAwB,0CAA0C,EACzE,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,iBAAiB,mCAAmC,KAAK,EAChE,OAAO,aAAa,mDAAmD,KAAK,EAC5E,OAAO,OAAO,SAAS;AACtB,MAAI;AAEF,YAAQ,IAAI;AACZ,YAAQ,IAAII,OAAM,2BAAsB,CAAC;AACzC,IAAAC,KAAI;AAEJ,UAAM,SAAS,WAAW;AAC1B,YAAQ,IAAIH,KAAI,cAAc,OAAO,OAAO,EAAE,CAAC;AAC/C,YAAQ,IAAIA,KAAI,cAAc,SAAS,EAAE,IAAI,EAAE,CAAC;AAChD,IAAAG,KAAI;AAIJ,UAAM,eAAe,WAAW;AAEhC,UAAM,iBAAiB,KAAK;AAE5B,UAAM,OAAO,KAAK,SAAS,kBACtB,MAAM;AAAE,YAAM,IAAI,MAAM,iDAAiD;AAAA,IAAG,GAAG,IAChF,MAAM,MAAM;AAAA,MACV,SAASN,GAAE,gBAAgB;AAAA,MAC3B,UAAU,CAAC,MAAc,EAAE,SAAS,KAAK;AAAA,IAC3C,CAAC;AAEL,UAAM,YAAY,KAAK,cAAc,iBACjC,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE,IACjE,MAAM,MAAM;AAAA,MACV,SAASA,GAAE,eAAe;AAAA,MAC1B,SAAS,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE;AAAA,MAC1E,UAAU,CAAC,MAAc,EAAE,UAAU,KAAK;AAAA,IAC5C,CAAC;AAEL,UAAM,cAAc,KAAK,gBAAgB,iBACrC,GAAG,IAAI,iCACP,MAAM,MAAM;AAAA,MACV,SAASA,GAAE,aAAa;AAAA,MACxB,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAEL,UAAM,aAAa,KAAK,YAAY,eAC/B,iBACG,OAAO,YAAY,IACnB,MAAM,MAAM,EAAE,SAASA,GAAE,qBAAqB,GAAG,SAAS,OAAO,YAAY,EAAE,CAAC,IACnF,iBACG,MACA,MAAM,MAAM,EAAE,SAASA,GAAE,qBAAqB,GAAG,UAAU,CAAC,MAAc,QAAQ,KAAK,CAAC,KAAK,mBAAmB,CAAC;AAGzH,UAAM,eAAe,KAAK,iBAAiB,SAAY,KAAK,eAAgB,iBACxE,OACA,MAAM,QAAQ;AAAA,MACZ,SAASA,GAAE,qCAAqC;AAAA,MAChD,SAAS;AAAA,IACX,CAAC;AAIL,UAAM,gBAAyC;AAAA,MAC7C,MAAM,OAAO,EAAE;AAAA,MACf,MAAM,OAAO,EAAE;AAAA,IACjB;AAEA,QAAI;AACJ,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,KAAK,MAAM,YAAY;AACrC,UAAI,cAAc,KAAK,GAAG;AACxB,gBAAQ,cAAc,KAAK;AAAA,MAC7B,WAAW,KAAK,MAAM,WAAW,IAAI,KAAK,KAAK,MAAM,WAAW,IAAI;AAClE,gBAAQ,KAAK;AAAA,MACf,OAAO;AACL,cAAM,YAAY,OAAO,KAAK,aAAa,EAAE,KAAK,IAAI;AACtD,gBAAQ,MAAMC,OAAM,IAAI,oBAAoB,KAAK,KAAK,oBAAoB,SAAS,oBAAoB,CAAC;AACxG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,WAAW,gBAAgB;AAEzB,cAAQ,OAAO,EAAE,SAAS,+CACtB,cAAc,OACd,cAAc;AAAA,IACpB,OAAO;AAEL,YAAM,cAAc,MAAM,OAAO;AAAA,QAC/B,SAASD,GAAE,iDAAiD;AAAA,QAC5D,SAAS;AAAA,UACP,EAAE,MAAM,QAAQ,OAAO,QAAQ,aAAa,wBAAwB;AAAA,UACpE,EAAE,MAAM,QAAQ,OAAO,QAAQ,aAAa,8BAA8B;AAAA,QAC5E;AAAA,MACF,CAAC;AACD,cAAQ,cAAc,WAAW;AAAA,IACnC;AAEA,UAAM,eAAe,gBAAgB;AACrC,UAAM,CAAC,UAAU,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChD,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,WAAW,cAAc,WAAW,CAAC;AAAA,MACtF,aAAa,aAAa,EAAE,SAAS,OAAO,KAAK,WAAW,cAAc,SAAS,CAAC;AAAA,IACtF,CAAC;AACD,UAAM,SAAS,KAAK,WAAW;AAG/B,YAAQ,IAAI;AACZ,YAAQ,IAAIK,OAAM,iBAAY,CAAC;AAC/B,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,mBAAmBE,MAAK,IAAI,CAAC,EAAE,CAAC;AAC9C,YAAQ,IAAIF,GAAE,mBAAmBF,GAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACvE,YAAQ,IAAIE,GAAE,mBAAmBC,KAAI,WAAW,CAAC,EAAE,CAAC;AACpD,YAAQ,IAAID,GAAE,oBAAoB,UAAU,EAAE,CAAC;AAC/C,YAAQ,IAAIA,GAAE,mBAAmB,WAAW,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;AAC1E,YAAQ,IAAIA,GAAE,mBAAmB,MAAM,EAAE,CAAC;AAC1C,YAAQ,IAAIA,GAAE,oBAAoB,eAAeF,GAAE,KAAK,IAAIC,OAAM,IAAI,gBAAgB,CAAC,EAAE,CAAC;AAC1F,IAAAK,KAAI;AAEJ,QAAI,CAAC,gBAAgB;AACnB,YAAM,KAAK,MAAM,QAAQ,EAAE,SAASN,GAAE,mBAAmB,GAAG,SAAS,KAAK,CAAC;AAC3E,UAAI,CAAC,IAAI;AACP,gBAAQ,IAAIG,KAAI,cAAc,CAAC;AAC/B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,cAAc,KAAK,eAAe;AAEtC,QAAI,CAAC,aAAa;AAChB,YAAMK,WAAUC,KAAI,EAAE,MAAMP,GAAE,+BAA+B,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AACxF,UAAI;AACF,cAAM,WAA8B;AAAA,UAClC,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,OAAO,SAAS,EAAE;AAAA,UAClB,YAAY,CAAC;AAAA,UACb,OAAO;AAAA,YACL,UAAU;AAAA,UACZ;AAAA,UACA,OAAO,CAAC;AAAA,QACV;AACA,sBAAc,MAAM,eAAe,QAAQ;AAC3C,QAAAM,SAAQ,QAAQR,GAAE,oBAAoBG,KAAI,WAAW,CAAC,EAAE,CAAC;AAAA,MAC3D,SAAS,KAAK;AACZ,QAAAK,SAAQ,KAAKP,OAAM,OAAO,iDAA4C,CAAC;AACvE,cAAM,OAAO,KAAK,UAAU,EAAE,MAAM,aAAa,WAAW,OAAO,aAAa,cAAc,WAAW,qBAAqB,CAAC;AAC/H,sBAAc,gCAAgC,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ,CAAC;AAAA,MACpF;AAAA,IACF;AAGA,UAAM,UAAUQ,KAAI,EAAE,MAAMP,GAAE,gCAAgC,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AAEzF,UAAM,SAAS,MAAiB,gBAAgB;AAAA,MAC9C,gBAAgB,OAAO,UAAU;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,qBAAiB,SAAS,EAAE,IAAI,SAAS,OAAO,KAAK;AAIrD,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAC5C,YAAQ,OAAOA,GAAE,iCAAiC;AAClD,QAAI;AACF,MAAS,gBAAgB,OAAO,KAAK;AACrC,YAAM,iBAAiB,WAAW,EAAE;AACpC,YAAe;AAAA,QACb,OAAO,UAAU;AAAA,QACjB;AAAA;AAAA,MACF;AAAA,IACF,SAAS,QAAQ;AAEf,cAAQ,KAAKD,OAAM,OAAO,mGAAyF,CAAC;AAAA,IACtH;AAEA,YAAQ,OAAOC,GAAE,oBAAoB;AAGrC,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,YAAM,UAAU,MAAM,KAAK,qBAAqB,YAAY,WAAW,KAAK,UAAU;AACtF,YAAM,cAAc,WAAW,eAAe,SAAS,OAAO,KAAgB;AAC9E,mBAAa,WAAW,OAAO;AAAA,IACjC,QAAQ;AACN,cAAQ,KAAKD,OAAM,OAAO,6CAAwC,CAAC;AACnE,cAAQ,KAAKA,OAAM,IAAI,yCAAyC,SAAS,OAAO,CAAC;AAAA,IACnF;AAGA,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,KAAK,uBAAuB,WAAW,UAAU,GAAG,YAAY,CAAC;AACpF,UAAI,WAAW,cAAc,WAAW,YAAY;AAClD,gBAAQ,IAAID,GAAE,sEAAiE,CAAC;AAAA,MAClF,WAAW,CAAC,WAAW,YAAY;AACjC,gBAAQ,IAAIG,KAAI,sEAAsE,YAAY,gBAAgB,CAAC;AAAA,MACrH;AAAA,IACF,QAAQ;AAAA,IAAkB;AAE1B,YAAQ,KAAK;AAGb,YAAQ,IAAI;AACZ,YAAQ,IAAIE,OAAM,4BAAuB,CAAC;AAC1C,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,eAAeF,GAAE,IAAI,OAAO,WAAW,EAAE,CAAC,EAAE,CAAC;AAC3D,YAAQ,IAAIE,GAAE,eAAeF,GAAE,OAAO,KAAK,CAAC,EAAE,CAAC;AAC/C,YAAQ,IAAIE,GAAE,eAAeF,GAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACnE,YAAQ,IAAIE,GAAE,eAAeC,KAAI,YAAY,SAAS,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,QAAQ,WAAW,CAAC,EAAE,CAAC;AAC7G,YAAQ,IAAID,GAAE,eAAeC,KAAI,eAAe,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;AAChE,YAAQ,IAAID,GAAE,eAAeC,KAAI,iBAAiB,SAAS,EAAE,CAAC,EAAE,CAAC;AACjE,IAAAG,KAAI;AACJ,YAAQ,IAAIN,GAAE,iDAA4C,CAAC;AAC3D,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMC,OAAM,IAAI;AAAA,WAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE,CAAC;AACpF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,mEAAmE,EAC/E,OAAO,uBAAuB,2BAA2B,EACzD,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AAEF,QAAI;AAEJ,QAAI,QAAQ,IAAI,cAAc;AAC5B,YAAM,SAAS,MAAkBC,qBAAoB,KAAK,OAAO;AACjE,mBAAa;AAAA,IACf,OAAO;AACL,YAAM,SAAS,MAAiB,oBAAoB;AACpD,mBAAa,OAAO,IAAI,CAAC,OAAO;AAAA,QAC9B,IAAI,EAAE,GAAG,SAAS;AAAA,QAClB,OAAO,EAAE;AAAA,QACT,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,WAAW,EAAE,UAAU,SAAS;AAAA,QAChC,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,IACJ;AAEA,YAAQ,KAAK;AAEb,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAIT,OAAM,IAAI,6BAA6B,CAAC;AACpD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,sBAAsB,WAAW,MAAM,GAAG,CAAC;AAClE,QAAI,CAAC,QAAQ,IAAI,cAAc;AAC7B,cAAQ,IAAIA,OAAM,IAAI,iDAAiD,CAAC;AAAA,IAC1E;AACA,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,eAAW,KAAK,YAAY;AAC1B,YAAM,KAAK,OAAO,EAAE,cAAc,WAAW,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS;AACrF,YAAM,OAAO,IAAI,KAAK,KAAK,GAAI,EAAE,mBAAmB;AACpD,YAAM,UAAU,EAAE,YAAY,GAAG,EAAE,SAAS,uBAAuB;AACnE,cAAQ,IAAI,MAAM,EAAE,EAAE,KAAKA,OAAM,KAAK,WAAW,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;AACnE,UAAI,QAAS,SAAQ,IAAI,gBAAgBA,OAAM,KAAK,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;AACtE,cAAQ,IAAI,gBAAgB,EAAE,OAAO,EAAE;AACvC,cAAQ,IAAI,gBAAgB,IAAI,EAAE;AAClC,UAAI,EAAE,eAAe;AACnB,gBAAQ,IAAI,iBAAiB,EAAE,aAAa,OAAO;AAAA,MACrD;AACA,UAAI,EAAE,aAAa;AACjB,gBAAQ,IAAI,iBAAiBA,OAAM,IAAI,EAAE,WAAW,CAAC,EAAE;AAAA,MACzD;AACA,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,2BAA2B;AACxC,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,SAAS,QAAQ,cAAc,EAC/B,OAAO,OAAO,UAAU;AACvB,QAAM,UAAUQ,KAAI,2BAA2B,EAAE,MAAM;AACvD,MAAI;AACF,UAAM,KAAK,OAAO,KAAK;AACvB,UAAM,OAAO,MAAiB,aAAa,EAAE;AAC7C,YAAQ,KAAK;AAEb,QAAI,CAAC,KAAK,SAAS,KAAK,UAAU,8CAA8C;AAC9E,cAAQ,IAAIR,OAAM,IAAI,cAAc,EAAE,aAAa,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,IAAI,GAAI,EAAE,mBAAmB;AACxE,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,cAAc,KAAK,EAAE,EAAE,CAAC;AAC/C,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,QAAI,KAAK,WAAW;AAClB,cAAQ,IAAI,iBAAiBA,OAAM,KAAK,GAAG,KAAK,SAAS,oBAAoB,CAAC,EAAE;AAAA,IAClF;AACA,YAAQ,IAAI,iBAAiBA,OAAM,KAAK,KAAK,KAAK,CAAC,EAAE;AACrD,YAAQ,IAAI,iBAAiB,KAAK,OAAO,EAAE;AAC3C,YAAQ,IAAI,iBAAiB,IAAI,EAAE;AACnC,YAAQ,IAAI,iBAAiB,KAAK,SAASA,OAAM,MAAM,KAAK,IAAIA,OAAM,IAAI,IAAI,CAAC,EAAE;AACjF,QAAI,KAAK,aAAa;AACpB,cAAQ,IAAI,iBAAiBA,OAAM,IAAI,KAAK,WAAW,CAAC,EAAE;AAAA,IAC5D;AAGA,IAAS,gBAAgB,KAAK,KAAK;AACnC,UAAM,YAAY,MAAe,aAAa;AAC9C,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,eAAe,CAAC;AACvC,YAAQ,IAAI,2BAA2B,UAAU,WAAW,EAAE;AAC9D,YAAQ,IAAI,2BAA2B,UAAU,UAAU,EAAE;AAC7D,YAAQ,IAAI,2BAA2B,UAAU,iBAAiB,EAAE;AACpE,YAAQ,IAAI,2BAA2B,OAAO,UAAU,gBAAgB,IAAI,GAAG,GAAG;AAClF,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,+BAA+B;AAC5C,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,iBAAiB,EACzB,YAAY,0CAA0C,EACtD,eAAe,aAAa,cAAc,EAC1C,OAAO,iBAAiB,gBAAgB,EACxC,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,eAAe,yCAAyC,EAC/D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,EAAE,MAAMP,GAAE,sBAAsB,GAAG,OAAO,QAAQ,CAAC,EAAE,MAAM;AAC/E,MAAI;AACF,UAAM,cAAc,OAAO,KAAK,EAAE;AAClC,QAAI,cAAc,KAAK;AAEvB,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,MAAiB,aAAa,WAAW;AACtD,UAAI,CAAC,KAAK,SAAS,KAAK,UAAU,8CAA8C;AAC9E,gBAAQ,KAAK,cAAc,KAAK,EAAE,aAAa;AAC/C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,YAAM,cAAc,KAAK,eAAe,GAAG,IAAI,mCAA8B,KAAK,SAAS;AAE3F,cAAQ,OAAOA,GAAE,+BAA+B;AAChD,YAAM,WAA8B;AAAA,QAClC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,OAAO,SAAS,EAAE;AAAA,QAClB,YAAY,CAAC;AAAA,QACb,OAAO,CAAC;AAAA,QACR,OAAO,CAAC;AAAA,MACV;AACA,oBAAc,MAAM,eAAe,QAAQ;AAC3C,cAAQ,OAAOA,GAAE,+BAA+B;AAAA,IAClD;AAEA,UAAM,OAAO,MAAiB,eAAe,aAAa,WAAW;AACrE,YAAQ,QAAQF,GAAE,kBAAkB,CAAC;AACrC,YAAQ,IAAIG,KAAI,WAAW,WAAW,EAAE,CAAC;AACzC,YAAQ,IAAIA,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,YAAQ,KAAK,wBAAwB;AACrC,YAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,mBAAmB,EAC3B,YAAY,4CAA4C,EACxD,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,yBAAyB,oBAAoB,EAC5D,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,wBAAwB,EAAE,MAAM;AACpD,MAAI;AACF,UAAM,YAAY,gBAAgB,KAAK,WAAW,WAAW;AAC7D,UAAM,OAAO,MAAe,iBAAiB,SAAS;AACtD,YAAQ,QAAQ,uBAAuB,IAAI,EAAE;AAC7C,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EACpD,SAAS,KAAK;AACZ,YAAQ,KAAK,iBAAiB;AAC9B,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,kBAAkB,EAC1B,YAAY,6DAA6D,EACzE,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,yBAAyB,mBAAmB,EAC3D,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AACF,UAAM,YAAY,gBAAgB,KAAK,WAAW,WAAW;AAC7D,UAAM,OAAO,MAAe,gBAAgB,SAAS;AACrD,YAAQ,QAAQ,sBAAsB,IAAI,EAAE;AAC5C,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EACpD,SAAS,KAAK;AACZ,YAAQ,KAAK,gBAAgB;AAC7B,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,YAAY,uDAAuD,EACnE,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,mBAAmB,oCAAoC,EACtE,eAAe,sBAAsB,sBAAsB,EAC3D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,sBAAsB,EAAE,MAAM;AAClD,MAAI;AAEF,iBAAa,IAAI;AACjB,UAAM,eAAwB,gBAAgB;AAG9C,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM,sBAAsB,YAAY;AACvE,UAAM,gBAAgB,WAAW,EAAE,QAAQ,YAAY;AACvD,QAAI,QAAQ,YAAY,MAAM,eAAe;AAC3C,cAAQ,KAAK,2CAA2C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,cAAc,gBAAgB,KAAK,QAAQ,QAAQ;AACzD,YAAQ,OAAO;AACf,UAAM,OAAO,MAAe;AAAA,MAC1B,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,IACF;AACA,YAAQ,QAAQ,qBAAqB,IAAI,EAAE;AAC3C,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAGlD,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,YAAM,QAAQ,MAAM,KAAK,SAAS,YAAY,SAAS;AACvD,YAAM,KAAK,UAAU,OAAO,KAAK,MAAM;AACvC,YAAM,KAAK,aAAa,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,OAAO,KAAK,OAAO,GAAG,SAAS,KAAK,OAAO;AAAA,QAC/D,WAAW;AAAA,QACX,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,MACzC,CAAC;AACD,cAAQ,IAAIA,OAAM,IAAI,oBAAoB,SAAS,EAAE,CAAC;AAAA,IACxD,QAAQ;AACN,cAAQ,KAAKA,OAAM,OAAO,4CAAuC,CAAC;AAClE,cAAQ,KAAKA,OAAM,IAAI,8CAA8C,SAAS,OAAO,CAAC;AAAA,IACxF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,qBAAqB;AAClC,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAIH,UACG,QAAQ,MAAM,EACd,YAAY,0DAA0D,EACtE,eAAe,sBAAsB,6BAA6B,EAClE,OAAO,oBAAoB,0BAA0B,mCAAmC,EACxF,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,wBAAwB,EAAE,MAAM;AACpD,MAAI;AACF,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS;AACZ,cAAQ,KAAK,8DAA8D;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAME,aAAY,MAAM,iBAAiB,KAAK,SAAS;AACvD,UAAM,gBAAgB,WAAW,EAAE;AAGnC,YAAQ,OAAO;AACf,IAAS,gBAAgBA,WAAU,KAAK;AACxC,UAAM,eAAe,MAAe,QAAQ,aAAa;AACzD,QAAI,cAAc;AAChB,cAAQ,QAAQ,sDAAsD;AAEtE,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,KAAK,cAAc;AACzB,gBAAQ,IAAIV,OAAM,IAAI,uBAAuB,CAAC;AAAA,MAChD,QAAQ;AACN,gBAAQ,KAAKA,OAAM,OAAO,6CAAwC,CAAC;AAAA,MACrE;AAEA,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,aAAa,KAAK,uBAAuB,KAAK,WAAW,UAAU,GAAG,YAAY,CAAC;AACzF,YAAI,WAAW,cAAc,WAAW,YAAY;AAClD,kBAAQ,IAAIA,OAAM,MAAM,yCAAoC,CAAC;AAAA,QAC/D,WAAW,CAAC,WAAW,YAAY;AACjC,kBAAQ,IAAIA,OAAM,IAAI,sEAAsE,KAAK,YAAY,gBAAgB,CAAC;AAAA,QAChI;AAAA,MACF,QAAQ;AAAA,MAAkB;AAC1B;AAAA,IACF;AAGA,YAAQ,OAAO;AACf,UAAM,kBAAkB,MAAa,kBAAkBU,WAAU,OAAO;AACxE,UAAM,kBAAkB,gBAAgB;AAAA,MACtC,CAAC,MAAM,EAAE,SAAS,YAAY,MAAM,cAAc,YAAY,KACzD,EAAE,QAAQ,MAAM,YAAY,MAAMA,WAAU,MAAM,YAAY;AAAA,IACrE;AACA,QAAI,iBAAiB;AACnB,cAAQ,QAAQ,4DAA4D;AAC5E,cAAQ,IAAIV,OAAM,IAAI,kBAAkB,gBAAgB,GAAG,EAAE,CAAC;AAC9D,cAAQ,IAAIA,OAAM,IAAI,kBAAkB,IAAI,KAAK,gBAAgB,OAAO,GAAI,EAAE,eAAe,CAAC,EAAE,CAAC;AAEjG,UAAI;AACF,cAAM,OAAO,MAAM,SAAS;AAC5B,cAAM,KAAK,cAAc;AACzB,gBAAQ,IAAIA,OAAM,IAAI,uBAAuB,CAAC;AAAA,MAChD,QAAQ;AACN,gBAAQ,KAAKA,OAAM,OAAO,6CAAwC,CAAC;AAAA,MACrE;AACA;AAAA,IACF;AAEA,YAAQ,OAAO;AACf,UAAM,EAAE,KAAK,KAAK,IAAI,MAAa;AAAA,MACjCU,WAAU;AAAA,MACV,OAAO,OAAO;AAAA,MACdA,WAAU;AAAA,MACVA,WAAU;AAAA,MACV,KAAK;AAAA,IACP;AAGA,QAAI;AACF,cAAQ,OAAO;AACf,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,KAAK,cAAc;AACzB,cAAQ,QAAQ,4CAA4C;AAAA,IAC9D,QAAQ;AACN,cAAQ,QAAQ,sBAAsB;AACtC,cAAQ,KAAKV,OAAM,OAAO,oGAA0F,CAAC;AAAA,IACvH;AAGA,QAAI;AACF,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,KAAK,uBAAuB,KAAK,WAAW,UAAU,GAAG,YAAY,CAAC;AACzF,UAAI,WAAW,cAAc,WAAW,YAAY;AAClD,gBAAQ,IAAID,GAAE,wEAAmE,CAAC;AAAA,MACpF,WAAW,CAAC,WAAW,YAAY;AACjC,gBAAQ,IAAIG,KAAI,sEAAsE,KAAK,YAAY,gBAAgB,CAAC;AAAA,MAC1H;AAAA,IACF,QAAQ;AAAA,IAAkB;AAE1B,YAAQ,IAAI;AACZ,YAAQ,IAAIE,OAAM,iCAA4B,CAAC;AAC/C,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,mBAAmBF,GAAE,GAAG,KAAK,SAAS,oBAAoB,CAAC,EAAE,CAAC;AAC5E,YAAQ,IAAIE,GAAE,oBAAoB,OAAO,EAAE,CAAC;AAC5C,YAAQ,IAAIA,GAAE,mBAAmBC,KAAIQ,WAAU,OAAO,CAAC,EAAE,CAAC;AAC1D,YAAQ,IAAIT,GAAE,mBAAmBC,KAAI,GAAG,CAAC,EAAE,CAAC;AAC5C,YAAQ,IAAID,GAAE,mBAAmBC,KAAW,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC;AAClE,YAAQ,IAAID,GAAE,mBAAmBC,KAAI,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC;AAC7D,IAAAG,KAAI;AACJ,YAAQ,IAAIN,GAAE,uCAAkC,CAAC;AACjD,YAAQ,IAAIG,KAAI,+CAA+C,KAAK,SAAS,EAAE,CAAC;AAChF,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,qBAAqB;AAClC,YAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,UAAU,EAClB,YAAY,2DAA2D,EACvE,OAAO,sBAAsB,qBAAqB,EAClD,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,0BAA0B,EAAE,MAAM;AACtD,MAAI;AACF,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,WAAW;AAClB,YAAM,gBAAgB,MAAM,iBAAiB,KAAK,SAAS;AAC3D,uBAAiB,cAAc;AAC/B,kBAAY,KAAK;AACjB,uBAAiB,cAAc;AAAA,IACjC,OAAO;AACL,mBAAa,IAAI;AACjB,uBAA0B,gBAAgB;AAC1C,YAAM,gBAAgB,MAAM,sBAAsB,cAAc;AAChE,uBAAiB,cAAc;AAC/B,kBAAY,cAAc;AAAA,IAC5B;AAGA,UAAM,gBAAgB,WAAW,EAAE,QAAQ,YAAY;AACvD,QAAI,eAAe,YAAY,MAAM,eAAe;AAClD,cAAQ,KAAK,mDAAmD;AAChE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,OAAO;AACf,UAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1C,kBAAkB,cAAc;AAAA,MAChC,eAAe,cAAc;AAAA,IACtC,CAAC;AAGD,UAAM,eAAe,IAAI;AAAA,MACvB,UACG,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,YAAY,MAAM,eAAe,YAAY,CAAC,EAC5E,IAAI,CAAC,MAAM,EAAE,QAAQ,QAAQ,SAAS,CAAC;AAAA,IAC5C;AACA,UAAM,WAAW,YAAY;AAAA,MAC3B,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,QAAQ,QAAQ,SAAS,CAAC,KAChD,EAAE,QAAQ,MAAM,YAAY,MAAM,eAAe,YAAY;AAAA,IACpE;AAEA,YAAQ,KAAK;AAEb,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAIN,KAAI,iCAAiC,CAAC;AAClD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIE,OAAM,mCAA8B,SAAS,MAAM,GAAG,CAAC;AACnE,IAAAC,KAAI;AAEJ,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,MAAM,SAAS,CAAC;AACtB,YAAM,OAAO,IAAI,KAAK,IAAI,OAAO,GAAI,EAAE,eAAe;AACtD,cAAQ,IAAIJ,GAAE,KAAK,IAAI,CAAC,YAAY,IAAI,QAAQ,OAAO,IAAIC,KAAI,IAAI,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;AACtF,cAAQ,IAAIA,KAAI,sBAAsB,IAAI,QAAQ,OAAO,GAAG,CAAC;AAC7D,cAAQ,IAAIA,KAAI,qBAAqB,IAAI,EAAE,CAAC;AAC5C,cAAQ,IAAIA,KAAI,qBAAqB,IAAI,GAAG,EAAE,CAAC;AAC/C,cAAQ,IAAI;AAAA,IACd;AAEA,YAAQ,IAAIH,GAAE,eAAe,CAAC;AAC9B,YAAQ,IAAIG,KAAI,gEAAgE,CAAC;AACjF,YAAQ,IAAIH,GAAE,cAAc,CAAC;AAC7B,YAAQ,IAAIG,KAAI,mDAAmD,CAAC;AACpE,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,yBAAyB;AACtC,YAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,YAAY,wEAAwE,EACpF,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,sBAAsB,8CAA8C,EAC3E,eAAe,mBAAmB,oCAAoC,EACtE,eAAe,sBAAsB,sBAAsB,EAC3D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,sBAAsB,EAAE,MAAM;AAClD,MAAI;AAEF,QAAI,KAAK,aAAa,CAAC,KAAK,OAAO;AACjC,YAAM,gBAAgB,MAAM,iBAAiB,KAAK,SAAS;AAC3D,MAAS,gBAAgB,cAAc,KAAK;AAAA,IAC9C,OAAO;AACL,mBAAa,IAAI;AAAA,IACnB;AACA,UAAM,eAAwB,gBAAgB;AAE9C,UAAM,cAAc,gBAAgB,KAAK,QAAQ,QAAQ;AAGzD,UAAM,EAAE,SAAS,WAAW,IAAI,YAAY,IAAI,MAAM,sBAAsB,YAAY;AACxF,UAAM,gBAAgB,WAAW,EAAE,QAAQ,YAAY;AACvD,QAAI,QAAQ,YAAY,MAAM,eAAe;AAC3C,cAAQ,KAAK,+CAA+C;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,YAAQ,OAAO;AACf,QAAI,qBAAqB;AACzB,QAAI;AACF,YAAM,UAAU,MAAe;AAAA,QAC7B,OAAO,KAAK,OAAO;AAAA,QACnB;AAAA,MACF;AACA,2BAAqB;AACrB,cAAQ,IAAIN,KAAI,uBAAuB,eAAe,OAAO,CAAC,EAAE,CAAC;AAAA,IACnE,SAAS,QAAQ;AACf,YAAM,MAAM,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM;AACpE,UAAI,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,wBAAwB,GAAG;AACxE,gBAAQ,IAAIA,KAAI,qDAAgD,CAAC;AAAA,MACnE,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAGA,QAAI,oBAAoB;AACtB,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAAA,IAC9C;AAGA,YAAQ,OAAO;AACf,UAAM,oBAAoB,MAAa,eAAe,WAAW,EAAE,OAAO;AAC1E,UAAM,kBAAkB,kBAAkB;AAAA,MACxC,CAAC,MAAM,EAAE,QAAQ,YAAY,OAAO,KAAK,OAAO,KAAK,EAAE,QAAQ,MAAM,YAAY,MAAM,aAAa,YAAY;AAAA,IAClH;AAEA,QAAI;AACJ,QAAI,iBAAiB;AACnB,oBAAc,gBAAgB;AAC9B,cAAQ,IAAIA,KAAI,uDAAkD,CAAC;AAAA,IACrE,OAAO;AACL,cAAQ,OAAO;AACf,YAAM,SAAS,MAAa;AAAA,QAC1B;AAAA,QACA,OAAO,KAAK,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AACA,oBAAc,OAAO;AAAA,IACvB;AAGA,QAAI;AACF,cAAQ,OAAO;AACf,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,aAAa,MAAM,KAAK,cAAc;AAC5C,YAAM,QAAQ,MAAM,KAAK,SAAS,YAAY,SAAS;AACvD,YAAM,KAAK,UAAU,OAAO,KAAK,MAAM;AACvC,YAAM,KAAK,aAAa,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,OAAO,KAAK,OAAO,GAAG,SAAS,KAAK,OAAO;AAAA,QAC/D,WAAW;AAAA,QACX,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,MACzC,CAAC;AACD,cAAQ,IAAIA,KAAI,oBAAoB,SAAS,EAAE,CAAC;AAAA,IAClD,QAAQ;AACN,cAAQ,KAAKF,OAAM,OAAO,4CAAuC,CAAC;AAClE,cAAQ,KAAKA,OAAM,IAAI,8CAA8C,SAAS,OAAO,CAAC;AAAA,IACxF;AAEA,YAAQ,QAAQ,+BAA+B;AAC/C,YAAQ,IAAI;AACZ,YAAQ,IAAII,OAAM,yBAAoB,CAAC;AACvC,IAAAC,KAAI;AACJ,YAAQ,IAAIJ,GAAE,oBAAoB,KAAK,OAAO,EAAE,CAAC;AACjD,YAAQ,IAAIA,GAAE,mBAAmBF,GAAE,KAAK,MAAM,CAAC,EAAE,CAAC;AAClD,YAAQ,IAAIE,GAAE,mBAAmBC,KAAI,WAAW,CAAC,EAAE,CAAC;AACpD,YAAQ,IAAID,GAAE,mBAAmBC,KAAW,cAAc,WAAW,CAAC,CAAC,EAAE,CAAC;AAC1E,IAAAG,KAAI;AAAA,EACN,SAAS,KAAK;AACZ,YAAQ,KAAK,iBAAiB;AAC9B,YAAQ,MAAML,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,mDAAmD,EAC/D,eAAe,uBAAuB,wCAAwC,EAC9E,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUQ,KAAI,yBAAyB,EAAE,MAAM;AACrD,MAAI;AACF,UAAM,OAAO,MAAa;AAAA,MACxB,YAAY,EAAE;AAAA,MACd,KAAK;AAAA,IACP;AACA,YAAQ,QAAQ,uBAAuB;AACvC,YAAQ,IAAIN,KAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,YAAQ,KAAK,kBAAkB;AAC/B,YAAQ,MAAMF,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,WAAW,QAAQ,QAAQ,OAAO;AAExC,SACG,QAAQ,SAAS,EACjB,YAAY,sBAAsB,EAClC,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,qBAAqB,oCAAoC,EACxE,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,WAAW,MAAe,iBAAiB;AACjD,QAAM,SAASW,YAAW,KAAK,QAAQ,QAAQ;AAC/C,QAAM,UAAUH,KAAI,cAAc,KAAK,MAAM,KAAK,EAAE,MAAM;AAC1D,MAAI;AACF,UAAM,OAAO,MAAe,QAAQ,MAAM;AAC1C,YAAQ,QAAQ,cAAc,IAAI,EAAE;AACpC,YAAQ,IAAIR,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EACpD,SAAS,KAAK;AACZ,YAAQ,KAAK,gBAAgB;AAC7B,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AACF,UAAM,OAAO,MAAe,aAAa;AACzC,YAAQ,KAAK;AACb,YAAQ,IAAI;AACZ,YAAQ,IAAIR,OAAM,KAAK,YAAY,CAAC;AACpC,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,yBAAyB,KAAK,OAAO,EAAE;AACnD,YAAQ,IAAI,yBAAyB,KAAK,WAAW,EAAE;AACvD,YAAQ,IAAI,yBAAyB,KAAK,UAAU,EAAE;AACtD,YAAQ,IAAI,yBAAyB,KAAK,iBAAiB,EAAE;AAC7D,YAAQ,IAAI,yBAAyB,OAAO,KAAK,gBAAgB,IAAI,GAAG,GAAG;AAC3E,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,2BAA2B;AACxC,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,uCAAuC,EACnD,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUQ,KAAI,oBAAoB,EAAE,MAAM;AAChD,MAAI;AACF,UAAM,UAAU,MAAe,WAAW,KAAK,OAA8B;AAC7E,YAAQ,KAAK;AACb,YAAQ,IAAI;AACZ,YAAQ,IAAIR,OAAM,KAAK,aAAa,CAAC;AACrC,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,mBAAmB,QAAQ,OAAO,SAAS,CAAC,EAAE;AAC1D,YAAQ,IAAI,mBAAmB,QAAQ,WAAW,EAAE;AACpD,YAAQ,IAAI,mBAAmB,QAAQ,cAAc,EAAE;AACvD,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,wBAAwB;AACrC,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,gDAA2C;AACpG,iCAAiC,QAAQ;AAGzC,QACG,QAAQ,WAAW,EACnB,YAAY,+BAA+B,EAC3C,OAAO,YAAY;AAClB,QAAM,EAAE,iBAAiB,eAAe,IAAI,MAAM,OAAO,wBAA+B;AACxF,QAAM,YAAY,CAAC,IAAI,iBAAiB,GAAG,IAAI,gBAAgB,GAAG,IAAI,gBAAgB,GAAG,IAAI,eAAe,CAAC;AAC7G,aAAW,KAAK,WAAW;AACzB,UAAM,OAAO,EAAE,KAAK;AACpB,YAAQ,IAAI;AAAA,EAAK,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG;AAC3C,YAAQ,IAAI,mBAAmB,KAAK,aAAa,KAAK,IAAI,CAAC,EAAE;AAC7D,YAAQ,IAAI,aAAa,KAAK,gBAAgB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/E;AACF,CAAC;AAGH,IAAI;AACF,QAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,oBAAoB;AAClE,uBAAqB,OAAO;AAC9B,QAAQ;AACN,UACG,QAAQ,sCAAsC,EAC9C,YAAY,iDAA4C,EACxD,OAAO,MAAM;AACZ,YAAQ,MAAMA,OAAM,IAAI,yBAAyB,CAAC;AAClD,YAAQ,MAAMA,OAAM,IAAI,yCAAyC,CAAC;AAClE,YAAQ,MAAMA,OAAM,IAAI,4CAA4C,CAAC;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL;AAGA,IAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,uBAAuB;AACxE,wBAAwB,OAAO;AAG/B,uBAAuB,OAAO;AAG9B,0BAA0B,OAAO;AAGjC,yBAAyB,OAAO;AAGhC,yBAAyB,OAAO;AAGhC,yBAAyB,OAAO;AAGhC,IAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,wBAAwB;AAC1E,yBAAyB,OAAO;AAGhC,IAAM,YAAY,QAAQ,QAAQ,QAAQ;AAE1C,UACG,QAAQ,KAAK,EACb,YAAY,qEAAqE,EACjF,OAAO,uBAAuB,kCAAkC,EAChE,OAAO,qBAAqB,gCAAgC,EAC5D,OAAO,eAAe,+CAA+C,EACrE,OAAO,oBAAoB,gEAAgE,EAC3F,OAAO,CAAC,SAAS;AAChB,MAAI,QAAQ;AAEZ,MAAI,KAAK,YAAY;AACnB,kBAAc,KAAK,UAAU;AAC7B,UAAM,UAAU,WAAW;AAC3B,YAAQ,IAAIA,OAAM,MAAM,8CAA8C,CAAC;AACvE,YAAQ,IAAIA,OAAM,IAAI,aAAa,QAAQ,OAAO,EAAE,CAAC;AACrD,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,OAAO;AACd,UAAM,UAAU,SAAS,EAAE;AAC3B,qBAAiB,SAAS,SAAS,KAAK,KAAK;AAC7C,YAAQ,IAAIA,OAAM,MAAM,iDAAiD,OAAO,GAAG,CAAC;AACpF,YAAQ,IAAIA,OAAM,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;AAC/C,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,KAAK;AACZ,UAAM,UAAU,WAAW;AAC3B,oBAAgB,SAAS,KAAK,GAAG;AACjC,YAAQ,IAAIA,OAAM,MAAM,qBAAqB,OAAO,EAAE,CAAC;AACvD,YAAQ,IAAIA,OAAM,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;AAC3C,YAAQ;AAAA,EACV;AAEA,MAAI,KAAK,UAAU;AACjB,gBAAY,KAAK,QAAQ;AACzB,YAAQ,IAAIA,OAAM,MAAM,qDAAqD,CAAC;AAC9E,YAAQ,IAAIA,OAAM,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;AACtD,YAAQ;AAAA,EACV;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAIA,OAAM,IAAI,qEAAqE,CAAC;AAC5F,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,+CAA+C,EAC3D,OAAO,MAAM;AACZ,QAAM,UAAU,WAAW;AAC3B,QAAM,UAAU,SAAS,EAAE;AAC3B,QAAM,YAAY,kBAAkB,OAAO;AAC3C,QAAM,SAAS,WAAW;AAC1B,QAAM,YAAY,OAAO,MAAM,OAAO;AAEtC,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,iBAAiB,CAAC;AACzC,UAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,UAAQ,IAAI,iBAAiBA,OAAM,KAAK,OAAO,CAAC,WAAW,OAAO,GAAG;AACrE,UAAQ,IAAI,iBAAiB,YAAYA,OAAM,MAAM,SAAS,IAAIA,OAAM,IAAI,SAAS,CAAC,EAAE;AACxF,UAAQ,IAAI,iBAAiB,OAAO,aAAaA,OAAM,MAAM,YAAY,IAAIA,OAAM,IAAI,SAAS,CAAC,EAAE;AACnG,UAAQ,IAAI,iBAAiB,OAAO,WAAWA,OAAM,IAAI,SAAS,CAAC,EAAE;AACrE,UAAQ,IAAI,iBAAiB,UAAU,SAASA,OAAM,IAAI,SAAS,CAAC,EAAE;AACtE,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,wCAAwC,CAAC;AAC/D,UAAQ,IAAI;AACd,CAAC;AAEH,QAAQ,MAAM;","names":["parseUnits","isAddress","chalk","ora","base","baseSepolia","encodeAbiParameters","encodeFunctionData","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","encodeAbiParameters","encodeFunctionData","INIT_PARAMS_TYPES","buildInitData","encodeAbiParameters","buildExecuteCalls","encodeFunctionData","buildSettleCalls","buildInitData","buildExecuteCalls","buildSettleCalls","strategy","account","propose","parseDuration","getActiveSyndicates","data","formatUnits","isAddress","chalk","ora","program","ora","chalk","formatUnits","isAddress","parseUnits","formatUnits","isAddress","chalk","ora","encodeFunctionData","concat","encodeFunctionData","concat","encodeFunctionData","parseUnits","ERC20_ABI","parseUnits","encodeFunctionData","program","isAddress","chalk","ora","parseUnits","formatUnits","chalk","ora","program","chalk","ora","isAddress","chalk","ora","readFileSync","chalk","readFileSync","program","isAddress","spinner","ora","chalk","ora","G","chalk","W","DIM","BOLD","LABEL","SEP","program","ora","require","G","chalk","W","DIM","BOLD","LABEL","SEP","isAddress","spinner","ora","getActiveSyndicates","syndicate","parseUnits"]}