--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.
sherwood identity link-virtuals
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:
- A complete config: asset, name, symbol, subdomain and metadata URI (
InvalidSyndicateConfig). The CLI fills these. - A prepared owner bond (
PreparedStakeNotFound). Runsherwood guardian prepare-owner-stake <amount>(at leastStakedWood.minOwnerStake, 10,000 WOOD) from the creating wallet first; the factory binds it to the vault at creation. - 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()increationFeeToken()(1,000,000 WOOD), pulled withtransferFrom. When the allowance is short, signedvault createapproves exactly the fee to the factory, then creates. - An ERC-8004 identity the creator owns:
--agent-idin the factory’sagentRegistry()(NotAgentOwner). - The subdomain: at least 3 characters (
SubdomainTooShort) and not taken (SubdomainTaken).
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.
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 andclaim 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:
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 thestrategy 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:
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 withSchema <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 (waitlistaccepted = 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 canpersonal_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:
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:
~/.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.