Contracts
Every address Cowl runs on, with its ABI one click away. The shielded pool, its proof verifiers, and the atomic trade adapter are live on Robinhood Chain testnet — read any of them on the explorer before you send a wei.
Robinhood Chain testnet
46630.Core
| Contract | Role | Address |
|---|---|---|
| ShieldedPool ABI ↓ | Deposits, private sends, unshields, and the note tree | 0xf9F825f2D6d8509c78baaa587694f74672C32A59 |
| CowlTradeAdapter ABI ↓ | Atomic private trades: unshield, swap, re-shield in one transaction | 0xD0D74be38C0B99EBa6465e9F512c3F78EE2d1f3B |
| TransferVerifier ABI ↓ | Verifies join-split spend proofs on chain | 0xBA945Bf3A0F777cdcA53643e6a14037D82cA4239 |
| ShieldVerifier ABI ↓ | Verifies deposit proofs on chain | 0xB75c565943cdb00959EC6a8B1eEe823ffD000ba9 |
The pool went live at block 92522685. Point an indexer or a cold sync there — nothing shielded exists before it.
Trade venue
The testnet venue wears the exact Uniswap V3 interface the adapter targets — exactOutputSingle, quoteExactOutputSingle, same structs — so on mainnet the adapter points at the chain’s live V3 stack and nothing else changes. The test USDG mints openly: every install is its own faucet.
| Contract | Role | Address |
|---|---|---|
| TestSwapRouter ABI ↓ | Fixed-rate WETH/USDG router, V3 interface | 0xbd610c3A708C483a64dC2C92876C2D1a8Ef43b03 |
| TestQuoterV2 ABI ↓ | Prices an exact output before you trade it | 0x5cD1F037A2CB277A7661Ad6c045803BFC428f84B |
| TestWETH ABI ↓ | Wrapped ether for the swap leg | 0xdC155cafBa4D26790781c12e4B1001F933496Da2 |
| TestUSDG ABI ↓ | Six-decimal test dollar, open mint | 0xa82762eDA1AF5Ed19B9BD544C121dbcF365526aC |
ABIs
Every ABI ships from this site as plain JSON — cowlprotocol.com/abi/<Contract>.json — ready for viem, ethers, or anything else that eats JSON:
import { createPublicClient, http } from "viem";
const POOL = "0xf9F825f2D6d8509c78baaa587694f74672C32A59";
const abi = await fetch(
"https://www.cowlprotocol.com/abi/ShieldedPool.json",
).then((r) => r.json());
const client = createPublicClient({
transport: http("https://46630.rpc.thirdweb.com"),
});
const root = await client.readContract({ address: POOL, abi, functionName: "root" });
const held = await client.readContract({
address: POOL,
abi,
functionName: "pooledValue",
args: [0n], // native coin — the per-token conservation cap, live
});The pool’s events and their topic hashes are documented under onchain events; governance state — owner, timelock, conservation cap — is public and covered in the trust model.
Robinhood Chain mainnet
| Contract | Role | Address |
|---|---|---|
| ShieldedPool | Deposits, private sends, unshields, and the note tree | In progress |
| CowlTradeAdapter | Atomic private trades through the chain’s live Uniswap V3 | In progress |
| TransferVerifier | Verifies join-split spend proofs on chain | In progress |
| ShieldVerifier | Verifies deposit proofs on chain | In progress |
cowl statusto see the exact addresses it’s using.