CoW Protocol on Solana
CoW Protocol is an open-source trading protocol that settles user intents in batch auctions. It supports direct matching between users (Coincidence of Wants) as well as on-chain liquidity sources.
This repository hosts the Solana implementation, currently in early development. The protocol is already live on Ethereum and other EVM chains; the Solidity contracts are at cowprotocol/contracts.
[!CAUTION] These Solana programs are a work in progress and are not ready for production use. The code is unaudited, subject to change, and may contain significant vulnerabilities that could lead to loss of funds. Please do not rely on it with real assets. Any deployment to mainnet is for testing purposes only. We're sharing it openly to develop in the open and welcome your feedback.
Design
The design of the program is documented in DESIGN.md. It contains a high-level technical description of what the program does and points out meaningful differences from the Ethereum implementation.
Development
Install the Solana toolchain (Rust, Solana CLI, and friends) by following the Solana quick setup.
Common dev tasks are exposed via just recipes (see Justfile).
Most package managers provide this package, see list of available Just packages.
Run just --list to see what's available.
Repository layout
The repository is a Cargo workspace following the program / client / interface split:
interface/: shared types and theInstructionbuilders. Depends only on the lightweight crates so it can be consumed from both on-chain and off-chain code.programs/settlement/: the on-chain settlement program.client/: off-chain client helpers that re-export the builders frominterfaceand add small convenience wrappers.
How to build
Build the on-chain program (produces target/deploy/settlement.so):
Build everything (workspace crates plus the on-chain program):
How to test
Benchmarks
just bench runs the test suite and regenerates bench-report.json:
How to build a verified (reproducible) build
Requires Docker.
How to deploy
Requires Docker (for the verified build step).
You will need a deployer keypair — a Solana wallet funded with enough SOL to cover program storage rent and transaction fees. This wallet becomes the upgrade authority for the deployed program.
Do not fund the program address itself. Only the deployer wallet needs SOL.
There are two distinct flows depending on whether this is a first-time deploy or an upgrade to an existing program.
Initial deployment
Pass the program keypair file as the first argument. Solana derives the program address from it and registers the deployer as the upgrade authority:
Upgrading an existing program
[!IMPORTANT] Before upgrading, if the storage format has been changed for any existing PDAs, ensure that the MINOR (aka v0.x.0) version in the Cargo.toml is bumped. This will relocate all program storage, preventing unintended collisions with incompatible data.
Pass the program's public key (address) as the first argument. The deployer wallet must already be the upgrade authority:
If the package minor or major has been changed, it is also necessary to run initialize again.
Devnet example
The deployer for the canonical devnet program (MooohhPEAAHwAwEozL7JPEmnDvaahuUpccYN4Yb8ccK) is stored in the team password manager under B6acm3swJK9pJ7fe4i4GQgP7x5A3RndvsdV2bKhcA1i5.
License
The core settlement program rust crate is licensed under the terms of the GNU Lesser General Public License v3.0.
All other crates are dual licensed under the terms of the MIT or Apache 2.0 license.
Copyright (c) 2026 CoW Foundation