Skip to main content
You are putting up inventory so people can trade “Will ETH be above $5,000 at year end?” You are not buying Yes or No. You deposit collateral (USDC on Base and Polygon) into that question’s market maker. The contract holds a mix of Yes, No, and Invalid. Traders buy and sell through that inventory. Protocol, creator, and referrer fees leave the trade as cash. The liquidity-provider cut (default 0.8%) stays in the pool as extra complete sets. Your profit and loss is that inventory marked at the market maker’s prices (or 0 or 1 after the result) versus what you put in. It is not deposit times odds times win or lose. Worked numbers (100 collateral, 70/30, buy 40): LP calculator. Not financial advice. Size only what you can lose.

What you actually mint

You pass one collateral amount. The market maker pulls it, splits a complete set, keeps a slice of each answer as inventory, and mints ERC-20 pool shares to you. Those shares are a claim on the whole inventory — not an NFT and not a perpetual. In code, first liquidity is market.seed. Later liquidity is market.addLiquidity. Both call addFunding.
Invalid is part of the complete set and sits in the market maker. It is not tradable and always prices at 0. On a skewed pool, later liquidity binds on the heaviest reserve. Lighter answers send leftover tokens back to you.

What you earn

Cost on add is max(amountsAdded) (addedFunds). Indexer remove proceeds are the named basket at 1e18 prices, or 0/1 if resolved. Send-back tokens are a share position, not this LP lot.
A market that resolves quickly can show almost no trading and a large inventory term. The halt at resolve protects remaining inventory from 0/1 arb.

Risks

Trading stops when the market resolves — otherwise LPs get arbitraged

After payouts are set, every named share is worth exactly 1 or 0 collateral. If swaps kept running:
  • Winner still priced below 1 — buy it from the market maker, redeem at 1.
  • Loser still priced above 0 — sell worthless shares into the market maker, take collateral out.
buy / sell therefore revert Resolved once Conditional Tokens has a payout denominator. Fee income from traders stops with them. Fee income for the protocol only exists between the first deposit and resolve. A market that resolves quickly can pay almost no volume relative to the inventory you posted — but leaving the market maker open would be worse: the inventory itself would be picked off.

Inventory while the market is open

Across-answer liquidity is how you market-make the whole question without picking Yes or No. It is not delta-neutral. As implied probability moves, you hold more of the answer traders are selling. You are the other side of every trade.

Even join vs live odds

Later addLiquidity joins current reserve proportions. It does not re-apply your original opening mix.

Idle Invalid

The complete-set mint always prints Invalid. It never trades. Unwinding a full set later means you need the named answers back (from removeFunding, from trading, or from leftover send-backs).

Operational

Approvals, factory version, and market-maker clone all have to match. Tiny deposits revert (mintAmount == 0 or dust). Contracts, oracles, and resolution can fail. This is not financial advice. Size only what you can lose.

How to exit

  1. client.user(owner).lpPositions({ market }) — find the pool-share lot.
  2. Open: market.removeFunding({ shares, owner }) — basket of every slot, then merge complete sets if you want collateral.
  3. Resolved: market.redeemLp({ shares, owner }) — burn shares, redeem the basket to collateral (same redeem fee).
  4. Send-back / leftover named tokens: market.redeem as share positions.
redeemLp only works after resolve. While open there is no 1:1 payout on a single answer.

In the SDK

Next

Add liquidity