@sherwoodagent/cli 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chat-HHXJOCKN.js → chat-2BKH5FCV.js} +3 -3
- package/dist/{chunk-3WZLP6BH.js → chunk-WAJ6T64Y.js} +45 -1
- package/dist/chunk-WAJ6T64Y.js.map +1 -0
- package/dist/index.js +108 -19
- package/dist/index.js.map +1 -1
- package/dist/session-LATHJZ2S.js +386 -0
- package/dist/session-LATHJZ2S.js.map +1 -0
- package/dist/{xmtp-PICTODCB.js → xmtp-IRIWABDL.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-3WZLP6BH.js.map +0 -1
- /package/dist/{chat-HHXJOCKN.js.map → chat-2BKH5FCV.js.map} +0 -0
- /package/dist/{xmtp-PICTODCB.js.map → xmtp-IRIWABDL.js.map} +0 -0
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-run.ts","../src/strategies/levered-swap.ts","../src/lib/quote.ts","../src/lib/batch.ts","../src/lib/factory.ts","../src/lib/subgraph.ts","../src/lib/registry.ts","../src/lib/ipfs.ts","../src/commands/venice.ts","../src/strategies/venice-fund.ts","../src/lib/venice.ts","../src/commands/allowance.ts","../src/strategies/allowance-disburse.ts","../src/commands/identity.ts","../src/lib/eas.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 { Command } from \"commander\";\nimport { parseUnits } from \"viem\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { input, confirm, select } from \"@inquirer/prompts\";\nimport { setNetwork } from \"./lib/network.js\";\nimport { getExplorerUrl, getChain } 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 { runLeveredSwap } from \"./commands/strategy-run.js\";\nimport * as vaultLib from \"./lib/vault.js\";\nimport * as factoryLib from \"./lib/factory.js\";\nimport * as subgraphLib from \"./lib/subgraph.js\";\nimport * as registryLib from \"./lib/registry.js\";\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 { 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}\nimport { cacheGroupId, getCachedGroupId, setChainContract, getChainContracts, loadConfig, setPrivateKey, getAgentId } from \"./lib/config.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\n/** Set vault address from --vault flag or fall back to config. */\nfunction resolveVault(opts: { vault?: string }) {\n if (opts.vault) {\n vaultLib.setVaultAddress(opts.vault as Address);\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(\"0.1.0\")\n .option(\"--testnet\", \"Use Base Sepolia testnet instead of Base mainnet\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setNetwork(opts.testnet ? \"base-sepolia\" : \"base\");\n if (opts.testnet) {\n console.log(chalk.yellow(\"[testnet] Base Sepolia\"));\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 <address>\", \"Underlying asset 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 .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 name = opts.name || await input({\n message: G(\"Syndicate name\"),\n validate: (v: string) => v.length > 0 || \"Name is required\",\n });\n\n const subdomain = opts.subdomain || 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 || await input({\n message: G(\"Description\"),\n default: `${name} — a Sherwood syndicate`,\n });\n\n const agentIdStr = opts.agentId || (savedAgentId\n ? await input({ message: G(\"Agent ID (ERC-8004)\"), default: String(savedAgentId) })\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 : await confirm({\n message: G(\"Open deposits? (anyone can deposit)\"),\n default: true,\n });\n\n // ── Resolve asset ──\n const asset = (opts.asset || TOKENS().USDC) as Address;\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 const go = await confirm({ message: G(\"Deploy syndicate?\"), default: true });\n if (!go) {\n console.log(DIM(\" Cancelled.\"));\n return;\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 ragequitEnabled: true,\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 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, // pkp = creator EOA (direct execution)\n creatorAddress, // operator = creator EOA\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 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: { ragequitEnabled: true },\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 hash = await vaultLib.approveDepositor(opts.depositor as Address);\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 hash = await vaultLib.removeDepositor(opts.depositor as Address);\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(\"--pkp <address>\", \"Agent PKP address\")\n .requiredOption(\"--eoa <address>\", \"Operator EOA 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 spinner.text = \"Registering agent...\";\n const hash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n opts.pkp as Address,\n opts.eoa as Address,\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.pkp);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.pkp },\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 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 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\n if (opts.subdomain) {\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n creatorAddress = syndicateInfo.creator;\n subdomain = opts.subdomain;\n } else {\n resolveVault(opts);\n const vaultAddress = vaultLib.getVaultAddress();\n const syndicateInfo = await resolveVaultSyndicate(vaultAddress);\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 requests = await easLib.queryJoinRequests(creatorAddress);\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> --pkp <addr> --eoa <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(\"--pkp <address>\", \"Agent PKP address\")\n .requiredOption(\"--eoa <address>\", \"Operator EOA address\")\n .option(\"--revoke-request <uid>\", \"Revoke the join request attestation after approval\")\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 // 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 try {\n const regHash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n opts.pkp as Address,\n opts.eoa as Address,\n );\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 // 2. Create AGENT_APPROVED attestation\n spinner.text = \"Creating approval attestation...\";\n const { uid: approvalUid } = await easLib.createApproval(\n syndicateId,\n BigInt(opts.agentId),\n vaultAddress,\n opts.eoa as Address,\n );\n\n // 3. Optionally revoke the join request\n if (opts.revokeRequest) {\n spinner.text = \"Revoking join request...\";\n await easLib.revokeAttestation(\n EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n opts.revokeRequest as `0x${string}`,\n );\n }\n\n // 4. 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.pkp);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.pkp },\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(` PKP: ${G(opts.pkp)}`));\n console.log(W(` EOA: ${G(opts.eoa)}`));\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(\"ragequit\")\n .description(\"Withdraw all shares from a vault\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Ragequitting...\").start();\n try {\n const hash = await vaultLib.ragequit();\n spinner.succeed(`Ragequit: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Ragequit 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\");\n\nstrategy\n .command(\"list\")\n .description(\"List registered strategies\")\n .option(\"--type <id>\", \"Filter by strategy type\")\n .action(async (opts) => {\n const spinner = ora(\"Loading strategies...\").start();\n try {\n const strategies = await registryLib.listStrategies(\n opts.type ? BigInt(opts.type) : undefined,\n );\n spinner.stop();\n\n if (strategies.length === 0) {\n console.log(chalk.dim(\"No strategies registered.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Strategies (${strategies.length})`));\n console.log(chalk.dim(\"─\".repeat(70)));\n for (const s of strategies) {\n const status = s.active ? chalk.green(\"active\") : chalk.red(\"inactive\");\n console.log(` #${s.id} ${chalk.bold(s.name)} [type: ${s.strategyTypeId}] ${status}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Implementation: ${s.implementation}`);\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 strategies\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nstrategy\n .command(\"info\")\n .description(\"Show strategy details\")\n .argument(\"<id>\", \"Strategy ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading strategy...\").start();\n try {\n const s = await registryLib.getStrategy(BigInt(idStr));\n spinner.stop();\n\n console.log();\n console.log(chalk.bold(`Strategy #${s.id}`));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Name: ${s.name}`);\n console.log(` Type: ${s.strategyTypeId}`);\n console.log(` Active: ${s.active ? chalk.green(\"yes\") : chalk.red(\"no\")}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Implementation: ${s.implementation}`);\n if (s.metadataURI) {\n console.log(` Metadata: ${chalk.dim(s.metadataURI)}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load strategy\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nstrategy\n .command(\"register\")\n .description(\"Register a new strategy on-chain\")\n .requiredOption(\"--implementation <address>\", \"Strategy contract address\")\n .requiredOption(\"--type <id>\", \"Strategy type ID\")\n .requiredOption(\"--name <name>\", \"Strategy name\")\n .option(\"--metadata <uri>\", \"Metadata URI (IPFS/Arweave)\", \"\")\n .action(async (opts) => {\n const spinner = ora(\"Registering strategy...\").start();\n try {\n const hash = await registryLib.registerStrategy(\n opts.implementation as Address,\n BigInt(opts.type),\n opts.name,\n opts.metadata,\n );\n spinner.succeed(`Strategy registered: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\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\nstrategy\n .command(\"run\")\n .description(\"Execute the levered swap strategy\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--collateral <amount>\", \"WETH collateral amount (e.g. 1.0)\")\n .requiredOption(\"--borrow <amount>\", \"USDC to borrow against collateral\")\n .requiredOption(\"--token <address>\", \"Target token address to buy\")\n .option(\"--fee <tier>\", \"Uniswap fee tier in bps (500, 3000, 10000)\", \"500\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"100\")\n .option(\"--execute\", \"Actually execute on-chain (default: simulate only)\", false)\n .action(async (opts) => {\n resolveVault(opts);\n await runLeveredSwap(opts);\n });\n\n// ── Provider info ──\nprogram\n .command(\"providers\")\n .description(\"List available DeFi providers\")\n .action(() => {\n const providers = [new MoonwellProvider(), new UniswapProvider()];\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// ── Venice commands ──\nregisterVeniceCommands(program);\n\n// ── Allowance commands ──\nregisterAllowanceCommands(program);\n\n// ── Identity commands ──\nregisterIdentityCommands(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 .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 (!saved) {\n console.log(chalk.red(\"Provide at least one of: --private-key, --vault\"));\n process.exit(1);\n }\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Display current config for the active network\")\n .action(() => {\n const chainId = getChain().id;\n const contracts = getChainContracts(chainId);\n const config = loadConfig();\n\n console.log();\n console.log(chalk.bold(`Sherwood Config (chain ${chainId})`));\n console.log(chalk.dim(\"─\".repeat(50)));\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","import 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","import 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 * `sherwood strategy run` command — executes the levered swap strategy.\n *\n * Flow:\n * 1. Agent sends WETH to vault (prerequisite)\n * 2. Quote: get USDC → target token price from Uniswap\n * 3. Build batch: deposit WETH → borrow USDC → swap to target\n * 4. Simulate via vault (caps + allowlist check)\n * 5. Execute on-chain (if --execute flag)\n *\n * The vault is the onchain identity — all positions live on the vault\n * via delegatecall to a shared executor lib. Agent provides their\n * own WETH (no LP capital deployed).\n */\n\nimport type { Address } from \"viem\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { buildEntryBatch, type LeveredSwapConfig } from \"../strategies/levered-swap.js\";\nimport { getQuote, applySlippage } from \"../lib/quote.js\";\nimport { formatBatch } from \"../lib/batch.js\";\nimport { executeBatch, simulateBatch } from \"../lib/vault.js\";\nimport { getPublicClient } from \"../lib/client.js\";\nimport { ERC20_ABI } from \"../lib/abis.js\";\nimport { TOKENS } from \"../lib/addresses.js\";\nimport { getExplorerUrl } from \"../lib/network.js\";\n\nconst VALID_FEES = [500, 3000, 10000] as const;\n\nexport async function runLeveredSwap(opts: {\n vault: string;\n collateral: string; // WETH amount (e.g. \"1.0\")\n borrow: string; // USDC amount (e.g. \"1000\")\n token: string; // target token address\n fee: string;\n slippage: string;\n execute: boolean;\n}): Promise<void> {\n // ── Validate inputs ──\n\n const vaultAddress = opts.vault as Address;\n\n if (!isAddress(opts.token)) {\n console.error(chalk.red(`Invalid token address: ${opts.token}`));\n process.exit(1);\n }\n const targetToken = opts.token as Address;\n\n const feeTier = Number(opts.fee);\n if (!VALID_FEES.includes(feeTier as 500 | 3000 | 10000)) {\n console.error(chalk.red(`Invalid fee tier: ${opts.fee}. Valid: ${VALID_FEES.join(\", \")}`));\n process.exit(1);\n }\n\n const slippageBps = Number(opts.slippage);\n\n // Fetch token decimals on-chain\n const client = getPublicClient();\n let targetDecimals: number;\n let borrowDecimals: number;\n try {\n [targetDecimals, borrowDecimals] = await Promise.all([\n client.readContract({\n address: targetToken,\n abi: ERC20_ABI,\n functionName: \"decimals\",\n }) as Promise<number>,\n client.readContract({\n address: TOKENS().USDC,\n abi: ERC20_ABI,\n functionName: \"decimals\",\n }) as Promise<number>,\n ]);\n } catch {\n console.error(chalk.red(`Could not read token decimals — are the addresses valid ERC20s?`));\n process.exit(1);\n }\n\n // ── Display config ──\n\n console.log();\n console.log(chalk.bold(\"Levered Swap Strategy\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Collateral: ${opts.collateral} WETH (agent-provided)`);\n console.log(` Borrow: ${opts.borrow} USDC (from Moonwell)`);\n console.log(` Buy: ${targetToken} (${targetDecimals} decimals)`);\n console.log(` Fee tier: ${(feeTier / 10000 * 100).toFixed(2)}%`);\n console.log(` Slippage: ${(slippageBps / 100).toFixed(2)}%`);\n console.log(` Vault: ${vaultAddress}`);\n console.log();\n\n // ── Get Uniswap quote (USDC → target token) ──\n\n const spinner = ora(\"Fetching Uniswap quote...\").start();\n let amountOut: bigint;\n let minOut: bigint;\n\n try {\n const borrowAmount = parseUnits(opts.borrow, borrowDecimals);\n const quote = await getQuote({\n tokenIn: TOKENS().USDC,\n tokenOut: targetToken,\n amountIn: borrowAmount,\n fee: feeTier,\n });\n amountOut = quote.amountOut;\n minOut = applySlippage(amountOut, slippageBps);\n spinner.succeed(\n `Quote: ${formatUnits(amountOut, targetDecimals)} tokens ` +\n `(min: ${formatUnits(minOut, targetDecimals)}, gas est: ${quote.gasEstimate})`\n );\n } catch (err) {\n spinner.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 entry batch ──\n\n const config: LeveredSwapConfig = {\n collateralAmount: opts.collateral,\n borrowAmount: opts.borrow,\n targetToken,\n fee: feeTier as 500 | 3000 | 10000,\n slippageBps,\n profitTargetBps: 2000, // 20% default\n stopLossBps: 1000, // 10% default\n };\n\n const calls = buildEntryBatch(config, vaultAddress, minOut, borrowDecimals);\n\n console.log();\n console.log(chalk.bold(\"Batch calls (6):\"));\n console.log(formatBatch(calls));\n console.log();\n\n // ── Simulate ──\n\n const simSpinner = ora(\"Simulating via vault...\").start();\n try {\n const results = await simulateBatch(calls);\n const allSucceeded = results.every((r) => r.success);\n if (allSucceeded) {\n simSpinner.succeed(\"Simulation passed\");\n } else {\n simSpinner.fail(\"Simulation: some calls failed\");\n for (let i = 0; i < results.length; i++) {\n const status = results[i].success ? \"✓\" : \"✗\";\n console.log(` ${status} Call ${i + 1}`);\n }\n if (!opts.execute) {\n process.exit(1);\n }\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\n }\n } catch (err) {\n simSpinner.fail(\"Simulation failed\");\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(msg));\n if (!opts.execute) {\n process.exit(1);\n }\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\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.\"));\n console.log(chalk.dim(\" Prerequisite: send WETH to vault before executing.\"));\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 * Levered Swap Strategy\n *\n * The agent's autonomous loop:\n * 1. Research: Query Messari for market intelligence (signal, metrics, news)\n * 2. Decide: Analyze data, identify opportunity, pick token + size\n * 3. Execute: Deposit ETH collateral → Borrow USDC → Swap into target token (atomic batch)\n * 4. Monitor: Continuously check position health + market conditions\n * 5. Unwind: Hit profit target or risk threshold → Sell → Repay → Withdraw\n *\n * The vault is the onchain identity — it holds all positions (mTokens, borrows,\n * swapped tokens) via delegatecall to a shared executor lib.\n *\n * The agent provides their own WETH as collateral (sent to vault). The borrowed\n * USDC is swapped into whatever token Messari research recommends. assetAmount=0\n * since no LP capital is deployed — agent capital only.\n *\n * All intelligence lives here. The onchain executor lib is a dumb pipe.\n */\n\nimport type { Address } from \"viem\";\nimport {\n encodeFunctionData,\n parseUnits,\n parseEther,\n} from \"viem\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { MOONWELL, UNISWAP, TOKENS } from \"../lib/addresses.js\";\n\n// ── Strategy Config ──\n\nexport interface LeveredSwapConfig {\n /** WETH collateral amount (human-readable, e.g. \"1.0\" = 1 WETH) */\n collateralAmount: string;\n /** USDC borrow amount (human-readable, e.g. \"1000\") */\n borrowAmount: string;\n /** Target token to buy with borrowed USDC */\n targetToken: Address;\n /** Uniswap pool fee tier for USDC → target swap */\n fee: 500 | 3000 | 10000;\n /** Max slippage in basis points (e.g. 100 = 1%) */\n slippageBps: number;\n /** Profit target in basis points (e.g. 2000 = 20%) */\n profitTargetBps: number;\n /** Stop loss in basis points (e.g. 1000 = 10%) */\n stopLossBps: number;\n}\n\n// ── ABIs (minimal, what BatchExecutor needs to encode 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 MTOKEN_ABI = [\n {\n name: \"mint\",\n type: \"function\",\n inputs: [{ name: \"mintAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"borrow\",\n type: \"function\",\n inputs: [{ name: \"borrowAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"repayBorrow\",\n type: \"function\",\n inputs: [{ name: \"repayAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"redeemUnderlying\",\n type: \"function\",\n inputs: [{ name: \"redeemAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\nconst COMPTROLLER_ABI = [\n {\n name: \"enterMarkets\",\n type: \"function\",\n inputs: [{ name: \"mTokens\", type: \"address[]\" }],\n outputs: [{ name: \"\", type: \"uint256[]\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_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\n// ── Build Entry Batch (Deposit WETH → Borrow USDC → Swap to Target) ──\n\n/**\n * Build the entry batch. Agent's WETH must already be in the vault.\n *\n * Flow:\n * 1. Approve mWETH to pull WETH from vault\n * 2. Deposit WETH as collateral on Moonwell\n * 3. Enable WETH market as collateral\n * 4. Borrow USDC against WETH collateral\n * 5. Approve SwapRouter to spend borrowed USDC\n * 6. Swap USDC → target token (Messari pick)\n *\n * All calls execute as the vault (via delegatecall), so positions\n * (mTokens, borrows, swapped tokens) live on the vault address.\n */\nexport function buildEntryBatch(\n config: LeveredSwapConfig,\n vaultAddress: Address,\n amountOutMinimum: bigint, // Computed by CLI from Uniswap quote\n borrowDecimals: number, // Decimals of the borrow token (read on-chain by caller)\n): BatchCall[] {\n // Guard: fail early if Moonwell is not deployed (e.g. on testnet)\n const ZERO = \"0x0000000000000000000000000000000000000000\";\n if (MOONWELL().mWETH === ZERO || MOONWELL().mUSDC === ZERO || MOONWELL().COMPTROLLER === ZERO) {\n throw new Error(\"Moonwell is not deployed on this network — levered swap requires Moonwell lending markets\");\n }\n\n const collateral = parseEther(config.collateralAmount); // WETH = 18 decimals\n const borrow = parseUnits(config.borrowAmount, borrowDecimals);\n\n const calls: BatchCall[] = [\n // 1. Approve mWETH to pull WETH from executor\n {\n target: TOKENS().WETH,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [MOONWELL().mWETH, collateral],\n }),\n value: 0n,\n },\n // 2. Deposit WETH as collateral (mint mWETH tokens)\n {\n target: MOONWELL().mWETH,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"mint\",\n args: [collateral],\n }),\n value: 0n,\n },\n // 3. Enter WETH market (enable as collateral for borrowing)\n {\n target: MOONWELL().COMPTROLLER,\n data: encodeFunctionData({\n abi: COMPTROLLER_ABI,\n functionName: \"enterMarkets\",\n args: [[MOONWELL().mWETH]],\n }),\n value: 0n,\n },\n // 4. Borrow USDC against WETH collateral\n {\n target: MOONWELL().mUSDC,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"borrow\",\n args: [borrow],\n }),\n value: 0n,\n },\n // 5. Approve SwapRouter to pull borrowed USDC\n {\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, borrow],\n }),\n value: 0n,\n },\n // 6. Swap USDC → target token\n {\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: TOKENS().USDC,\n tokenOut: config.targetToken,\n fee: config.fee,\n recipient: vaultAddress, // Tokens stay in vault (delegatecall)\n amountIn: borrow,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n },\n ];\n\n return calls;\n}\n\n// ── Build Exit Batch (Sell Target → Repay USDC → Withdraw WETH) ──\n\n/**\n * Build the exit batch. Unwinds the position.\n *\n * Flow:\n * 1. Approve SwapRouter to pull target tokens\n * 2. Swap target token → USDC\n * 3. Approve mUSDC for repayment\n * 4. Repay USDC borrow on Moonwell\n * 5. Withdraw WETH collateral from Moonwell\n */\nexport function buildExitBatch(\n config: LeveredSwapConfig,\n vaultAddress: Address,\n tokenBalance: bigint, // How much of the target token to sell\n amountOutMinimum: bigint, // Min USDC from selling the token\n borrowBalance: bigint, // Current borrow balance to repay (includes interest)\n): BatchCall[] {\n // Guard: fail early if Moonwell is not deployed (e.g. on testnet)\n const ZERO = \"0x0000000000000000000000000000000000000000\";\n if (MOONWELL().mWETH === ZERO || MOONWELL().mUSDC === ZERO) {\n throw new Error(\"Moonwell is not deployed on this network — levered swap requires Moonwell lending markets\");\n }\n\n const collateral = parseEther(config.collateralAmount); // WETH = 18 decimals\n\n const calls: BatchCall[] = [\n // 1. Approve SwapRouter to pull target tokens\n {\n target: config.targetToken,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, tokenBalance],\n }),\n value: 0n,\n },\n // 2. Swap target token → USDC\n {\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: config.targetToken,\n tokenOut: TOKENS().USDC,\n fee: config.fee,\n recipient: vaultAddress,\n amountIn: tokenBalance,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n },\n // 3. Approve mUSDC to pull USDC for repayment\n {\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [MOONWELL().mUSDC, borrowBalance],\n }),\n value: 0n,\n },\n // 4. Repay USDC borrow\n {\n target: MOONWELL().mUSDC,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"repayBorrow\",\n args: [borrowBalance],\n }),\n value: 0n,\n },\n // 5. Withdraw WETH collateral (stays in vault)\n {\n target: MOONWELL().mWETH,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"redeemUnderlying\",\n args: [collateral],\n }),\n value: 0n,\n },\n ];\n\n return calls;\n}\n\n// TODO: buildMonitorLoop() — continuous position health + market check\n// Uses Messari Signal API for sentiment shifts\n// Uses Messari Metrics API for price movement\n// Checks Moonwell getAccountLiquidity for health factor\n// Triggers exit when profit target or stop loss hit\n\n// TODO: getMessariSignal() — query Messari Signal API for token sentiment\n// POST https://api.messari.io/ai/v2/chat/completions\n// or GET https://api.messari.io/signal/v1/... for sentiment data\n// x402 auth: send request, handle 402, sign payment, retry\n\n// TODO: Multi-hop routing for tokens without direct USDC pair\n// Use SWAP_EXACT_IN_MULTI with encoded path from Uniswap SDK\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 * 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 * 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: \"getActiveSyndicates\",\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 return 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}\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 pkpAddress: string;\n operatorEOA: 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 const where = creator\n ? `where: { active: true, creator: \"${creator.toLowerCase()}\" }`\n : `where: { active: true }`;\n\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(`\n {\n syndicates(${where}, 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 {\n syndicate(id: \"${syndicateId}\") {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n agents(first: 50) {\n id\n pkpAddress\n operatorEOA\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 `);\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 {\n deposits(where: { owner: \"${addr}\" }, 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: \"${addr}\" }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }\n `);\n\n return { deposits: data.deposits, withdrawals: data.withdrawals };\n}\n","/**\n * StrategyRegistry contract wrapper.\n *\n * Permissionless registration — anyone can register a strategy.\n * Creator address is public (for future carry fees).\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { getPublicClient, getWalletClient, getAccount } from \"./client.js\";\nimport { STRATEGY_REGISTRY_ABI } from \"./abis.js\";\nimport { SHERWOOD } from \"./addresses.js\";\n\nexport interface StrategyRecord {\n id: bigint;\n implementation: Address;\n creator: Address;\n strategyTypeId: bigint;\n active: boolean;\n name: string;\n metadataURI: string;\n}\n\nfunction getRegistryAddress(): Address {\n return SHERWOOD().STRATEGY_REGISTRY;\n}\n\n/**\n * Register a new strategy on-chain.\n */\nexport async function registerStrategy(\n implementation: Address,\n strategyTypeId: bigint,\n name: string,\n metadataURI: string,\n): Promise<Hex> {\n const wallet = getWalletClient();\n return wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: getRegistryAddress(),\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"registerStrategy\",\n args: [implementation, strategyTypeId, name, metadataURI],\n });\n}\n\n/**\n * Get a strategy by ID.\n */\nexport async function getStrategy(id: bigint): Promise<StrategyRecord> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getRegistryAddress(),\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"getStrategy\",\n args: [id],\n })) as {\n implementation: Address;\n creator: Address;\n strategyTypeId: bigint;\n active: boolean;\n name: string;\n metadataURI: string;\n };\n\n return {\n id,\n implementation: result.implementation,\n creator: result.creator,\n strategyTypeId: result.strategyTypeId,\n active: result.active,\n name: result.name,\n metadataURI: result.metadataURI,\n };\n}\n\n/**\n * List all strategies, optionally filtered by type.\n */\nexport async function listStrategies(typeId?: bigint): Promise<StrategyRecord[]> {\n const client = getPublicClient();\n const registryAddress = getRegistryAddress();\n\n let ids: readonly bigint[];\n\n if (typeId !== undefined) {\n ids = (await client.readContract({\n address: registryAddress,\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"getStrategiesByType\",\n args: [typeId],\n })) as readonly bigint[];\n } else {\n const count = (await client.readContract({\n address: registryAddress,\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"strategyCount\",\n })) as bigint;\n\n ids = Array.from({ length: Number(count) }, (_, i) => BigInt(i + 1));\n }\n\n const strategies: StrategyRecord[] = [];\n for (const id of ids) {\n const s = await getStrategy(id);\n strategies.push(s);\n }\n\n return strategies;\n}\n\n/**\n * Get total number of registered strategies.\n */\nexport async function strategyCount(): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: getRegistryAddress(),\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"strategyCount\",\n }) as Promise<bigint>;\n}\n","/**\n * IPFS metadata upload/fetch via Pinata.\n *\n * Used for syndicate metadata (name, description, strategies, terms).\n * Requires PINATA_API_KEY and PINATA_GATEWAY env vars.\n */\n\nexport interface SyndicateMetadata {\n schema: string;\n name: string;\n description: string;\n logo?: string;\n chain: string;\n strategies: {\n id: string;\n name: string;\n description: string;\n protocols: string[];\n riskLevel: string;\n }[];\n terms: {\n minDeposit?: string;\n minDepositFormatted?: string;\n feeModel?: string;\n ragequitEnabled: boolean;\n lockPeriod?: number;\n };\n links: {\n moltbook?: string;\n dashboard?: string;\n github?: string;\n };\n}\n\n// Bundled Pinata credentials — used by all CLI users for syndicate metadata.\n// Override with PINATA_API_KEY / PINATA_GATEWAY env vars if needed.\nconst BUNDLED_PINATA_JWT =\n \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySW5mb3JtYXRpb24iOnsiaWQiOiI2NDQ0MGViOC1hYTYyLTQzY2EtOGYwNC04MDZjZmNjY2Y4YTUiLCJlbWFpbCI6ImltdGhhdGNhcmxvc0BnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicGluX3BvbGljeSI6eyJyZWdpb25zIjpbeyJkZXNpcmVkUmVwbGljYXRpb25Db3VudCI6MSwiaWQiOiJGUkExIn1dLCJ2ZXJzaW9uIjoxfSwibWZhX2VuYWJsZWQiOmZhbHNlLCJzdGF0dXMiOiJBQ1RJVkUifSwiYXV0aGVudGljYXRpb25UeXBlIjoic2NvcGVkS2V5Iiwic2NvcGVkS2V5S2V5IjoiMWJhZWFmMzQwODM3MGQ0NGZkZWEiLCJzY29wZWRLZXlTZWNyZXQiOiIzNDcxMmU5MTkyYTgxNWFhMGRmNjUyYjYyMDQzODQ1MDJjMmU0YWE0MDhkZTJmOTU2NWYwOTk3YTNlY2U3NGU3IiwiZXhwIjoxODAxMjc2ODExfQ.7OMJiOATpqkSwe7Orrpt2b8H_-czH-W61vBm4AHtqfA\";\nconst BUNDLED_PINATA_GATEWAY = \"https://sherwood.mypinata.cloud\";\n\nfunction getPinataApiKey(): string {\n return process.env.PINATA_API_KEY || BUNDLED_PINATA_JWT;\n}\n\nfunction getPinataGateway(): string {\n return process.env.PINATA_GATEWAY || BUNDLED_PINATA_GATEWAY;\n}\n\n/**\n * Upload JSON metadata to IPFS via Pinata.\n * Returns the IPFS URI (ipfs://Qm...).\n */\nexport async function uploadMetadata(metadata: SyndicateMetadata): Promise<string> {\n const apiKey = getPinataApiKey();\n\n const response = await fetch(\"https://api.pinata.cloud/pinning/pinJSONToIPFS\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n pinataContent: metadata,\n pinataMetadata: {\n name: `sherwood-syndicate-${metadata.name.toLowerCase().replace(/\\s+/g, \"-\")}`,\n },\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Pinata upload failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { IpfsHash: string };\n return `ipfs://${result.IpfsHash}`;\n}\n\n/**\n * Fetch and parse metadata from an IPFS URI.\n * Supports ipfs:// protocol URIs and raw CIDs.\n */\nexport async function fetchMetadata(ipfsURI: string): Promise<SyndicateMetadata> {\n const gateway = getPinataGateway();\n let cid: string;\n\n if (ipfsURI.startsWith(\"ipfs://\")) {\n cid = ipfsURI.slice(7);\n } else if (ipfsURI.startsWith(\"Qm\") || ipfsURI.startsWith(\"bafy\")) {\n cid = ipfsURI;\n } else {\n throw new Error(`Invalid IPFS URI: ${ipfsURI}`);\n }\n\n const url = `${gateway}/ipfs/${cid}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch metadata from ${url} (${response.status})`);\n }\n\n return (await response.json()) as SyndicateMetadata;\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, simulateBatch } from \"../lib/vault.js\";\nimport { buildFundBatch, type VeniceFundConfig } from \"../strategies/venice-fund.js\";\nimport { provisionApiKey, checkApiKeyValid } from \"../lib/venice.js\";\nimport { getVeniceApiKey } from \"../lib/config.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 .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: \"getAgentOperators\" }) 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 // ── Simulate ──\n\n const simSpinner = ora(\"Simulating via vault...\").start();\n try {\n const results = await simulateBatch(calls);\n const allSucceeded = results.every((r) => r.success);\n if (allSucceeded) {\n simSpinner.succeed(\"Simulation passed\");\n } else {\n simSpinner.fail(\"Simulation: some calls failed\");\n for (let i = 0; i < results.length; i++) {\n const status = results[i].success ? \"ok\" : \"FAIL\";\n console.log(` ${status} Call ${i + 1}`);\n }\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\n }\n } catch (err) {\n simSpinner.fail(\"Simulation failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\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.\"));\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: \"getAgentOperators\" }) 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","/**\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 and validation.\n *\n * 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 * 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 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 as string;\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 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 as string;\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 });\n return res.ok;\n } catch {\n return false;\n }\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, simulateBatch } 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: \"getAgentOperators\" }) 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 // ── Simulate ──\n\n const simSpinner = ora(\"Simulating via vault...\").start();\n try {\n const results = await simulateBatch(calls);\n const allSucceeded = results.every((r) => r.success);\n if (allSucceeded) {\n simSpinner.succeed(\"Simulation passed\");\n } else {\n simSpinner.fail(\"Simulation: some calls failed\");\n for (let i = 0; i < results.length; i++) {\n const status = results[i].success ? \"ok\" : \"FAIL\";\n console.log(` ${status} Call ${i + 1}`);\n }\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\n }\n } catch (err) {\n simSpinner.fail(\"Simulation failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\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.\"));\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: \"getAgentOperators\" }) 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 * EAS (Ethereum Attestation Service) wrapper for syndicate join requests and approvals.\n *\n * Uses viem for on-chain writes and the EAS GraphQL API for queries.\n * No ethers dependency — attestation data is encoded with viem's encodeAbiParameters.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from \"viem\";\nimport { getPublicClient, getWalletClient, getAccount } from \"./client.js\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { EAS_CONTRACTS, EAS_SCHEMAS } from \"./addresses.js\";\nimport { EAS_ABI } from \"./abis.js\";\n\n// ── Schema definitions ──\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as Hex;\n\nconst JOIN_REQUEST_PARAMS = parseAbiParameters(\"uint256, uint256, address, string\");\nconst AGENT_APPROVED_PARAMS = parseAbiParameters(\"uint256, uint256, address\");\n\nfunction assertSchemasRegistered() {\n const schemas = EAS_SCHEMAS();\n if (schemas.SYNDICATE_JOIN_REQUEST === ZERO_BYTES32 || schemas.AGENT_APPROVED === ZERO_BYTES32) {\n throw new Error(\n \"EAS schemas not registered. Run: npx tsx scripts/register-eas-schemas.ts --testnet\",\n );\n }\n}\n\n// ── GraphQL ──\n\nfunction getEasGraphqlUrl(): string {\n return getNetwork() === \"base\"\n ? \"https://base.easscan.org/graphql\"\n : \"https://base-sepolia.easscan.org/graphql\";\n}\n\nexport function getEasScanUrl(uid: Hex): string {\n const host = getNetwork() === \"base\" ? \"base.easscan.org\" : \"base-sepolia.easscan.org\";\n return `https://${host}/attestation/view/${uid}`;\n}\n\n// ── Attestation Creation ──\n\n/**\n * Extract the attestation UID from a transaction receipt.\n * The EAS contract emits: event Attested(address indexed recipient, address indexed attester, bytes32 uid, bytes32 indexed schemaUID)\n * uid is a non-indexed parameter in the event data.\n */\nfunction extractAttestationUid(receipt: { logs: readonly { topics: readonly Hex[]; data: Hex }[] }): Hex {\n for (const log of receipt.logs) {\n // Attested event has 4 topics (sig + 3 indexed) and data contains the uid (bytes32)\n if (log.topics.length === 4 && log.data.length >= 66) {\n return (\"0x\" + log.data.slice(2, 66)) as Hex;\n }\n }\n throw new Error(\"Could not extract attestation UID from transaction receipt\");\n}\n\n/**\n * Create a SYNDICATE_JOIN_REQUEST attestation.\n * Attester: the calling agent. Recipient: the syndicate creator.\n */\nexport async function createJoinRequest(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n creatorAddress: Address,\n message: string,\n): Promise<{ uid: Hex; hash: Hex }> {\n assertSchemasRegistered();\n const wallet = getWalletClient();\n const client = getPublicClient();\n\n const data = encodeAbiParameters(JOIN_REQUEST_PARAMS, [\n syndicateId, agentId, vault, message,\n ]);\n\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n data: {\n recipient: creatorAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await client.waitForTransactionReceipt({ hash });\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n}\n\n/**\n * Create an AGENT_APPROVED attestation.\n * Attester: the syndicate creator. Recipient: the agent's operator EOA.\n */\nexport async function createApproval(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n agentAddress: Address,\n): Promise<{ uid: Hex; hash: Hex }> {\n assertSchemasRegistered();\n const wallet = getWalletClient();\n const client = getPublicClient();\n\n const data = encodeAbiParameters(AGENT_APPROVED_PARAMS, [\n syndicateId, agentId, vault,\n ]);\n\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().AGENT_APPROVED,\n data: {\n recipient: agentAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await client.waitForTransactionReceipt({ hash });\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n}\n\n/**\n * Revoke an attestation. Only the original attester can revoke.\n */\nexport async function revokeAttestation(\n schemaUid: Hex,\n attestationUid: Hex,\n): Promise<Hex> {\n const wallet = getWalletClient();\n\n return wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"revoke\",\n args: [{\n schema: schemaUid,\n data: {\n uid: attestationUid,\n value: 0n,\n },\n }],\n value: 0n,\n });\n}\n\n// ── Attestation Queries ──\n\nexport interface JoinRequestAttestation {\n uid: Hex;\n attester: Address;\n recipient: Address;\n time: number;\n decoded: {\n syndicateId: bigint;\n agentId: bigint;\n vault: Address;\n message: string;\n };\n}\n\n/**\n * Query pending (non-revoked) join requests for a given recipient (creator address).\n * Uses the EAS GraphQL API.\n */\nexport async function queryJoinRequests(\n recipient: Address,\n): Promise<JoinRequestAttestation[]> {\n assertSchemasRegistered();\n const schemaUid = EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST;\n const url = getEasGraphqlUrl();\n\n const query = `\n query JoinRequests($schemaId: String!, $recipient: String!) {\n attestations(\n where: {\n schemaId: { equals: $schemaId }\n recipient: { equals: $recipient }\n revoked: { equals: false }\n }\n orderBy: [{ time: desc }]\n ) {\n id\n attester\n recipient\n time\n data\n }\n }\n `;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query,\n variables: { schemaId: schemaUid, recipient },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`EAS GraphQL query failed: ${response.statusText}`);\n }\n\n const json = await response.json() as {\n data?: {\n attestations: Array<{\n id: string;\n attester: string;\n recipient: string;\n time: number;\n data: string;\n }>;\n };\n };\n\n if (!json.data?.attestations) return [];\n\n return json.data.attestations.map((a) => {\n const decoded = decodeAbiParameters(JOIN_REQUEST_PARAMS, a.data as Hex);\n return {\n uid: a.id as Hex,\n attester: a.attester as Address,\n recipient: a.recipient as Address,\n time: a.time,\n decoded: {\n syndicateId: decoded[0],\n agentId: decoded[1],\n vault: decoded[2],\n message: decoded[3],\n },\n };\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,UAAU,kBAAkB;AAErC,SAAS,eAAe;AACxB,SAAS,cAAAA,mBAAkB;AAE3B,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,SAAS,OAAO,eAAuB;;;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;;;ACTA,SAAS,cAAAC,aAAY,aAAa,iBAAiB;AACnD,OAAO,WAAW;AAClB,OAAO,SAAS;;;ACGhB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAyBP,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;AACF;AAEA,IAAM,aAAa;AAAA,EACjB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,cAAc,MAAM,UAAU,CAAC;AAAA,IAChD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,gBAAgB,MAAM,UAAU,CAAC;AAAA,IAClD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,eAAe,MAAM,UAAU,CAAC;AAAA,IACjD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,gBAAgB,MAAM,UAAU,CAAC;AAAA,IAClD,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,YAAY,CAAC;AAAA,IAC/C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,YAAY,CAAC;AAAA,EAC3C;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;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;AAkBO,SAAS,gBACd,QACA,cACA,kBACA,gBACa;AAEb,QAAM,OAAO;AACb,MAAI,SAAS,EAAE,UAAU,QAAQ,SAAS,EAAE,UAAU,QAAQ,SAAS,EAAE,gBAAgB,MAAM;AAC7F,UAAM,IAAI,MAAM,gGAA2F;AAAA,EAC7G;AAEA,QAAM,aAAa,WAAW,OAAO,gBAAgB;AACrD,QAAM,SAAS,WAAW,OAAO,cAAc,cAAc;AAE7D,QAAM,QAAqB;AAAA;AAAA,IAEzB;AAAA,MACE,QAAQ,OAAO,EAAE;AAAA,MACjB,MAAM,mBAAmB;AAAA,QACvB,KAAKA;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,SAAS,EAAE,OAAO,UAAU;AAAA,MACrC,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ,SAAS,EAAE;AAAA,MACnB,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,UAAU;AAAA,MACnB,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ,SAAS,EAAE;AAAA,MACnB,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ,SAAS,EAAE;AAAA,MACnB,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,MAAM;AAAA,MACf,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ,OAAO,EAAE;AAAA,MACjB,MAAM,mBAAmB;AAAA,QACvB,KAAKA;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,QAAQ,EAAE,aAAa,MAAM;AAAA,MACtC,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ,QAAQ,EAAE;AAAA,MAClB,MAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM;AAAA,UACJ;AAAA,YACE,SAAS,OAAO,EAAE;AAAA,YAClB,UAAU,OAAO;AAAA,YACjB,KAAK,OAAO;AAAA,YACZ,WAAW;AAAA;AAAA,YACX,UAAU;AAAA,YACV;AAAA,YACA,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AC1NA,SAAS,sBAAAC,qBAAoB,sBAAsB,QAAQ,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,SAAO,OAAO,KAAK;AACrB;AAKA,eAAsB,iBAAiB,QAGd;AACvB,QAAM,SAAS,gBAAgB;AAE/B,QAAM,WAAWA,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;;;ACzGO,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;;;AHIA,IAAM,aAAa,CAAC,KAAK,KAAM,GAAK;AAEpC,eAAsB,eAAe,MAQnB;AAGhB,QAAM,eAAe,KAAK;AAE1B,MAAI,CAAC,UAAU,KAAK,KAAK,GAAG;AAC1B,YAAQ,MAAM,MAAM,IAAI,0BAA0B,KAAK,KAAK,EAAE,CAAC;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,cAAc,KAAK;AAEzB,QAAM,UAAU,OAAO,KAAK,GAAG;AAC/B,MAAI,CAAC,WAAW,SAAS,OAA6B,GAAG;AACvD,YAAQ,MAAM,MAAM,IAAI,qBAAqB,KAAK,GAAG,YAAY,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,OAAO,KAAK,QAAQ;AAGxC,QAAM,SAAS,gBAAgB;AAC/B,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,KAAC,gBAAgB,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD,OAAO,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,OAAO,aAAa;AAAA,QAClB,SAAS,OAAO,EAAE;AAAA,QAClB,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,QAAQ;AACN,YAAQ,MAAM,MAAM,IAAI,sEAAiE,CAAC;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,UAAQ,IAAI;AACZ,UAAQ,IAAI,MAAM,KAAK,uBAAuB,CAAC;AAC/C,UAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,UAAQ,IAAI,kBAAkB,KAAK,UAAU,wBAAwB;AACrE,UAAQ,IAAI,kBAAkB,KAAK,MAAM,uBAAuB;AAChE,UAAQ,IAAI,kBAAkB,WAAW,KAAK,cAAc,YAAY;AACxE,UAAQ,IAAI,mBAAmB,UAAU,MAAQ,KAAK,QAAQ,CAAC,CAAC,GAAG;AACnE,UAAQ,IAAI,mBAAmB,cAAc,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC/D,UAAQ,IAAI,kBAAkB,YAAY,EAAE;AAC5C,UAAQ,IAAI;AAIZ,QAAM,UAAU,IAAI,2BAA2B,EAAE,MAAM;AACvD,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,UAAM,eAAeC,YAAW,KAAK,QAAQ,cAAc;AAC3D,UAAM,QAAQ,MAAM,SAAS;AAAA,MAC3B,SAAS,OAAO,EAAE;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,KAAK;AAAA,IACP,CAAC;AACD,gBAAY,MAAM;AAClB,aAAS,cAAc,WAAW,WAAW;AAC7C,YAAQ;AAAA,MACN,UAAU,YAAY,WAAW,cAAc,CAAC,iBACvC,YAAY,QAAQ,cAAc,CAAC,cAAc,MAAM,WAAW;AAAA,IAC7E;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,KAAK,uBAAuB;AACpC,YAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,QAAM,SAA4B;AAAA,IAChC,kBAAkB,KAAK;AAAA,IACvB,cAAc,KAAK;AAAA,IACnB;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA,iBAAiB;AAAA;AAAA,IACjB,aAAa;AAAA;AAAA,EACf;AAEA,QAAM,QAAQ,gBAAgB,QAAQ,cAAc,QAAQ,cAAc;AAE1E,UAAQ,IAAI;AACZ,UAAQ,IAAI,MAAM,KAAK,kBAAkB,CAAC;AAC1C,UAAQ,IAAI,YAAY,KAAK,CAAC;AAC9B,UAAQ,IAAI;AAIZ,QAAM,aAAa,IAAI,yBAAyB,EAAE,MAAM;AACxD,MAAI;AACF,UAAM,UAAU,MAAM,cAAc,KAAK;AACzC,UAAM,eAAe,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO;AACnD,QAAI,cAAc;AAChB,iBAAW,QAAQ,mBAAmB;AAAA,IACxC,OAAO;AACL,iBAAW,KAAK,+BAA+B;AAC/C,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAM,SAAS,QAAQ,CAAC,EAAE,UAAU,WAAM;AAC1C,gBAAQ,IAAI,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE;AAAA,MACzC;AACA,UAAI,CAAC,KAAK,SAAS;AACjB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,IAAI,MAAM,OAAO,uDAAuD,CAAC;AAAA,IACnF;AAAA,EACF,SAAS,KAAK;AACZ,eAAW,KAAK,mBAAmB;AACnC,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,YAAQ,MAAM,MAAM,IAAI,GAAG,CAAC;AAC5B,QAAI,CAAC,KAAK,SAAS;AACjB,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,IAAI,MAAM,OAAO,uDAAuD,CAAC;AAAA,EACnF;AAIA,MAAI,CAAC,KAAK,SAAS;AACjB,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,OAAO,qDAAqD,CAAC;AAC/E,YAAQ,IAAI,MAAM,IAAI,sDAAsD,CAAC;AAC7E;AAAA,EACF;AAEA,QAAM,cAAc,IAAI,8BAA8B,EAAE,MAAM;AAC9D,MAAI;AACF,UAAM,SAAS,MAAM,aAAa,KAAK;AACvC,gBAAY,QAAQ,mBAAmB,MAAM,EAAE;AAC/C,YAAQ,IAAI,MAAM,IAAI,KAAK,eAAe,MAAM,CAAC,EAAE,CAAC;AAAA,EACtD,SAAS,KAAK;AACZ,gBAAY,KAAK,kBAAkB;AACnC,YAAQ,MAAM,MAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AIjLA,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,SAAO,OAAO,cAAc;AAAA,IAC1B,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;AACH;;;AC3IA,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,eAAsBC,qBACpB,SAC8B;AAC9B,QAAM,QAAQ,UACV,oCAAoC,QAAQ,YAAY,CAAC,QACzD;AAEJ,QAAM,OAAO,MAAM,MAA2C;AAAA;AAAA,mBAE7C,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWrB;AAED,SAAO,KAAK;AACd;;;ACtFA,SAAS,qBAA8B;AACrC,SAAO,SAAS,EAAE;AACpB;AAKA,eAAsB,iBACpB,gBACA,gBACA,MACA,aACc;AACd,QAAM,SAAS,gBAAgB;AAC/B,SAAO,OAAO,cAAc;AAAA,IAC1B,SAAS,WAAW;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,SAAS,mBAAmB;AAAA,IAC5B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,gBAAgB,gBAAgB,MAAM,WAAW;AAAA,EAC1D,CAAC;AACH;AAKA,eAAsB,YAAY,IAAqC;AACrE,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAU,MAAM,OAAO,aAAa;AAAA,IACxC,SAAS,mBAAmB;AAAA,IAC5B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,EAAE;AAAA,EACX,CAAC;AASD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,SAAS,OAAO;AAAA,IAChB,gBAAgB,OAAO;AAAA,IACvB,QAAQ,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,EACtB;AACF;AAKA,eAAsB,eAAe,QAA4C;AAC/E,QAAM,SAAS,gBAAgB;AAC/B,QAAM,kBAAkB,mBAAmB;AAE3C,MAAI;AAEJ,MAAI,WAAW,QAAW;AACxB,UAAO,MAAM,OAAO,aAAa;AAAA,MAC/B,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,MAAM;AAAA,IACf,CAAC;AAAA,EACH,OAAO;AACL,UAAM,QAAS,MAAM,OAAO,aAAa;AAAA,MACvC,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,IAChB,CAAC;AAED,UAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,EACrE;AAEA,QAAM,aAA+B,CAAC;AACtC,aAAW,MAAM,KAAK;AACpB,UAAM,IAAI,MAAM,YAAY,EAAE;AAC9B,eAAW,KAAK,CAAC;AAAA,EACnB;AAEA,SAAO;AACT;;;AC1EA,IAAM,qBACJ;AAGF,SAAS,kBAA0B;AACjC,SAAO,QAAQ,IAAI,kBAAkB;AACvC;AAUA,eAAsB,eAAe,UAA8C;AACjF,QAAM,SAAS,gBAAgB;AAE/B,QAAM,WAAW,MAAM,MAAM,kDAAkD;AAAA,IAC7E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,eAAe;AAAA,MACf,gBAAgB;AAAA,QACd,MAAM,sBAAsB,SAAS,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,MAC9E;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,MAAM,IAAI,EAAE;AAAA,EACtE;AAEA,QAAM,SAAU,MAAM,SAAS,KAAK;AACpC,SAAO,UAAU,OAAO,QAAQ;AAClC;;;ACnEA,SAAS,cAAAC,aAAY,eAAAC,cAAa,aAAAC,kBAAiB;AACnD,OAAOC,YAAW;AAClB,OAAOC,UAAS;;;ACEhB,SAAS,sBAAAC,qBAAoB,cAAAC,mBAAkB;AAmB/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;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;AAEA,IAAM,cAAc;AAAA,EAClB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,MAAM,aAAa,MAAM,UAAU;AAAA,MACrC,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AACF;AAeO,SAAS,eACd,QACA,cACA,QACA,cACA,eACA,QACA,UACa;AAEb,QAAM,OAAO;AACb,MAAI,OAAO,EAAE,QAAQ,QAAQ,OAAO,EAAE,YAAY,MAAM;AACtD,UAAM,IAAI,MAAM,wGAAmG;AAAA,EACrH;AAEA,QAAM,cAAcC,YAAW,OAAO,QAAQ,aAAa;AAC3D,QAAM,SAAS,aAAa,YAAY,MAAM,OAAO,EAAE,KAAK,YAAY;AACxE,QAAM,QAAqB,CAAC;AAG5B,QAAM,KAAK;AAAA,IACT,QAAQ;AAAA,IACR,MAAMC,oBAAmB;AAAA,MACvB,KAAKF;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,QAAQ,EAAE,aAAa,WAAW;AAAA,IAC3C,CAAC;AAAA,IACD,OAAO;AAAA,EACT,CAAC;AAGD,MAAI,QAAQ;AAEV,UAAM,KAAK;AAAA,MACT,QAAQ,QAAQ,EAAE;AAAA,MAClB,MAAME,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM;AAAA,UACJ;AAAA,YACE,SAAS,OAAO,EAAE;AAAA,YAClB,UAAU,OAAO,EAAE;AAAA,YACnB,KAAK,OAAO;AAAA,YACZ,WAAW;AAAA,YACX,UAAU;AAAA,YACV,kBAAkB;AAAA,YAClB,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,OAAO;AAEL,UAAM,KAAK;AAAA,MACT,QAAQ,QAAQ,EAAE;AAAA,MAClB,MAAMA,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM;AAAA,UACJ;AAAA,YACE,MAAM;AAAA,YACN,WAAW;AAAA,YACX,UAAU;AAAA,YACV,kBAAkB;AAAA,UACpB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,KAAK;AAAA,IACT,QAAQ,OAAO,EAAE;AAAA,IACjB,MAAMA,oBAAmB;AAAA,MACvB,KAAKF;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,OAAO,EAAE,SAAS,MAAM;AAAA,IACjC,CAAC;AAAA,IACD,OAAO;AAAA,EACT,CAAC;AAGD,QAAM,WAAW,SAAS,OAAO,OAAO,MAAM;AAC9C,aAAW,SAAS,QAAQ;AAC1B,UAAM,KAAK;AAAA,MACT,QAAQ,OAAO,EAAE;AAAA,MACjB,MAAME,oBAAmB;AAAA,QACvB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ;AAAA,MACxB,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACnMA,IAAM,kBAAkB;AAMxB,eAAsB,kBAAmC;AACvD,QAAM,UAAU,WAAW;AAG3B,QAAM,WAAW,MAAM,MAAM,GAAG,eAAe,6BAA6B;AAC5E,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,UAAU,KAAK;AAG7B,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,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,QAAQ,KAAK;AAG5B,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,IAC/C,CAAC;AACD,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AFtDA,IAAMC,cAAa,CAAC,KAAK,KAAM,GAAK;AAE7B,SAAS,uBAAuBC,UAAwB;AAC7D,QAAM,SAASA,SAAQ,QAAQ,QAAQ,EAAE,YAAY,+DAA0D;AAI/G,SACG,QAAQ,MAAM,EACd,YAAY,6EAA8D,EAC1E,eAAe,qBAAqB,eAAe,EACnD,eAAe,qBAAqB,4CAA4C,EAChF,OAAO,iBAAiB,yDAAoD,MAAM,EAClF,OAAO,iBAAiB,oCAA+B,OAAO,EAC9D,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,OAAO,OAAO,KAAK,IAAI;AAC7B,UAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,QAAI,CAACH,YAAW,SAAS,IAA0B,KAAK,CAACA,YAAW,SAAS,IAA0B,GAAG;AACxG,cAAQ,MAAMG,OAAM,IAAI,4BAA4BH,YAAW,KAAK,IAAI,CAAC,EAAE,CAAC;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,cAAc,OAAO,KAAK,QAAQ;AAExC,UAAM,SAAS,gBAAgB;AAI/B,UAAM,UAAUI,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;AAExE,YAAQ,IAAI;AACZ,YAAQ,IAAIF,OAAM,KAAK,aAAa,CAAC;AACrC,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,YAAQ,IAAI,oBAAoB,SAAS,wBAAmB,IAAI,MAAM,GAAG,WAAW,qBAAgB,IAAI,qBAAgB,IAAI,GAAG,EAAE;AACjI,YAAQ,IAAI,qBAAqB,cAAc,KAAK,QAAQ,CAAC,CAAC,GAAG;AACjE,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,UAAM,eAAeC,KAAI,2BAA2B,EAAE,MAAM;AAC5D,QAAI;AACJ,QAAI;AACJ,QAAI,WAAiC;AAErC,QAAI;AACF,UAAI,QAAQ;AAEV,cAAM,QAAQ,MAAM,SAAS;AAAA,UAC3B,SAAS,OAAO,EAAE;AAAA,UAClB,UAAU,OAAO,EAAE;AAAA,UACnB,UAAU;AAAA,UACV,KAAK;AAAA,QACP,CAAC;AACD,oBAAY,MAAM;AAAA,MACpB,OAAO;AAEL,mBAAW;AAAA,UACT,CAAC,cAAc,OAAO,EAAE,MAAM,OAAO,EAAE,GAAG;AAAA,UAC1C,CAAC,MAAM,IAAI;AAAA,QACb;AACA,cAAM,QAAQ,MAAM,iBAAiB;AAAA,UACnC,MAAM;AAAA,UACN,UAAU;AAAA,QACZ,CAAC;AACD,oBAAY,MAAM;AAAA,MACpB;AAEA,eAAS,cAAc,WAAW,WAAW;AAE7C,mBAAa;AAAA,QACX,UAAUE,aAAY,WAAW,EAAE,CAAC,cAC3BA,aAAY,QAAQ,EAAE,CAAC,gBAAgBA,aAAY,SAAS,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC;AAAA,MACjG;AAAA,IACF,SAAS,KAAK;AACZ,mBAAa,KAAK,uBAAuB;AACzC,cAAQ,MAAMH,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAIA,UAAM,SAA2B;AAAA,MAC/B,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,eAAe,QAAQ,cAAc,QAAQ,cAAc,eAAe,QAAQ,QAAQ;AAExG,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,gBAAgB,MAAM,MAAM,IAAI,CAAC;AACxD,YAAQ,IAAI,YAAY,KAAK,CAAC;AAC9B,YAAQ,IAAI;AAIZ,UAAM,aAAaC,KAAI,yBAAyB,EAAE,MAAM;AACxD,QAAI;AACF,YAAM,UAAU,MAAM,cAAc,KAAK;AACzC,YAAM,eAAe,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO;AACnD,UAAI,cAAc;AAChB,mBAAW,QAAQ,mBAAmB;AAAA,MACxC,OAAO;AACL,mBAAW,KAAK,+BAA+B;AAC/C,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,gBAAM,SAAS,QAAQ,CAAC,EAAE,UAAU,OAAO;AAC3C,kBAAQ,IAAI,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE;AAAA,QACzC;AACA,YAAI,CAAC,KAAK,QAAS,SAAQ,KAAK,CAAC;AACjC,gBAAQ,IAAID,OAAM,OAAO,uDAAuD,CAAC;AAAA,MACnF;AAAA,IACF,SAAS,KAAK;AACZ,iBAAW,KAAK,mBAAmB;AACnC,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,UAAI,CAAC,KAAK,QAAS,SAAQ,KAAK,CAAC;AACjC,cAAQ,IAAIA,OAAM,OAAO,uDAAuD,CAAC;AAAA,IACnF;AAIA,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,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,IAAID,OAAM,OAAO,0EAA0E,CAAC;AACpG,gBAAQ,IAAIA,OAAM,OAAO,kEAAkE,CAAC;AAC5F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,mBAAa,QAAQ,iBAAiBG,aAAY,aAAa,EAAE,CAAC,EAAE;AAAA,IACtE,SAAS,KAAK;AACZ,mBAAa,KAAK,8BAA8B;AAChD,cAAQ,MAAMH,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,aAAaC,KAAI,gCAAgC,EAAE,MAAM;AAC/D,QAAI;AACF,YAAM,SAAS,MAAM,gBAAgB;AACrC,iBAAW,QAAQ,4BAA4B;AAC/C,cAAQ,IAAID,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,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,UAAU,WAAW;AAC3B,UAAM,UAAUC,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,IAAID,OAAM,KAAK,yBAAyB,CAAC;AACjD,cAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC,cAAQ,IAAIA,OAAM,KAAK,WAAW,CAAC;AACnC,cAAQ,IAAI,0BAA0BG,aAAY,QAAQ,aAAa,CAAC,IAAI,WAAW,EAAE;AACzF,cAAQ,IAAI,0BAA0BA,aAAY,iBAAiB,EAAE,CAAC,EAAE;AAExE,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,EAAE,CAAC,OAAO;AAAA,MAC9D;AAEA,cAAQ,IAAIH,OAAM,KAAK,iBAAiB,CAAC;AACzC,cAAQ,IAAI,0BAA0BG,aAAY,QAAQ,EAAE,CAAC,EAAE;AAC/D,cAAQ,IAAI,0BAA0BA,aAAY,WAAW,EAAE,CAAC,MAAM;AAEtE,cAAQ,IAAIH,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;AACL;;;AG1WA,SAAS,cAAAI,aAAY,eAAAC,cAAa,aAAAC,kBAAiB;AACnD,OAAOC,YAAW;AAClB,OAAOC,UAAS;;;ACAhB,SAAS,sBAAAC,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,IAAMC,sCAAqC;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,IAAMC,+BAA8B;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,KAAKJ;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,MAAMI,oBAAmB;AAAA,UACvB,KAAKH;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,MAAMG,oBAAmB;AAAA,UACvB,KAAKF;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,MAAME,oBAAmB;AAAA,QACvB,KAAKJ;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO,QAAQ;AAAA,MACxB,CAAC;AAAA,MACD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ADxKA,IAAMK,cAAa,CAAC,KAAK,KAAM,GAAK;AAE7B,SAAS,0BAA0BC,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,CAACH,YAAW,SAAS,GAAyB,GAAG;AACnD,cAAQ,MAAMG,OAAM,IAAI,4BAA4BH,YAAW,KAAK,IAAI,CAAC,EAAE,CAAC;AAC5E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,cAAc,OAAO,KAAK,QAAQ;AAExC,UAAM,SAAS,gBAAgB;AAI/B,UAAM,UAAUI,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,UAAM,aAAaC,KAAI,yBAAyB,EAAE,MAAM;AACxD,QAAI;AACF,YAAM,UAAU,MAAM,cAAc,KAAK;AACzC,YAAM,eAAe,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO;AACnD,UAAI,cAAc;AAChB,mBAAW,QAAQ,mBAAmB;AAAA,MACxC,OAAO;AACL,mBAAW,KAAK,+BAA+B;AAC/C,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,gBAAM,SAAS,QAAQ,CAAC,EAAE,UAAU,OAAO;AAC3C,kBAAQ,IAAI,KAAK,MAAM,SAAS,IAAI,CAAC,EAAE;AAAA,QACzC;AACA,YAAI,CAAC,KAAK,QAAS,SAAQ,KAAK,CAAC;AACjC,gBAAQ,IAAID,OAAM,OAAO,uDAAuD,CAAC;AAAA,MACnF;AAAA,IACF,SAAS,KAAK;AACZ,iBAAW,KAAK,mBAAmB;AACnC,cAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,UAAI,CAAC,KAAK,QAAS,SAAQ,KAAK,CAAC;AACjC,cAAQ,IAAIA,OAAM,OAAO,uDAAuD,CAAC;AAAA,IACnF;AAIA,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;;;AEpSA,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;;;AC3NA,SAAS,qBAAqB,oBAAoB,2BAA2B;AAQ7E,IAAM,eAAe;AAErB,IAAM,sBAAsB,mBAAmB,mCAAmC;AAClF,IAAM,wBAAwB,mBAAmB,2BAA2B;AAE5E,SAAS,0BAA0B;AACjC,QAAM,UAAU,YAAY;AAC5B,MAAI,QAAQ,2BAA2B,gBAAgB,QAAQ,mBAAmB,cAAc;AAC9F,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAIA,SAAS,mBAA2B;AAClC,SAAO,WAAW,MAAM,SACpB,qCACA;AACN;AAEO,SAAS,cAAc,KAAkB;AAC9C,QAAM,OAAO,WAAW,MAAM,SAAS,qBAAqB;AAC5D,SAAO,WAAW,IAAI,qBAAqB,GAAG;AAChD;AASA,SAAS,sBAAsB,SAA0E;AACvG,aAAW,OAAO,QAAQ,MAAM;AAE9B,QAAI,IAAI,OAAO,WAAW,KAAK,IAAI,KAAK,UAAU,IAAI;AACpD,aAAQ,OAAO,IAAI,KAAK,MAAM,GAAG,EAAE;AAAA,IACrC;AAAA,EACF;AACA,QAAM,IAAI,MAAM,4DAA4D;AAC9E;AAMA,eAAsB,kBACpB,aACA,SACA,OACA,gBACA,SACkC;AAClC,0BAAwB;AACxB,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAS,gBAAgB;AAE/B,QAAM,OAAO,oBAAoB,qBAAqB;AAAA,IACpD;AAAA,IAAa;AAAA,IAAS;AAAA,IAAO;AAAA,EAC/B,CAAC;AAED,QAAM,OAAO,MAAM,OAAO,cAAc;AAAA,IACtC,SAAS,WAAW;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,SAAS,cAAc,EAAE;AAAA,IACzB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,MACL,QAAQ,YAAY,EAAE;AAAA,MACtB,MAAM;AAAA,QACJ,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IACD,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU,MAAM,OAAO,0BAA0B,EAAE,KAAK,CAAC;AAC/D,QAAM,MAAM,sBAAsB,OAAO;AAEzC,SAAO,EAAE,KAAK,KAAK;AACrB;AAMA,eAAsB,eACpB,aACA,SACA,OACA,cACkC;AAClC,0BAAwB;AACxB,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAS,gBAAgB;AAE/B,QAAM,OAAO,oBAAoB,uBAAuB;AAAA,IACtD;AAAA,IAAa;AAAA,IAAS;AAAA,EACxB,CAAC;AAED,QAAM,OAAO,MAAM,OAAO,cAAc;AAAA,IACtC,SAAS,WAAW;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,SAAS,cAAc,EAAE;AAAA,IACzB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,MACL,QAAQ,YAAY,EAAE;AAAA,MACtB,MAAM;AAAA,QACJ,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IACD,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU,MAAM,OAAO,0BAA0B,EAAE,KAAK,CAAC;AAC/D,QAAM,MAAM,sBAAsB,OAAO;AAEzC,SAAO,EAAE,KAAK,KAAK;AACrB;AAKA,eAAsB,kBACpB,WACA,gBACc;AACd,QAAM,SAAS,gBAAgB;AAE/B,SAAO,OAAO,cAAc;AAAA,IAC1B,SAAS,WAAW;AAAA,IACpB,OAAO,SAAS;AAAA,IAChB,SAAS,cAAc,EAAE;AAAA,IACzB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IACD,OAAO;AAAA,EACT,CAAC;AACH;AAqBA,eAAsB,kBACpB,WACmC;AACnC,0BAAwB;AACxB,QAAM,YAAY,YAAY,EAAE;AAChC,QAAM,MAAM,iBAAiB;AAE7B,QAAME,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBd,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,OAAAA;AAAA,MACA,WAAW,EAAE,UAAU,WAAW,UAAU;AAAA,IAC9C,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,6BAA6B,SAAS,UAAU,EAAE;AAAA,EACpE;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAYjC,MAAI,CAAC,KAAK,MAAM,aAAc,QAAO,CAAC;AAEtC,SAAO,KAAK,KAAK,aAAa,IAAI,CAAC,MAAM;AACvC,UAAM,UAAU,oBAAoB,qBAAqB,EAAE,IAAW;AACtE,WAAO;AAAA,MACL,KAAK,EAAE;AAAA,MACP,UAAU,EAAE;AAAA,MACZ,WAAW,EAAE;AAAA,MACb,MAAM,EAAE;AAAA,MACR,SAAS;AAAA,QACP,aAAa,QAAQ,CAAC;AAAA,QACtB,SAAS,QAAQ,CAAC;AAAA,QAClB,OAAO,QAAQ,CAAC;AAAA,QAChB,SAAS,QAAQ,CAAC;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AjBnQA,IAAI;AAAE,aAAW;AAAG,QAAQ;AAAC;AA8B7B,eAAe,WAAW;AACxB,SAAO,OAAO,oBAAe;AAC/B;AAIA,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;AAGjD,SAAS,aAAa,MAA0B;AAC9C,MAAI,KAAK,OAAO;AACd,IAAS,gBAAgB,KAAK,KAAgB;AAAA,EAChD;AAEF;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,6CAA6C,EACzD,QAAQ,OAAO,EACf,OAAO,aAAa,oDAAoD,KAAK,EAC7E,KAAK,aAAa,CAAC,gBAAgB;AAClC,QAAM,OAAO,YAAY,gBAAgB;AACzC,aAAW,KAAK,UAAU,iBAAiB,MAAM;AACjD,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAIA,OAAM,OAAO,wBAAwB,CAAC;AAAA,EACpD;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,qBAAqB,0BAA0B,EACtD,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,wBAAwB,0CAA0C,EACzE,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,iBAAiB,mCAAmC,KAAK,EAChE,OAAO,OAAO,SAAS;AACtB,MAAI;AAEF,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,2BAAsB,CAAC;AACzC,QAAI;AAEJ,UAAM,SAAS,WAAW;AAC1B,YAAQ,IAAI,IAAI,cAAc,OAAO,OAAO,EAAE,CAAC;AAC/C,YAAQ,IAAI,IAAI,cAAc,SAAS,EAAE,IAAI,EAAE,CAAC;AAChD,QAAI;AAIJ,UAAM,eAAe,WAAW;AAEhC,UAAM,OAAO,KAAK,QAAQ,MAAM,MAAM;AAAA,MACpC,SAAS,EAAE,gBAAgB;AAAA,MAC3B,UAAU,CAAC,MAAc,EAAE,SAAS,KAAK;AAAA,IAC3C,CAAC;AAED,UAAM,YAAY,KAAK,aAAa,MAAM,MAAM;AAAA,MAC9C,SAAS,EAAE,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;AAED,UAAM,cAAc,KAAK,eAAe,MAAM,MAAM;AAAA,MAClD,SAAS,EAAE,aAAa;AAAA,MACxB,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAED,UAAM,aAAa,KAAK,YAAY,eAChC,MAAM,MAAM,EAAE,SAAS,EAAE,qBAAqB,GAAG,SAAS,OAAO,YAAY,EAAE,CAAC,IAChF,MAAM,MAAM,EAAE,SAAS,EAAE,qBAAqB,GAAG,UAAU,CAAC,MAAc,QAAQ,KAAK,CAAC,KAAK,mBAAmB,CAAC;AAGrH,UAAM,eAAe,KAAK,iBAAiB,SAAY,KAAK,eAAe,MAAM,QAAQ;AAAA,MACvF,SAAS,EAAE,qCAAqC;AAAA,MAChD,SAAS;AAAA,IACX,CAAC;AAGD,UAAM,QAAS,KAAK,SAAS,OAAO,EAAE;AACtC,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,IAAI,MAAM,iBAAY,CAAC;AAC/B,QAAI;AACJ,YAAQ,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC,EAAE,CAAC;AAC9C,YAAQ,IAAI,EAAE,mBAAmB,EAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACvE,YAAQ,IAAI,EAAE,mBAAmB,IAAI,WAAW,CAAC,EAAE,CAAC;AACpD,YAAQ,IAAI,EAAE,oBAAoB,UAAU,EAAE,CAAC;AAC/C,YAAQ,IAAI,EAAE,mBAAmB,WAAW,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;AAC1E,YAAQ,IAAI,EAAE,mBAAmB,MAAM,EAAE,CAAC;AAC1C,YAAQ,IAAI,EAAE,oBAAoB,eAAe,EAAE,KAAK,IAAIA,OAAM,IAAI,gBAAgB,CAAC,EAAE,CAAC;AAC1F,QAAI;AAEJ,UAAM,KAAK,MAAM,QAAQ,EAAE,SAAS,EAAE,mBAAmB,GAAG,SAAS,KAAK,CAAC;AAC3E,QAAI,CAAC,IAAI;AACP,cAAQ,IAAI,IAAI,cAAc,CAAC;AAC/B;AAAA,IACF;AAGA,QAAI,cAAc,KAAK,eAAe;AAEtC,QAAI,CAAC,aAAa;AAChB,YAAMC,WAAUC,KAAI,EAAE,MAAM,EAAE,+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,iBAAiB;AAAA,YACjB,UAAU;AAAA,UACZ;AAAA,UACA,OAAO,CAAC;AAAA,QACV;AACA,sBAAc,MAAM,eAAe,QAAQ;AAC3C,QAAAD,SAAQ,QAAQ,EAAE,oBAAoB,IAAI,WAAW,CAAC,EAAE,CAAC;AAAA,MAC3D,SAAS,KAAK;AACZ,QAAAA,SAAQ,KAAKD,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,UAAUE,KAAI,EAAE,MAAM,EAAE,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;AAGrD,YAAQ,OAAO,EAAE,iCAAiC;AAClD,QAAI;AACF,MAAS,gBAAgB,OAAO,KAAK;AACrC,YAAM,iBAAiB,WAAW,EAAE;AACpC,YAAe;AAAA,QACb,OAAO,UAAU;AAAA,QACjB;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,IACF,SAAS,QAAQ;AAEf,cAAQ,KAAKF,OAAM,OAAO,mGAAyF,CAAC;AAAA,IACtH;AAEA,YAAQ,OAAO,EAAE,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,KAAKA,OAAM,OAAO,6CAAwC,CAAC;AACnE,cAAQ,KAAKA,OAAM,IAAI,yCAAyC,SAAS,OAAO,CAAC;AAAA,IACnF;AAEA,YAAQ,KAAK;AAGb,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,4BAAuB,CAAC;AAC1C,QAAI;AACJ,YAAQ,IAAI,EAAE,eAAe,EAAE,IAAI,OAAO,WAAW,EAAE,CAAC,EAAE,CAAC;AAC3D,YAAQ,IAAI,EAAE,eAAe,EAAE,OAAO,KAAK,CAAC,EAAE,CAAC;AAC/C,YAAQ,IAAI,EAAE,eAAe,EAAE,GAAG,SAAS,oBAAoB,CAAC,EAAE,CAAC;AACnE,YAAQ,IAAI,EAAE,eAAe,IAAI,YAAY,SAAS,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,QAAQ,WAAW,CAAC,EAAE,CAAC;AAC7G,YAAQ,IAAI,EAAE,eAAe,IAAI,eAAe,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;AAChE,YAAQ,IAAI,EAAE,eAAe,IAAI,iBAAiB,SAAS,EAAE,CAAC,EAAE,CAAC;AACjE,QAAI;AACJ,YAAQ,IAAI,EAAE,iDAA4C,CAAC;AAC3D,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,MAAMA,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,UAAUE,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,IAAIH,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,UAAUE,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,IAAIF,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,UAAUE,KAAI,EAAE,MAAM,EAAE,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,OAAO,EAAE,+BAA+B;AAChD,YAAM,WAA8B;AAAA,QAClC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,OAAO,SAAS,EAAE;AAAA,QAClB,YAAY,CAAC;AAAA,QACb,OAAO,EAAE,iBAAiB,KAAK;AAAA,QAC/B,OAAO,CAAC;AAAA,MACV;AACA,oBAAc,MAAM,eAAe,QAAQ;AAC3C,cAAQ,OAAO,EAAE,+BAA+B;AAAA,IAClD;AAEA,UAAM,OAAO,MAAiB,eAAe,aAAa,WAAW;AACrE,YAAQ,QAAQ,EAAE,kBAAkB,CAAC;AACrC,YAAQ,IAAI,IAAI,WAAW,WAAW,EAAE,CAAC;AACzC,YAAQ,IAAI,IAAI,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,UAAUE,KAAI,wBAAwB,EAAE,MAAM;AACpD,MAAI;AACF,UAAM,OAAO,MAAe,iBAAiB,KAAK,SAAoB;AACtE,YAAQ,QAAQ,uBAAuB,IAAI,EAAE;AAC7C,YAAQ,IAAIF,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,UAAUE,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AACF,UAAM,OAAO,MAAe,gBAAgB,KAAK,SAAoB;AACrE,YAAQ,QAAQ,sBAAsB,IAAI,EAAE;AAC5C,YAAQ,IAAIF,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,mBAAmB,mBAAmB,EACrD,eAAe,mBAAmB,sBAAsB,EACxD,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUE,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,YAAQ,OAAO;AACf,UAAM,OAAO,MAAe;AAAA,MAC1B,OAAO,KAAK,OAAO;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,YAAQ,QAAQ,qBAAqB,IAAI,EAAE;AAC3C,YAAQ,IAAIF,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,GAAG;AACpC,YAAM,KAAK,aAAa,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,OAAO,KAAK,OAAO,GAAG,SAAS,KAAK,IAAI;AAAA,QAC5D,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,UAAUE,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,IAAIJ,OAAM,IAAI,uBAAuB,CAAC;AAAA,MAChD,QAAQ;AACN,gBAAQ,KAAKA,OAAM,OAAO,6CAAwC,CAAC;AAAA,MACrE;AACA;AAAA,IACF;AAGA,YAAQ,OAAO;AACf,UAAM,kBAAkB,MAAa,kBAAkBI,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,IAAIJ,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,MACjCI,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,KAAKJ,OAAM,OAAO,oGAA0F,CAAC;AAAA,IACvH;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,iCAA4B,CAAC;AAC/C,QAAI;AACJ,YAAQ,IAAI,EAAE,mBAAmB,EAAE,GAAG,KAAK,SAAS,oBAAoB,CAAC,EAAE,CAAC;AAC5E,YAAQ,IAAI,EAAE,oBAAoB,OAAO,EAAE,CAAC;AAC5C,YAAQ,IAAI,EAAE,mBAAmB,IAAII,WAAU,OAAO,CAAC,EAAE,CAAC;AAC1D,YAAQ,IAAI,EAAE,mBAAmB,IAAI,GAAG,CAAC,EAAE,CAAC;AAC5C,YAAQ,IAAI,EAAE,mBAAmB,IAAW,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC;AAClE,YAAQ,IAAI,EAAE,mBAAmB,IAAI,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC;AAC7D,QAAI;AACJ,YAAQ,IAAI,EAAE,uCAAkC,CAAC;AACjD,YAAQ,IAAI,IAAI,+CAA+C,KAAK,SAAS,EAAE,CAAC;AAChF,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,qBAAqB;AAClC,YAAQ,MAAMJ,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,UAAUE,KAAI,0BAA0B,EAAE,MAAM;AACtD,MAAI;AACF,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,WAAW;AAClB,YAAM,gBAAgB,MAAM,iBAAiB,KAAK,SAAS;AAC3D,uBAAiB,cAAc;AAC/B,kBAAY,KAAK;AAAA,IACnB,OAAO;AACL,mBAAa,IAAI;AACjB,YAAM,eAAwB,gBAAgB;AAC9C,YAAM,gBAAgB,MAAM,sBAAsB,YAAY;AAC9D,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,WAAW,MAAa,kBAAkB,cAAc;AAE9D,YAAQ,KAAK;AAEb,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAI,IAAI,iCAAiC,CAAC;AAClD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAI,MAAM,mCAA8B,SAAS,MAAM,GAAG,CAAC;AACnE,QAAI;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,IAAI,EAAE,KAAK,IAAI,CAAC,YAAY,IAAI,QAAQ,OAAO,IAAI,IAAI,IAAI,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;AACtF,cAAQ,IAAI,IAAI,sBAAsB,IAAI,QAAQ,OAAO,GAAG,CAAC;AAC7D,cAAQ,IAAI,IAAI,qBAAqB,IAAI,EAAE,CAAC;AAC5C,cAAQ,IAAI,IAAI,qBAAqB,IAAI,GAAG,EAAE,CAAC;AAC/C,cAAQ,IAAI;AAAA,IACd;AAEA,YAAQ,IAAI,EAAE,eAAe,CAAC;AAC9B,YAAQ,IAAI,IAAI,0EAA0E,CAAC;AAC3F,YAAQ,IAAI,EAAE,cAAc,CAAC;AAC7B,YAAQ,IAAI,IAAI,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,mBAAmB,mBAAmB,EACrD,eAAe,mBAAmB,sBAAsB,EACxD,OAAO,0BAA0B,oDAAoD,EACrF,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUE,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;AAG9C,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;AACF,YAAM,UAAU,MAAe;AAAA,QAC7B,OAAO,KAAK,OAAO;AAAA,QACnB,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AACA,cAAQ,IAAI,IAAI,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,IAAI,IAAI,qDAAgD,CAAC;AAAA,MACnE,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAGA,YAAQ,OAAO;AACf,UAAM,EAAE,KAAK,YAAY,IAAI,MAAa;AAAA,MACxC;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,MACA,KAAK;AAAA,IACP;AAGA,QAAI,KAAK,eAAe;AACtB,cAAQ,OAAO;AACf,YAAa;AAAA,QACX,YAAY,EAAE;AAAA,QACd,KAAK;AAAA,MACP;AAAA,IACF;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,GAAG;AACpC,YAAM,KAAK,aAAa,OAAO;AAAA,QAC7B,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,OAAO,KAAK,OAAO,GAAG,SAAS,KAAK,IAAI;AAAA,QAC5D,WAAW;AAAA,QACX,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,MACzC,CAAC;AACD,cAAQ,IAAI,IAAI,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,IAAI,MAAM,yBAAoB,CAAC;AACvC,QAAI;AACJ,YAAQ,IAAI,EAAE,oBAAoB,KAAK,OAAO,EAAE,CAAC;AACjD,YAAQ,IAAI,EAAE,mBAAmB,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAC/C,YAAQ,IAAI,EAAE,mBAAmB,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;AAC/C,YAAQ,IAAI,EAAE,mBAAmB,IAAI,WAAW,CAAC,EAAE,CAAC;AACpD,YAAQ,IAAI,EAAE,mBAAmB,IAAW,cAAc,WAAW,CAAC,CAAC,EAAE,CAAC;AAC1E,QAAI;AAAA,EACN,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,QAAQ,EAChB,YAAY,mDAAmD,EAC/D,eAAe,uBAAuB,wCAAwC,EAC9E,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUE,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,IAAI,IAAI,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,SAASK,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,IAAIF,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,UAAU,EAClB,YAAY,kCAAkC,EAC9C,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUE,KAAI,iBAAiB,EAAE,MAAM;AAC7C,MAAI;AACF,UAAM,OAAO,MAAe,SAAS;AACrC,YAAQ,QAAQ,aAAa,IAAI,EAAE;AACnC,YAAQ,IAAIF,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,SACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,UAAUE,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AACF,UAAM,OAAO,MAAe,aAAa;AACzC,YAAQ,KAAK;AACb,YAAQ,IAAI;AACZ,YAAQ,IAAIF,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,UAAUE,KAAI,oBAAoB,EAAE,MAAM;AAChD,MAAI;AACF,UAAM,UAAU,MAAe,WAAW,KAAK,OAA8B;AAC7E,YAAQ,KAAK;AACb,YAAQ,IAAI;AACZ,YAAQ,IAAIF,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;AAE3C,SACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,OAAO,eAAe,yBAAyB,EAC/C,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUE,KAAI,uBAAuB,EAAE,MAAM;AACnD,MAAI;AACF,UAAM,aAAa,MAAkB;AAAA,MACnC,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,IAClC;AACA,YAAQ,KAAK;AAEb,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAIF,OAAM,IAAI,2BAA2B,CAAC;AAClD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,eAAe,WAAW,MAAM,GAAG,CAAC;AAC3D,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,eAAW,KAAK,YAAY;AAC1B,YAAM,SAAS,EAAE,SAASA,OAAM,MAAM,QAAQ,IAAIA,OAAM,IAAI,UAAU;AACtE,cAAQ,IAAI,MAAM,EAAE,EAAE,KAAKA,OAAM,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,MAAM,MAAM,EAAE;AACvF,cAAQ,IAAI,uBAAuB,EAAE,OAAO,EAAE;AAC9C,cAAQ,IAAI,uBAAuB,EAAE,cAAc,EAAE;AACrD,UAAI,EAAE,aAAa;AACjB,gBAAQ,IAAI,uBAAuBA,OAAM,IAAI,EAAE,WAAW,CAAC,EAAE;AAAA,MAC/D;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,SACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,SAAS,QAAQ,aAAa,EAC9B,OAAO,OAAO,UAAU;AACvB,QAAM,UAAUE,KAAI,qBAAqB,EAAE,MAAM;AACjD,MAAI;AACF,UAAM,IAAI,MAAkB,YAAY,OAAO,KAAK,CAAC;AACrD,YAAQ,KAAK;AAEb,YAAQ,IAAI;AACZ,YAAQ,IAAIF,OAAM,KAAK,aAAa,EAAE,EAAE,EAAE,CAAC;AAC3C,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,qBAAqB,EAAE,IAAI,EAAE;AACzC,YAAQ,IAAI,qBAAqB,EAAE,cAAc,EAAE;AACnD,YAAQ,IAAI,qBAAqB,EAAE,SAASA,OAAM,MAAM,KAAK,IAAIA,OAAM,IAAI,IAAI,CAAC,EAAE;AAClF,YAAQ,IAAI,qBAAqB,EAAE,OAAO,EAAE;AAC5C,YAAQ,IAAI,qBAAqB,EAAE,cAAc,EAAE;AACnD,QAAI,EAAE,aAAa;AACjB,cAAQ,IAAI,qBAAqBA,OAAM,IAAI,EAAE,WAAW,CAAC,EAAE;AAAA,IAC7D;AACA,YAAQ,IAAI;AAAA,EACd,SAAS,KAAK;AACZ,YAAQ,KAAK,yBAAyB;AACtC,YAAQ,MAAMA,OAAM,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,SACG,QAAQ,UAAU,EAClB,YAAY,kCAAkC,EAC9C,eAAe,8BAA8B,2BAA2B,EACxE,eAAe,eAAe,kBAAkB,EAChD,eAAe,iBAAiB,eAAe,EAC/C,OAAO,oBAAoB,+BAA+B,EAAE,EAC5D,OAAO,OAAO,SAAS;AACtB,QAAM,UAAUE,KAAI,yBAAyB,EAAE,MAAM;AACrD,MAAI;AACF,UAAM,OAAO,MAAkB;AAAA,MAC7B,KAAK;AAAA,MACL,OAAO,KAAK,IAAI;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,YAAQ,QAAQ,wBAAwB,IAAI,EAAE;AAC9C,YAAQ,IAAIF,OAAM,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC;AAAA,EACpD,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;AAEH,SACG,QAAQ,KAAK,EACb,YAAY,mCAAmC,EAC/C,OAAO,qBAAqB,sCAAsC,EAClE,eAAe,yBAAyB,mCAAmC,EAC3E,eAAe,qBAAqB,mCAAmC,EACvE,eAAe,qBAAqB,6BAA6B,EACjE,OAAO,gBAAgB,8CAA8C,KAAK,EAC1E,OAAO,oBAAoB,6BAA6B,KAAK,EAC7D,OAAO,aAAa,sDAAsD,KAAK,EAC/E,OAAO,OAAO,SAAS;AACtB,eAAa,IAAI;AACjB,QAAM,eAAe,IAAI;AAC3B,CAAC;AAGH,QACG,QAAQ,WAAW,EACnB,YAAY,+BAA+B,EAC3C,OAAO,MAAM;AACZ,QAAM,YAAY,CAAC,IAAI,iBAAiB,GAAG,IAAI,gBAAgB,CAAC;AAChE,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,uBAAuB,OAAO;AAG9B,0BAA0B,OAAO;AAGjC,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,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,CAAC,OAAO;AACV,YAAQ,IAAIA,OAAM,IAAI,iDAAiD,CAAC;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,+CAA+C,EAC3D,OAAO,MAAM;AACZ,QAAM,UAAU,SAAS,EAAE;AAC3B,QAAM,YAAY,kBAAkB,OAAO;AAC3C,QAAM,SAAS,WAAW;AAE1B,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,0BAA0B,OAAO,GAAG,CAAC;AAC5D,UAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,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","chalk","ora","base","baseSepolia","parseUnits","ERC20_ABI","encodeFunctionData","encodeFunctionData","parseUnits","getActiveSyndicates","parseUnits","formatUnits","isAddress","chalk","ora","encodeFunctionData","parseUnits","ERC20_ABI","parseUnits","encodeFunctionData","VALID_FEES","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","query","chalk","spinner","ora","getActiveSyndicates","syndicate","parseUnits"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/providers/moonwell.ts","../src/providers/uniswap.ts","../src/commands/strategy-run.ts","../src/strategies/levered-swap.ts","../src/lib/quote.ts","../src/lib/batch.ts","../src/lib/factory.ts","../src/lib/subgraph.ts","../src/lib/registry.ts","../src/lib/ipfs.ts","../src/commands/venice.ts","../src/strategies/venice-fund.ts","../src/lib/venice.ts","../src/commands/allowance.ts","../src/strategies/allowance-disburse.ts","../src/commands/identity.ts","../src/lib/eas.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 { Command } from \"commander\";\nimport { parseUnits } from \"viem\";\nimport type { Address } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { input, confirm, select } from \"@inquirer/prompts\";\nimport { setNetwork } from \"./lib/network.js\";\nimport { getExplorerUrl, getChain } 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 { runLeveredSwap } from \"./commands/strategy-run.js\";\nimport * as vaultLib from \"./lib/vault.js\";\nimport * as factoryLib from \"./lib/factory.js\";\nimport * as subgraphLib from \"./lib/subgraph.js\";\nimport * as registryLib from \"./lib/registry.js\";\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 { 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}\nimport { cacheGroupId, getCachedGroupId, setChainContract, getChainContracts, loadConfig, setPrivateKey, getAgentId } from \"./lib/config.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\n/** Set vault address from --vault flag or fall back to config. */\nfunction resolveVault(opts: { vault?: string }) {\n if (opts.vault) {\n vaultLib.setVaultAddress(opts.vault as Address);\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(\"0.1.0\")\n .option(\"--testnet\", \"Use Base Sepolia testnet instead of Base mainnet\", false)\n .hook(\"preAction\", (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n setNetwork(opts.testnet ? \"base-sepolia\" : \"base\");\n if (opts.testnet) {\n console.log(chalk.yellow(\"[testnet] Base Sepolia\"));\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 .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 name = opts.name || await input({\n message: G(\"Syndicate name\"),\n validate: (v: string) => v.length > 0 || \"Name is required\",\n });\n\n const subdomain = opts.subdomain || 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 || await input({\n message: G(\"Description\"),\n default: `${name} — a Sherwood syndicate`,\n });\n\n const agentIdStr = opts.agentId || (savedAgentId\n ? await input({ message: G(\"Agent ID (ERC-8004)\"), default: String(savedAgentId) })\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 : 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 {\n // Interactive prompt — no silent default\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 const go = await confirm({ message: G(\"Deploy syndicate?\"), default: true });\n if (!go) {\n console.log(DIM(\" Cancelled.\"));\n return;\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 ragequitEnabled: true,\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 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, // pkp = creator EOA (direct execution)\n creatorAddress, // operator = creator EOA\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 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: { ragequitEnabled: true },\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 hash = await vaultLib.approveDepositor(opts.depositor as Address);\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 hash = await vaultLib.removeDepositor(opts.depositor as Address);\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(\"--pkp <address>\", \"Agent PKP address\")\n .requiredOption(\"--eoa <address>\", \"Operator EOA 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 spinner.text = \"Registering agent...\";\n const hash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n opts.pkp as Address,\n opts.eoa as Address,\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.pkp);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.pkp },\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 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 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\n if (opts.subdomain) {\n const syndicateInfo = await resolveSyndicate(opts.subdomain);\n creatorAddress = syndicateInfo.creator;\n subdomain = opts.subdomain;\n } else {\n resolveVault(opts);\n const vaultAddress = vaultLib.getVaultAddress();\n const syndicateInfo = await resolveVaultSyndicate(vaultAddress);\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\n const approvedAgentIds = new Set(approvals.map((a) => a.decoded.agentId.toString()));\n const requests = allRequests.filter(\n (r) => !approvedAgentIds.has(r.decoded.agentId.toString()),\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> --pkp <addr> --eoa <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(\"--pkp <address>\", \"Agent PKP address\")\n .requiredOption(\"--eoa <address>\", \"Operator EOA 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 // 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 try {\n const regHash = await vaultLib.registerAgent(\n BigInt(opts.agentId),\n opts.pkp as Address,\n opts.eoa as Address,\n );\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 // 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 opts.eoa as Address,\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.pkp);\n await xmtp.sendEnvelope(group, {\n type: \"AGENT_REGISTERED\",\n agent: { erc8004Id: Number(opts.agentId), address: opts.pkp },\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(` PKP: ${G(opts.pkp)}`));\n console.log(W(` EOA: ${G(opts.eoa)}`));\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(\"ragequit\")\n .description(\"Withdraw all shares from a vault\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .action(async (opts) => {\n resolveVault(opts);\n const spinner = ora(\"Ragequitting...\").start();\n try {\n const hash = await vaultLib.ragequit();\n spinner.succeed(`Ragequit: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\n } catch (err) {\n spinner.fail(\"Ragequit 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\");\n\nstrategy\n .command(\"list\")\n .description(\"List registered strategies\")\n .option(\"--type <id>\", \"Filter by strategy type\")\n .action(async (opts) => {\n const spinner = ora(\"Loading strategies...\").start();\n try {\n const strategies = await registryLib.listStrategies(\n opts.type ? BigInt(opts.type) : undefined,\n );\n spinner.stop();\n\n if (strategies.length === 0) {\n console.log(chalk.dim(\"No strategies registered.\"));\n return;\n }\n\n console.log();\n console.log(chalk.bold(`Strategies (${strategies.length})`));\n console.log(chalk.dim(\"─\".repeat(70)));\n for (const s of strategies) {\n const status = s.active ? chalk.green(\"active\") : chalk.red(\"inactive\");\n console.log(` #${s.id} ${chalk.bold(s.name)} [type: ${s.strategyTypeId}] ${status}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Implementation: ${s.implementation}`);\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 strategies\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nstrategy\n .command(\"info\")\n .description(\"Show strategy details\")\n .argument(\"<id>\", \"Strategy ID\")\n .action(async (idStr) => {\n const spinner = ora(\"Loading strategy...\").start();\n try {\n const s = await registryLib.getStrategy(BigInt(idStr));\n spinner.stop();\n\n console.log();\n console.log(chalk.bold(`Strategy #${s.id}`));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Name: ${s.name}`);\n console.log(` Type: ${s.strategyTypeId}`);\n console.log(` Active: ${s.active ? chalk.green(\"yes\") : chalk.red(\"no\")}`);\n console.log(` Creator: ${s.creator}`);\n console.log(` Implementation: ${s.implementation}`);\n if (s.metadataURI) {\n console.log(` Metadata: ${chalk.dim(s.metadataURI)}`);\n }\n console.log();\n } catch (err) {\n spinner.fail(\"Failed to load strategy\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n process.exit(1);\n }\n });\n\nstrategy\n .command(\"register\")\n .description(\"Register a new strategy on-chain\")\n .requiredOption(\"--implementation <address>\", \"Strategy contract address\")\n .requiredOption(\"--type <id>\", \"Strategy type ID\")\n .requiredOption(\"--name <name>\", \"Strategy name\")\n .option(\"--metadata <uri>\", \"Metadata URI (IPFS/Arweave)\", \"\")\n .action(async (opts) => {\n const spinner = ora(\"Registering strategy...\").start();\n try {\n const hash = await registryLib.registerStrategy(\n opts.implementation as Address,\n BigInt(opts.type),\n opts.name,\n opts.metadata,\n );\n spinner.succeed(`Strategy registered: ${hash}`);\n console.log(chalk.dim(` ${getExplorerUrl(hash)}`));\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\nstrategy\n .command(\"run\")\n .description(\"Execute the levered swap strategy\")\n .option(\"--vault <address>\", \"Vault address (default: from config)\")\n .requiredOption(\"--collateral <amount>\", \"WETH collateral amount (e.g. 1.0)\")\n .requiredOption(\"--borrow <amount>\", \"USDC to borrow against collateral\")\n .requiredOption(\"--token <address>\", \"Target token address to buy\")\n .option(\"--fee <tier>\", \"Uniswap fee tier in bps (500, 3000, 10000)\", \"500\")\n .option(\"--slippage <bps>\", \"Slippage tolerance in bps\", \"100\")\n .option(\"--execute\", \"Actually execute on-chain (default: simulate only)\", false)\n .action(async (opts) => {\n resolveVault(opts);\n await runLeveredSwap(opts);\n });\n\n// ── Provider info ──\nprogram\n .command(\"providers\")\n .description(\"List available DeFi providers\")\n .action(() => {\n const providers = [new MoonwellProvider(), new UniswapProvider()];\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// ── 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 .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 (!saved) {\n console.log(chalk.red(\"Provide at least one of: --private-key, --vault\"));\n process.exit(1);\n }\n });\n\nconfigCmd\n .command(\"show\")\n .description(\"Display current config for the active network\")\n .action(() => {\n const chainId = getChain().id;\n const contracts = getChainContracts(chainId);\n const config = loadConfig();\n\n console.log();\n console.log(chalk.bold(`Sherwood Config (chain ${chainId})`));\n console.log(chalk.dim(\"─\".repeat(50)));\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","import 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","import 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 * `sherwood strategy run` command — executes the levered swap strategy.\n *\n * Flow:\n * 1. Agent sends WETH to vault (prerequisite)\n * 2. Quote: get USDC → target token price from Uniswap\n * 3. Build batch: deposit WETH → borrow USDC → swap to target\n * 4. Simulate via vault (caps + allowlist check)\n * 5. Execute on-chain (if --execute flag)\n *\n * The vault is the onchain identity — all positions live on the vault\n * via delegatecall to a shared executor lib. Agent provides their\n * own WETH (no LP capital deployed).\n */\n\nimport type { Address } from \"viem\";\nimport { parseUnits, formatUnits, isAddress } from \"viem\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { buildEntryBatch, type LeveredSwapConfig } from \"../strategies/levered-swap.js\";\nimport { getQuote, applySlippage } from \"../lib/quote.js\";\nimport { formatBatch } from \"../lib/batch.js\";\nimport { executeBatch, simulateBatch } from \"../lib/vault.js\";\nimport { getPublicClient } from \"../lib/client.js\";\nimport { ERC20_ABI } from \"../lib/abis.js\";\nimport { TOKENS } from \"../lib/addresses.js\";\nimport { getExplorerUrl } from \"../lib/network.js\";\n\nconst VALID_FEES = [500, 3000, 10000] as const;\n\nexport async function runLeveredSwap(opts: {\n vault: string;\n collateral: string; // WETH amount (e.g. \"1.0\")\n borrow: string; // USDC amount (e.g. \"1000\")\n token: string; // target token address\n fee: string;\n slippage: string;\n execute: boolean;\n}): Promise<void> {\n // ── Validate inputs ──\n\n const vaultAddress = opts.vault as Address;\n\n if (!isAddress(opts.token)) {\n console.error(chalk.red(`Invalid token address: ${opts.token}`));\n process.exit(1);\n }\n const targetToken = opts.token as Address;\n\n const feeTier = Number(opts.fee);\n if (!VALID_FEES.includes(feeTier as 500 | 3000 | 10000)) {\n console.error(chalk.red(`Invalid fee tier: ${opts.fee}. Valid: ${VALID_FEES.join(\", \")}`));\n process.exit(1);\n }\n\n const slippageBps = Number(opts.slippage);\n\n // Fetch token decimals on-chain\n const client = getPublicClient();\n let targetDecimals: number;\n let borrowDecimals: number;\n try {\n [targetDecimals, borrowDecimals] = await Promise.all([\n client.readContract({\n address: targetToken,\n abi: ERC20_ABI,\n functionName: \"decimals\",\n }) as Promise<number>,\n client.readContract({\n address: TOKENS().USDC,\n abi: ERC20_ABI,\n functionName: \"decimals\",\n }) as Promise<number>,\n ]);\n } catch {\n console.error(chalk.red(`Could not read token decimals — are the addresses valid ERC20s?`));\n process.exit(1);\n }\n\n // ── Display config ──\n\n console.log();\n console.log(chalk.bold(\"Levered Swap Strategy\"));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Collateral: ${opts.collateral} WETH (agent-provided)`);\n console.log(` Borrow: ${opts.borrow} USDC (from Moonwell)`);\n console.log(` Buy: ${targetToken} (${targetDecimals} decimals)`);\n console.log(` Fee tier: ${(feeTier / 10000 * 100).toFixed(2)}%`);\n console.log(` Slippage: ${(slippageBps / 100).toFixed(2)}%`);\n console.log(` Vault: ${vaultAddress}`);\n console.log();\n\n // ── Get Uniswap quote (USDC → target token) ──\n\n const spinner = ora(\"Fetching Uniswap quote...\").start();\n let amountOut: bigint;\n let minOut: bigint;\n\n try {\n const borrowAmount = parseUnits(opts.borrow, borrowDecimals);\n const quote = await getQuote({\n tokenIn: TOKENS().USDC,\n tokenOut: targetToken,\n amountIn: borrowAmount,\n fee: feeTier,\n });\n amountOut = quote.amountOut;\n minOut = applySlippage(amountOut, slippageBps);\n spinner.succeed(\n `Quote: ${formatUnits(amountOut, targetDecimals)} tokens ` +\n `(min: ${formatUnits(minOut, targetDecimals)}, gas est: ${quote.gasEstimate})`\n );\n } catch (err) {\n spinner.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 entry batch ──\n\n const config: LeveredSwapConfig = {\n collateralAmount: opts.collateral,\n borrowAmount: opts.borrow,\n targetToken,\n fee: feeTier as 500 | 3000 | 10000,\n slippageBps,\n profitTargetBps: 2000, // 20% default\n stopLossBps: 1000, // 10% default\n };\n\n const calls = buildEntryBatch(config, vaultAddress, minOut, borrowDecimals);\n\n console.log();\n console.log(chalk.bold(\"Batch calls (6):\"));\n console.log(formatBatch(calls));\n console.log();\n\n // ── Simulate ──\n\n const simSpinner = ora(\"Simulating via vault...\").start();\n try {\n const results = await simulateBatch(calls);\n const allSucceeded = results.every((r) => r.success);\n if (allSucceeded) {\n simSpinner.succeed(\"Simulation passed\");\n } else {\n simSpinner.fail(\"Simulation: some calls failed\");\n for (let i = 0; i < results.length; i++) {\n const status = results[i].success ? \"✓\" : \"✗\";\n console.log(` ${status} Call ${i + 1}`);\n }\n if (!opts.execute) {\n process.exit(1);\n }\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\n }\n } catch (err) {\n simSpinner.fail(\"Simulation failed\");\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(msg));\n if (!opts.execute) {\n process.exit(1);\n }\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\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.\"));\n console.log(chalk.dim(\" Prerequisite: send WETH to vault before executing.\"));\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 * Levered Swap Strategy\n *\n * The agent's autonomous loop:\n * 1. Research: Query Messari for market intelligence (signal, metrics, news)\n * 2. Decide: Analyze data, identify opportunity, pick token + size\n * 3. Execute: Deposit ETH collateral → Borrow USDC → Swap into target token (atomic batch)\n * 4. Monitor: Continuously check position health + market conditions\n * 5. Unwind: Hit profit target or risk threshold → Sell → Repay → Withdraw\n *\n * The vault is the onchain identity — it holds all positions (mTokens, borrows,\n * swapped tokens) via delegatecall to a shared executor lib.\n *\n * The agent provides their own WETH as collateral (sent to vault). The borrowed\n * USDC is swapped into whatever token Messari research recommends. assetAmount=0\n * since no LP capital is deployed — agent capital only.\n *\n * All intelligence lives here. The onchain executor lib is a dumb pipe.\n */\n\nimport type { Address } from \"viem\";\nimport {\n encodeFunctionData,\n parseUnits,\n parseEther,\n} from \"viem\";\nimport type { BatchCall } from \"../lib/batch.js\";\nimport { MOONWELL, UNISWAP, TOKENS } from \"../lib/addresses.js\";\n\n// ── Strategy Config ──\n\nexport interface LeveredSwapConfig {\n /** WETH collateral amount (human-readable, e.g. \"1.0\" = 1 WETH) */\n collateralAmount: string;\n /** USDC borrow amount (human-readable, e.g. \"1000\") */\n borrowAmount: string;\n /** Target token to buy with borrowed USDC */\n targetToken: Address;\n /** Uniswap pool fee tier for USDC → target swap */\n fee: 500 | 3000 | 10000;\n /** Max slippage in basis points (e.g. 100 = 1%) */\n slippageBps: number;\n /** Profit target in basis points (e.g. 2000 = 20%) */\n profitTargetBps: number;\n /** Stop loss in basis points (e.g. 1000 = 10%) */\n stopLossBps: number;\n}\n\n// ── ABIs (minimal, what BatchExecutor needs to encode 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 MTOKEN_ABI = [\n {\n name: \"mint\",\n type: \"function\",\n inputs: [{ name: \"mintAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"borrow\",\n type: \"function\",\n inputs: [{ name: \"borrowAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"repayBorrow\",\n type: \"function\",\n inputs: [{ name: \"repayAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"redeemUnderlying\",\n type: \"function\",\n inputs: [{ name: \"redeemAmount\", type: \"uint256\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\nconst COMPTROLLER_ABI = [\n {\n name: \"enterMarkets\",\n type: \"function\",\n inputs: [{ name: \"mTokens\", type: \"address[]\" }],\n outputs: [{ name: \"\", type: \"uint256[]\" }],\n },\n] as const;\n\nconst SWAP_ROUTER_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\n// ── Build Entry Batch (Deposit WETH → Borrow USDC → Swap to Target) ──\n\n/**\n * Build the entry batch. Agent's WETH must already be in the vault.\n *\n * Flow:\n * 1. Approve mWETH to pull WETH from vault\n * 2. Deposit WETH as collateral on Moonwell\n * 3. Enable WETH market as collateral\n * 4. Borrow USDC against WETH collateral\n * 5. Approve SwapRouter to spend borrowed USDC\n * 6. Swap USDC → target token (Messari pick)\n *\n * All calls execute as the vault (via delegatecall), so positions\n * (mTokens, borrows, swapped tokens) live on the vault address.\n */\nexport function buildEntryBatch(\n config: LeveredSwapConfig,\n vaultAddress: Address,\n amountOutMinimum: bigint, // Computed by CLI from Uniswap quote\n borrowDecimals: number, // Decimals of the borrow token (read on-chain by caller)\n): BatchCall[] {\n // Guard: fail early if Moonwell is not deployed (e.g. on testnet)\n const ZERO = \"0x0000000000000000000000000000000000000000\";\n if (MOONWELL().mWETH === ZERO || MOONWELL().mUSDC === ZERO || MOONWELL().COMPTROLLER === ZERO) {\n throw new Error(\"Moonwell is not deployed on this network — levered swap requires Moonwell lending markets\");\n }\n\n const collateral = parseEther(config.collateralAmount); // WETH = 18 decimals\n const borrow = parseUnits(config.borrowAmount, borrowDecimals);\n\n const calls: BatchCall[] = [\n // 1. Approve mWETH to pull WETH from executor\n {\n target: TOKENS().WETH,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [MOONWELL().mWETH, collateral],\n }),\n value: 0n,\n },\n // 2. Deposit WETH as collateral (mint mWETH tokens)\n {\n target: MOONWELL().mWETH,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"mint\",\n args: [collateral],\n }),\n value: 0n,\n },\n // 3. Enter WETH market (enable as collateral for borrowing)\n {\n target: MOONWELL().COMPTROLLER,\n data: encodeFunctionData({\n abi: COMPTROLLER_ABI,\n functionName: \"enterMarkets\",\n args: [[MOONWELL().mWETH]],\n }),\n value: 0n,\n },\n // 4. Borrow USDC against WETH collateral\n {\n target: MOONWELL().mUSDC,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"borrow\",\n args: [borrow],\n }),\n value: 0n,\n },\n // 5. Approve SwapRouter to pull borrowed USDC\n {\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, borrow],\n }),\n value: 0n,\n },\n // 6. Swap USDC → target token\n {\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: TOKENS().USDC,\n tokenOut: config.targetToken,\n fee: config.fee,\n recipient: vaultAddress, // Tokens stay in vault (delegatecall)\n amountIn: borrow,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n },\n ];\n\n return calls;\n}\n\n// ── Build Exit Batch (Sell Target → Repay USDC → Withdraw WETH) ──\n\n/**\n * Build the exit batch. Unwinds the position.\n *\n * Flow:\n * 1. Approve SwapRouter to pull target tokens\n * 2. Swap target token → USDC\n * 3. Approve mUSDC for repayment\n * 4. Repay USDC borrow on Moonwell\n * 5. Withdraw WETH collateral from Moonwell\n */\nexport function buildExitBatch(\n config: LeveredSwapConfig,\n vaultAddress: Address,\n tokenBalance: bigint, // How much of the target token to sell\n amountOutMinimum: bigint, // Min USDC from selling the token\n borrowBalance: bigint, // Current borrow balance to repay (includes interest)\n): BatchCall[] {\n // Guard: fail early if Moonwell is not deployed (e.g. on testnet)\n const ZERO = \"0x0000000000000000000000000000000000000000\";\n if (MOONWELL().mWETH === ZERO || MOONWELL().mUSDC === ZERO) {\n throw new Error(\"Moonwell is not deployed on this network — levered swap requires Moonwell lending markets\");\n }\n\n const collateral = parseEther(config.collateralAmount); // WETH = 18 decimals\n\n const calls: BatchCall[] = [\n // 1. Approve SwapRouter to pull target tokens\n {\n target: config.targetToken,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [UNISWAP().SWAP_ROUTER, tokenBalance],\n }),\n value: 0n,\n },\n // 2. Swap target token → USDC\n {\n target: UNISWAP().SWAP_ROUTER,\n data: encodeFunctionData({\n abi: SWAP_ROUTER_ABI,\n functionName: \"exactInputSingle\",\n args: [\n {\n tokenIn: config.targetToken,\n tokenOut: TOKENS().USDC,\n fee: config.fee,\n recipient: vaultAddress,\n amountIn: tokenBalance,\n amountOutMinimum,\n sqrtPriceLimitX96: 0n,\n },\n ],\n }),\n value: 0n,\n },\n // 3. Approve mUSDC to pull USDC for repayment\n {\n target: TOKENS().USDC,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [MOONWELL().mUSDC, borrowBalance],\n }),\n value: 0n,\n },\n // 4. Repay USDC borrow\n {\n target: MOONWELL().mUSDC,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"repayBorrow\",\n args: [borrowBalance],\n }),\n value: 0n,\n },\n // 5. Withdraw WETH collateral (stays in vault)\n {\n target: MOONWELL().mWETH,\n data: encodeFunctionData({\n abi: MTOKEN_ABI,\n functionName: \"redeemUnderlying\",\n args: [collateral],\n }),\n value: 0n,\n },\n ];\n\n return calls;\n}\n\n// TODO: buildMonitorLoop() — continuous position health + market check\n// Uses Messari Signal API for sentiment shifts\n// Uses Messari Metrics API for price movement\n// Checks Moonwell getAccountLiquidity for health factor\n// Triggers exit when profit target or stop loss hit\n\n// TODO: getMessariSignal() — query Messari Signal API for token sentiment\n// POST https://api.messari.io/ai/v2/chat/completions\n// or GET https://api.messari.io/signal/v1/... for sentiment data\n// x402 auth: send request, handle 402, sign payment, retry\n\n// TODO: Multi-hop routing for tokens without direct USDC pair\n// Use SWAP_EXACT_IN_MULTI with encoded path from Uniswap SDK\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 * 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 * 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: \"getActiveSyndicates\",\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 return 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}\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 pkpAddress: string;\n operatorEOA: 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 const where = creator\n ? `where: { active: true, creator: \"${creator.toLowerCase()}\" }`\n : `where: { active: true }`;\n\n const data = await query<{ syndicates: SubgraphSyndicate[] }>(`\n {\n syndicates(${where}, 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 {\n syndicate(id: \"${syndicateId}\") {\n id\n vault\n creator\n metadataURI\n createdAt\n active\n totalDeposits\n totalWithdrawals\n agents(first: 50) {\n id\n pkpAddress\n operatorEOA\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 `);\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 {\n deposits(where: { owner: \"${addr}\" }, 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: \"${addr}\" }, orderBy: timestamp, orderDirection: desc, first: 50) {\n id\n sender\n owner\n assets\n shares\n timestamp\n txHash\n }\n }\n `);\n\n return { deposits: data.deposits, withdrawals: data.withdrawals };\n}\n","/**\n * StrategyRegistry contract wrapper.\n *\n * Permissionless registration — anyone can register a strategy.\n * Creator address is public (for future carry fees).\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { getPublicClient, getWalletClient, getAccount } from \"./client.js\";\nimport { STRATEGY_REGISTRY_ABI } from \"./abis.js\";\nimport { SHERWOOD } from \"./addresses.js\";\n\nexport interface StrategyRecord {\n id: bigint;\n implementation: Address;\n creator: Address;\n strategyTypeId: bigint;\n active: boolean;\n name: string;\n metadataURI: string;\n}\n\nfunction getRegistryAddress(): Address {\n return SHERWOOD().STRATEGY_REGISTRY;\n}\n\n/**\n * Register a new strategy on-chain.\n */\nexport async function registerStrategy(\n implementation: Address,\n strategyTypeId: bigint,\n name: string,\n metadataURI: string,\n): Promise<Hex> {\n const wallet = getWalletClient();\n return wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: getRegistryAddress(),\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"registerStrategy\",\n args: [implementation, strategyTypeId, name, metadataURI],\n });\n}\n\n/**\n * Get a strategy by ID.\n */\nexport async function getStrategy(id: bigint): Promise<StrategyRecord> {\n const client = getPublicClient();\n const result = (await client.readContract({\n address: getRegistryAddress(),\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"getStrategy\",\n args: [id],\n })) as {\n implementation: Address;\n creator: Address;\n strategyTypeId: bigint;\n active: boolean;\n name: string;\n metadataURI: string;\n };\n\n return {\n id,\n implementation: result.implementation,\n creator: result.creator,\n strategyTypeId: result.strategyTypeId,\n active: result.active,\n name: result.name,\n metadataURI: result.metadataURI,\n };\n}\n\n/**\n * List all strategies, optionally filtered by type.\n */\nexport async function listStrategies(typeId?: bigint): Promise<StrategyRecord[]> {\n const client = getPublicClient();\n const registryAddress = getRegistryAddress();\n\n let ids: readonly bigint[];\n\n if (typeId !== undefined) {\n ids = (await client.readContract({\n address: registryAddress,\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"getStrategiesByType\",\n args: [typeId],\n })) as readonly bigint[];\n } else {\n const count = (await client.readContract({\n address: registryAddress,\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"strategyCount\",\n })) as bigint;\n\n ids = Array.from({ length: Number(count) }, (_, i) => BigInt(i + 1));\n }\n\n const strategies: StrategyRecord[] = [];\n for (const id of ids) {\n const s = await getStrategy(id);\n strategies.push(s);\n }\n\n return strategies;\n}\n\n/**\n * Get total number of registered strategies.\n */\nexport async function strategyCount(): Promise<bigint> {\n const client = getPublicClient();\n return client.readContract({\n address: getRegistryAddress(),\n abi: STRATEGY_REGISTRY_ABI,\n functionName: \"strategyCount\",\n }) as Promise<bigint>;\n}\n","/**\n * IPFS metadata upload/fetch via Pinata.\n *\n * Used for syndicate metadata (name, description, strategies, terms).\n * Requires PINATA_API_KEY and PINATA_GATEWAY env vars.\n */\n\nexport interface SyndicateMetadata {\n schema: string;\n name: string;\n description: string;\n logo?: string;\n chain: string;\n strategies: {\n id: string;\n name: string;\n description: string;\n protocols: string[];\n riskLevel: string;\n }[];\n terms: {\n minDeposit?: string;\n minDepositFormatted?: string;\n feeModel?: string;\n ragequitEnabled: boolean;\n lockPeriod?: number;\n };\n links: {\n moltbook?: string;\n dashboard?: string;\n github?: string;\n };\n}\n\n// Bundled Pinata credentials — used by all CLI users for syndicate metadata.\n// Override with PINATA_API_KEY / PINATA_GATEWAY env vars if needed.\nconst BUNDLED_PINATA_JWT =\n \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySW5mb3JtYXRpb24iOnsiaWQiOiI2NDQ0MGViOC1hYTYyLTQzY2EtOGYwNC04MDZjZmNjY2Y4YTUiLCJlbWFpbCI6ImltdGhhdGNhcmxvc0BnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicGluX3BvbGljeSI6eyJyZWdpb25zIjpbeyJkZXNpcmVkUmVwbGljYXRpb25Db3VudCI6MSwiaWQiOiJGUkExIn1dLCJ2ZXJzaW9uIjoxfSwibWZhX2VuYWJsZWQiOmZhbHNlLCJzdGF0dXMiOiJBQ1RJVkUifSwiYXV0aGVudGljYXRpb25UeXBlIjoic2NvcGVkS2V5Iiwic2NvcGVkS2V5S2V5IjoiMWJhZWFmMzQwODM3MGQ0NGZkZWEiLCJzY29wZWRLZXlTZWNyZXQiOiIzNDcxMmU5MTkyYTgxNWFhMGRmNjUyYjYyMDQzODQ1MDJjMmU0YWE0MDhkZTJmOTU2NWYwOTk3YTNlY2U3NGU3IiwiZXhwIjoxODAxMjc2ODExfQ.7OMJiOATpqkSwe7Orrpt2b8H_-czH-W61vBm4AHtqfA\";\nconst BUNDLED_PINATA_GATEWAY = \"https://sherwood.mypinata.cloud\";\n\nfunction getPinataApiKey(): string {\n return process.env.PINATA_API_KEY || BUNDLED_PINATA_JWT;\n}\n\nfunction getPinataGateway(): string {\n return process.env.PINATA_GATEWAY || BUNDLED_PINATA_GATEWAY;\n}\n\n/**\n * Upload JSON metadata to IPFS via Pinata.\n * Returns the IPFS URI (ipfs://Qm...).\n */\nexport async function uploadMetadata(metadata: SyndicateMetadata): Promise<string> {\n const apiKey = getPinataApiKey();\n\n const response = await fetch(\"https://api.pinata.cloud/pinning/pinJSONToIPFS\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n pinataContent: metadata,\n pinataMetadata: {\n name: `sherwood-syndicate-${metadata.name.toLowerCase().replace(/\\s+/g, \"-\")}`,\n },\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Pinata upload failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as { IpfsHash: string };\n return `ipfs://${result.IpfsHash}`;\n}\n\n/**\n * Fetch and parse metadata from an IPFS URI.\n * Supports ipfs:// protocol URIs and raw CIDs.\n */\nexport async function fetchMetadata(ipfsURI: string): Promise<SyndicateMetadata> {\n const gateway = getPinataGateway();\n let cid: string;\n\n if (ipfsURI.startsWith(\"ipfs://\")) {\n cid = ipfsURI.slice(7);\n } else if (ipfsURI.startsWith(\"Qm\") || ipfsURI.startsWith(\"bafy\")) {\n cid = ipfsURI;\n } else {\n throw new Error(`Invalid IPFS URI: ${ipfsURI}`);\n }\n\n const url = `${gateway}/ipfs/${cid}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch metadata from ${url} (${response.status})`);\n }\n\n return (await response.json()) as SyndicateMetadata;\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, simulateBatch } from \"../lib/vault.js\";\nimport { buildFundBatch, type VeniceFundConfig } from \"../strategies/venice-fund.js\";\nimport { provisionApiKey, checkApiKeyValid } from \"../lib/venice.js\";\nimport { getVeniceApiKey } from \"../lib/config.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 .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: \"getAgentOperators\" }) 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 // ── Simulate ──\n\n const simSpinner = ora(\"Simulating via vault...\").start();\n try {\n const results = await simulateBatch(calls);\n const allSucceeded = results.every((r) => r.success);\n if (allSucceeded) {\n simSpinner.succeed(\"Simulation passed\");\n } else {\n simSpinner.fail(\"Simulation: some calls failed\");\n for (let i = 0; i < results.length; i++) {\n const status = results[i].success ? \"ok\" : \"FAIL\";\n console.log(` ${status} Call ${i + 1}`);\n }\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\n }\n } catch (err) {\n simSpinner.fail(\"Simulation failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\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.\"));\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: \"getAgentOperators\" }) 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","/**\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 and validation.\n *\n * 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 * 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 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 as string;\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 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 as string;\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 });\n return res.ok;\n } catch {\n return false;\n }\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, simulateBatch } 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: \"getAgentOperators\" }) 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 // ── Simulate ──\n\n const simSpinner = ora(\"Simulating via vault...\").start();\n try {\n const results = await simulateBatch(calls);\n const allSucceeded = results.every((r) => r.success);\n if (allSucceeded) {\n simSpinner.succeed(\"Simulation passed\");\n } else {\n simSpinner.fail(\"Simulation: some calls failed\");\n for (let i = 0; i < results.length; i++) {\n const status = results[i].success ? \"ok\" : \"FAIL\";\n console.log(` ${status} Call ${i + 1}`);\n }\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\n }\n } catch (err) {\n simSpinner.fail(\"Simulation failed\");\n console.error(chalk.red(err instanceof Error ? err.message : String(err)));\n if (!opts.execute) process.exit(1);\n console.log(chalk.yellow(\"Continuing to execution despite simulation failure...\"));\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.\"));\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: \"getAgentOperators\" }) 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 * EAS (Ethereum Attestation Service) wrapper for syndicate join requests and approvals.\n *\n * Uses viem for on-chain writes and the EAS GraphQL API for queries.\n * No ethers dependency — attestation data is encoded with viem's encodeAbiParameters.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from \"viem\";\nimport { getPublicClient, getWalletClient, getAccount } from \"./client.js\";\nimport { getChain, getNetwork } from \"./network.js\";\nimport { EAS_CONTRACTS, EAS_SCHEMAS } from \"./addresses.js\";\nimport { EAS_ABI } from \"./abis.js\";\n\n// ── Schema definitions ──\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as Hex;\n\nconst JOIN_REQUEST_PARAMS = parseAbiParameters(\"uint256, uint256, address, string\");\nconst AGENT_APPROVED_PARAMS = parseAbiParameters(\"uint256, uint256, address\");\n\nfunction assertSchemasRegistered() {\n const schemas = EAS_SCHEMAS();\n if (schemas.SYNDICATE_JOIN_REQUEST === ZERO_BYTES32 || schemas.AGENT_APPROVED === ZERO_BYTES32) {\n throw new Error(\n \"EAS schemas not registered. Run: npx tsx scripts/register-eas-schemas.ts --testnet\",\n );\n }\n}\n\n// ── GraphQL ──\n\nfunction getEasGraphqlUrl(): string {\n return getNetwork() === \"base\"\n ? \"https://base.easscan.org/graphql\"\n : \"https://base-sepolia.easscan.org/graphql\";\n}\n\nexport function getEasScanUrl(uid: Hex): string {\n const host = getNetwork() === \"base\" ? \"base.easscan.org\" : \"base-sepolia.easscan.org\";\n return `https://${host}/attestation/view/${uid}`;\n}\n\n// ── Attestation Creation ──\n\n/**\n * Extract the attestation UID from a transaction receipt.\n * The EAS contract emits: event Attested(address indexed recipient, address indexed attester, bytes32 uid, bytes32 indexed schemaUID)\n * uid is a non-indexed parameter in the event data.\n */\nfunction extractAttestationUid(receipt: { logs: readonly { topics: readonly Hex[]; data: Hex }[] }): Hex {\n for (const log of receipt.logs) {\n // Attested event has 4 topics (sig + 3 indexed) and data contains the uid (bytes32)\n if (log.topics.length === 4 && log.data.length >= 66) {\n return (\"0x\" + log.data.slice(2, 66)) as Hex;\n }\n }\n throw new Error(\"Could not extract attestation UID from transaction receipt\");\n}\n\n/**\n * Create a SYNDICATE_JOIN_REQUEST attestation.\n * Attester: the calling agent. Recipient: the syndicate creator.\n */\nexport async function createJoinRequest(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n creatorAddress: Address,\n message: string,\n): Promise<{ uid: Hex; hash: Hex }> {\n assertSchemasRegistered();\n const wallet = getWalletClient();\n const client = getPublicClient();\n\n const data = encodeAbiParameters(JOIN_REQUEST_PARAMS, [\n syndicateId, agentId, vault, message,\n ]);\n\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n data: {\n recipient: creatorAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await client.waitForTransactionReceipt({ hash });\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n}\n\n/**\n * Create an AGENT_APPROVED attestation.\n * Attester: the syndicate creator. Recipient: the agent's operator EOA.\n */\nexport async function createApproval(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n agentAddress: Address,\n): Promise<{ uid: Hex; hash: Hex }> {\n assertSchemasRegistered();\n const wallet = getWalletClient();\n const client = getPublicClient();\n\n const data = encodeAbiParameters(AGENT_APPROVED_PARAMS, [\n syndicateId, agentId, vault,\n ]);\n\n const hash = await wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().AGENT_APPROVED,\n data: {\n recipient: agentAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await client.waitForTransactionReceipt({ hash });\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n}\n\n/**\n * Revoke an attestation. Only the original attester can revoke.\n */\nexport async function revokeAttestation(\n schemaUid: Hex,\n attestationUid: Hex,\n): Promise<Hex> {\n const wallet = getWalletClient();\n\n return wallet.writeContract({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"revoke\",\n args: [{\n schema: schemaUid,\n data: {\n uid: attestationUid,\n value: 0n,\n },\n }],\n value: 0n,\n });\n}\n\n// ── Attestation Queries ──\n\nexport interface JoinRequestAttestation {\n uid: Hex;\n attester: Address;\n recipient: Address;\n time: number;\n decoded: {\n syndicateId: bigint;\n agentId: bigint;\n vault: Address;\n message: string;\n };\n}\n\n/**\n * Query pending (non-revoked) join requests for a given recipient (creator address).\n * Uses the EAS GraphQL API.\n */\nexport interface ApprovalAttestation {\n uid: Hex;\n attester: Address;\n recipient: Address;\n time: number;\n decoded: {\n syndicateId: bigint;\n agentId: bigint;\n vault: Address;\n };\n}\n\n/**\n * Query existing (non-revoked) AGENT_APPROVED attestations created by a given attester (creator).\n * Used to check for duplicates before creating a new approval and to filter already-approved agents from requests.\n */\nexport async function queryApprovals(\n attester: Address,\n): Promise<ApprovalAttestation[]> {\n assertSchemasRegistered();\n const schemaUid = EAS_SCHEMAS().AGENT_APPROVED;\n const url = getEasGraphqlUrl();\n\n const query = `\n query Approvals($schemaId: String!, $attester: String!) {\n attestations(\n where: {\n schemaId: { equals: $schemaId }\n attester: { equals: $attester }\n revoked: { equals: false }\n }\n orderBy: [{ time: desc }]\n ) {\n id\n attester\n recipient\n time\n data\n }\n }\n `;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query,\n variables: { schemaId: schemaUid, attester },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`EAS GraphQL query failed: ${response.statusText}`);\n }\n\n const json = await response.json() as {\n data?: {\n attestations: Array<{\n id: string;\n attester: string;\n recipient: string;\n time: number;\n data: string;\n }>;\n };\n };\n\n if (!json.data?.attestations) return [];\n\n return json.data.attestations.map((a) => {\n const decoded = decodeAbiParameters(AGENT_APPROVED_PARAMS, a.data as Hex);\n return {\n uid: a.id as Hex,\n attester: a.attester as Address,\n recipient: a.recipient as Address,\n time: a.time,\n decoded: {\n syndicateId: decoded[0],\n agentId: decoded[1],\n vault: decoded[2],\n },\n };\n });\n}\n\nexport async function queryJoinRequests(\n recipient: Address,\n): Promise<JoinRequestAttestation[]> {\n assertSchemasRegistered();\n const schemaUid = EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST;\n const url = getEasGraphqlUrl();\n\n const query = `\n query JoinRequests($schemaId: String!, $recipient: String!) {\n attestations(\n where: {\n schemaId: { equals: $schemaId }\n recipient: { equals: $recipient }\n revoked: { equals: false }\n }\n orderBy: [{ time: desc }]\n ) {\n id\n attester\n recipient\n time\n data\n }\n }\n `;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query,\n variables: { schemaId: schemaUid, recipient },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`EAS GraphQL query failed: ${response.statusText}`);\n }\n\n const json = await response.json() as {\n data?: {\n attestations: Array<{\n id: string;\n attester: string;\n recipient: string;\n time: number;\n data: string;\n }>;\n };\n };\n\n if (!json.data?.attestations) return [];\n\n return json.data.attestations.map((a) => {\n const decoded = decodeAbiParameters(JOIN_REQUEST_PARAMS, a.data as Hex);\n return {\n uid: a.id as Hex,\n attester: a.attester as Address,\n recipient: a.recipient as Address,\n time: a.time,\n decoded: {\n syndicateId: decoded[0],\n agentId: decoded[1],\n vault: decoded[2],\n message: decoded[3],\n },\n };\n });\n}\n"],"mappings":"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","names":["parseUnits","chalk","ora","base","baseSepolia","parseUnits","ERC20_ABI","encodeFunctionData","encodeFunctionData","parseUnits","getActiveSyndicates","parseUnits","formatUnits","isAddress","chalk","ora","encodeFunctionData","parseUnits","ERC20_ABI","parseUnits","encodeFunctionData","VALID_FEES","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","query","chalk","spinner","ora","getActiveSyndicates","syndicate","parseUnits"]}
|