Docs · Tools
Signed off-chain, settled by solvers.
The Limit and TWAP tabs on the swap page place CoW Protocol orders. An order is an EIP-712 message you sign off-chain; independent solvers settle it when your price is reachable, which is why placing one, filling it and cancelling it cost no gas at all. This page is what you sign, what it costs, and every place that “gasless” stops being true.
At a glance#
| Limit order | TWAP ladder | |
|---|---|---|
| Chains | Ethereum, Gnosis, Base, Arbitrum | Ethereum, Gnosis, Base, Arbitrum |
| Wallets | Any EVM wallet — EOA or smart-contract. | Smart-contract wallets only. A Safe, in practice. |
| What you sign | One EIP-712 message, off-chain. No gas. | One on-chain transaction that registers the whole ladder. |
| Gas to place | None, beyond a one-off token approval. | Yes — it is an on-chain transaction. |
| Gas to fill | None. Solvers pay it. | None. Solvers pay it. |
| Gas to cancel | None for an EOA. On-chain for a contract wallet. | On-chain, always. |
| Sell asset | ERC-20 only. Native ETH is refused. | ERC-20 only. |
| Partial fills | No — the signed order is fill-or-kill. | Per part. Each part is its own fill-or-kill order. |
| Cost | 0.30% of volume plus 25% of surplus — see the fee. | 0.30% of volume, applied per part. |
Placing a limit order#
- Pick the pair. Both sides live on the same chain — choosing a sell token pins the buy side to that chain. There are no cross-chain limit orders.
- Set a price. The field is pre-filled from a live CoW market reference and shows how far your price sits from it, in percent. Four chips set it for you:
Market,+1%,+5%,+10%. If the market reference cannot be fetched the chips are disabled and you type a price yourself — a missing reference never blocks an order. - Pick an expiry. Four options: 1 hour, 1 day, 7 days, 30 days, defaulting to 7 days. There is no custom expiry.
- Place it. The summary line spells out the trade before you commit: “Sell X for at least Y — gasless, filled by CoW solvers when your price is reached.”
The “you buy” figure is derived, not typed: it is your sell amount multiplied by your limit price, and it is a minimum. If a solver can do better, it does, and you keep most of the difference.
What you actually sign#
For an ordinary wallet, in this order:
| Step | Cost | What it is |
|---|---|---|
| 1. Wallet check | Free | Reads your account's code to decide whether this is a regular account or a contract wallet. It refuses to guess: if the lookup fails, no order is placed. |
| 2. The order signature | Free | One eth_signTypedData_v4 over the order — sell token, buy token, amounts, expiry, receiver. Off-chain, no transaction. |
| 3. The approval | Gas | An approve of CoW's vault relayer (0xC92E8bdf79f0507f65a392b0ab4667716BFE0110), and the only on-chain step. Skipped entirely when the existing allowance already covers the order. |
| 4. Posting | Free | The signed order goes to CoW's order book. Solvers take it from there. |
The approval is for the exact amount, not unlimited
The order signed for you is partiallyFillable: false and carries no fee amount of its own — it is fill-or-kill: a solver either satisfies the whole thing at or above your price, or it does not fill.
Contract wallets and multisigs#
A smart-contract wallet signs with ERC-1271 — the wallet contract vouches for the order itself — and that is still gasless. Two things change.
- Placement waits for owners. On a multisig the signature only exists once enough owners have confirmed it. The panel shows the running count — “Waiting for owner signatures — 1 of 3 collected.” — and states that nothing has been spent. You can walk away and place the same order later; the collected signature is reused.
- The signature is verified before any approval is sent. The wallet is asked to validate its own signature on-chain first. If it will not, you are told exactly that — “Your wallet returned a signature the contract itself doesn't accept, so CoW would reject the order. Nothing was spent.” — and no gas has been spent on an approval for an order that would have bounced.
There is also an opt-in on-chain confirmation route, offered as a button labelled “Confirm on-chain instead (costs gas)”. It is never taken silently, because it costs gas and no solver can fill the order until the confirmation transaction executes. Until then the order sits in the list as awaiting on-chain confirmation. More on contract accounts on the DAO page.
Expiry and cancellation#
- From an ordinary wallet, cancelling is free. You sign a cancellation message and it is withdrawn from the book. No transaction.
- From a contract wallet it is an on-chain transaction, and it costs gas. That is CoW's constraint, not ours: its gasless cancellation endpoint only accepts regular-account signatures. The panel says so before you press it.
- An unfilled order simply expires. At its expiry it stops being fillable and drops out of the open list. Nothing was sold, nothing was spent, and there is no notification — the open orders panel shows a live countdown so you can see it coming.
- A cancellation cannot recall a fill. An order a solver is already settling is past the point of withdrawal, and CoW says so: “Solvers are already bidding on your previous order — wait a moment and try again.”
Open orders are polled across all supported chains every 30 seconds while the tab is visible, and a flaky order book keeps the previous list rather than blanking the panel.
TWAP ladders#
A TWAP splits one sale into equal parts on a fixed schedule — a way to sell into a thin market over hours or days instead of moving it all at once. It is a different mechanism from a limit order, not a setting on one.
| Parameter | Range | Notes |
|---|---|---|
| Parts | 2 to 100 | Equal size, by integer division of the total. Two is the protocol's floor; the upper bound is ours. |
| Interval | 5 minutes to 365 days | Presets of 5 minutes, 1 hour, 6 hours and 1 day; 6 hours is the default. |
| Span | Optional, up to one interval | Limits each part to the first N seconds of its window — for trading only during a stretch of the day. Empty means the part runs its whole window. |
| Price | A minimum per part | A part that cannot reach its price simply does not trade in its window. |
What a TWAP costs you in gas, and why#
Creating a ladder is one on-chain Safe transaction, batched where the wallet supports it. It can contain up to four calls, and the panel itemises every one of them before you sign:
- Point the Safe's fallback handler at CoW's extensible handler — only the first time. This is a real change to your Safe, and the panel says so plainly: it is what lets the Safe answer signature checks for conditional orders, your owners, threshold and funds are untouched, and you can point it back at any time.
- Authorise CoW's conditional-order contract to verify signatures for CoW's trading domain only.
- Approve the vault relayer for the whole ladder, if the allowance is short.
- Create the ladder itself.
After that the parts are relayed and settled for free, like a limit order. A Safe that is already set up skips the first two calls entirely.
We run none of the execution
- Parts that are too small may never fill. The builder warns when a part falls below roughly $1,000 on Ethereum or $1 on the L2s — the point where solvers stop reliably settling. It is a warning, not a block.
- Cancelling stops every future part, as an on-chain Safe transaction, and cannot recall a part already on the order book — that one fills or expires at the end of its window.
- The ladder's progress view is stored locally. Losing it costs you the view, not the order; the ladder itself lives on-chain and keeps running.
The fee#
Declared inside the order's own metadata document, so it is visible to anyone reading the order and cannot be applied retroactively:
- 0.30% of volume. The output you are shown is already net of it.
- 25% of surplus — the share of any execution better than your limit price. If the order fills exactly at your price there is no surplus and this is zero. Volume and surplus together can never exceed 0.70% of the trade, and that ceiling is declared in the same document.
- A TWAP declares the volume fee per part, tagged as a TWAP.
- A qualifying Pro Pass drops both policies — the metadata document is written with no fee section at all. CoW's own protocol fee and network gas are not ours to waive; we never receive them.
One caveat about the number on screen: the market reference the Limit tab quotes is CoW's gross rate, priced without the fee document. It is a reference for setting a price, not a quote of your proceeds. Fees has the full table.
Failure modes#
CoW's rejections are mapped one-for-one to plain sentences rather than shown as error codes. The ones worth knowing before you trade:
| Situation | What you see |
|---|---|
| Fee-on-transfer or rebasing token | “CoW doesn’t support one of these tokens (fee-on-transfer and rebasing tokens are excluded).” This is a protocol-level exclusion, not a SwapsPro one. |
| No liquidity for the pair | “No liquidity for this pair on CoW right now — try a different pair.” |
| The amount is too small to settle | “The order can’t cover CoW’s settlement cost — try a larger amount.” A limit order still has to be worth a solver’s gas. |
| Too many open orders | “You’ve reached CoW’s open limit-order cap — cancel an old order first.” |
| The sell token is paused or you are blocklisted by it | “CoW couldn’t simulate moving the sell token — check the token isn’t paused or blocklisted for your account.” |
| An identical order already exists | “You already have an identical open order.” |
| The market never reaches your price | Nothing happens. The order expires, drops out of the list, and nothing was sold. |
The balance check on the sell field is advisory: it only fires when a non-zero balance is known, so an order placed against a balance the app could not read will be rejected by CoW rather than by the button.
What it deliberately will not do#
- Sell native ETH from the Limit tab. Limit orders trade ERC-20s. The panel points you at WETH with a one-click button rather than silently wrapping your ETH for you. (Buying native ETH is fine.)
- Trade across chains. Both legs are on one chain, enforced by the token picker.
- Fill partially. The signed order says so.
- Take the on-chain confirmation route for you. It costs gas and its clock runs while owners sign, so it is always an explicit choice.
- Approve more than the order needs. Exact amounts, every time.
- Offer TWAP to a regular account. The mechanism needs a wallet with code to answer signature checks. The tab says so up front instead of failing at the end.
- Widen your slippage to qualify for CoW's automatic refunder. That is a knowing trade of price for convenience, and it is not ours to make.
Related#
- DAO and treasury tooling — ERC-1271, the Safe App, and laddering a treasury sale.
- Fees — one table, every path.
