What are split, merge, and convert?
Polymarket positions are ERC-1155 tokens representing outcomes. Three on-chain operations let you manage them directly: Split — Turn collateral into YES + NO tokens for a market. Current V2 trading uses pUSD; explicit legacy V1 uses USDC.e. You put in 1 at resolution, the other $0. Merge — The reverse. Put YES + NO tokens back together and receive the matching collateral. In current V2, 100 YES + 100 NO returns 100 pUSD. Convert — Rebalance positions across outcomes in a multi-outcome market (neg-risk only). The legacy neg-risk adapter converts selected NO tokens into USDC.e plus YES tokens on the remaining outcomes.When to use each
TypeScript (gasless)
The TypeScript SDK executes these operations gaslessly through the Polymarket relayer. No MATIC/POL needed.Split
Merge
Convert
Convert is only available on neg-risk multi-outcome markets (e.g. “Republican Presidential Nominee” with 36 outcomes).- Your NO tokens on outcomes 0 and 1 are burned
- You receive (number of outcomes - 1) x amount in USDC.e (here: $100)
- You receive YES tokens on all other outcomes (here: outcomes 2 through 35)
outcomeIndices correspond to the position of each outcome in the market. Index 0 is the first outcome, index 1 is the second, etc. You can find these by looking at the questionID field in market data — the last byte of each questionID is the outcome index.
Rust
The existing Rust helpers remain build-only for integrations that submit their own transactions:user_owned mode, execute_split() and
execute_merge() submit gaslessly with wallet-owned authorization:
Python
The synchronous Python helpers also remain build-only:user_owned mode, use the explicit async
execution methods:
Finding market IDs
To use these operations, you need the right identifiers from market data:Neg-risk vs standard markets
The TypeScript SDK auto-detects the market type and routes to the correct contract. Rust and Python default to neg-risk (most multi-outcome markets). Pass
neg_risk=False for standard binary markets.
Rust and Python keep their synchronous build-only helpers for compatibility and
also provide gasless user-owned
execute_split / execute_merge methods.
Convert remains gasless through TypeScript; Rust and Python expose a build-only
convert transaction.
