CoW Protocol Integration for MEV Protection
Placing an order on Uniswap for 100,000 USDC? In 90% of cases, sandwich bots will steal part of your slippage. CoW Protocol (Coincidence of Wants) solves this radically: your transactions are not visible in the public mempool until batch execution. We are Web3 engineers with 5+ years in DeFi, having implemented 30+ similar integrations. Gas savings reach up to 80%, and slippage is reduced by 3–5 times.
Mechanics: the user signs an "intent" — I want to sell X tokens of A, receive at least Y tokens of B, without specifying a specific route. The solver network takes a pool of intents, finds coincidences (coincidences of wants) or the best route through DEXes, executes a batch on-chain. The user does not interact with the pool directly. CoW Protocol technical documentation confirms that batch settlement effectively eliminates frontrunning.
How Intent-Based Architecture Works
Order Structure
An intent in CoW Protocol is an EIP-712 signed structure:
interface Order { sellToken: Address; buyToken: Address; receiver: Address; sellAmount: bigint; buyAmount: bigint; // minimum acceptable validTo: number; // unix timestamp expiry appData: Hex; // arbitrary metadata (IPFS hash) feeAmount: bigint; // fee for solver (usually 0 for off-chain orders) kind: "sell" | "buy"; partiallyFillable: boolean; sellTokenBalance: "erc20" | "external" | "internal"; buyTokenBalance: "erc20" | "internal"; } The order is signed with the user's private key (EIP-712 signTypedData). No on-chain gas at the moment of signing.
Solver Competition
Multiple solver nodes compete for the right to execute a batch of orders. The solver offering the best outcome for users (larger buyAmount or smaller sellAmount) wins. This creates competition in favor of the trader, not against them.
CoW swap is not just MEV protection. If a solver finds a coincidence of wants (user A wants to sell ETH for USDC, user B wants to sell USDC for ETH), both get execution without any on-chain swap. Zero slippage, zero AMM fees. Only settlement gas.
Integration via CoW SDK
Installation and Setup
npm install @cowprotocol/cow-sdk viem import { OrderBookApi, OrderSigningUtils, SupportedChainId } from "@cowprotocol/cow-sdk"; import { createWalletClient, http } from "viem"; import { mainnet } from "viem/chains"; const orderBookApi = new OrderBookApi({ chainId: SupportedChainId.MAINNET }); CoW Protocol operates on Ethereum mainnet, Gnosis Chain, Arbitrum One, and Sepolia testnet.
Creating and Sending an Order
// 1. Get fee quote const quoteRequest = { sellToken: WETH_ADDRESS, buyToken: USDC_ADDRESS, from: walletAddress, receiver: walletAddress, sellAmountBeforeFee: parseEther("1").toString(), kind: OrderKind.SELL }; const { quote } = await orderBookApi.getQuote(quoteRequest); // 2. Sign order const orderToSign = { ...quote, receiver: walletAddress, }; const signedOrder = await OrderSigningUtils.signOrder( orderToSign, SupportedChainId.MAINNET, walletClient ); // 3. Send to orderbook const orderId = await orderBookApi.sendOrder({ ...orderToSign, ...signedOrder, from: walletAddress }); Monitoring Execution
After submission, the order is in one of the states: open, filled, cancelled, expired. Polling via getOrder(orderId) or WebSocket via orderBookApi.subscribe().
const pollOrder = async (orderId: string) => { const order = await orderBookApi.getOrder(orderId); if (order.status === "fulfilled") { console.log(`Executed at: ${order.executedSellAmount} → ${order.executedBuyAmount}`); } return order.status; }; Important: the validTo timestamp is the order expiry. After it, the order is automatically marked expired. Set a reasonable time (20-60 minutes for regular orders, a few minutes for urgent ones).
Pre-Sign Orders (for Contracts)
Smart contracts cannot sign EIP-712 messages. For on-chain integration, we use the pre-sign mechanism: the contract calls setPreSignature(orderId, true) on GPv2Settlement — this allows the solver to include the order in a settlement.
interface IGPv2Settlement { function setPreSignature(bytes calldata orderUid, bool signed) external; } function createOrder(bytes calldata orderUid) external { settlement.setPreSignature(orderUid, true); } When to Use CoW Protocol?
CoW Protocol is ideal for large swaps ($10K+) where MEV protection is critical. Protocols executing swaps on behalf of users (yield aggregators, rebalancers) also benefit from batch execution. Protection is especially useful when trading stablecoins, where coincidence of wants is likely. Gnosis Safe has built-in support for CoW.
However, HFT traders may not find CoW suitable due to latency. Low-liquidity tokens may lack solver coverage. If guaranteed immediate execution is needed, a direct DEX swap is preferable.
Common Integration Errors
Incorrect appData: appData must be the keccak256 hash of a JSON document with metadata. Passing an arbitrary hash without a real document may cause order rejection.
Fee amount: for off-chain orders, feeAmount is usually taken from the quote. Do not set it to 0 manually — it may lead to rejection.
Allowance: before creating an order, the user must grant allowance to the CoW vault relayer (0xC92E8bdf79f0507f65a392b0ab4667716BFE0110 on mainnet), not to the settlement contract itself.
Comparison of CoW Protocol with Other DEXes
| Criteria | CoW Protocol | Uniswap | 1inch |
|---|---|---|---|
| MEV protection | Yes (batch + private mempool) | No | Partial (private RPC) |
| Integration complexity | Medium (SDK + EIP-712) | Low | Medium |
| Slippage | Minimal (coincidence) | Depends on pool | Medium |
| Gas cost | Low (batch) | Medium | Medium |
Timeline and Cost Estimates
| Integration Type | Timeline |
|---|---|
| Simple (frontend + SDK) | 1–2 days |
| On-chain contract with pre-sign | 3–5 days |
| Full protocol with retry and fallback | up to 1 week |
Cost is calculated individually based on architecture. Request a preliminary assessment — we will prepare the architecture and estimate within 1 day.
EIP-712 Details
Order signing uses EIP-712 domain separation: verifyingContract is the GPv2Settlement address, chainId is the network identifier. This protects orders from reuse on other chains.Our Process
- Analysis: define swap requirements, volumes, frequency.
- Design: select stack (viem, cow-sdk), design the flow.
- Implementation: write code for signing, sending, monitoring.
- Testing: verify quote, send, cancellation on Sepolia.
- Deployment: launch on mainnet, enable monitoring.
Get a consultation from our Web3 engineer — we will assess your project and propose a solution tailored to your needs.







