# Private Trade Links

Private Trade Links

Summary

I’d like to propose a simple P2P trading primitive for CoW Protocol: Private Trade Links.

The idea is to make it easy for two parties who have already agreed on a trade to settle it on-chain without having to trust each other.

A user creates a trade by specifying:

  • what they are offering

  • what they want in return

  • the amount

  • an expiration time

  • optionally, the address that is allowed to accept the trade

They then receive a link which they can send to the other person.

The counterparty opens the link, reviews the terms and accepts the trade.

The two assets are then exchanged atomically and directly between the two parties.

There is no public order book, no price discovery and no solver competition.

The basic idea is:

We already agreed on the trade. CoW provides the trustless settlement.


The problem

There are plenty of situations where two people have already agreed on a trade.

For example:

“I’ll give you 100 USDC for 0.05 WBTC.”

At this point neither party needs price discovery. They don’t need an aggregator to find a better price and they don’t need their order to compete with other orders.

They simply need a safe way to exchange the assets.

Today, this usually means one of the following:

  • one party sends first and trusts the other

  • using an escrow

  • using a CEX or OTC desk

  • manually coordinating the transfers

It would be useful to have a simple primitive for:

“We already agreed on the terms. Now let’s exchange the assets atomically.”


How it works

A user creates a Private Trade:

CREATE PRIVATE TRADE

I OFFER
100 USDC

I WANT
0.05 WBTC

EXPIRES
24 hours

COUNTERPARTY
[ Optional address ]

             [ CREATE TRADE ]

After creating the trade, they receive a link:

PRIVATE TRADE

100 USDC
    ⇅
0.05 WBTC

[ Copy trade link ]

They can send it to the person they negotiated the trade with.

The recipient opens the link:

PRIVATE TRADE

You receive:
100 USDC

You pay:
0.05 WBTC

Expires:
23h 41m

[ ACCEPT TRADE ]

After the counterparty accepts, the trade is settled directly between the two wallets.


P2P by design

This is an important part of the proposal.

Private Trades should not enter the normal CoW solver competition.

There is no auction for the order and no search for alternative execution.

The creator has already specified the exact terms of the trade.

For example:

Maker:
0xAAA

Taker:
0xBBB

Maker gives:
100 USDC

Taker gives:
0.05 WBTC

When 0xBBB accepts, the settlement should simply execute those terms:

0xAAA ── 100 USDC ──► 0xBBB

0xAAA ◄── 0.05 WBTC ── 0xBBB

The exchange should be atomic.

If the required conditions aren’t met, the trade doesn’t happen.

This is closer to a P2P atomic swap / OTC settlement primitive than to a private limit order.


Optional counterparty restriction

The creator can optionally specify the wallet that is allowed to accept the trade.

No restriction

100 USDC → 0.05 WBTC

Counterparty:
Anyone

Anyone who has the link can accept the trade.

This could be useful for sharing offers publicly or within a community.

Address-restricted

100 USDC → 0.05 WBTC

Counterparty:
0x1234...5678

Only that address can accept the trade.

The restriction should be enforced by the settlement layer rather than by the frontend.

This means the link can be forwarded without giving another wallet the ability to execute the trade.

The address lock is therefore completely optional.


Why the link?

I think the link is one of the more interesting parts of the UX.

The actual negotiation can happen anywhere:

  • Telegram

  • Discord

  • Farcaster

  • email

  • DAO forums

  • inside an application

  • in a game

Once the two parties agree, one person simply creates the trade and shares the link.

For example:

“We agreed on 100 USDC for 0.05 WBTC. Here’s the CoW trade link.”

The recipient doesn’t need to manually recreate the transaction or enter token addresses and amounts.

They just open the link, verify the terms and accept.

The link is essentially a portable representation of the agreed trade.


Beyond crypto OTC

This is where I think the idea gets more interesting.

The primitive doesn’t necessarily have to be exposed only through the CoW frontend.

If exposed through an SDK, Private Trades could become a generic P2P settlement component that other applications can build on top of.

For example, consider digital item marketplaces.

A marketplace for game items could use CoW’s settlement layer to handle the payment side of a trade between a buyer and seller.

Example: game item marketplace

Imagine a marketplace similar to CSFloat for Counter-Strike skins.

A seller has an item and agrees with a buyer on a price.

The application could create a Private Trade containing:

SELLER
0xAAA

BUYER
0xBBB

PAYMENT
100 USDC

ITEM
Skin / Item ID #12345

The marketplace could then present the buyer with a trade link or embed the trade directly into its UI.

The buyer accepts.

The settlement layer ensures that the agreed assets are exchanged atomically.

The same concept could potentially apply to:

  • game items

  • skins

  • collectibles

  • tickets

  • digital goods

  • NFT marketplaces

  • P2P marketplaces

  • OTC platforms

  • DAO applications

  • other applications where two users already agreed on a transaction

The important part is that the application doesn’t need to build its own escrow and settlement mechanism from scratch.

It could use the Private Trade primitive through an SDK.


Why an SDK matters

I think the long-term opportunity here is bigger than adding another page to the CoW frontend.

The frontend could be the first implementation, but the underlying functionality could be exposed as an SDK/API.

An application could essentially do something like:

createPrivateTrade({
    offer: {
        token: USDC,
        amount: 100
    },

    request: {
        token: WBTC,
        amount: 0.05
    },

    taker: "0xBBB...", // optional

    expiry: ...
})

and receive a trade identifier/link.

The application could then decide how it wants to present the trade:

                 Private Trade SDK
                         │
          ┌──────────────┼──────────────┐
          │              │              │
       CoW UI       Game marketplace   DAO app
          │              │              │
          ▼              ▼              ▼
       Trade link    Embedded UI     Custom UI
          │              │              │
          └──────────────┼──────────────┘
                         ▼
                  P2P Settlement

This would make CoW less of a destination users have to visit and more of a settlement primitive that applications can integrate directly.


Atomic settlement

The main value of using CoW here is the settlement.

The two parties should not have to trust each other or use an intermediary.

Instead of:

Alice sends USDC
        ↓
Bob is supposed to send WBTC
        ↓
???

the desired flow is:

              P2P TRADE
                  │
          ┌───────┴───────┐
          │               │
       Alice             Bob
          │               │
       -100 USDC       -0.05 WBTC
          │               │
          └───────┬───────┘
                  │
            ATOMIC SETTLEMENT
                  │
          ┌───────┴───────┐
          │               │
       Alice             Bob
       +0.05 WBTC       +100 USDC

Either the trade happens according to the agreed terms, or it doesn’t.

No trusted escrow should be required.


How this fits CoW

I see this as a different use of the CoW infrastructure rather than another type of CoW market order.

A normal CoW trade is about finding good execution.

A Private Trade is about settling a trade that has already been negotiated.

So there are two different flows:

NORMAL COW ORDER

User
 ↓
Intent
 ↓
Solver competition
 ↓
Best execution
 ↓
Settlement

versus:

PRIVATE TRADE

Party A + Party B
       ↓
Agreed terms
       ↓
P2P settlement
       ↓
Atomic exchange

The second flow doesn’t need an auction.

The value CoW provides here is the trustless settlement mechanism.


Potential use cases

Peer-to-peer OTC

Two people agree on a trade privately and use CoW only for settlement.

DAO / treasury deals

A DAO negotiates a bilateral transaction with a known counterparty.

Game item marketplaces

A marketplace can use the SDK to settle transactions between buyers and sellers.

This could be particularly useful for marketplaces where the application already handles the item ownership side and needs a reliable payment/settlement layer.

P2P digital goods

The same primitive could potentially be used for other digital assets and marketplaces where a buyer and seller already agreed on a transaction.

Community trading

Someone can create an offer and share the link in a Discord or Telegram community.

Address-restricted deals

A trade can be explicitly locked to one wallet when the parties have already agreed who the counterparty is.


Fees

A small fee could be charged on successful settlement.

For example:

Private Trade fee: 0.05% – 0.10%

The exact economics would obviously need to be discussed.

The important part is that this could potentially become another protocol primitive without requiring a separate OTC network.

For SDK integrations, applications could potentially also build their own business model around the primitive.


MVP

I’d keep the first version very small.

Required

  • ERC20 → ERC20

  • fixed input amount

  • fixed output amount

  • expiration

  • shareable trade link

  • atomic P2P settlement

  • cancellation

  • optional counterparty address restriction

  • no solver competition

Later

  • native ETH

  • NFTs

  • game assets

  • partial fills

  • multiple assets

  • QR codes

  • SDK

  • embedded trade widgets

  • DAO integrations

I wouldn’t start with all of these.

The basic ERC20-for-ERC20 flow should be enough to validate the concept and the UX.


Open questions

There are still some implementation details I’d like to get feedback on:

  • How much of the existing CoW settlement infrastructure can be reused for a direct P2P trade?

  • What is the cleanest way to guarantee atomicity between the two parties?

  • Should funds be locked when creating the trade, or can existing permit/approval mechanisms be used?

  • How should cancellation work?

  • Should the open version be first-come-first-served?

  • Should a Private Trade always be fully filled?

  • How should protocol fees be handled?

  • What would the right SDK interface look like?

  • Are there privacy or MEV considerations for this type of settlement?

  • How could this work for assets that aren’t ERC20s, such as NFTs or game items?


Why I think this is worth exploring

I don’t see this as trying to compete with CoW’s normal trading flow.

It’s for a different situation.

Sometimes the two parties have already done the hard part themselves:

They agreed on the trade.

What they need is a reliable way to settle it without trusting the other party.

The basic UX is:

Create → Share → Accept → Settle

No order book.

No solver competition.

No price discovery.

Just a bilateral trade between two parties with atomic settlement.

But the interesting part is that the same primitive could potentially be used outside of the CoW frontend.

If exposed through an SDK, it could become a general-purpose building block for P2P marketplaces and applications — from crypto OTC trades to DAO deals to game-item marketplaces.

In that sense, the opportunity isn’t necessarily to build another trading interface.

It is to make CoW a trustless P2P settlement layer that other applications can build on.

I’d be interested in hearing whether this fits within the current direction of CoW Protocol and what the simplest technically viable implementation would look like.

4 Likes

We found this use case interisting and thought it would be nice to build a small MVP around the v0. You can check it out here:

The MVP is only deployed on Gnosis and there isn’t any fee. The contract has not been audited, so please use it at your own risk.

Beyond the items already mapped out in the original post, a few natural next steps we see are:

  • Deploy on other chains
  • Store orders on a server, potentially encrypted, instead of only on local storage.
  • Automatically receive orders addressed to your wallet
  • Add USD prices and warnings when prices are too different
  • Enable third-party execution
  • Support permit-based flows
  • Continue improving the UI/UX

We also explored whether this could be integrated more directly into CoW Protocol instead of using a separate contract. The integration was technically possible, but it ended up being considerably more complex. Since these private trades skip the solver auction, there also didn’t seem to be many relevant benefits from a deeper CoW Protocol integration.

We documented that exploration here:

Would love to hear feedback on the MVP, please report any bug that you might find or next features that you would like to see it.

2 Likes

Great work! I can definitely see this being a really useful product to have in the CoW Swap frontend.

I’d want to add support for missing token addresses and multiple positions in the offer basket, rather than only 1 token <> 1 token. For example:

1 COW, 10 UNI, 20 WBTC <> 200 ETH

I don’t really see a reason to merge it into CoW Protocol itself, since the workflow is completely separate and doesn’t depend on solvers or anything like that. It’s purely for executing trades that have already been agreed on between two sides.

The main benefits are privacy, safety (fewer dependencies and fewer other protocols involved, etc.), and no slippage. Another interesting use case is assets that aren’t properly priced by oracles, or simply don’t have an oracle price at all. For example, NFTs, smart contracts, or other more exotic positions. If two people can agree on the value of something and want to buy/sell it at that price, this could provide a great permissionless and trustless execution layer.

Once it’s been properly tested and the contract is audited, I can see quite a few use cases for it.

The one thing I’m not really sure about is how to monetize it. A standard fee would probably make sense, but a dynamic fee gets more complicated because you’d need to calculate the value of the basket using oracles.

And what happens if I want to sell something that’s not so easy to price? For example, NFTs, Uniswap positions, other staked tokens, or even smart accounts that are being used by some protocols for staking?

One example I have in mind is orchestrators. Some protocols have orchestrators where the stake is bonded to a specific address. I might want to sell the Safe that owns that orchestrator position. Right now, there’s basically no good way to do that, even though I already know people who would be interested in buying these kinds of positions.

1 Like

Definitely agree that there probably isn’t a reason to merge this into CoW Protocol itself. Our exploration there was mostly driven by curiosity. That said, it could still potentially be supported or linked from the CoW Swap UI. Not sure what the core team’s view on that would be.

Regarding token addresses, can you share which other token lists you would like to see supported?

On baskets, I agree it’s an interesting use case, although I’m not sure whether most cases couldn’t just be split into multiple orders. The UX would be a bit worse, especially when dealing with dust, but it would keep the system simpler.

NFT support should be relatively straightforward to add. Orchestrator positions are something I would need to look into more. Regarding exotic tokens, the current implementation already works with any ERC-20 transfarable, so staked tokens and pool shares should work.

As you mentioned, there are a lot of interesting directions this could go. I would probably prefer to first see some real usage and adoption before deciding which features are actually worth prioritizing.

I’m also not sure about monetization. For now, since this is a simple frontend and a very small contract, I don’t really see a reason to charge a fee. It would also be easy to fork. I currently see it more as a public good, similar to https://swiss-knife.xyz/.

For next steps, I would like to get approval for a small audit budget so we can promote the tool more confidently and hopefully get some real usage. The contract is very small, so I wouldn’t expect the audit to be too expensive.

Given the simplicity of the contract, I believe the risk is relatively limited, but it has not been audited yet, so users should still DYOR and use it at their own risk.

I’m not sure whether CoW Grants or another CoW entity would be interested in funding the audit, especially since the tool isn’t integrated into the protocol and probably won’t generate fees for now. We could also explore funding it elsewhere (e.g. giveth) but since the idea originally came from this community, it feels more natural to first see whether there is interest in supporting it here.

1 Like

Hello everyone. Thanks for the initiative. Having this sort of OTC tool is something we have considered in the past and has been a requested feature, albeit so far only internally from a handful of people.

As noted, such feature would not benefit from what CoW Protocol currently has to offer (solver competition, battle tested settlement contract, existing infrastructure), and would be completely its own standalone project.

We know of other DEXes that have, or used to have something similar, but it seems to be a very niche tool that has little demand and some have even decommissioned it.

Given the current market conditions and our focus on the near future, I personally don’t think it would make sense to pursue/fund such project for now.