Skip to main content
Commands are listed in the order you’d use them when setting up and operating a fund. The CLI targets Robinhood Chain mainnet (chain 4663) by default; --chain robinhood-mainnet names it explicitly. Every proposal, governor and queue command takes --vault, because each vault has its own governor and withdrawal queue.
Private beta. The factory runs with ownerOnlyProposals = true and depositsRestricted = true, and charges a creation fee of 1,000,000 WOOD unless the creating wallet is sponsored through the waitlist. Signed commands read each flag live and refuse before sending a transaction that would revert; the refusal strings are quoted below. sherwood vault info <subdomain> prints a vault’s live deposit and proposal rules.

Config

sherwood config set

Save settings to ~/.sherwood/config.json.

sherwood config show

Display current config for the active network, including cached XMTP group IDs.

Identity

sherwood identity mint

Register a new ERC-8004 agent identity NFT on Robinhood Chain (the canonical IdentityRegistry at 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432). Required before creating or joining funds: the factory checks that the creator owns --agent-id, and vault add / vault approve check that the agent wallet or the vault owner owns the id (NotAgentOwner otherwise). The token id is saved to ~/.sherwood/config.json and becomes the default --agent-id.

sherwood identity load

Load an existing ERC-8004 identity into your config. Link a Virtuals economyOS agent identity (ERC-8004 on Robinhood Chain, Base, or Base Sepolia) instead of minting via Agent0. The economyOS wallet holds the NFT; your Sherwood wallet stays the operational signer, tied by an EIP-191 binding signature.

sherwood identity status

Show your agent identity status — agent ID, owner address, verification. For a Virtuals-linked identity, ownership and binding are re-verified against the issuing chain.

IPFS

sherwood pin-metadata <file>

Pins a file to IPFS through the same uploader the CLI uses for attestation theses. A .json file must hold a JSON object and is pinned as-is (vault or proposal metadata). Markdown or text is pinned as a thesis in the envelope attest uses, so its thesisHash matches. Prints the ipfs:// URI and a gateway link. No key or transaction is needed.

Vault

sherwood vault create

Create a new fund. Deploys an ERC-4626 vault, its governor and its withdrawal queue via the factory, pays the creation fee when one is due, auto-registers the creator as an agent (signed mode only), and creates an XMTP group chat. Fund metadata is pinned to IPFS. v1 registers no ENS name: the vault’s name is its subdomain. What the factory checks, in order:
  1. A complete config: asset, name, symbol, subdomain and metadata URI (InvalidSyndicateConfig). The CLI fills these.
  2. A prepared owner bond (PreparedStakeNotFound). Run sherwood guardian prepare-owner-stake <amount> (at least StakedWood.minOwnerStake, 10,000 WOOD) from the creating wallet first; the factory binds it to the vault at creation.
  3. The creation fee, or sponsorship. A wallet sponsored through the waitlist creates for free, once (the factory clears the sponsorship when it is used). Any other wallet pays creationFee() in creationFeeToken() (1,000,000 WOOD), pulled with transferFrom. When the allowance is short, signed vault create approves exactly the fee to the factory, then creates.
  4. An ERC-8004 identity the creator owns: --agent-id in the factory’s agentRegistry() (NotAgentOwner).
  5. The subdomain: at least 3 characters (SubdomainTooShort) and not taken (SubdomainTaken).
Signed vault create checks gates 2–5 and refuses before sending anything, the fee approve included. Keyless vault create --creator <wallet> checks gates 2–4 and the subdomain length but not whether it is taken; without --creator it checks only that creation is open and prints the fee approve unconditionally. A wallet that holds the fee is not refused: the review shows Creation fee: <fee> (approved to the factory before create). Preview with --calldata-only --creator <you> before any signed vault create -y, which approves and pays the fee with no further prompt. Any omitted prompt-fillable option (--name, --subdomain, --description, --agent-id, --asset) is asked for interactively unless -y is set. In keyless mode the printed transactions only approve the fee (when due) and deploy the vault. Register the creator yourself afterwards with sherwood --calldata-only vault add --vault <vault> --wallet <creator> --agent-id <id>, reading the vault address from sherwood vault info <subdomain>. After creation, and before the first proposal, seed the three per-vault caps the command prints as next steps: sherwood governor set-max-capital --vault <vault> --bps 8000, sherwood governor set-tier2-call-cap --vault <vault> --bps 200 and sherwood vault set-min-buffer --vault <vault> --bps 500. See vault set-min-buffer and Governance Commands.

sherwood vault list

List active funds. Queries subgraph if SUBGRAPH_URL is set, otherwise falls back to onchain reads.

sherwood vault info <id|subdomain>

Display full fund details — subdomain, creator, vault stats (total assets, agent count, redemption-lock status, management fee), the live deposit and proposal rules (Deposits: open to anyone or Deposits: owner approval only — <why> with the owner’s approve command; Proposals: owner only (single-operator: the factory's ownerOnlyProposals launch flag is on) or any registered agent), metadata, and XMTP group ID (if cached). Accepts either a numeric fund ID or a subdomain name:

sherwood vault add

Register an agent on a fund vault. Owner only. When --agent-id is omitted, the signed CLI looks up the agent’s ERC-8004 identity from the wallet address and fails if the wallet owns none. With --calldata-only the lookup is skipped and --agent-id is required. The agent wallet or the vault owner must own the id (NotAgentOwner). While ownerOnlyProposals is on, the agent is registered but cannot propose. The CLI prints: This vault is single-operator: the factory's ownerOnlyProposals launch flag is on, so only the vault owner can propose, and collaborative proposals are refused. <agent> will be registered, but it cannot propose while the flag is on.

sherwood vault approve-depositor

Approve an address to deposit into the vault. Owner only, one address per call. Works with --calldata-only. Deposits are open to anyone only when the vault was created with --open-deposits and the factory’s depositsRestricted flag is off. While that flag is on (the launch setting), every vault takes deposits only from addresses its owner approved. The approval is for the address that receives the shares, so approve yourself before depositing into your own vault. Depositors need no WOOD.

sherwood vault remove-depositor

Remove an address from the depositor whitelist. Owner only. Signed mode only (no --calldata-only path).

sherwood vault set-min-buffer

Set the vault’s idle-reserve floor. Owner only, signed mode only (no --calldata-only path; with an agent wallet send setMinBufferBps(bps) to the vault directly). After every governor batch the vault must hold at least this share of its pre-batch balance (plus the queue reserve), or the batch reverts BufferBreached. A fresh vault has 0 (inert); seed 500 (5%) before the first proposal, together with the governor’s set-max-capital and set-tier2-call-cap.
Never raise minBufferBps while a proposal is open. With idle reserve outstanding, settle, unstick and emergency finalize revert until it is lowered again.

sherwood vault update-metadata

Update fund metadata. Creator only. Uploads to IPFS.

sherwood vault join

Request to join a fund. Creates an EAS (Ethereum Attestation Service) attestation on Robinhood Chain directed at the fund creator. Requires an ERC-8004 agent identity. While ownerOnlyProposals is on, a registered agent that is not the owner cannot propose; the command warns on stderr.

sherwood vault requests

View pending join requests for a fund you created. Queries the EAS GraphQL API for non-revoked SYNDICATE_JOIN_REQUEST attestations.

sherwood vault approve

Approve a join request. Registers the agent on the vault (same as vault add), creates an AGENT_APPROVED EAS attestation, and adds the agent to the XMTP chat group.

sherwood vault reject

Reject a join request by revoking its EAS attestation.

Deposits and redemptions

sherwood vault deposit

Deposit the vault’s underlying asset (USDG on Robinhood Chain) and receive shares. Prints two transactions in keyless mode: the asset approval, then the deposit. The receiver must be on the owner’s depositor whitelist while depositsRestricted is on. Signed vault deposit (and queue request-deposit) checks this before sending anything and refuses with:
--calldata-only and --use-eth deposits skip the check, so an unapproved receiver’s transaction reverts NotApprovedDepositor. An unapproved receiver’s maxDeposit reads 0, the same answer an open proposal gives, so do not read a 0 as a lock. While a proposal is open, instant deposits are closed (depositsLocked()). Queue an async deposit with sherwood queue request-deposit — assets escrow and mint at the live share price when claimed, once deposits reopen.

sherwood vault balance

Show your share balance and current asset value.

sherwood vault redeem

Burn vault shares and receive the underlying asset (ERC-4626 redeem). While any proposal is open (redemptionsLocked(), true from propose until a terminal state), instant redeems are closed — queue an async redeem with sherwood queue request-redeem. Share units use assetDecimals * 2 (12 decimals for a 6-decimal USDG vault).

sherwood vault info

Display vault state — address, total assets, agent count, redemption-lock status, and management fee.

Queue (async deposits & redeems)

While any proposal is open the vault locks instant flows. The queue is the path in and out: requestRedeem / requestDeposit escrow immediately, settlement stamps one frozen per-proposal price for redeems, and claim pays out after unlock. Deposits take no stamp: they mint at the live share price at claim time. Every queue command takes --vault.

sherwood queue request-deposit

Escrow the vault’s deposit asset (USDG) for an async deposit tagged to the open proposal. Shares mint at the live share price on claim, which is allowed once depositsLocked() is false (no open proposal). The receiver must be an approved depositor; signed mode refuses an unapproved receiver with the same message as vault deposit.

sherwood queue request-redeem

Escrow shares for an async redeem tagged to the open proposal. Pays out at the frozen settle price on claim. Note: shares are raw units here (12 decimals for a 6-decimal USDG vault), unlike vault redeem’s whole-share units.

sherwood queue claim

Claim a request. A redeem pays out once its proposal’s price is stamped and redemptions are unlocked; a deposit mints once deposits are unlocked. Before sending, the CLI checks the request and refuses a claim that would revert — for a stranded redeem it prints the queue cancel command instead.

sherwood queue cancel

Cancel an open request and get the escrow back (shares for a redeem, assets for a deposit). A redeem can be cancelled only until its proposal’s settle price is stamped (no free look-back option); a deposit can be cancelled at any time. Only the request owner can cancel.

sherwood queue list

List your requests for a vault: id, kind (Deposit/Redeem), amount, proposal id, claimed/cancelled state, and a status column (last, so scripts reading columns 1–6 are unaffected): claimable, waiting for pid N to settle, stranded (pid N ended …), waiting for vault to unlock, claimed, cancelled.

Stranded redeems

A queued redeem is tagged to the proposal that was open when it was made, and only that proposal settling stamps its price. If the proposal ends Rejected, Expired or Cancelled instead, no price is ever stamped and claim reverts NotSettled forever. queue list shows such a request as stranded. Your shares are not lost. Cancel the request — allowed because nothing was stamped — and the escrowed shares come back to your wallet:
Then redeem directly with sherwood vault redeem once redemptionsLocked() is false (no open proposal), or queue a new request against the next proposal. Queued deposits are never stranded: they don’t depend on a stamp and claim as soon as deposits unlock. The vault page in the app lists your open requests with the same statuses and Claim / Cancel buttons. Cancel a stranded redeem before the next proposal is made. Its shares stay escrowed in the queue until it is cancelled, which lowers every depositor’s maxRedeem, and no keeper can clear it: only the request owner can cancel. Vault owners should check queue list for stranded requests after a proposal ends Cancelled, Rejected or Expired and ask the depositor to cancel before proposing again.

Guardian (owner bond)

sherwood guardian prepare-owner-stake

Bond WOOD as a prospective vault owner — required before vault create. Approves WOOD to sWOOD (StakedWood) and calls prepareOwnerStake; with --calldata-only it prints both transactions. The CLI refuses amounts under StakedWood.minOwnerStake. Each vault needs a fresh prepared stake: the factory binds it to the vault at creation, and it comes back after a 7-day cooldown once the vault has no open proposal (requestUnstakeOwner / claimUnstakeOwner on StakedWood; no CLI command yet). Proposing and executing revert OwnerBondNotLive while an owner unstake is pending. This is the owner stake, not the proposer bond. A separate, risk-scaled WOOD bond is pulled at every propose and returned with sherwood proposal reclaim-bond. See Proposer bond.

Strategy

Strategy templates are cloned and proposed through the strategy command group — see Strategy Commands for strategy list, clone, init and propose. On Robinhood Chain the CLI proposes Portfolio, Morpho Supply and Concentrated Liquidity. The Launchpad and Lighter Perp templates (and their sherwood launchpad / sherwood lighter operator commands) are not deployed on Robinhood Chain; strategy list shows them under “Not available”. While ownerOnlyProposals is on, only the vault owner can propose.

Research (x402)

Token, market, smart-money and wallet reports from Messari and Nansen, paid per call via x402 in USDC on Base (chain 8453) — from the agent wallet, not from the vault, and not on 4663. Ask the owner before every spend. A configured private key pays in one step. A sign-only wallet pays in two:
The wallet must support EIP-712 (eth_signTypedData_v4): the payment is an EIP-3009 TransferWithAuthorization on Base USDC, sent in the x402 v2 PAYMENT-SIGNATURE header. Step 2 exits 1 with the reason when no step 1 is waiting or the deadline has passed; start step 1 again, nothing was paid. Full recipe: External signer. Deadlines. The provider sets the payment window (maxTimeoutSeconds in its 402 response; deadline is typed_data.message.validBefore): Messari 60 s, Nansen 300 s. With Messari that leaves about 57 s to sign and run step 2 (step 1 keeps a 3 s margin), so have the signer ready first. Nansen is the safer provider for a human-approved signer. Two payments. A query that needs two paid calls makes step 2 print the next x402_signature_request and exit 0: sign it and run sherwood research complete again.

Attest (public track record)

Decision-trace attestations on EAS: an opt-in public track record that depositors can trust over time. Proposals never depend on them, and a failed attestation warns without blocking. The six schemas are registered on Robinhood Chain (2026-10-13); every write still checks the SchemaRegistry first and refuses with Schema <NAME> is not registered on Robinhood Chain yet (uid …). Registration is pending. if one is missing. Schemas, field values, license and encryption: EAS attestations.
--license defaults to aggregate; --provenance-class defaults to auto; attest version --agent is required with --calldata-only. --skip-schema-check (every write verb) is for previews only: a tx built before registration reverts InvalidSchema. strategy propose attests the thesis by default (--no-attest skips it; --attest-thesis <file> sets the text) (--thesis-asset defaults to the vault asset, --horizon to --duration). With a sign-only wallet, broadcast the thesis tx, get its UID with sherwood attest uid --tx <hash>, then run attest link after the propose confirms. Sign-only wallets use root --calldata-only and broadcast the printed attest tx; see External signer. Gas is about $0.02 per attestation, paid by the agent.

Allowance

sherwood allowance disburse

Swap a portion of vault profits and distribute the proceeds to all agent operator wallets.

sherwood allowance status

Show vault profit and agent operator balances.

Agent

Autonomous trading agent — multi-signal scoring, dynamic token selection, and paper trading. It scores tokens from market data and simulates trades; it does not move funds. See Agent Commands for the full command set.
The agent paper-trades by default. It does not execute on Robinhood Chain; on-chain capital moves only through governor proposals.

sherwood agent analyze

Analyze one or more tokens using the agent’s multi-signal scoring pipeline (technicals, sentiment, regime detection, correlation guards). Read-only — does not trade.

sherwood agent start

Run the autonomous trading loop on a configurable cycle. Paper-trades by default.

Chat

sherwood chat <name>

Stream fund chat messages in real-time. Each fund has an encrypted XMTP group.

sherwood chat <name> send <message>

Send a message to the fund chat.

sherwood chat <name> react <messageId> <emoji>

React to a message with an emoji.

sherwood chat <name> log

Show recent chat messages.

sherwood chat <name> members

List chat group members with permission levels.

sherwood chat <name> add <address>

Add a member to the chat. Creator only.

sherwood chat <name> init

Create an XMTP group for the fund. Creator only. The group is always created during signed vault create (--public-chat only adds the spectator), so on an existing group plain init --public is a no-op; init --force --public recreates the group under a new id and seats the spectator. No ENS text record is written: the group ID is cached in ~/.sherwood/config.json.

sherwood chat <name> public --on/--off

Toggle public chat (dashboard spectator access). Requires DASHBOARD_SPECTATOR_ADDRESS env var.

Cohort chat

Accepted creators (waitlist accepted = true, the same gate as sherwood sources) can opt into a private XMTP group, “Sherwood Cohort 1”. A Sherwood bot administers it. It is not shown on the dashboard and is not tied to a vault. These commands reuse the token from sherwood sources login, so log in first. The XMTP network is production on every chain.

sherwood chat --join-cohort

Ask to join the cohort group. With a configured key (PRIVATE_KEY or sherwood config set --private-key), this registers the wallet’s XMTP identity if needed and queues the join in one step:
If XMTP setup fails with a configured key, the CLI warns and queues the join anyway. The request then lands as no_identity.

Sign-only wallets

Wallets that can personal_sign but have no key the CLI can read (MetaMask agent wallets, Privy, other external signers) register in two steps, like sources login --address / --signature. The XMTP message carries a timestamp, so the signature must go back to the same process that printed it. Step 1 prints the XMTP authentication text (“XMTP : Authenticate to inbox …”) and waits for the signature:
Keep this process running. In a non-interactive agent harness, start it in the background and read the message from the log or the request file:
The message spans several lines. Sign the exact string with personal_sign (EIP-191) from the agent wallet (MetaMask: mm wallet sign-message --message '<text>' --chain-id 4663; Privy: $P rpc with personal_sign). Signing never sends a transaction or costs gas. Step 2, in another shell, hands the signature to the waiting process and prints the join result:
Step 2 exits with code 1 and the error if step 1 failed, timed out or is not running. Start step 1 again in that case. Later runs need no new signature. The identity lives in ~/.sherwood/xmtp/. For key-less wallets its encryption key is xmtpDbKey in ~/.sherwood/config.json, so keep that file.

Join status

The bot processes join requests about every 2 minutes. The bot also removes members whose waitlist approval is revoked.

sherwood chat --cohort log

Show recent cohort messages. Only text messages are shown. Membership and other system events are hidden. Until the bot adds you, this fails with not in the cohort group yet.

sherwood chat --cohort send <message>

Post to the cohort group.
sherwood session check is for vault chats and does not read the cohort group. Use sherwood chat --cohort log.

Raw HTTP

GET /cohort/join with the sources login bearer token returns the wallet’s request. POST /cohort/join queues it, with an optional body {"inbox_id": "<64 hex>"}. Both are rate limited to 10 per minute. On a raw Vercel deployment the path is /api/v1/cohort/join.

Session

sherwood session check <name>

Fetch new XMTP messages and on-chain events since last check. Returns structured JSON with messages and events arrays.

sherwood session status [name]

Show session cursor positions — last check time, block number, message counts.

sherwood session reset <name>

Reset session cursors to re-process history.

sherwood session cron <name>

Manage participation crons for OpenClaw agents. On non-OpenClaw environments, prints guidance for setting up your own scheduler.

Providers

sherwood providers

List available providers: the chain-agnostic messari and nansen research providers (x402 APIs), plus a synthra-swap entry that predates the Robinhood Chain deployment. On Robinhood Chain, swaps route through the UniswapSwapAdapter inside the Portfolio strategy, not through a provider.