> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sherwood.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Deployments

> Deployed chain, addresses, and feature matrix

Sherwood deploys on two chains. **Robinhood testnet (chain 46630)** — an Arbitrum
Orbit L2 — is the CLI's default target. The **Robinhood mainnet fork (chain
9994663\)**, a Tenderly Virtual TestNet, carries the latest protocol build and is
where the newest governance and guardian contracts land first; reach it with
`--chain robinhood-fork`.

## Chain

| Chain                                                           | ID      | Type                            | Status | CLI flag                    |
| --------------------------------------------------------------- | ------- | ------------------------------- | ------ | --------------------------- |
| [Robinhood mainnet fork](#robinhood-mainnet-fork-chain-9994663) | 9994663 | Fork (Tenderly Virtual TestNet) | Active | default (CLI ≥ 0.83.0)      |
| Robinhood testnet                                               | 46630   | Testnet (Arbitrum Orbit)        | Active | `--chain robinhood-testnet` |

On Robinhood testnet the post-audit stack is deployed: vaults, governance, the
guardian layer (GuardianRegistry + StakedWood + TierRegistry, with a WOOD fixture
token), the StrategyFactory keyless clone+init path, and a Uniswap-compatible swap
adapter backed by Synthra via a QuoterV2 shim.

## Feature Matrix

| Feature                                                      | Robinhood testnet (46630)             |
| ------------------------------------------------------------ | ------------------------------------- |
| Vaults + Factory                                             | Yes                                   |
| Governor (proposals, voting)                                 | Yes                                   |
| Guardian layer (registry + sWOOD + TierRegistry)             | Yes                                   |
| Strategy Factory (keyless deploy)                            | Yes                                   |
| Swap adapter (Uniswap-compatible, Synthra-backed)            | Yes                                   |
| Portfolio strategy                                           | Yes                                   |
| Morpho / concentrated-liquidity templates                    | No — fork only                        |
| Challenge game, token court, proposer bonds, exposure ledger | No — fork only                        |
| Synthra DEX (swaps)                                          | Yes                                   |
| Chainlink Data Streams                                       | Yes                                   |
| Stock Tokens (RWA)                                           | Yes (TSLA / AMZN / PLTR / NFLX / AMD) |
| XMTP Chat                                                    | Yes                                   |
| WETH (default vault asset)                                   | Yes                                   |
| ERC-8004 Identity                                            | Not yet                               |
| EAS Attestations                                             | Not yet                               |
| ENS Subnames (Durin)                                         | Not yet                               |
| USDC                                                         | No — not deployed                     |

### Key details

**Robinhood testnet (Arbitrum Orbit, chain 46630)** — Vaults, governance, the
guardian layer, and the Portfolio (basket) strategy. Swaps route through **Synthra**
(a Uniswap-V3-compatible concentrated-liquidity DEX); pricing uses **Chainlink Data
Streams** via a verifier proxy. Tokenized stock tokens (TSLA, AMZN, PLTR, NFLX, AMD)
are available for portfolio strategies. **WETH** is the default vault asset (no USDC
is deployed). Identity verification (ERC-8004), EAS attestations, and ENS
registration are not active on this chain yet — the factory and vault accept
`address(0)` for optional registries and skip those checks.

<Note>
  **What's planned.** Agentic trading strategies for tokenized real-world assets
  (RWAs) — stocks, ETFs, and other equities — live on Robinhood testnet today
  (Synthra DEX + Chainlink Data Streams, with a tokenized stock universe of TSLA,
  AMZN, PLTR, NFLX, AMD). Sherwood is built to be multi-chain; additional chains will
  come online over time.
</Note>

## Deployed Addresses — Robinhood Testnet (46630)

Source of truth: `contracts/chains/46630.json`.

<Note>
  On-chain contracts keep the `Syndicate*` naming for audit continuity; the product concept is a fund.
</Note>

<Warning>
  This stack was **redeployed on 2026-08-21** after the security audit. The previous
  deployment — and the 9 legacy syndicates created under its factory — is superseded:
  those contracts are still on-chain but are no longer the protocol. Every address
  below is from the post-audit deploy.
</Warning>

### Sherwood Contracts

| Contract           | Address (46630)                              |
| ------------------ | -------------------------------------------- |
| SyndicateFactory   | `0xa91AA45AFF32f52b6357044B02a16EBA775feC0b` |
| GovernorBeacon     | `0x3D46Ec018cd5893b685b4dfdc3921A4Eb64E11d1` |
| ProtocolConfig     | `0xC104Eb6a522d6718cA28F344B2373B29d57FF2E0` |
| SyndicateVaultImpl | `0xC57e12d6e2d8Ed49316F0b69c51893CcA44151F7` |
| BatchExecutorLib   | `0xF3b8db5aa41c7Ce92478A0Fa9C55a6460533eb86` |
| CallSandboxImpl    | `0xf09f6AF7DeBB964eD731376C9Af389F2Ce3d872A` |
| StrategyFactory    | `0xb683Bb8EEcBc2419BC3801df6FeA88f96657e670` |

Guardian layer:

| Contract           | Address (46630)                              |
| ------------------ | -------------------------------------------- |
| GuardianRegistry   | `0xA400eFcfFc820C6f812203C58ee00423AeCC0903` |
| StakedWood (sWOOD) | `0x21A69A6c9814c0d339C57fDdafed3B283702a739` |
| TierRegistry       | `0x99b8068Dc0F6093466964D581f72d947e3e380DB` |

The challenge game, token court, proposer-bond escrow, and exposure ledger are **not
deployed on this chain** — they live on the
[mainnet fork](#robinhood-mainnet-fork-chain-9994663) only.

On the fork, `propose` also locks a **risk-scaled proposer bond** in WOOD. See
[Proposer bond](/protocol/governance/proposer-bond). That pull is separate from
the 10,000 WOOD owner stake required at `fund create`.

There is **no singleton `SyndicateGovernor`**. Since PR #421 each vault's governor is
deployed **per-vault** — a `BeaconProxy` the factory creates at `createSyndicate`,
all sharing one implementation through the `GovernorBeacon` above — and is resolved
at runtime via `factory.governorOf(vault)`. Protocol-level fees live on the shared
`ProtocolConfig` (protocol-multisig-owned) and are snapshotted into each proposal at
propose time.

### Strategy Templates

ERC-1167 clonable singletons. Each proposal clones a template and initializes it
with custom parameters.

| Template                            | Address                                      |
| ----------------------------------- | -------------------------------------------- |
| PortfolioStrategy                   | `0x67420Cc504d70a42Adfd8867d878afe0978C7d10` |
| UniswapSwapAdapter (Synthra-backed) | `0x4fc3492117cC3bbcE0b210D22a8DC244f9d86490` |

Portfolio is the only strategy template approved on this chain. The Morpho supply and
concentrated-liquidity templates exist on the
[mainnet fork](#robinhood-mainnet-fork-chain-9994663) only.

A strategy is never trusted for value. The vault's `totalAssets()` is its own idle
float net of the queue reserve and escrowed fees — it carries no strategy-reported
term at all. While a proposal is live, entry and exit escrow in the async-redeem
queue and settle at one frozen per-proposal price stamped at settlement. See
[Vault Liquidity](/protocol/vault-liquidity) for the queue mechanics.

### Tokens

Each fund chooses its deposit asset at creation (any ERC-20). On this chain that
means **WETH** — specifically Synthra's WETH9, which holds all stock-DEX liquidity
here. Plain ETH auto-wraps into it on deposit. A second, canonical WETH also exists
but its pools are effectively empty; do not target it. The post-audit factory has no
funds created against it yet, so pick the Synthra WETH9 below.

| Token                                          | Address (46630)                              |
| ---------------------------------------------- | -------------------------------------------- |
| WETH (vault asset — Synthra WETH9)             | `0x33e4191705c386532ba27cBF171Db86919200B94` |
| WETH (canonical — reference only, empty pools) | `0x7943e237c7F95DA44E0301572D358911207852Fa` |
| WOOD token (fixture — guardian staking)        | `0xCCb4fB59cf40de1E23083037ee81Da1DD747D8d7` |

There is **no USDC on this chain**. Funds that want a stablecoin base have no
deployed option here; use WETH.

### Stock Tokens

| Token | Address                                      |
| ----- | -------------------------------------------- |
| TSLA  | `0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E` |
| AMZN  | `0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02` |
| PLTR  | `0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0` |
| NFLX  | `0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93` |
| AMD   | `0x71178BAc73cBeb415514eB542a8995b82669778d` |

### External Protocols

Synthra is Uniswap-V3-compatible; the deployed `UniswapSwapAdapter` is backed by the
Synthra router plus a QuoterV2 shim.

| Contract                 | Address                                      |
| ------------------------ | -------------------------------------------- |
| Synthra SwapRouter02     | `0x3Ce954107b1A675826B33bF23060Dd655e3758fE` |
| Synthra QuoterV2         | `0x231606c321A99DE81e28fE48B07a93F1ba49e713` |
| Synthra QuoterV2 shim    | `0xb3C009aECAeDd5ccC62Ec12eDAAA55F19C4A1eFb` |
| Synthra V3 Factory       | `0x911b4000D3422F482F4062a913885f7b035382Df` |
| Chainlink Verifier Proxy | `0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64` |
| Permit2                  | `0x000000000022D473030F116dDEE9F6B43aC78BA3` |
| Multicall3               | `0xcA11bde05977b3631167028862bE2a173976CA11` |

## Robinhood Mainnet Fork (chain 9994663)

A fork of Robinhood Chain **mainnet** run as a Tenderly Virtual TestNet: real
mainnet state — USDG, the official Uniswap v3 and v4 deployments, Chainlink push
feeds, and tokenized-stock liquidity — with test capital. It runs the latest
protocol build, so contracts that are not on Robinhood testnet yet (the challenge
game, token court, proposer-bond escrow, exposure ledger, tier registry) are live
here first.

### Connecting

```
https://virtual.robinhood-chain.eu.rpc.tenderly.co/moonwell/wormhole-bridge/231af1
```

This endpoint is **public**: it serves reads and accepts broadcast transactions,
and it is the RPC the CLI and SDK bundle as the default for chain 9994663 — no
setup needed. State-cheat access (`tenderly_setBalance`, `tenderly_setStorageAt`,
`evm_increaseTime`, and the rest of the vnet admin surface) is **not** exposed
here; those calls need the vnet's private admin RPC from the Tenderly dashboard.

Explorer: [dashboard.tenderly.co/explorer/vnet/6ad5961e…](https://dashboard.tenderly.co/explorer/vnet/6ad5961e-fbca-452f-939f-ca9a8c020933)

Point the CLI at the fork with `--chain robinhood-fork`:

```bash theme={null}
sherwood --chain robinhood-fork strategy list
sherwood --chain robinhood-fork fund list
```

To use a different endpoint — the admin RPC, or a freshly minted vnet — set
`ROBINHOOD_FORK_RPC_URL`, which takes precedence over the bundled default:

```bash theme={null}
ROBINHOOD_FORK_RPC_URL=<your-rpc> sherwood --chain robinhood-fork fund list
```

<Note>
  A Tenderly vnet is ephemeral. If the RPC above stops answering, the vnet has been
  replaced — mint a new one and override it with `ROBINHOOD_FORK_RPC_URL` until the
  bundled default catches up.
</Note>

### Test funds

The public RPC serves reads and broadcasts, but it will not mint you a balance —
the state cheats that do are behind the admin endpoint. The Explorer runs a faucet
for the fork instead. One claim tops your address up by **1 ETH**, **15,000 WOOD**,
and **1,000 USDG**, added on top of whatever it already holds:

```bash theme={null}
curl -X POST https://app.sherwood.sh/api/v1/faucet \
  -H 'content-type: application/json' \
  -d '{"address":"0xYou"}'
```

Any address works, so fund a fresh EOA before you point the CLI at the fork. You
get one claim per address and one per IP every 24 hours, whichever limit you reach
first; a repeat claim answers `429` with a `retryAfter` in seconds. The faucet is
fork-only — there is nothing at this path for chain 46630.

### Fork Addresses (9994663)

Source of truth: `contracts/chains/9994663.json`.

| Contract           | Address (9994663)                            |
| ------------------ | -------------------------------------------- |
| SyndicateFactory   | `0x02bc9B9C1A4322D5A5df86DadA0a2a02e45108B9` |
| GovernorBeacon     | `0x2e8aB422Db9127F1a70d8C38A15903f22B51DA97` |
| ProtocolConfig     | `0x36C45dC52FbC267d8536E8456ADe5255eC83A5ab` |
| SyndicateVaultImpl | `0x9BF51da59B13746e6cCeb1b35c398EDA9776a4Dc` |
| BatchExecutorLib   | `0xdBdBce2af4222Abe0cCDAc05f84364a50577B5a2` |
| StrategyFactory    | `0xb3C009aECAeDd5ccC62Ec12eDAAA55F19C4A1eFb` |

Guardian and challenge layer — the newest contracts, deployed here first:

| Contract           | Address (9994663)                            |
| ------------------ | -------------------------------------------- |
| GuardianRegistry   | `0xdfEe38C4D7595c9c04AdBcaFE01E4Fd6FD6117f4` |
| StakedWood (sWOOD) | `0xD3037D28693cc7BB3DbF1E17B6e01C4ce628f6DF` |
| TierRegistry       | `0x42B089B816F994d792481fAa308199E9CF63be9f` |
| ExposureLedger     | `0x223e2Fd41aD6487333146fc3998d000E74CB1549` |
| ProposerBondEscrow | `0xef2D6994faCad11e6CfAF3DaBf7b0B2091009B05` |
| ChallengeGame      | `0x202c1F133006D6706e872433CCAfD729c7A8AE56` |
| TokenCourt         | `0x5DC603881f5d77f41bbd4202F1d518263Dfd497f` |

Proposals on this chain pull a **second** WOOD amount (the proposer bond) into
that escrow. Quote via `ExposureLedger.proposerBondWood` — it scales (\~1% of
extractable value at the default bps). Full write-up:
[Proposer bond](/protocol/governance/proposer-bond).

Strategy templates and the swap adapter. **Portfolio** is the strategy exposed by
`sherwood strategy list` on this chain:

| Contract           | Address (9994663)                            |
| ------------------ | -------------------------------------------- |
| PortfolioStrategy  | `0x0e768a93B814282776022c3EBfc4e3f22Fa1605E` |
| UniswapSwapAdapter | `0xdBf12248c68d1FCb6083f431A1d6ab6d0ef84E49` |

Tokens. Unlike Robinhood testnet, this chain has **USDG** — the mainnet stablecoin —
alongside WETH, and WOOD here is a real Uniswap-traded token rather than a fixture:

| Token      | Address (9994663)                            |
| ---------- | -------------------------------------------- |
| WETH       | `0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73` |
| USDG       | `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168` |
| WOOD token | `0xF8BC08092C06dB6148114DCf82AF881F1085f92b` |

The fork also carries the mainnet tokenized-stock universe (AAPL, TSLA, NVDA,
MSFT, AMZN, META, AMD, GOOGL, SPY, QQQ, SLV) with Chainlink push feeds for each —
a wider set than Robinhood testnet's five. Those addresses live in
`contracts/chains/9994663.json`.

## Deployment Records

Per-chain deployment records are stored in `contracts/chains/{chainId}.json` (here,
`46630.json`). These contain the deployer address, contract addresses, and
deployment metadata. Deploy scripts auto-write this file.

## Address Resolution

Addresses are resolved at runtime in `cli/src/lib/addresses.ts`. Each address family
is a `Record<Network, ...>` map keyed by chain; Robinhood testnet is the active
network:

```
TOKENS()             → WETH, stock tokens
SYNTHRA()            → Router, Quoter, Factory
UNISWAP()            → SwapRouter, QuoterV2, SwapAdapter (Synthra-backed)
SHERWOOD()           → Factory, GovernorBeacon, ProtocolConfig, StrategyFactory
STRATEGY_TEMPLATES() → Portfolio
CHAINLINK()          → VerifierProxy
INFRA()              → Multicall3
```

Per-vault governors are not in this table — each vault's governor is resolved at
runtime via `factory.governorOf(vault)` (see `cli/src/lib/governor.ts`). There is no
singleton governor address to configure.

Zero addresses (`0x000...000`) indicate a protocol is not deployed. Commands that
depend on a zeroed address fail with a clear error at runtime.

## Adding a New Chain

Sherwood is built to be multi-chain — Robinhood testnet is simply the first target.
To bring up an additional chain:

1. Define the chain in `cli/src/lib/network.ts` (add to the `ChainConfig` registry)
2. Add address entries in `cli/src/lib/addresses.ts` (all `Record<Network, ...>` maps)
3. If contracts skip registries: ensure `SyndicateFactory` and `SyndicateVault` handle `address(0)` (already supported)
4. Create a deployment script in `contracts/script/<chain>/Deploy.s.sol`
5. Add the RPC endpoint to `contracts/foundry.toml`
6. Deploy and save the record to `contracts/chains/{chainId}.json`
