Integration

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

Testnet · Live
Live now. Every deposit, private send, private trade, and unshield settles through these contracts. Chain ID 46630.

Core

ContractRoleAddress
ShieldedPool
ABI ↓
Deposits, private sends, unshields, and the note tree0xf9F825f2D6d8509c78baaa587694f74672C32A59
CowlTradeAdapter
ABI ↓
Atomic private trades: unshield, swap, re-shield in one transaction0xD0D74be38C0B99EBa6465e9F512c3F78EE2d1f3B
TransferVerifier
ABI ↓
Verifies join-split spend proofs on chain0xBA945Bf3A0F777cdcA53643e6a14037D82cA4239
ShieldVerifier
ABI ↓
Verifies deposit proofs on chain0xB75c565943cdb00959EC6a8B1eEe823ffD000ba9

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.

ContractRoleAddress
TestSwapRouter
ABI ↓
Fixed-rate WETH/USDG router, V3 interface0xbd610c3A708C483a64dC2C92876C2D1a8Ef43b03
TestQuoterV2
ABI ↓
Prices an exact output before you trade it0x5cD1F037A2CB277A7661Ad6c045803BFC428f84B
TestWETH
ABI ↓
Wrapped ether for the swap leg0xdC155cafBa4D26790781c12e4B1001F933496Da2
TestUSDG
ABI ↓
Six-decimal test dollar, open mint0xa82762eDA1AF5Ed19B9BD544C121dbcF365526aC

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

Mainnet · In progress
Mainnet contracts publish here the day they go live. The pool ships as one immutable release, deployed once and never redeployed, so these addresses are final the moment they land.
ContractRoleAddress
ShieldedPoolDeposits, private sends, unshields, and the note treeIn progress
CowlTradeAdapterAtomic private trades through the chain’s live Uniswap V3In progress
TransferVerifierVerifies join-split spend proofs on chainIn progress
ShieldVerifierVerifies deposit proofs on chainIn progress
Tip
The CLI always talks to the current contracts. Run cowl statusto see the exact addresses it’s using.