- A complete set. One unit of collateral can always be split into one token of every answer, including Invalid, and those tokens can be merged back into collateral.
- One market maker per question. Liquidity providers deposit collateral. The contract holds the answer tokens and quotes prices from that inventory. VOIZ calls this contract OutcomeAmm. There is one per market.
Complete sets and Invalid
Take a Yes / No market. One unit of collateral splits into one Yes, one No, and one Invalid. If you hold all three, you can merge them back into one unit of collateral at any time, including while the market is still open.How a trade works
There is one market maker for the whole question, not one per answer. Buying Yes does not mint a full set into the trader’s wallet. The contract splits collateral into Yes, No, and Invalid, pays the trader Yes, and keeps the rest as inventory. The market maker now holds less Yes, so Yes is more expensive. It holds more of the other named answers, so those get cheaper. One buy moves every named price. Nothing else has to rebalance the pool. Selling is the reverse: the trader returns Yes, and the contract pays collateral while putting Yes back into inventory. In code you talk to one answer at a time through a pool handle. That handle is not a second market maker. It is how you quote and swap that answer on the same contract.Prices
Named answer prices sum to 1. Invalid is not in that sum. The price of each named answer is inverse to how much of it the market maker is holding. Scarce inventory is expensive:x_i is the market maker’s reserve of answer i. On-chain, the extra Invalid slot is always priced at 0. The SDK’s display prices list named answers only.
Those display prices can lag. They are for showing a mid, not for sizing a trade. Size a trade with a quote, then send that size.
Starting the market
You create the question on chain. Until someone deposits the first collateral, there is nothing to trade against. That first deposit does two jobs. It stocks the market maker, and it sets how the inventory is split across named answers. More of the favorite stays in the pool so the market maker can sell it. Extra tokens of the less likely answers are returned to the depositor. Invalid is kept in full and is not given an opening weight. You are not placing a bet by choosing that mix. You are deciding how the starting inventory is split. If you pass the deposit when you create the market, both happen in one factory transaction (approve the factory). If you omit it, the market exists and you add the first liquidity afterwards. Later liquidity providers join whatever mix the pool already has. They do not set a new opening mix.Liquidity providers
A liquidity provider is not picking Yes or No. You deposit collateral. The contract splits a complete set, keeps a mix of answer tokens, and mints you ERC-20 pool shares. Those shares are a claim on the whole inventory. They are not an NFT and not a perpetual. On a skewed pool, later deposits bind on the heaviest reserve. Lighter answers send leftover tokens back to you. Those returned tokens are a share position, not your pool-share lot. While the market is open, leaving means burning pool shares for a basket of every answer, including Invalid. Merge a complete set if you want collateral back. After resolve, you burn the pool shares and redeem the basket at 0 or 1. This is not delta-neutral. As prices move, you hold more of the answer traders are selling. You are the other side of every trade. Worked numbers: LP calculator. How to call it: How liquidity works.Fees
The same schedule applies to buy, sell, and redeem. Protocol is 1%. The other cuts are configurable and together cap at 1.5%. SDK defaults:
Liquidity providers do not receive a cash stream. Their cut is more inventory. Mark it against cost; do not treat the opening mix as a win/lose bet.
Pause, resolve, and redeem
The creator can pause trading once, before resolve. Buys, sells, and new liquidity stop. Existing liquidity can still be withdrawn. Pause is not the result of the question, and it cannot be undone. When the answer is known, the admin publishes it, or a committee reaches its threshold. For Invalid, the outcome index is the number of named answers (the SDK’s admin path callsreportInvalid). Check that you are allowed to resolve first.
Trading stops at resolve on purpose. After payouts are set, every named share is worth exactly 1 or 0. If the market maker still quoted 0.62 next to a 1-or-0 redeem, traders would buy the cheap winner or dump the expensive loser and empty the inventory. Buys and sells revert once the result is on chain.
Then:
- Named winning tokens → redeem for collateral.
- Pool shares → redeem the basket for collateral.
- Leftover named tokens from liquidity (the ones sent back when you deposited) → redeem as shares, not as pool shares.